import logging from datetime import date from app.stats import stats import datetime from app import db from app.common.responses import success_response 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 success_response() @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 success_response({'data': total_calls_today}) @stats.route("/gallons/total/", 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 success_response({'data': sum_of_gallons}) @stats.route("/delivery/total/", 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 success_response({'data': total_stops}) @stats.route("/primes/total/", 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 success_response({'data': total_stops}) @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 success_response({'data': total_stops}) @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 success_response({'data': total_stops}) @stats.route("/user/", 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 success_response({"user_stats": user_schema.dump(get_user)}) @stats.route("/user/lastdelivery/", 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 success_response({'date': str(date_delivered)}) @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 success_response({'total': total_gallons}) @stats.route("/gallons/check/total/", 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 success_response()