Create new services: inventory, recipes, suppliers

This commit is contained in:
Urtzi Alfaro
2025-08-13 17:39:35 +02:00
parent fbe7470ad9
commit 16b8a9d50c
151 changed files with 35799 additions and 857 deletions

View File

@@ -165,10 +165,10 @@ async def get_sales_analytics(
raise HTTPException(status_code=500, detail=f"Failed to get sales analytics: {str(e)}")
@router.get("/tenants/{tenant_id}/products/{product_name}/sales", response_model=List[SalesDataResponse])
@router.get("/tenants/{tenant_id}/inventory-products/{inventory_product_id}/sales", response_model=List[SalesDataResponse])
async def get_product_sales(
tenant_id: UUID = Path(..., description="Tenant ID"),
product_name: str = Path(..., description="Product name"),
inventory_product_id: UUID = Path(..., description="Inventory product ID"),
start_date: Optional[datetime] = Query(None, description="Start date filter"),
end_date: Optional[datetime] = Query(None, description="End date filter"),
current_tenant: str = Depends(get_current_tenant_id_dep),
@@ -180,13 +180,13 @@ async def get_product_sales(
if str(tenant_id) != current_tenant:
raise HTTPException(status_code=403, detail="Access denied to this tenant")
records = await sales_service.get_product_sales(tenant_id, product_name, start_date, end_date)
records = await sales_service.get_product_sales(tenant_id, inventory_product_id, start_date, end_date)
logger.info("Retrieved product sales", count=len(records), product=product_name, tenant_id=tenant_id)
logger.info("Retrieved product sales", count=len(records), inventory_product_id=inventory_product_id, tenant_id=tenant_id)
return records
except Exception as e:
logger.error("Failed to get product sales", error=str(e), tenant_id=tenant_id, product=product_name)
logger.error("Failed to get product sales", error=str(e), tenant_id=tenant_id, inventory_product_id=inventory_product_id)
raise HTTPException(status_code=500, detail=f"Failed to get product sales: {str(e)}")
@@ -322,4 +322,81 @@ async def validate_sales_record(
raise HTTPException(status_code=400, detail=str(ve))
except Exception as e:
logger.error("Failed to validate sales record", error=str(e), record_id=record_id, tenant_id=tenant_id)
raise HTTPException(status_code=500, detail=f"Failed to validate sales record: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to validate sales record: {str(e)}")
# ================================================================
# INVENTORY INTEGRATION ENDPOINTS
# ================================================================
@router.get("/tenants/{tenant_id}/inventory/products/search")
async def search_inventory_products(
tenant_id: UUID = Path(..., description="Tenant ID"),
search: str = Query(..., description="Search term"),
product_type: Optional[str] = Query(None, description="Product type filter"),
current_tenant: str = Depends(get_current_tenant_id_dep),
sales_service: SalesService = Depends(get_sales_service)
):
"""Search products in inventory service"""
try:
# Verify tenant access
if str(tenant_id) != current_tenant:
raise HTTPException(status_code=403, detail="Access denied to this tenant")
products = await sales_service.search_inventory_products(search, tenant_id, product_type)
return {"items": products, "count": len(products)}
except Exception as e:
logger.error("Failed to search inventory products", error=str(e), tenant_id=tenant_id)
raise HTTPException(status_code=500, detail=f"Failed to search inventory products: {str(e)}")
@router.get("/tenants/{tenant_id}/inventory/products/{product_id}")
async def get_inventory_product(
tenant_id: UUID = Path(..., description="Tenant ID"),
product_id: UUID = Path(..., description="Product ID from inventory service"),
current_tenant: str = Depends(get_current_tenant_id_dep),
sales_service: SalesService = Depends(get_sales_service)
):
"""Get product details from inventory service"""
try:
# Verify tenant access
if str(tenant_id) != current_tenant:
raise HTTPException(status_code=403, detail="Access denied to this tenant")
product = await sales_service.get_inventory_product(product_id, tenant_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found in inventory")
return product
except HTTPException:
raise
except Exception as e:
logger.error("Failed to get inventory product", error=str(e), product_id=product_id, tenant_id=tenant_id)
raise HTTPException(status_code=500, detail=f"Failed to get inventory product: {str(e)}")
@router.get("/tenants/{tenant_id}/inventory/products/category/{category}")
async def get_inventory_products_by_category(
tenant_id: UUID = Path(..., description="Tenant ID"),
category: str = Path(..., description="Product category"),
product_type: Optional[str] = Query(None, description="Product type filter"),
current_tenant: str = Depends(get_current_tenant_id_dep),
sales_service: SalesService = Depends(get_sales_service)
):
"""Get products by category from inventory service"""
try:
# Verify tenant access
if str(tenant_id) != current_tenant:
raise HTTPException(status_code=403, detail="Access denied to this tenant")
products = await sales_service.get_inventory_products_by_category(category, tenant_id, product_type)
return {"items": products, "count": len(products)}
except Exception as e:
logger.error("Failed to get inventory products by category", error=str(e), category=category, tenant_id=tenant_id)
raise HTTPException(status_code=500, detail=f"Failed to get inventory products by category: {str(e)}")