diff --git a/app/models/auto.py b/app/models/auto.py index 6f8a072..acc03fb 100644 --- a/app/models/auto.py +++ b/app/models/auto.py @@ -1,12 +1,22 @@ from sqlalchemy import (Column, Integer, DECIMAL, TEXT, - VARCHAR, TIMESTAMP, DATE, INTEGER) + VARCHAR, DATE, INTEGER) from datetime import datetime from database import Base +class Auto_Update(Base): + __tablename__ = 'auto_update' + + id = Column(Integer, + primary_key=True, + autoincrement=True, + unique=False) + + last_updated = Column(DATE()) + class Auto_Temp(Base): __tablename__ = 'auto_temp' @@ -16,7 +26,7 @@ class Auto_Temp(Base): autoincrement=True, unique=False) - todays_date = Column(TIMESTAMP(), default=datetime.utcnow()) + todays_date = Column(DATE) temp = Column(DECIMAL(5, 2)) temp_max = Column(DECIMAL(5, 2)) temp_min = Column(DECIMAL(5, 2)) @@ -40,11 +50,37 @@ class Auto_Delivery(Base): customer_address = Column(VARCHAR(1000)) customer_zip = Column(VARCHAR(25)) customer_full_name = Column(VARCHAR(250)) - last_fill = Column(TIMESTAMP()) - last_updated = Column(TIMESTAMP()) - estimated_gallons_left = Column(INTEGER()) - estimated_gallons_left_prev_day = Column(INTEGER()) + last_fill = Column(DATE()) + days_since_last_fill = Column(INTEGER()) + last_updated = Column(DATE()) + estimated_gallons_left = Column(DECIMAL(6, 2)) + estimated_gallons_left_prev_day = Column(DECIMAL(6, 2)) tank_height = Column(VARCHAR(25)) tank_size = Column(VARCHAR(25)) house_factor = Column(DECIMAL(5, 2)) - auto_status = Column(INTEGER()) \ No newline at end of file + auto_status = Column(INTEGER()) + + +class Tickets_Auto_Delivery(Base): + __tablename__ = 'auto_tickets' + + id = Column(Integer, + primary_key=True, + autoincrement=True, + unique=False) + customer_id = Column(INTEGER()) + account_number = Column(VARCHAR(25)) + + customer_town = Column(VARCHAR(140)) + customer_state = Column(Integer) + customer_address = Column(VARCHAR(1000)) + customer_zip = Column(VARCHAR(25)) + customer_full_name = Column(VARCHAR(250)) + customer_zip = Column(VARCHAR(25)) + + oil_prices_id = Column(INTEGER()) + + gallons_delivered = Column(DECIMAL(6, 2)) + price_per_gallon = Column(DECIMAL(6, 2)) + + total_amount_customer = Column(DECIMAL(6, 2)) diff --git a/app/models/cards.py b/app/models/cards.py index de40f06..2db8c85 100644 --- a/app/models/cards.py +++ b/app/models/cards.py @@ -1,8 +1,8 @@ from sqlalchemy import (Column, Integer, - DECIMAL, Text, BOOLEAN, - VARCHAR, TIMESTAMP, - Date, INTEGER) + DECIMAL, BOOLEAN, DATE, + VARCHAR, + INTEGER) from datetime import datetime, timezone from database import Base @@ -16,7 +16,7 @@ class Card_Card(Base): primary_key=True, autoincrement=True, unique=False) - date_added = Column(TIMESTAMP(), default=datetime.utcnow()) + date_added = Column(DATE()) user_id = Column(INTEGER()) card_number = Column(VARCHAR(50)) last_four_digits = Column(INTEGER()) diff --git a/app/models/customer.py b/app/models/customer.py index c41921b..43ca18b 100644 --- a/app/models/customer.py +++ b/app/models/customer.py @@ -1,7 +1,7 @@ from sqlalchemy import (Column, Integer, - DECIMAL, Text, - VARCHAR, TIMESTAMP, - Date, INTEGER) + DECIMAL, + VARCHAR, + DATE, INTEGER) from datetime import datetime, timezone from database import Base @@ -20,7 +20,7 @@ class Customer_Customer(Base): customer_town = Column(VARCHAR(140)) customer_state = Column(INTEGER) customer_zip = Column(VARCHAR(25)) - customer_first_call = Column(TIMESTAMP()) + customer_first_call = Column(DATE()) customer_email = Column(VARCHAR(500)) customer_automatic = Column(INTEGER) customer_phone_number = Column(VARCHAR(25)) diff --git a/app/models/delivery.py b/app/models/delivery.py index 9f0c85d..ed395a4 100644 --- a/app/models/delivery.py +++ b/app/models/delivery.py @@ -26,8 +26,8 @@ class Delivery(Base): customer_filled = Column(INTEGER) delivery_status = Column(INTEGER) - when_ordered = Column(TIMESTAMP(), default=datetime.datetime.utcnow()) - when_delivered = Column(TIMESTAMP(), default=None) + when_ordered = Column(DATE(), ) + when_delivered = Column(DATE()) expected_delivery_date = Column(DATE(), default=None) automatic = Column(INTEGER) automatic_id = Column(INTEGER) diff --git a/app/routers/confirm.py b/app/routers/confirm.py index c0041fb..88ee627 100644 --- a/app/routers/confirm.py +++ b/app/routers/confirm.py @@ -1,11 +1,13 @@ from fastapi import APIRouter, Request -from datetime import datetime +from datetime import date from database import session from pyowm import OWM from decimal import Decimal -from app.models.auto import Auto_Delivery -from app.models.delivery import Delivery +from app.models.auto import Auto_Delivery, Tickets_Auto_Delivery +from app.models.pricing import Pricing_Oil_Oil + + from app.script.update_auto import calc_home_factor @@ -16,26 +18,17 @@ router = APIRouter( ) -@router.put("/delivery") -async def add_delivery(request: Request): - - now = datetime.utcnow - +@router.put("/auto/update/{autoid}") +async def update_auto(autoid: int, request: Request): request_body = await request.json() - gallons_delivered = request_body['gallons'] + gallons_delivered = request_body['gallons_delivered'] gallons_delivered = Decimal(gallons_delivered) - delivery_id = request_body['delivery_id'] - - get_delivery = (session - .query(Delivery) - .filter(Delivery.id == delivery_id) - .first()) get_auto_delivery = (session .query(Auto_Delivery) - .filter(Auto_Delivery.customer_id == get_delivery.customer_id) + .filter(Auto_Delivery.id == autoid) .first()) gallons_put_in_home = Decimal(gallons_delivered) @@ -46,15 +39,67 @@ async def add_delivery(request: Request): new_home_factor = calc_home_factor(gallons_put_in_home = gallons_put_in_home, current_house_factor=customer_home_factor) + + get_auto_delivery.house_factor = new_home_factor get_auto_delivery.tank_height = 'Full' - get_auto_delivery.last_fill = now + get_auto_delivery.last_fill = date.today() get_auto_delivery.estimated_gallons_left = 240 get_auto_delivery.estimated_gallons_left_prev_day = 240 - get_auto_delivery.auto_status = 0 + get_auto_delivery.auto_status = 1 + get_auto_delivery.days_since_last_fill = 0 session.add(get_auto_delivery) + session.commit() return ({"ok": True}), 200 + + + +@router.post("/auto/create/{autoid}") +async def create_auto_ticket(autoid: int, request: Request): + + + request_body = await request.json() + gallons_delivered = request_body['gallons_delivered'] + gallons_delivered = Decimal(gallons_delivered) + + + get_auto_delivery = (session + .query(Auto_Delivery) + .filter(Auto_Delivery.id == autoid) + .first()) + get_todays_price = (session.query(Pricing_Oil_Oil) + .order_by(Pricing_Oil_Oil.id.desc()) + .first()) + gallons_put_in_home = Decimal(gallons_delivered) + todays_price = Decimal(get_todays_price.price_for_customer) + total_amount = gallons_put_in_home * todays_price + + create_new_ticket = Tickets_Auto_Delivery( + + customer_id = get_auto_delivery.customer_id, + account_number = get_auto_delivery.account_number, + customer_town = get_auto_delivery.customer_town, + customer_state = get_auto_delivery.customer_state, + customer_address = get_auto_delivery.customer_address, + customer_zip =get_auto_delivery.customer_zip, + customer_full_name = get_auto_delivery.customer_full_name, + oil_prices_id = get_todays_price.id, + gallons_delivered = gallons_delivered, + price_per_gallon = get_todays_price.price_for_customer, + total_amount_customer = total_amount, + ) + + + session.add(create_new_ticket) + + session.commit() + + return ({ + "ok": True, + "auto_ticket_id":create_new_ticket.id + }), 200 + diff --git a/app/routers/delivery.py b/app/routers/delivery.py index d6084b5..0435513 100644 --- a/app/routers/delivery.py +++ b/app/routers/delivery.py @@ -1,15 +1,10 @@ -from fastapi import APIRouter, Request +from fastapi import APIRouter, Request, Depends from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder -from datetime import datetime from database import session -from pyowm import OWM -from decimal import Decimal -from app.models.auto import Auto_Delivery + +from app.models.auto import Auto_Delivery, Tickets_Auto_Delivery from app.models.delivery import Delivery -from app.models.pricing import Pricing_Oil_Oil -from app.models.cards import Card_Card -from app.models.employee import Employee_Employee @@ -19,6 +14,22 @@ router = APIRouter( responses={404: {"description": "Not found"}}, ) + +@router.get("/all/customers", status_code=200) +def get_delivery_customers(): + + + automatics = ( + session.query(Auto_Delivery) + .filter(Auto_Delivery.auto_status == 1) + .order_by(Auto_Delivery.estimated_gallons_left.desc()) + .all() + ) + + return JSONResponse(content=jsonable_encoder(automatics), status_code=200) + + + @router.get("/driver/{driver_employee_id}", status_code=200) def get_delivery_for_specific_driver(driver_employee_id: int): automatics = ( @@ -32,13 +43,12 @@ def get_delivery_for_specific_driver(driver_employee_id: int): return JSONResponse(content=jsonable_encoder(automatics), status_code=200) - -@router.get("/{delivery_id_order}", status_code=200) -def get_delivery(delivery_id_order): +@router.get("/{auto_id}", status_code=200) +def get_auto(auto_id): get_delivery = ( session.query(Auto_Delivery) - .filter(Auto_Delivery.id == delivery_id_order) + .filter(Auto_Delivery.id == auto_id) .first() ) @@ -46,128 +56,15 @@ def get_delivery(delivery_id_order): -@router.get("/all/customers", status_code=200) -def get_delivery_customers(): +@router.get("/delivery/{delivery_id_order}", status_code=200) +def get_delivery(delivery_id_order): - # auto = ( - # session.query(Auto_Delivery) - # .order_by(Auto_Delivery.estimated_gallons_left.desc()) - # .first() - # ) - - # auto.id = auto.id - # session.add(auto) - # session.flush() - - - automatics = ( - session.query(Auto_Delivery) - .order_by(Auto_Delivery.estimated_gallons_left.desc()) - .all() + get_delivery = ( + session.query(Tickets_Auto_Delivery) + .filter(Tickets_Auto_Delivery.id == delivery_id_order) + .first() ) - - - return JSONResponse(content=jsonable_encoder(automatics), status_code=200) + + return JSONResponse(content=jsonable_encoder(get_delivery), status_code=200) -@router.post("/create") -async def create_delivery_from_automatic(request: Request): - - # client_host = await request.body() - # body_text = client_host.decode("utf-8") - # print(body_text) - list_added_tickets = [] - - now = datetime.utcnow() - - request_body = await request.json() - - for f in request_body['values']: - list_added_tickets.append(f) - driver_id = request_body['driver_employee_id'] - - - get_today_price = session\ - .query(Pricing_Oil_Oil)\ - .order_by(Pricing_Oil_Oil.id.desc())\ - .first() - - precharge_amount = (250 * get_today_price.price_for_customer) - - get_driver = (session.query(Employee_Employee) - .filter(Employee_Employee.id == driver_id) - .first()) - - - count = 0 - - for f in list_added_tickets: - - count =+ 1 - - get_auto_delivery = (session.query(Auto_Delivery) - .filter(Auto_Delivery.id == f) - .first()) - - get_auto_delivery.auto_status = 1 - session.add(get_auto_delivery) - - get_main_credit_card = (session.query(Card_Card) - .filter(Card_Card.user_id == get_auto_delivery.customer_id) - .filter(Card_Card.main_card == True) - .first()) - - see_if_delivery_exists = (session.query(Delivery) - .filter(Delivery.driver_employee_id == get_driver.id) - .filter(Delivery.automatic_id == get_auto_delivery.id) - .filter(Delivery.delivery_status == 0) - .first()) - - - if see_if_delivery_exists is None: - - new_delivery = Delivery( - customer_id=get_auto_delivery.customer_id, - customer_address=get_auto_delivery.customer_address, - customer_name=get_auto_delivery.customer_full_name, - customer_town=get_auto_delivery.customer_town, - customer_state=get_auto_delivery.customer_state, - customer_zip=get_auto_delivery.customer_zip, - gallons_ordered=250, - customer_asked_for_fill=1, - gallons_delivered=0, - customer_filled=0, - delivery_status=0, - when_ordered=now, - when_delivered=None, - expected_delivery_date=None, - automatic=1, - automatic_id=get_auto_delivery.id, - oil_id=get_today_price.id, - supplier_price=get_today_price.price_from_supplier, - customer_price=get_today_price.price_for_customer, - customer_temperature=None, - dispatcher_notes=None, - prime=0, - same_day=0, - payment_type=1, - payment_card_id=get_main_credit_card.id, - pre_charge_amount=precharge_amount, - total_price=precharge_amount, - final_price=0, - driver_last_name=get_driver.employee_last_name, - driver_first_name=get_driver.employee_first_name, - driver_employee_id=get_driver.id, - ) - - session.add(new_delivery) - - - session.commit() - - - return ({ - "ok": True, - 'count': count, - }) - diff --git a/app/routers/main.py b/app/routers/main.py index 20268df..6afc541 100644 --- a/app/routers/main.py +++ b/app/routers/main.py @@ -1,9 +1,9 @@ from fastapi import APIRouter, Request -from datetime import datetime +from datetime import datetime, date from database import session from pyowm import OWM -from app.models.auto import Auto_Delivery, Auto_Temp +from app.models.auto import Auto_Delivery, Auto_Temp, Auto_Update from app.models.delivery import Delivery @@ -15,99 +15,145 @@ router = APIRouter( responses={404: {"description": "Not found"}}, ) - +def Average(lst): + return sum(lst) / len(lst) @router.get("/update", status_code=200) def update_auto_customers(): - - today_temp = session\ - .query(Auto_Temp)\ - .order_by(Auto_Temp.id.desc())\ - .first() - - # get all automatic customers - auto_customers = session\ - .query(Auto_Delivery)\ - .order_by(Auto_Delivery.last_updated.desc())\ - .limit(25) - - for f in auto_customers: - - # figure out how much temperature effects oil - if today_temp >= 60: - use_day = 1 - elif 40 >= today_temp >= 59: - use_day = 3 - elif 30 >= today_temp >= 39: - use_day = 5 - elif 0 >= today_temp >= 29: - use_day = 7 - elif -20 >= today_temp >= -1: - use_day = 10 - else: - use_day = 0 + try: - # times temp factory by house factor - gallon_use_today = f.house_factor * use_day + see_if_autos_updated = (session.query(Auto_Update) + .filter(Auto_Update.last_updated == date.today()) + .first() + ) + except: + session.rollback() + see_if_autos_updated = None - # get estimated gallons left - get_gallons_left = f.estimated_gallons_left_prev_day - gallon_use_today + if see_if_autos_updated is not None: + return ({"ok": True}), 200 + else: + + create_new_update = Auto_Update( + last_updated = date.today() + ) + today_temp = (session + .query(Auto_Temp) + .order_by(Auto_Temp.id.desc()) + .first()) + + # get all automatic customers + auto_customers = (session + .query(Auto_Delivery) + .order_by(Auto_Delivery.last_updated.desc()) + .limit(25)) - # get previous day gallons left - f.estimated_gallons_left_prev_day = f.estimated_gallons_left + gallon_use_today + for f in auto_customers: + + # figure out days since last fill + d1 = date.today() + d0 = f.last_fill + + delta = d1 - d0 + f.days_since_last_fill = delta.days + # figure out how much temperature effects oil + today_temptemp_avg = int(today_temp.temp_avg) + if today_temptemp_avg >= 65.01: + use_day = 1 + elif 50.01 <= today_temptemp_avg <= 65: + use_day = 2 + elif 35.01 <= today_temptemp_avg <= 50: + use_day = 3 + elif 30.01 <= today_temptemp_avg <= 35: + use_day = 4 + elif 25.01 <= today_temptemp_avg <= 30: + use_day = 5 + elif 20.01 <= today_temptemp_avg <= 25: + use_day = 7 + elif 15.01 <= today_temptemp_avg <= 20: + use_day = 8 + elif 10.01 <= today_temptemp_avg <= 15: + use_day = 9 + elif 5.01 <= today_temptemp_avg <= 10: + use_day = 10 + elif 0.01 <= today_temptemp_avg <= 5: + use_day =12 + elif -20 <= today_temptemp_avg <= -1: + use_day = 15 + else: + use_day = 0 - f.estimated_gallons_left = get_gallons_left + # times temp factory by house factor - session.add(f) + gallon_use_today = f.house_factor * use_day + + + # get previous day gallons left + f.estimated_gallons_left_prev_day = f.estimated_gallons_left + + # get estimated gallons left + get_gallons_left = f.estimated_gallons_left_prev_day - gallon_use_today + + + + f.estimated_gallons_left = get_gallons_left + + session.add(create_new_update) + session.add(f) session.commit() - + return ({"ok": True}), 200 @router.get("/temp", status_code=200) def update_temp(): - - temps = [] - - owm = OWM('21648d8c8d1a4ae495ace0b7810b4d36') - mgr = owm.weather_manager() - - # Search for current weather in London (Great Britain) and get details - observation = mgr.weather_at_place('Worcester, US') - w = observation.weather - - temp_dict_fahrenheit = w.temperature() # a dict in Kelvin units (default when no temperature units provided) - temp_dict_fahrenheit['temp_min'] - temp_dict_fahrenheit['temp_max'] - temp_dict_fahrenheit = w.temperature('fahrenheit') - - low_temp = temp_dict_fahrenheit['temp_min'] - high_temp = temp_dict_fahrenheit['temp_max'] - temps.append(temp_dict_fahrenheit['temp_max']) - temps.append(temp_dict_fahrenheit['temp_min']) - - get_avg = Average(temps) - rounded_temp = round(get_avg) - - dday = (65 - ((low_temp + high_temp) /2)) - - add_new_temp = Auto_Temp( - temp = temp_dict_fahrenheit['temp'], - temp_max = temp_dict_fahrenheit['temp_max'], - temp_min = temp_dict_fahrenheit['temp_min'], - temp_avg = rounded_temp, - degree_day = dday - ) - - session.add(add_new_temp) - session.commit() + try: + see_if_temp_exists = (session.query(Auto_Temp) + .filter(Auto_Temp.todays_date == date.today()) + .first()) + except: + see_if_temp_exists = None + if see_if_temp_exists is not None: + return ({"ok": True}), 200 + else: + temps = [] - return ({"ok": True}), 200 - - -def Average(lst): - return sum(lst) / len(lst) + owm = OWM('21648d8c8d1a4ae495ace0b7810b4d36') + mgr = owm.weather_manager() + + # Search for current weather in London (Great Britain) and get details + observation = mgr.weather_at_place('Worcester, US') + w = observation.weather + + temp_dict_fahrenheit = w.temperature() # a dict in Kelvin units (default when no temperature units provided) + temp_dict_fahrenheit['temp_min'] + temp_dict_fahrenheit['temp_max'] + temp_dict_fahrenheit = w.temperature('fahrenheit') + + low_temp = temp_dict_fahrenheit['temp_min'] + high_temp = temp_dict_fahrenheit['temp_max'] + temps.append(temp_dict_fahrenheit['temp_max']) + temps.append(temp_dict_fahrenheit['temp_min']) + + get_avg = Average(temps) + rounded_temp = round(get_avg) + + dday = (65 - ((low_temp + high_temp) /2)) + + add_new_temp = Auto_Temp( + temp = temp_dict_fahrenheit['temp'], + temp_max = temp_dict_fahrenheit['temp_max'], + temp_min = temp_dict_fahrenheit['temp_min'], + temp_avg = rounded_temp, + degree_day = dday, + todays_date = date.today() + ) + + session.add(add_new_temp) + session.commit() + + return ({"ok": True}), 200 diff --git a/app/script/update_auto.py b/app/script/update_auto.py index ea29885..d297391 100644 --- a/app/script/update_auto.py +++ b/app/script/update_auto.py @@ -1,40 +1,13 @@ from decimal import Decimal -from datetime import datetime from database import session -from app.models.auto import Auto_Delivery -def update_automatic(get_delivery, gallons_delivered ): - - now = datetime.utcnow() - - - get_auto_delivery = (session - .query(Auto_Delivery) - .filter(Auto_Delivery.customer_id == get_delivery.customer_id) - .first()) - - gallons_put_in_home = Decimal(gallons_delivered) - - customer_home_factor = get_auto_delivery.house_factor - - - new_home_factor = calc_home_factor(gallons_put_in_home = gallons_put_in_home, - current_house_factor=customer_home_factor) - get_auto_delivery.house_factor = new_home_factor - get_auto_delivery.tank_height = 'Full' - get_auto_delivery.last_fill = now - get_auto_delivery.estimated_gallons_left = 240 - get_auto_delivery.estimated_gallons_left_prev_day = 240 - get_auto_delivery.auto_status = 0 - - session.add(get_auto_delivery) def calc_home_factor(gallons_put_in_home, current_house_factor): - - if 200.01 >= gallons_put_in_home >= 500: + + if 200.01 <= gallons_put_in_home <= 500: customer_home_factor = Decimal(current_house_factor) + Decimal(1) elif 170.01 <= gallons_put_in_home <= 200: customer_home_factor = Decimal(current_house_factor) + Decimal(1.5)