Major Refactor
This commit is contained in:
@@ -17,116 +17,86 @@ from app.classes.promo import Promo_Promo
|
||||
from app.classes.stats_customer import Stats_Customer
|
||||
from app.classes.auto import Tickets_Auto_Delivery, Tickets_Auto_Delivery_schema
|
||||
|
||||
|
||||
# This endpoint is fine, but I've added some comments for clarity.
|
||||
@delivery.route("/updatestatus", methods=["GET"])
|
||||
def move_deliveries():
|
||||
"""
|
||||
This will get deliveries not done
|
||||
Batch updates delivery statuses based on their expected delivery date relative to today.
|
||||
- Today's deliveries -> "Out for Delivery" (2)
|
||||
- Tomorrow's deliveries -> "Scheduled for Tomorrow" (3)
|
||||
- Future deliveries -> "Waiting" (0)
|
||||
- Past-due deliveries -> "Pending" (9)
|
||||
"""
|
||||
counter = 0
|
||||
today = date.today()
|
||||
deliveries_today = (db.session
|
||||
.query(Delivery_Delivery)
|
||||
.filter(Delivery_Delivery.delivery_status != 10)
|
||||
.filter(Delivery_Delivery.delivery_status != 5)
|
||||
.filter(Delivery_Delivery.delivery_status != 1)
|
||||
.filter(Delivery_Delivery.expected_delivery_date == today)
|
||||
.all())
|
||||
for f in deliveries_today:
|
||||
if f.delivery_status != 2:
|
||||
f.delivery_status = 2
|
||||
db.session.add(f)
|
||||
counter = counter + 1
|
||||
tomorrow = today + timedelta(days=1)
|
||||
|
||||
# Update statuses for deliveries scheduled for today
|
||||
deliveries_today = db.session.query(Delivery_Delivery).filter(
|
||||
Delivery_Delivery.delivery_status.notin_([1, 5, 10]), # Not cancelled, issue, or finalized
|
||||
Delivery_Delivery.expected_delivery_date == today,
|
||||
Delivery_Delivery.delivery_status != 2 # Avoid redundant updates
|
||||
).all()
|
||||
for delivery_item in deliveries_today:
|
||||
delivery_item.delivery_status = 2
|
||||
db.session.add(delivery_item)
|
||||
counter += 1
|
||||
|
||||
tomm = date.today() + timedelta(days=1)
|
||||
deliveries_tom = (db.session
|
||||
.query(Delivery_Delivery)
|
||||
.filter(Delivery_Delivery.delivery_status != 10)
|
||||
.filter(Delivery_Delivery.delivery_status != 5)
|
||||
.filter(Delivery_Delivery.delivery_status != 1)
|
||||
.filter(Delivery_Delivery.expected_delivery_date == tomm)
|
||||
.all())
|
||||
for g in deliveries_tom:
|
||||
if g.delivery_status != 3:
|
||||
g.delivery_status = 3
|
||||
db.session.add(g)
|
||||
counter = counter + 1
|
||||
|
||||
|
||||
|
||||
deliveries_waiting = (db.session
|
||||
.query(Delivery_Delivery)
|
||||
.filter(Delivery_Delivery.delivery_status != 10)
|
||||
.filter(Delivery_Delivery.delivery_status != 5)
|
||||
.filter(Delivery_Delivery.delivery_status != 1)
|
||||
.filter(Delivery_Delivery.expected_delivery_date != tomm)
|
||||
.filter(Delivery_Delivery.expected_delivery_date > today)
|
||||
.all())
|
||||
for r in deliveries_waiting:
|
||||
if r.delivery_status != 0:
|
||||
r.delivery_status = 0
|
||||
db.session.add(r)
|
||||
counter = counter + 1
|
||||
|
||||
|
||||
deliveries_pending = (db.session
|
||||
.query(Delivery_Delivery)
|
||||
.filter(Delivery_Delivery.delivery_status != 10)
|
||||
.filter(Delivery_Delivery.delivery_status != 5)
|
||||
.filter(Delivery_Delivery.delivery_status != 1)
|
||||
.filter(Delivery_Delivery.expected_delivery_date < today)
|
||||
.all())
|
||||
for t in deliveries_pending:
|
||||
if t.delivery_status != 9:
|
||||
t.delivery_status = 9
|
||||
db.session.add(t)
|
||||
counter = counter + 1
|
||||
# Update statuses for deliveries scheduled for tomorrow
|
||||
deliveries_tomorrow = db.session.query(Delivery_Delivery).filter(
|
||||
Delivery_Delivery.delivery_status.notin_([1, 5, 10]),
|
||||
Delivery_Delivery.expected_delivery_date == tomorrow,
|
||||
Delivery_Delivery.delivery_status != 3
|
||||
).all()
|
||||
for delivery_item in deliveries_tomorrow:
|
||||
delivery_item.delivery_status = 3
|
||||
db.session.add(delivery_item)
|
||||
counter += 1
|
||||
|
||||
# Update statuses for future deliveries (after tomorrow)
|
||||
deliveries_waiting = db.session.query(Delivery_Delivery).filter(
|
||||
Delivery_Delivery.delivery_status.notin_([1, 5, 10]),
|
||||
Delivery_Delivery.expected_delivery_date > tomorrow,
|
||||
Delivery_Delivery.delivery_status != 0
|
||||
).all()
|
||||
for delivery_item in deliveries_waiting:
|
||||
delivery_item.delivery_status = 0
|
||||
db.session.add(delivery_item)
|
||||
counter += 1
|
||||
|
||||
# Update statuses for deliveries that are past their expected date
|
||||
deliveries_pending = db.session.query(Delivery_Delivery).filter(
|
||||
Delivery_Delivery.delivery_status.notin_([1, 5, 10]),
|
||||
Delivery_Delivery.expected_delivery_date < today,
|
||||
Delivery_Delivery.delivery_status != 9
|
||||
).all()
|
||||
for delivery_item in deliveries_pending:
|
||||
delivery_item.delivery_status = 9
|
||||
db.session.add(delivery_item)
|
||||
counter += 1
|
||||
|
||||
if counter > 0:
|
||||
db.session.commit()
|
||||
return jsonify({
|
||||
"ok": True,
|
||||
'update': True,
|
||||
}), 200
|
||||
|
||||
return jsonify({"ok": True}), 200
|
||||
return jsonify({"ok": True, 'update': True}), 200
|
||||
|
||||
return jsonify({"ok": True, 'update': False}), 200
|
||||
|
||||
|
||||
@delivery.route("/<int:delivery_id>", methods=["GET"])
|
||||
def get_a_delivery(delivery_id):
|
||||
"""
|
||||
Get a single delivery's details.
|
||||
"""
|
||||
get_delivery = db.session\
|
||||
.query(Delivery_Delivery)\
|
||||
.filter(Delivery_Delivery.id == delivery_id)\
|
||||
.first()
|
||||
|
||||
return jsonify({
|
||||
"ok": True,
|
||||
'delivery': {
|
||||
'id': get_delivery.id,
|
||||
'customer_id': get_delivery.customer_id,
|
||||
'delivery_expected_delivery_date': str(get_delivery.expected_delivery_date),
|
||||
'delivery_asked_for_fill': get_delivery.customer_asked_for_fill,
|
||||
'delivery_gallons_ordered': get_delivery.gallons_ordered,
|
||||
'dispatcher_notes_taken': get_delivery.dispatcher_notes,
|
||||
'delivery_prime': get_delivery.prime,
|
||||
'delivery_emergency': get_delivery.emergency,
|
||||
'delivery_same_day': get_delivery.same_day,
|
||||
'when_ordered': str(get_delivery.when_ordered),
|
||||
'customer_price': get_delivery.customer_price,
|
||||
'delivery_status': get_delivery.delivery_status,
|
||||
'payment_type': get_delivery.payment_type,
|
||||
'payment_card_id': get_delivery.payment_card_id,
|
||||
'driver_employee_id': get_delivery.driver_employee_id,
|
||||
'driver_first_name': get_delivery.driver_first_name,
|
||||
'driver_last_name': get_delivery.driver_last_name,
|
||||
'promo_id': get_delivery.promo_id,
|
||||
'promo_money_discount': get_delivery.promo_money_discount,
|
||||
|
||||
},
|
||||
}), 200
|
||||
get_delivery = db.session.query(Delivery_Delivery).filter(Delivery_Delivery.id == delivery_id).first()
|
||||
if not get_delivery:
|
||||
return jsonify({"ok": False, "error": "Delivery not found"}), 404
|
||||
|
||||
# Using the schema is cleaner and less error-prone than building a manual dictionary.
|
||||
delivery_schema = Delivery_Delivery_schema(many=False)
|
||||
return jsonify({"ok": True, "delivery": delivery_schema.dump(get_delivery)}), 200
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -173,11 +143,13 @@ def get_customer_auto_delivery(customer_id):
|
||||
|
||||
@delivery.route("/order/<int:delivery_id>", methods=["GET"])
|
||||
def get_a_specific_delivery(delivery_id):
|
||||
|
||||
get_delivery = db.session\
|
||||
.query(Delivery_Delivery)\
|
||||
.filter(Delivery_Delivery.id == delivery_id)\
|
||||
.first()
|
||||
"""
|
||||
Get a single delivery by its ID.
|
||||
"""
|
||||
get_delivery = db.session.query(Delivery_Delivery).filter(Delivery_Delivery.id == delivery_id).first()
|
||||
if not get_delivery:
|
||||
return jsonify({"error": "Delivery not found"}), 404
|
||||
|
||||
delivery_schema = Delivery_Delivery_schema(many=False)
|
||||
return jsonify(delivery_schema.dump(get_delivery))
|
||||
|
||||
@@ -492,172 +464,97 @@ def get_deliveries_today():
|
||||
@delivery.route("/edit/<int:delivery_id>", methods=["POST"])
|
||||
def edit_a_delivery(delivery_id):
|
||||
"""
|
||||
This will edit a delivery using a delivery id
|
||||
This will edit a delivery using a delivery id.
|
||||
"""
|
||||
get_delivery = db.session \
|
||||
.query(Delivery_Delivery) \
|
||||
.filter(Delivery_Delivery.id == delivery_id) \
|
||||
.first()
|
||||
|
||||
|
||||
get_customer = db.session \
|
||||
.query(Customer_Customer) \
|
||||
.filter(Customer_Customer.id == get_delivery.customer_id) \
|
||||
.first()
|
||||
|
||||
get_today_price = db.session\
|
||||
.query(Pricing_Oil_Oil)\
|
||||
.order_by(Pricing_Oil_Oil.id.desc())\
|
||||
.first()
|
||||
data = request.json
|
||||
get_delivery = db.session.query(Delivery_Delivery).filter(Delivery_Delivery.id == delivery_id).first()
|
||||
|
||||
if not get_delivery:
|
||||
return jsonify({"error": False}), 200
|
||||
else:
|
||||
gallons_ordered = request.json["gallons_ordered"]
|
||||
delivery_status = request.json["delivery_status"]
|
||||
when_to_deliver = request.json["expected_delivery_date"]
|
||||
when_ordered = request.json["created_delivery_date"]
|
||||
customer_wants_fill = request.json["customer_asked_for_fill"]
|
||||
card_payment = request.json["credit"]
|
||||
cash_payment = request.json["cash"]
|
||||
emergency_info = request.json["emergency"]
|
||||
dispatcher_notes = request.json["dispatcher_notes_taken"]
|
||||
return jsonify({"ok": False, "error": "Delivery not found"}), 404
|
||||
|
||||
delivery_driver_id = request.json["driver_employee_id"]
|
||||
# --- Fetch related data ---
|
||||
get_customer = db.session.query(Customer_Customer).filter(Customer_Customer.id == get_delivery.customer_id).first()
|
||||
if not get_customer:
|
||||
return jsonify({"ok": False, "error": "Associated customer not found"}), 404
|
||||
|
||||
get_driver = (db.session
|
||||
.query(Employee_Employee)
|
||||
.filter(Employee_Employee.id == delivery_driver_id)
|
||||
.first())
|
||||
get_today_price = db.session.query(Pricing_Oil_Oil).order_by(Pricing_Oil_Oil.id.desc()).first()
|
||||
if not get_today_price:
|
||||
return jsonify({"ok": False, "error": "Pricing information not available"}), 500
|
||||
|
||||
# --- Process Form Input (using .get() for safety) ---
|
||||
get_delivery.gallons_ordered = data.get("gallons_ordered", get_delivery.gallons_ordered)
|
||||
get_delivery.delivery_status = data.get("delivery_status", get_delivery.delivery_status)
|
||||
get_delivery.expected_delivery_date = data.get("expected_delivery_date")
|
||||
get_delivery.when_ordered = data.get("created_delivery_date")
|
||||
get_delivery.dispatcher_notes = data.get("dispatcher_notes_taken", "")
|
||||
get_delivery.payment_type = data.get("payment_type", 0)
|
||||
|
||||
# Convert booleans to 1 or 0 for the database
|
||||
customer_wants_fill = 1 if data.get("customer_asked_for_fill") else 0
|
||||
get_delivery.customer_asked_for_fill = customer_wants_fill
|
||||
get_delivery.prime = 1 if data.get("prime") else 0
|
||||
get_delivery.same_day = 1 if data.get("same_day") else 0
|
||||
get_delivery.emergency = 1 if data.get("emergency") else 0
|
||||
|
||||
# --- Handle Driver Assignment ---
|
||||
driver_id = data.get("driver_employee_id")
|
||||
if driver_id:
|
||||
get_driver = db.session.query(Employee_Employee).filter(Employee_Employee.id == driver_id).first()
|
||||
if get_driver:
|
||||
get_delivery.driver_employee_id = get_driver.id
|
||||
get_delivery.driver_first_name = get_driver.employee_first_name
|
||||
get_delivery.driver_last_name = get_driver.employee_last_name
|
||||
else:
|
||||
# Optionally, handle the case where the driver ID is invalid
|
||||
# For now, we'll just not update the driver info.
|
||||
pass
|
||||
|
||||
# --- Handle Promotion ---
|
||||
promo_id = data.get("promo_id")
|
||||
if promo_id and promo_id != 0:
|
||||
get_promo = db.session.query(Promo_Promo).filter(Promo_Promo.id == promo_id).first()
|
||||
if get_promo:
|
||||
get_delivery.promo_id = get_promo.id
|
||||
get_delivery.promo_money_discount = get_promo.money_off_delivery
|
||||
else: # Clear promo if "No Promotion" is selected
|
||||
get_delivery.promo_id = None
|
||||
get_delivery.promo_money_discount = None
|
||||
|
||||
# --- Handle Credit Card Assignment ---
|
||||
card_id = data.get("credit_card_id")
|
||||
# Only assign card if payment type is Card (1) and a valid card_id is provided
|
||||
if get_delivery.payment_type == 1 and card_id:
|
||||
get_card = db.session.query(Card_Card).filter(Card_Card.id == card_id, Card_Card.user_id == get_customer.id).first()
|
||||
if get_card:
|
||||
get_delivery.payment_card_id = get_card.id
|
||||
else: # Clear card if payment is not by card
|
||||
get_delivery.payment_card_id = None
|
||||
|
||||
# --- Recalculate Pricing (This logic could be moved to a helper function) ---
|
||||
gallons_for_calc = 250 if customer_wants_fill else int(get_delivery.gallons_ordered)
|
||||
base_price = gallons_for_calc * get_today_price.price_for_customer
|
||||
|
||||
# Add fees
|
||||
total_price = base_price
|
||||
if get_delivery.prime:
|
||||
total_price += get_today_price.price_prime
|
||||
if get_delivery.same_day:
|
||||
total_price += get_today_price.price_same_day
|
||||
if get_delivery.emergency:
|
||||
total_price += get_today_price.price_emergency
|
||||
|
||||
## promo
|
||||
|
||||
try:
|
||||
if request.json["promo_id"]:
|
||||
promo_id = request.json["promo_id"]
|
||||
else:
|
||||
promo_id = None
|
||||
except:
|
||||
promo_id = None
|
||||
|
||||
if promo_id is not None:
|
||||
get_promo_data = (db.session
|
||||
.query(Promo_Promo)
|
||||
.filter(Promo_Promo.id == promo_id)
|
||||
.first())
|
||||
promo_id_get_delivery =get_promo_data.id,
|
||||
promo_money_discount_get_delivery = get_promo_data.money_off_delivery
|
||||
else:
|
||||
promo_id_get_delivery =None
|
||||
promo_money_discount_get_delivery = None
|
||||
get_delivery.total_price = base_price # Price before fees
|
||||
get_delivery.pre_charge_amount = total_price # Price including fees
|
||||
|
||||
# --- Commit Changes ---
|
||||
db.session.add(get_delivery)
|
||||
db.session.commit()
|
||||
|
||||
|
||||
if request.json["credit_card_id"]:
|
||||
card_payment_id = request.json["credit_card_id"]
|
||||
else:
|
||||
card_payment_id = None
|
||||
|
||||
|
||||
if card_payment_id is not None:
|
||||
get_card = (db.session
|
||||
.query(Card_Card)
|
||||
.filter(Card_Card.id == card_payment_id)
|
||||
.filter(Card_Card.user_id == get_customer.id)
|
||||
.first())
|
||||
card_id_from_customer = get_card.id
|
||||
else:
|
||||
card_id_from_customer = None
|
||||
|
||||
|
||||
if cash_payment is True and card_payment is False:
|
||||
delivery_payment_method = 0
|
||||
|
||||
elif card_payment is True and cash_payment is False:
|
||||
delivery_payment_method = 1
|
||||
|
||||
elif card_payment is True and cash_payment is True:
|
||||
delivery_payment_method = 2
|
||||
else:
|
||||
delivery_payment_method = 3
|
||||
|
||||
if customer_wants_fill is True:
|
||||
customer_wants_fill = 1
|
||||
gallons_ordered = 250
|
||||
else:
|
||||
customer_wants_fill = 0
|
||||
|
||||
same_day_info = request.json["same_day"]
|
||||
if same_day_info is True:
|
||||
same_day_info = 1
|
||||
else:
|
||||
same_day_info = 0
|
||||
|
||||
if emergency_info is True:
|
||||
emergency_asked = 1
|
||||
else:
|
||||
emergency_asked = 0
|
||||
|
||||
prime_info = request.json["prime"]
|
||||
if prime_info is True:
|
||||
prime_info = 1
|
||||
else:
|
||||
prime_info = 0
|
||||
|
||||
# Pricing
|
||||
|
||||
if customer_wants_fill == 1:
|
||||
# Fill
|
||||
precharge_amount = (250 * get_today_price.price_for_customer)
|
||||
else:
|
||||
# Gallons
|
||||
precharge_amount = int(gallons_ordered) * get_today_price.price_for_customer
|
||||
|
||||
|
||||
# if prime/emergency/sameday
|
||||
if same_day_info == 1 and prime_info == 0:
|
||||
total_precharge_amount = precharge_amount + get_today_price.price_same_day
|
||||
|
||||
elif prime_info == 1 and same_day_info == 0:
|
||||
total_precharge_amount = precharge_amount + get_today_price.price_prime
|
||||
|
||||
elif emergency_asked == 1:
|
||||
total_precharge_amount = precharge_amount + get_today_price.price_emergency
|
||||
|
||||
else:
|
||||
total_precharge_amount = precharge_amount + get_today_price.price_prime + get_today_price.price_same_day
|
||||
|
||||
|
||||
|
||||
get_delivery.dispatcher_notes = dispatcher_notes
|
||||
get_delivery.delivery_status = delivery_status
|
||||
get_delivery.gallons_ordered = gallons_ordered
|
||||
get_delivery.customer_asked_for_fill = customer_wants_fill
|
||||
get_delivery.expected_delivery_date = when_to_deliver
|
||||
get_delivery.when_ordered = when_ordered
|
||||
get_delivery.prime = prime_info
|
||||
get_delivery.same_day = same_day_info
|
||||
get_delivery.gallons_ordered = gallons_ordered
|
||||
get_delivery.payment_type = delivery_payment_method
|
||||
get_delivery.payment_card_id = card_id_from_customer
|
||||
get_delivery.driver_last_name = get_driver.employee_last_name
|
||||
get_delivery.driver_first_name = get_driver.employee_first_name
|
||||
get_delivery.driver_employee_id = get_driver.id
|
||||
get_delivery.promo_id = promo_id_get_delivery
|
||||
get_delivery.promo_money_discount = promo_money_discount_get_delivery
|
||||
|
||||
get_delivery.pre_charge_amount = total_precharge_amount
|
||||
get_delivery.total_price = precharge_amount
|
||||
|
||||
db.session.add(get_delivery)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
"ok": True,
|
||||
'customer': {
|
||||
'user_id': get_customer.id,
|
||||
},
|
||||
}), 200
|
||||
return jsonify({
|
||||
"ok": True,
|
||||
'message': f"Delivery {delivery_id} updated successfully.",
|
||||
'customer_id': get_customer.id # Keep this if the frontend uses it for navigation
|
||||
}), 200
|
||||
|
||||
|
||||
@delivery.route("/create/<int:user_id>", methods=["POST"])
|
||||
|
||||
Reference in New Issue
Block a user