128 lines
4.6 KiB
Python
128 lines
4.6 KiB
Python
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"}
|