Files
eamco_office_api/app/service/views.py
2025-08-21 17:53:25 -04:00

107 lines
4.9 KiB
Python

from flask import request, jsonify
from app.service import service
from app import db
from datetime import datetime, date
from app.classes.customer import (Customer_Customer)
from app.classes.service import (Service_Service,
Service_Service_schema
)
# --- NEW ENDPOINT TO GET ALL SERVICE CALLS FOR THE MASTER CALENDAR ---
@service.route("/all", methods=["GET"])
def get_all_service_calls():
"""
Fetches ALL service calls from the database and formats them for FullCalendar.
"""
# 1. Query all service records, without filtering by customer
all_services = Service_Service.query.all()
# 2. Reuse the same formatting logic (colors, titles, etc.)
color_map = {
0: {"backgroundColor": "blue", "textColor": "white"},
1: {"backgroundColor": "red", "textColor": "white"},
2: {"backgroundColor": "green", "textColor": "white"},
3: {"backgroundColor": "yellow", "textColor": "black"},
4: {"backgroundColor": "black", "textColor": "white"}
}
service_type_map = {0: 'Tune-up', 1: 'No Heat', 2: 'Fix', 3: 'Tank Install', 4: 'Other'}
calendar_events = []
for service_record in all_services:
service_type_text = service_type_map.get(service_record.type_service_call, 'Service')
# The title now includes the customer name, which is crucial for a master calendar
event_title = f"{service_type_text}: {service_record.customer_name}"
event_colors = color_map.get(service_record.type_service_call, {"backgroundColor": "gray", "textColor": "white"})
# Use the schema to correctly format the date to a string
serialized_record = Service_Service_schema().dump(service_record)
event_data = {
"id": service_record.id,
"title": event_title,
"start": serialized_record.get('scheduled_date'), # Use the reliable formatted date
"end": None,
"extendedProps": {
"description": service_record.description,
"type_service_call": service_record.type_service_call,
},
"backgroundColor": event_colors.get("backgroundColor"),
"textColor": event_colors.get("textColor"),
"borderColor": event_colors.get("backgroundColor")
}
calendar_events.append(event_data)
return jsonify(calendar_events), 200
# --- YOUR OTHER EXISTING ROUTES (no changes needed below) ---
@service.route("/upcoming", methods=["GET"])
def get_upcoming_service_calls():
# ... (no changes)
now = datetime.now()
upcoming_services = (Service_Service.query.filter(Service_Service.scheduled_date >= now).order_by(Service_Service.scheduled_date.asc()).limit(100).all())
service_schema = Service_Service_schema(many=True)
result = service_schema.dump(upcoming_services)
return jsonify(result), 200
@service.route("/update/<int:id>", methods=["PUT"])
def update_service_call(id):
# ... (no changes)
service_record = Service_Service.query.get_or_404(id)
data = request.get_json()
if not data: return jsonify({"error": "No data provided"}), 400
scheduled_date_str = data.get('scheduled_date')
if scheduled_date_str: service_record.scheduled_date = datetime.strptime(scheduled_date_str, '%Y-%m-%d')
service_record.type_service_call = data.get('type_service_call', service_record.type_service_call)
service_record.description = data.get('description', service_record.description)
try:
db.session.commit()
service_schema = Service_Service_schema(many=False)
return jsonify({"ok": True, "service": service_schema.dump(service_record)}), 200
except Exception as e:
db.session.rollback()
return jsonify({"error": str(e)}), 500
@service.route("/create", methods=["POST"])
def create_service_call():
# ... (no changes)
data = request.get_json()
cus_id=data.get('customer_id')
get_customer = (db.session.query(Customer_Customer).filter(Customer_Customer.id == cus_id).first())
if not get_customer: return jsonify({"error": f"Customer with id {cus_id} not found."}), 404
scheduled_date_str = data.get('expected_delivery_date').split('T')[0]
scheduled_date_obj = datetime.strptime(scheduled_date_str, '%Y-%m-%d')
new_service_call = Service_Service(
customer_id=get_customer.id, customer_name=get_customer.customer_first_name + ' ' + get_customer.customer_last_name,
customer_address=get_customer.customer_address, customer_town=get_customer.customer_town,
customer_state=get_customer.customer_state, customer_zip=get_customer.customer_zip,
type_service_call=data.get('type_service_call'), when_ordered=datetime.utcnow(),
scheduled_date=scheduled_date_obj, description=data.get('description'),
)
db.session.add(new_service_call)
db.session.commit()
return jsonify({ "ok": True, "id": new_service_call.id }), 201
# ... (and so on for your other routes) ...