from fastapi import APIRouter, HTTPException from pydantic import BaseModel, Field from typing import List, Optional from .db_manager import ( add_customer_to_db, update_customer_in_db, delete_customer_from_db, get_all_customers_from_db, get_customer_details_from_db, add_contact_to_db, update_contact_in_db, delete_contact_from_db, add_sales_activity_to_db, update_sales_activity_in_db, delete_sales_activity_from_db ) router = APIRouter(prefix="/customers", tags=["customers"]) # --- Pydantic Schemas --- class CustomerSchema(BaseModel): id: Optional[int] = None name_kr: str name_en: Optional[str] = None business_registration_number: Optional[str] = None contact_number: Optional[str] = None address: Optional[str] = None class ContactSchema(BaseModel): id: Optional[int] = None customer_id: int name: str email: Optional[str] = None phone_number: Optional[str] = None position: Optional[str] = None work_location: Optional[str] = None class SalesActivitySchema(BaseModel): id: Optional[int] = None customer_id: int contact_id: Optional[int] = None activity_date: str # YYYY-MM-DD activity_type: str memo: Optional[str] = None # --- Customers APIs --- @router.post("/", response_model=dict) def create_customer(customer: CustomerSchema): result = add_customer_to_db(customer.dict()) if result is None: raise HTTPException(status_code=500, detail="Failed to create customer") return {"id": result, "status": "success"} @router.put("/{customer_id}", response_model=dict) def update_customer(customer_id: int, customer: CustomerSchema): data = customer.dict() data['id'] = customer_id success = update_customer_in_db(data) if not success: raise HTTPException(status_code=500, detail="Failed to update customer") return {"status": "success"} @router.delete("/{customer_id}", response_model=dict) def delete_customer(customer_id: int): success = delete_customer_from_db(customer_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete customer") return {"status": "success"} @router.get("/", response_model=List[CustomerSchema]) def list_customers(): return get_all_customers_from_db() @router.get("/{customer_id}", response_model=dict) def get_customer_details(customer_id: int): details = get_customer_details_from_db(customer_id) if not details: raise HTTPException(status_code=404, detail="Customer not found") return details # --- Contacts APIs --- @router.post("/contacts", response_model=dict) def create_contact(contact: ContactSchema): result = add_contact_to_db(contact.dict()) if result is None: raise HTTPException(status_code=500, detail="Failed to create contact") return {"id": result, "status": "success"} @router.put("/contacts/{contact_id}", response_model=dict) def update_contact(contact_id: int, contact: ContactSchema): data = contact.dict() data['id'] = contact_id success = update_contact_in_db(data) if not success: raise HTTPException(status_code=500, detail="Failed to update contact") return {"status": "success"} @router.delete("/contacts/{contact_id}", response_model=dict) def delete_contact(contact_id: int): success = delete_contact_from_db(contact_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete contact") return {"status": "success"} # --- Sales Activities APIs --- @router.post("/activities", response_model=dict) def create_sales_activity(activity: SalesActivitySchema): result = add_sales_activity_to_db(activity.dict()) if result is None: raise HTTPException(status_code=500, detail="Failed to create sales activity") return {"id": result, "status": "success"} @router.put("/activities/{activity_id}", response_model=dict) def update_sales_activity(activity_id: int, activity: SalesActivitySchema): data = activity.dict() data['id'] = activity_id success = update_sales_activity_in_db(data) if not success: raise HTTPException(status_code=500, detail="Failed to update sales activity") return {"status": "success"} @router.delete("/activities/{activity_id}", response_model=dict) def delete_sales_activity(activity_id: int): success = delete_sales_activity_from_db(activity_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete sales activity") return {"status": "success"}