from fastapi import APIRouter, Request from datetime import date 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.pricing import Pricing_Oil_Oil from app.script.update_auto import calc_home_factor router = APIRouter( prefix="/confirm", tags=["confirm"], responses={404: {"description": "Not found"}}, ) @router.put("/auto/update/{autoid}") async def update_auto(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()) 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) gallons_left_buffer = int(get_auto_delivery.tank_size) - 30 get_auto_delivery.house_factor = new_home_factor get_auto_delivery.tank_height = 'Full' get_auto_delivery.last_fill = date.today() get_auto_delivery.estimated_gallons_left = gallons_left_buffer get_auto_delivery.estimated_gallons_left_prev_day = gallons_left_buffer get_auto_delivery.auto_status = 1 get_auto_delivery.days_since_last_fill = 0 # Update the associated ticket if it exists if get_auto_delivery.open_ticket_id is not None: get_ticket = (session .query(Tickets_Auto_Delivery) .filter(Tickets_Auto_Delivery.id == get_auto_delivery.open_ticket_id) .first()) if get_ticket: get_ticket.gallons_delivered = gallons_delivered get_ticket.total_amount_customer = get_ticket.price_per_gallon * gallons_delivered session.add(get_ticket) 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) payment_type = request_body.get('payment_type') payment_card_id = request_body.get('payment_card_id') payment_status = request_body.get('payment_status') 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, fill_date = date.today(), payment_type = payment_type, payment_card_id = payment_card_id, payment_status = payment_status, ) session.add(create_new_ticket) session.flush() # Generate the ID for create_new_ticket # Update the auto_delivery with the open ticket id get_auto_delivery.open_ticket_id = create_new_ticket.id session.add(get_auto_delivery) session.commit() # Commit all changes in one transaction return ({ "ok": True, "auto_ticket_id":create_new_ticket.id }), 200 @router.put("/auto/close_ticket/{ticket_id}") async def close_ticket(ticket_id: int): """ Close an auto ticket by updating payment_status to 3 and setting open_ticket_id to None on the auto delivery. """ ticket = session.query(Tickets_Auto_Delivery).filter(Tickets_Auto_Delivery.id == ticket_id).first() if ticket: ticket.payment_status = 3 session.add(ticket) delivery = session.query(Auto_Delivery).filter(Auto_Delivery.open_ticket_id == ticket_id).first() if delivery: delivery.open_ticket_id = None session.add(delivery) session.commit() return {"ok": True}, 200 @router.delete("/auto/delete_ticket/{ticket_id}") async def delete_ticket(ticket_id: int): """ Delete an auto ticket and remove its reference from the associated auto delivery. Used when authorization fails and the ticket needs to be cleaned up. """ ticket = session.query(Tickets_Auto_Delivery).filter(Tickets_Auto_Delivery.id == ticket_id).first() if ticket: session.delete(ticket) delivery = session.query(Auto_Delivery).filter(Auto_Delivery.open_ticket_id == ticket_id).first() if delivery: delivery.open_ticket_id = None session.add(delivery) session.commit() return {"ok": True}, 200