autos working!

This commit is contained in:
2024-11-20 18:00:33 -05:00
parent 7c9b7f8998
commit 8569430468
8 changed files with 273 additions and 276 deletions

View File

@@ -1,12 +1,22 @@
from sqlalchemy import (Column, Integer, from sqlalchemy import (Column, Integer,
DECIMAL, TEXT, DECIMAL, TEXT,
VARCHAR, TIMESTAMP, DATE, INTEGER) VARCHAR, DATE, INTEGER)
from datetime import datetime from datetime import datetime
from database import Base 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): class Auto_Temp(Base):
__tablename__ = 'auto_temp' __tablename__ = 'auto_temp'
@@ -16,7 +26,7 @@ class Auto_Temp(Base):
autoincrement=True, autoincrement=True,
unique=False) unique=False)
todays_date = Column(TIMESTAMP(), default=datetime.utcnow()) todays_date = Column(DATE)
temp = Column(DECIMAL(5, 2)) temp = Column(DECIMAL(5, 2))
temp_max = Column(DECIMAL(5, 2)) temp_max = Column(DECIMAL(5, 2))
temp_min = Column(DECIMAL(5, 2)) temp_min = Column(DECIMAL(5, 2))
@@ -40,11 +50,37 @@ class Auto_Delivery(Base):
customer_address = Column(VARCHAR(1000)) customer_address = Column(VARCHAR(1000))
customer_zip = Column(VARCHAR(25)) customer_zip = Column(VARCHAR(25))
customer_full_name = Column(VARCHAR(250)) customer_full_name = Column(VARCHAR(250))
last_fill = Column(TIMESTAMP()) last_fill = Column(DATE())
last_updated = Column(TIMESTAMP()) days_since_last_fill = Column(INTEGER())
estimated_gallons_left = Column(INTEGER()) last_updated = Column(DATE())
estimated_gallons_left_prev_day = Column(INTEGER()) estimated_gallons_left = Column(DECIMAL(6, 2))
estimated_gallons_left_prev_day = Column(DECIMAL(6, 2))
tank_height = Column(VARCHAR(25)) tank_height = Column(VARCHAR(25))
tank_size = Column(VARCHAR(25)) tank_size = Column(VARCHAR(25))
house_factor = Column(DECIMAL(5, 2)) house_factor = Column(DECIMAL(5, 2))
auto_status = Column(INTEGER()) 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))

View File

@@ -1,8 +1,8 @@
from sqlalchemy import (Column, Integer, from sqlalchemy import (Column, Integer,
DECIMAL, Text, BOOLEAN, DECIMAL, BOOLEAN, DATE,
VARCHAR, TIMESTAMP, VARCHAR,
Date, INTEGER) INTEGER)
from datetime import datetime, timezone from datetime import datetime, timezone
from database import Base from database import Base
@@ -16,7 +16,7 @@ class Card_Card(Base):
primary_key=True, primary_key=True,
autoincrement=True, autoincrement=True,
unique=False) unique=False)
date_added = Column(TIMESTAMP(), default=datetime.utcnow()) date_added = Column(DATE())
user_id = Column(INTEGER()) user_id = Column(INTEGER())
card_number = Column(VARCHAR(50)) card_number = Column(VARCHAR(50))
last_four_digits = Column(INTEGER()) last_four_digits = Column(INTEGER())

View File

@@ -1,7 +1,7 @@
from sqlalchemy import (Column, Integer, from sqlalchemy import (Column, Integer,
DECIMAL, Text, DECIMAL,
VARCHAR, TIMESTAMP, VARCHAR,
Date, INTEGER) DATE, INTEGER)
from datetime import datetime, timezone from datetime import datetime, timezone
from database import Base from database import Base
@@ -20,7 +20,7 @@ class Customer_Customer(Base):
customer_town = Column(VARCHAR(140)) customer_town = Column(VARCHAR(140))
customer_state = Column(INTEGER) customer_state = Column(INTEGER)
customer_zip = Column(VARCHAR(25)) customer_zip = Column(VARCHAR(25))
customer_first_call = Column(TIMESTAMP()) customer_first_call = Column(DATE())
customer_email = Column(VARCHAR(500)) customer_email = Column(VARCHAR(500))
customer_automatic = Column(INTEGER) customer_automatic = Column(INTEGER)
customer_phone_number = Column(VARCHAR(25)) customer_phone_number = Column(VARCHAR(25))

View File

@@ -26,8 +26,8 @@ class Delivery(Base):
customer_filled = Column(INTEGER) customer_filled = Column(INTEGER)
delivery_status = Column(INTEGER) delivery_status = Column(INTEGER)
when_ordered = Column(TIMESTAMP(), default=datetime.datetime.utcnow()) when_ordered = Column(DATE(), )
when_delivered = Column(TIMESTAMP(), default=None) when_delivered = Column(DATE())
expected_delivery_date = Column(DATE(), default=None) expected_delivery_date = Column(DATE(), default=None)
automatic = Column(INTEGER) automatic = Column(INTEGER)
automatic_id = Column(INTEGER) automatic_id = Column(INTEGER)

View File

