from fastapi import APIRouter, HTTPException from pydantic import BaseModel from typing import List, Optional from .db_manager import ( add_supplier_to_db, update_supplier_in_db, delete_supplier_from_db, get_all_suppliers_from_db, get_supplier_details_from_db, add_supplier_contact_to_db, update_supplier_contact_in_db, delete_supplier_contact_from_db, add_purchase_activity_to_db, update_purchase_activity_in_db, delete_purchase_activity_from_db ) router = APIRouter(prefix="/suppliers", tags=["suppliers"]) # --- Pydantic Schemas --- class SupplierSchema(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 SupplierContactSchema(BaseModel): id: Optional[int] = None supplier_id: int name: str email: Optional[str] = None phone_number: Optional[str] = None position: Optional[str] = None work_location: Optional[str] = None class PurchaseActivitySchema(BaseModel): id: Optional[int] = None supplier_id: int contact_id: Optional[int] = None activity_date: str # YYYY-MM-DD activity_type: str memo: Optional[str] = None # --- Suppliers APIs --- @router.post("/", response_model=dict) def create_supplier(supplier: SupplierSchema): result = add_supplier_to_db(supplier.dict()) if result is None: raise HTTPException(status_code=500, detail="Failed to create supplier") return {"id": result, "status": "success"} @router.put("/{supplier_id}", response_model=dict) def update_supplier(supplier_id: int, supplier: SupplierSchema): data = supplier.dict() data['id'] = supplier_id success = update_supplier_in_db(data) if not success: raise HTTPException(status_code=500, detail="Failed to update supplier") return {"status": "success"} @router.delete("/{supplier_id}", response_model=dict) def delete_supplier(supplier_id: int): success = delete_supplier_from_db(supplier_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete supplier") return {"status": "success"} @router.get("/", response_model=List[SupplierSchema]) def list_suppliers(): return get_all_suppliers_from_db() @router.get("/{supplier_id}", response_model=dict) def get_supplier_details(supplier_id: int): details = get_supplier_details_from_db(supplier_id) if not details: raise HTTPException(status_code=404, detail="Supplier not found") return details # --- Contacts APIs --- @router.post("/contacts", response_model=dict) def create_contact(contact: SupplierContactSchema): result = add_supplier_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: SupplierContactSchema): data = contact.dict() data['id'] = contact_id success = update_supplier_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_supplier_contact_from_db(contact_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete contact") return {"status": "success"} # --- Purchase Activities APIs --- @router.post("/activities", response_model=dict) def create_purchase_activity(activity: PurchaseActivitySchema): result = add_purchase_activity_to_db(activity.dict()) if result is None: raise HTTPException(status_code=500, detail="Failed to create purchase activity") return {"id": result, "status": "success"} @router.put("/activities/{activity_id}", response_model=dict) def update_purchase_activity(activity_id: int, activity: PurchaseActivitySchema): data = activity.dict() data['id'] = activity_id success = update_purchase_activity_in_db(data) if not success: raise HTTPException(status_code=500, detail="Failed to update purchase activity") return {"status": "success"} @router.delete("/activities/{activity_id}", response_model=dict) def delete_purchase_activity(activity_id: int): success = delete_purchase_activity_from_db(activity_id) if not success: raise HTTPException(status_code=500, detail="Failed to delete purchase activity") return {"status": "success"}