Files
eamco_office_api/app/stats/views.py
2026-01-28 21:55:10 -05:00

232 lines
7.9 KiB
Python
Executable File

import logging
from flask import jsonify
from datetime import date
from app.stats import stats
import datetime
from app import db
from app.classes.delivery import Delivery_Delivery
from app.classes.stats_company import Stats_Company, Stats_Company_schema
from app.classes.stats_customer import Stats_Customer, Stats_Customer_schema
logger = logging.getLogger(__name__)
def get_monday_date(date_object):
"""Gets the date of the Monday for the given date."""
# Get the day of the week as an integer (0 = Monday, 6 = Sunday)
day_of_week = date_object.weekday()
# Calculate the number of days to subtract to get to Monday
days_to_monday = day_of_week - 0 # Monday is 0
# Subtract the days from the given date to get Monday's date
monday_date = date_object - datetime.timedelta(days=days_to_monday)
return monday_date
@stats.route("/calls/add", methods=["PUT"])
def total_calls_post():
logger.info("PUT /stats/calls/add - Incrementing call count")
total_calls_today = (db.session
.query(Stats_Company)
.filter(Stats_Company.expected_delivery_date == date.today())
.first())
current_call_count = total_calls_today.total_calls
new_call = current_call_count + 1
total_calls_today.total_calls = new_call
db.session.add(total_calls_today)
db.session.commit()
return jsonify({"ok": True,}), 200
@stats.route("/calls/count/today", methods=["GET"])
def total_calls_today():
logger.info("GET /stats/calls/count/today - Getting today's call count")
total_calls_today = (db.session
.query(Stats_Company)
.filter(Stats_Company.expected_delivery_date == date.today())
.count())
return jsonify({"ok": True,
'data': total_calls_today,
}), 200
@stats.route("/gallons/total/<int:driver_id>", methods=["GET"])
def total_gallons_delivered_driver(driver_id):
logger.info(f"GET /stats/gallons/total/{driver_id} - Calculating total gallons for driver")
gallons_list = []
total_gallons = db.session\
.query(Delivery_Delivery)\
.filter(Delivery_Delivery.driver_employee_id == driver_id)\
.all()
for f in total_gallons:
gallons_list.append(f.gallons_delivered)
sum_of_gallons = (sum(gallons_list))
return jsonify({"ok": True,
'data': sum_of_gallons,
}), 200
@stats.route("/delivery/total/<int:driver_id>", methods=["GET"])
def total_deliveries_driver(driver_id):
logger.info(f"GET /stats/delivery/total/{driver_id} - Counting total deliveries for driver")
total_stops = (db.session
.query(Delivery_Delivery)
.filter(Delivery_Delivery.driver_employee_id == driver_id)
.count())
return jsonify({"ok": True,
'data': total_stops,
}), 200
@stats.route("/primes/total/<int:driver_id>", methods=["GET"])
def total_primes_driver(driver_id):
logger.info(f"GET /stats/primes/total/{driver_id} - Counting prime deliveries for driver")
total_stops = (db.session
.query(Delivery_Delivery)
.filter(Delivery_Delivery.driver_employee_id == driver_id)
.filter(Delivery_Delivery.prime == 1)
.count())
return jsonify({"ok": True,
'data': total_stops,
}), 200
@stats.route("/delivery/count/today", methods=["GET"])
def total_deliveries_today():
logger.info("GET /stats/delivery/count/today - Counting today's deliveries")
total_stops = (db.session
.query(Delivery_Delivery)
.filter(Delivery_Delivery.expected_delivery_date == date.today())
.count())
return jsonify({"ok": True,
'data': total_stops,
}), 200
@stats.route("/delivery/count/delivered/today", methods=["GET"])
def total_deliveries_today_finished():
logger.info("GET /stats/delivery/count/delivered/today - Counting completed deliveries today")
total_stops = (db.session
.query(Delivery_Delivery)
.filter(Delivery_Delivery.expected_delivery_date == date.today())
.filter((Delivery_Delivery.delivery_status == 10))
.count())
return jsonify({"ok": True,
'data': total_stops,
}), 200
@stats.route("/user/<int:user_id>", methods=["GET"])
def get_user_stats(user_id):
"""
gets stats of user
"""
logger.info(f"GET /stats/user/{user_id} - Fetching user statistics")
get_user = db.session \
.query(Stats_Customer) \
.filter(Stats_Customer.customer_id == user_id) \
.first()
if get_user is None:
new_stats = Stats_Customer(
customer_id = user_id,
total_calls = 1,
service_calls_total = 0,
service_calls_total_spent = 0,
service_calls_total_profit = 0,
oil_deliveries = 0,
oil_total_gallons = 0,
oil_total_spent = 0,
oil_total_profit = 0,
)
db.session.add(new_stats)
db.session.commit()
get_user = db.session \
.query(Stats_Customer) \
.filter(Stats_Customer.customer_id == user_id) \
.first()
user_schema = Stats_Customer_schema(many=False)
return jsonify(user_schema.dump(get_user))
@stats.route("/user/lastdelivery/<int:user_id>", methods=["GET"])
def get_user_last_delivery(user_id):
"""
gets users last delivery. used on profile page
"""
logger.info(f"GET /stats/user/lastdelivery/{user_id} - Fetching user's last delivery date")
get_delivery= db.session \
.query(Delivery_Delivery) \
.filter(Delivery_Delivery.customer_id == user_id) \
.filter(Delivery_Delivery.delivery_status == 10) \
.order_by(Delivery_Delivery.id.desc())\
.first()
if get_delivery:
date_delivered = get_delivery.when_delivered
else:
date_delivered = "no deliveries on record"
return jsonify({"ok": True,
'date': str(date_delivered),
}), 200
@stats.route("/gallons/week", methods=["GET"])
def total_gallons_delivered_this_week():
logger.info("GET /stats/gallons/week - Calculating weekly gallons delivered")
# Get today's date
total_gallons = 0
today = datetime.date.today()
# Get the date of the Monday for today
monday = get_monday_date(today)
get_total = (db.session
.query(Delivery_Delivery)
.filter(Delivery_Delivery.when_delivered >= monday)
.filter(Delivery_Delivery.when_delivered <= today)
.all())
for f in get_total:
total_gallons = total_gallons + f.gallons_delivered
return jsonify({"ok": True,
'total': total_gallons,
}), 200
@stats.route("/gallons/check/total/<int:user_id>", methods=["GET"])
def calculate_gallons_user(user_id):
logger.info(f"GET /stats/gallons/check/total/{user_id} - Recalculating user total gallons")
# Get today's date
total_gallons = 0
# Get the date of the Monday for today
get_total = (db.session
.query(Delivery_Delivery)
.filter(Delivery_Delivery.customer_id == user_id)
.all())
get_user = db.session \
.query(Stats_Customer) \
.filter(Stats_Customer.customer_id == user_id) \
.first()
for f in get_total:
total_gallons = total_gallons + f.gallons_delivered
get_user.oil_total_gallons = total_gallons
db.session.add(get_user)
db.session.commit()
return jsonify({"ok": True,
}), 200