@@ -1,11 +1,13 @@
from fastapi import APIRouter, Request from fastapi import APIRouter, Request
from datetime import datetime from datetime import date
from database import session from database import session
from pyowm import OWM from pyowm import OWM
from decimal import Decimal 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.script.update_auto import calc_home_factor from app.script.update_auto import calc_home_factor
@@ -16,26 +18,17 @@ router = APIRouter(
) )
@router.put("/delivery") @router.put("/auto/update/{autoid}")
async def add_delivery(request: Request): async def update_auto(autoid: int, request: Request):
now = datetime.utcnow
request_body = await request.json() request_body = await request.json()
gallons_delivered = request_body['gallons'] gallons_delivered = request_body['gallons_delivered']
gallons_delivered = Decimal(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 get_auto_delivery = (session
.query(Auto_Delivery) .query(Auto_Delivery)
.filter(Auto_Delivery.customer_id == get_delivery.customer_id) .filter(Auto_Delivery.id == autoid)
.first()) .first())
gallons_put_in_home = Decimal(gallons_delivered) 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, new_home_factor = calc_home_factor(gallons_put_in_home = gallons_put_in_home,
current_house_factor=customer_home_factor) current_house_factor=customer_home_factor)
get_auto_delivery.house_factor = new_home_factor get_auto_delivery.house_factor = new_home_factor
get_auto_delivery.tank_height = 'Full' 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 = 240
get_auto_delivery.estimated_gallons_left_prev_day = 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.add(get_auto_delivery)
session.commit() session.commit()
return ({"ok": True}), 200 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

View File

@@ -1,15 +1,10 @@
from fastapi import APIRouter, Request from fastapi import APIRouter, Request, Depends
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder from fastapi.encoders import jsonable_encoder
from datetime import datetime
from database import session from database import session
from pyowm import OWM
from decimal import Decimal from app.models.auto import Auto_Delivery, Tickets_Auto_Delivery
from app.models.auto import Auto_Delivery
from app.models.delivery import 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"}}, 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) @router.get("/driver/{driver_employee_id}", status_code=200)
def get_delivery_for_specific_driver(driver_employee_id: int): def get_delivery_for_specific_driver(driver_employee_id: int):
automatics = ( automatics = (
@@ -32,13 +43,12 @@ def get_delivery_for_specific_driver(driver_employee_id: int):
return JSONResponse(content=jsonable_encoder(automatics), status_code=200) return JSONResponse(content=jsonable_encoder(automatics), status_code=200)
@router.get("/{auto_id}", status_code=200)
@router.get("/{delivery_id_order}", status_code=200) def get_auto(auto_id):
def get_delivery(delivery_id_order):
get_delivery = ( get_delivery = (
session.query(Auto_Delivery) session.query(Auto_Delivery)
.filter(Auto_Delivery.id == delivery_id_order) .filter(Auto_Delivery.id == auto_id)
.first() .first()
) )
@@ -46,128 +56,15 @@ def get_delivery(delivery_id_order):
@router.get("/all/customers", status_code=200) @router.get("/delivery/{delivery_id_order}", status_code=200)
def get_delivery_customers(): def get_delivery(delivery_id_order):
# auto = ( get_delivery = (
# session.query(Auto_Delivery) session.query(Tickets_Auto_Delivery)
# .order_by(Auto_Delivery.estimated_gallons_left.desc()) .filter(Tickets_Auto_Delivery.id == delivery_id_order)
# .first() .first()
# )
# auto.id = auto.id
# session.add(auto)
# session.flush()
automatics = (
session.query(Auto_Delivery)
.order_by(Auto_Delivery.estimated_gallons_left.desc())
.all()
) )
return JSONResponse(content=jsonable_encoder(get_delivery), status_code=200)
return JSONResponse(content=jsonable_encoder(automatics), 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,
})

View File

@@ -1,9 +1,9 @@
from fastapi import APIRouter, Request from fastapi import APIRouter, Request
from datetime import datetime from datetime import datetime, date
from database import session from database import session
from pyowm import OWM 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 from app.models.delivery import Delivery
@@ -15,99 +15,145 @@ router = APIRouter(
responses={404: {"description": "Not found"}}, responses={404: {"description": "Not found"}},
) )
def Average(lst):
return sum(lst) / len(lst)
@router.get("/update", status_code=200) @router.get("/update", status_code=200)
def update_auto_customers(): def update_auto_customers():
try:
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
# times temp factory by house factor see_if_autos_updated = (session.query(Auto_Update)
gallon_use_today = f.house_factor * use_day .filter(Auto_Update.last_updated == date.today())
.first()
)
except:
session.rollback()
see_if_autos_updated = None
# get estimated gallons left if see_if_autos_updated is not None:
get_gallons_left = f.estimated_gallons_left_prev_day - gallon_use_today 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 for f in auto_customers:
f.estimated_gallons_left_prev_day = f.estimated_gallons_left + gallon_use_today
# 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() session.commit()
return ({"ok": True}), 200 return ({"ok": True}), 200
@router.get("/temp", status_code=200) @router.get("/temp", status_code=200)
def update_temp(): def update_temp():
try:
temps = [] see_if_temp_exists = (session.query(Auto_Temp)
.filter(Auto_Temp.todays_date == date.today())
owm = OWM('21648d8c8d1a4ae495ace0b7810b4d36') .first())
mgr = owm.weather_manager() except:
see_if_temp_exists = None
# Search for current weather in London (Great Britain) and get details if see_if_temp_exists is not None:
observation = mgr.weather_at_place('Worcester, US') return ({"ok": True}), 200
w = observation.weather else:
temps = []
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()
return ({"ok": True}), 200 owm = OWM('21648d8c8d1a4ae495ace0b7810b4d36')
mgr = owm.weather_manager()
def Average(lst): # Search for current weather in London (Great Britain) and get details
return sum(lst) / len(lst) 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

View File

@@ -1,40 +1,13 @@
from decimal import Decimal from decimal import Decimal
from datetime import datetime
from database import session 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): 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) customer_home_factor = Decimal(current_house_factor) + Decimal(1)
elif 170.01 <= gallons_put_in_home <= 200: elif 170.01 <= gallons_put_in_home <= 200:
customer_home_factor = Decimal(current_house_factor) + Decimal(1.5) customer_home_factor = Decimal(current_house_factor) + Decimal(1.5)