commit 6624cf541b6d31218754046813f5137ddf35121f Author: Edwin Eames Date: Mon Jul 15 18:00:33 2024 -0400 first commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..864bc9f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.12-bullseye + +ENV PYTHONFAULTHANDLER=1 + +ENV PYTHONUNBUFFERED=1 + +RUN mkdir -p /app + +COPY requirements.txt /app + +WORKDIR /app + +RUN pip3 install -r requirements.txt + +EXPOSE 8000 + +COPY . /app \ No newline at end of file diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 0000000..3b0bcf9 --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,17 @@ +FROM python:3.12-bullseye + +ENV PYTHONFAULTHANDLER=1 + +ENV PYTHONUNBUFFERED=1 + +RUN mkdir -p /app + +COPY requirements.txt /app + +WORKDIR /app + +RUN pip3 install -r requirements.txt + +EXPOSE 8001 + +COPY . /app \ No newline at end of file diff --git a/__pycache__/database.cpython-312.pyc b/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000..e24c280 Binary files /dev/null and b/__pycache__/database.cpython-312.pyc differ diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000..45ad770 Binary files /dev/null and b/__pycache__/main.cpython-312.pyc differ diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/__pycache__/__init__.cpython-312.pyc b/app/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..74dda1a Binary files /dev/null and b/app/__pycache__/__init__.cpython-312.pyc differ diff --git a/app/models/__init__.py b/app/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/models/__pycache__/__init__.cpython-312.pyc b/app/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..ab473b9 Binary files /dev/null and b/app/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/app/models/__pycache__/delivery.cpython-312.pyc b/app/models/__pycache__/delivery.cpython-312.pyc new file mode 100644 index 0000000..779dd43 Binary files /dev/null and b/app/models/__pycache__/delivery.cpython-312.pyc differ diff --git a/app/models/__pycache__/money.cpython-312.pyc b/app/models/__pycache__/money.cpython-312.pyc new file mode 100644 index 0000000..b381de4 Binary files /dev/null and b/app/models/__pycache__/money.cpython-312.pyc differ diff --git a/app/models/__pycache__/pricing.cpython-312.pyc b/app/models/__pycache__/pricing.cpython-312.pyc new file mode 100644 index 0000000..03ba974 Binary files /dev/null and b/app/models/__pycache__/pricing.cpython-312.pyc differ diff --git a/app/models/delivery.py b/app/models/delivery.py new file mode 100644 index 0000000..c1ff949 --- /dev/null +++ b/app/models/delivery.py @@ -0,0 +1,50 @@ +from sqlalchemy import Column, Integer,\ + DECIMAL, Text,\ + VARCHAR, TIMESTAMP, Date +import datetime +from database import Base + + +class Delivery(Base): + __tablename__ = "delivery_delivery" + + id = Column(Integer, + primary_key=True, + autoincrement=True, + unique=False) + + customer_id = Column(Integer) + customer_name = Column(VARCHAR(1000)) + customer_address = Column(VARCHAR(1000)) + customer_town = Column(VARCHAR(140)) + customer_state = Column(VARCHAR(140)) + customer_zip = Column(Integer) + + gallons_ordered = Column(Integer) + customer_asked_for_fill = Column(Integer) + gallons_delivered = Column(DECIMAL(50, 2)) + customer_filled = Column(Integer) + + delivery_status = Column(Integer) + when_ordered = Column(TIMESTAMP(), default=datetime.datetime.utcnow()) + when_delivered = Column(TIMESTAMP(), default=None) + expected_delivery_date = Column(Date(), default=None) + automatic = Column(Integer) + oil_id = Column(Integer) + supplier_price = Column(DECIMAL(50, 2)) + customer_price = Column(DECIMAL(50, 2)) + customer_temperature = Column(DECIMAL(50, 2)) + dispatcher_notes = Column(Text()) + prime = Column(Integer) + same_day = Column(Integer) + payment_type = Column(Integer) + payment_card_id = Column(Integer) + cash_recieved = Column(DECIMAL(50, 2)) + + driver_employee_id = Column(Integer) + driver_first_name = Column(VARCHAR(140)) + driver_last_name = Column(VARCHAR(140)) + + pre_charge_amount = Column(DECIMAL(50, 2)) + total_price = Column(DECIMAL(50, 2)) + final_price = Column(DECIMAL(50, 2)) \ No newline at end of file diff --git a/app/models/money.py b/app/models/money.py new file mode 100644 index 0000000..e77d0fb --- /dev/null +++ b/app/models/money.py @@ -0,0 +1,28 @@ +from sqlalchemy import Column, Integer,\ + DECIMAL, Text,\ + VARCHAR, TIMESTAMP, Date +from datetime import datetime, timezone +from database import Base + + +class MoneyDelivery(Base): + __tablename__ = 'money_delivery' + + id = Column(Integer, + primary_key=True, + autoincrement=True, + unique=False) + + delivery_id = Column(Integer) + time_added = Column(TIMESTAMP(), default=datetime.utcnow()) + gallons_delivered = Column(DECIMAL(50, 2)) + supplier_price = Column(DECIMAL(50, 2)) + customer_price = Column(DECIMAL(50, 2)) + total_amount_oil = Column(DECIMAL(50, 2)) + total_amount_prime = Column(DECIMAL(50, 2)) + total_amount_same_day = Column(DECIMAL(50, 2)) + total_amount_fee = Column(DECIMAL(50, 2)) + total_amount = Column(DECIMAL(50, 2)) + taxes_paid = Column(DECIMAL(50, 2)) + total_profit = Column(DECIMAL(50, 2)) + total_profit_oil = Column(DECIMAL(50, 2)) \ No newline at end of file diff --git a/app/models/pricing.py b/app/models/pricing.py new file mode 100644 index 0000000..4a55718 --- /dev/null +++ b/app/models/pricing.py @@ -0,0 +1,34 @@ +from sqlalchemy import (Column, Integer, DECIMAL, TIMESTAMP) +from datetime import datetime, timezone +from database import Base + + +class Pricing_Oil_Oil(Base): + __tablename__ = 'pricing_oil_oil' + + + id = Column(Integer, + primary_key=True, + autoincrement=True, + unique=False) + + price_from_supplier = Column(DECIMAL(50, 2)) + price_for_customer = Column(DECIMAL(50, 2)) + price_for_employee = Column(DECIMAL(50, 2)) + price_same_day = Column(DECIMAL(50, 2)) + price_prime = Column(DECIMAL(50, 2)) + date = Column(TIMESTAMP(), default=datetime.utcnow()) + + + +class Pricing_Taxes(Base): + __tablename__ = 'taxes_pricing' + + + id = Column(Integer, + primary_key=True, + autoincrement=True, + unique=False) + state_id = Column(Integer) + taxes_oil = Column(DECIMAL(50, 2)) + taxes_other = Column(DECIMAL(50, 2)) \ No newline at end of file diff --git a/app/routers/__init__.py b/app/routers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/routers/__pycache__/__init__.cpython-312.pyc b/app/routers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..c2b3189 Binary files /dev/null and b/app/routers/__pycache__/__init__.cpython-312.pyc differ diff --git a/app/routers/__pycache__/delivery.cpython-312.pyc b/app/routers/__pycache__/delivery.cpython-312.pyc new file mode 100644 index 0000000..89a2e6e Binary files /dev/null and b/app/routers/__pycache__/delivery.cpython-312.pyc differ diff --git a/app/routers/delivery.py b/app/routers/delivery.py new file mode 100644 index 0000000..e556a47 --- /dev/null +++ b/app/routers/delivery.py @@ -0,0 +1,106 @@ +from typing import Annotated +from datetime import datetime, timezone +from fastapi.responses import JSONResponse +from fastapi.encoders import jsonable_encoder +from fastapi import APIRouter, Form, Body +from database import session + +from app.schema.delivery import DeliverPricing + + +from app.models.delivery import Delivery +from app.models.money import MoneyDelivery +from app.models.pricing import Pricing_Oil_Oil, Pricing_Taxes + +router = APIRouter( + prefix="/delivery", + tags=["delivery"], + responses={404: {"description": "Not found"}}, +) + +@router.get("/order/money/{delivery_id_order}", status_code=201) +async def add_delivery(delivery_id_order): + get_delivery = (session.query(Delivery) + .filter(Delivery.id == delivery_id_order) + .first()) + get_money_delivery = (session.query(MoneyDelivery) + .filter(MoneyDelivery.delivery_id == get_delivery.id) + .first()) + + print(get_money_delivery) + + + return JSONResponse(content=jsonable_encoder(get_money_delivery), status_code=200) + + +@router.post("/add/{delivery_id_order}", status_code=201) +async def add_delivery(delivery_id_order, deliverydata: DeliverPricing): + + + now = datetime.now(timezone.utc).replace(tzinfo=None) + get_delivery = (session.query(Delivery) + .filter(Delivery.id == delivery_id_order) + .first()) + + get_current_prices = (session.query(Pricing_Oil_Oil) + .order_by(Pricing_Oil_Oil.id.desc()) + .first()) + + get_current_taxes = (session.query(Pricing_Taxes) + .filter(Pricing_Taxes.state_id == get_delivery.customer_state) + .order_by(Pricing_Taxes.id.desc()) + .first()) + + # get total amount for just oil delivered + calc_total_oil = (float(deliverydata.gallons_delivered) * float(get_delivery.customer_price)) + calc_total_oil_supplier = (float(deliverydata.gallons_delivered) * float(get_delivery.supplier_price)) + + # calculate prime + if deliverydata.prime: + prime_price = get_current_prices.price_prime + else: + prime_price = 0 + + # calculate same day + if deliverydata.same_day: + same_day_price = get_current_prices.price_same_day + else: + same_day_price = 0 + + # calculate fees + total_amount_fees_from_delivery = (float(same_day_price) + float(prime_price)) + + # total amount + total_amount_delivery = (float(same_day_price) + float(prime_price) +float(calc_total_oil)) + + # calculate taxes + tax_oil = (float(get_current_taxes.taxes_oil) * float(deliverydata.gallons_delivered)) + tax_other = (float(get_current_taxes.taxes_oil) * float(total_amount_fees_from_delivery)) + total_taxes = (float(tax_oil) + float(tax_other)) + + # calculate profit + profit_from_oil = float(calc_total_oil) - float(calc_total_oil_supplier) + profit_from_stop = (float(profit_from_oil) + float(total_amount_fees_from_delivery)) - float(total_taxes) + + new_money = MoneyDelivery( + delivery_id = get_delivery.id, + time_added=now, + gallons_delivered=deliverydata.gallons_delivered, + supplier_price=get_delivery.supplier_price, + customer_price=get_delivery.customer_price, + total_amount_oil=calc_total_oil, + total_amount_prime=prime_price, + total_amount_same_day=same_day_price, + total_amount_fee= total_amount_fees_from_delivery, + total_amount=total_amount_delivery, + taxes_paid=total_taxes, + total_profit_oil=profit_from_oil, + total_profit=profit_from_stop, + ) + + session.add(new_money) + session.commit() + + + return {"delivery_id": delivery_id_order} + \ No newline at end of file diff --git a/app/schema/__pycache__/delivery.cpython-312.pyc b/app/schema/__pycache__/delivery.cpython-312.pyc new file mode 100644 index 0000000..85d90ea Binary files /dev/null and b/app/schema/__pycache__/delivery.cpython-312.pyc differ diff --git a/app/schema/delivery.py b/app/schema/delivery.py new file mode 100644 index 0000000..f20f825 --- /dev/null +++ b/app/schema/delivery.py @@ -0,0 +1,46 @@ +from pydantic import BaseModel, Field +from datetime import datetime, timezone + + +def datetime_now() -> datetime: + return datetime.now(timezone.utc) + +class DeliverPricing(BaseModel): + prime: bool + same_day: bool + gallons_delivered: float + + + +class SchemaDelivery(BaseModel): + customer_id: int + customer_name: str + customer_address: str + customer_town: str + customer_state: int + customer_zip: int + gallons_ordered: float + customer_asked_for_fill: int + gallons_delivered: float + customer_filled: int + delivery_status: int + when_ordered: datetime = Field(default_factory=datetime_now) + when_delivered: datetime = Field(default_factory=datetime_now) + expected_delivery_date: datetime = Field(default_factory=datetime_now) + automatic: int + oil_id: int + supplier_price: float + customer_price: float + customer_temperature: float + dispatcher_notes: str + prime: int + same_day: int + payment_type: int + payment_card_id: int + cash_recieved: float + driver_employee_id: int + driver_first_name: str + driver_last_name: str + pre_charge_amount: float + total_price: float + final_price: float \ No newline at end of file diff --git a/app/schema/money.py b/app/schema/money.py new file mode 100644 index 0000000..a80ac63 --- /dev/null +++ b/app/schema/money.py @@ -0,0 +1,21 @@ +from pydantic import BaseModel, Field +from datetime import datetime, timezone + + +def datetime_now() -> datetime: + return datetime.now(timezone.utc) + +class SchemaMoney(BaseModel): + delivery_id: int + time_added: datetime + gallons_delivered: float + supplier_price: float + customer_price: float + total_amount_oil: float + total_amount_prime: float + total_amount_same_day: float + total_amount_fee: float + total_amount: float + taxes_paid: float + total_profit: float + diff --git a/database.py b/database.py new file mode 100644 index 0000000..0242857 --- /dev/null +++ b/database.py @@ -0,0 +1,21 @@ +from sqlalchemy import create_engine +from sqlalchemy.engine import URL +from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm import declarative_base + +url = URL.create( + drivername="postgresql", + username="postgres", + password="password", + host="192.168.1.204", + database="eamco", + port=5432 +) + +engine = create_engine(url) + +Session = sessionmaker(autocommit=False, autoflush=False, bind=engine) +session = Session() + +Base = declarative_base() +Base.metadata.create_all(engine) \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..5e825bb --- /dev/null +++ b/main.py @@ -0,0 +1,27 @@ +from fastapi import FastAPI +from app.routers import delivery +from fastapi.middleware.cors import CORSMiddleware + +app = FastAPI() + +app.include_router(delivery.router) + + +origins = [ + "http://localhost:9000", + "https://localhost:5173", + "http://localhost", + +] + +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +@app.get("/") +def read_root(): + return {"Status": "Money Service is online"} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4e961b3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +fastapi +uvicorn[standard] +psycopg2-binary +sqlalchemy \ No newline at end of file