warehouse.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from typing import List, Optional
  3. import db
  4. import schemas
  5. from dependencies import require_admin
  6. import services.event_hooks as event_hooks
  7. router = APIRouter(prefix="/admin/warehouse", tags=["warehouse"])
  8. @router.get("/stock", response_model=dict)
  9. async def get_warehouse_stock(
  10. page: int = Query(1, ge=1),
  11. size: int = Query(50, ge=1, le=100),
  12. material_id: Optional[int] = None,
  13. admin: dict = Depends(require_admin)
  14. ):
  15. offset = (page - 1) * size
  16. query = """
  17. SELECT w.*, m.name_en as material_name_en
  18. FROM warehouse_stock w
  19. JOIN materials m ON w.material_id = m.id
  20. """
  21. params = []
  22. if material_id:
  23. query += " WHERE w.material_id = %s"
  24. params.append(material_id)
  25. query += " ORDER BY w.created_at DESC LIMIT %s OFFSET %s"
  26. params.extend([size, offset])
  27. stock = db.execute_query(query, tuple(params))
  28. count_query = "SELECT COUNT(*) as total FROM warehouse_stock"
  29. if material_id:
  30. count_query += " WHERE material_id = %s"
  31. total_res = db.execute_query(count_query, (material_id,))
  32. else:
  33. total_res = db.execute_query(count_query)
  34. return {
  35. "stock": stock,
  36. "total": total_res[0]['total'] if total_res else 0,
  37. "page": page,
  38. "size": size
  39. }
  40. @router.post("/stock", response_model=dict)
  41. async def add_stock_item(
  42. data: schemas.WarehouseItemCreate,
  43. admin: dict = Depends(require_admin)
  44. ):
  45. query = """
  46. INSERT INTO warehouse_stock (material_id, color_name, quantity, notes, is_active)
  47. VALUES (%s, %s, %s, %s, %s)
  48. """
  49. params = (data.material_id, data.color_name, data.quantity, data.notes, data.is_active)
  50. item_id = db.execute_commit(query, params)
  51. if not item_id:
  52. raise HTTPException(status_code=500, detail="Failed to add stock item")
  53. return {"id": item_id, "message": "Stock item added successfully"}
  54. @router.patch("/stock/{item_id}", response_model=dict)
  55. async def update_stock_item(
  56. item_id: int,
  57. data: schemas.WarehouseItemUpdate,
  58. admin: dict = Depends(require_admin)
  59. ):
  60. update_fields = []
  61. params = []
  62. if data.quantity is not None:
  63. update_fields.append("quantity = %s")
  64. params.append(data.quantity)
  65. if data.notes is not None:
  66. update_fields.append("notes = %s")
  67. params.append(data.notes)
  68. if data.is_active is not None:
  69. update_fields.append("is_active = %s")
  70. params.append(data.is_active)
  71. if not update_fields:
  72. raise HTTPException(status_code=400, detail="No fields to update")
  73. query = f"UPDATE warehouse_stock SET {', '.join(update_fields)} WHERE id = %s"
  74. params.append(item_id)
  75. db.execute_commit(query, tuple(params))
  76. return {"message": "Stock item updated successfully"}
  77. @router.delete("/stock/{item_id}", response_model=dict)
  78. async def delete_stock_item(
  79. item_id: int,
  80. admin: dict = Depends(require_admin)
  81. ):
  82. query = "DELETE FROM warehouse_stock WHERE id = %s"
  83. db.execute_commit(query, (item_id,))
  84. return {"message": "Stock item deleted successfully"}