diff --git a/services/data/app/services/sales_service.py b/services/data/app/services/sales_service.py index b360dc69..258c22bf 100644 --- a/services/data/app/services/sales_service.py +++ b/services/data/app/services/sales_service.py @@ -225,4 +225,54 @@ class SalesService: except Exception as e: await db.rollback() logger.error("Failed to delete sales record", error=str(e)) + raise + + @staticmethod + async def get_products_list(tenant_id: str, db: AsyncSession) -> List[Dict[str, Any]]: + """Get list of all products with sales data for tenant""" + try: + # Query to get unique products with aggregated sales data + query = ( + select( + SalesData.product_name, + func.count(SalesData.id).label('total_sales'), + func.sum(SalesData.quantity_sold).label('total_quantity'), + func.sum(SalesData.revenue).label('total_revenue'), + func.min(SalesData.date).label('first_sale_date'), + func.max(SalesData.date).label('last_sale_date'), + func.avg(SalesData.quantity_sold).label('avg_quantity'), + func.avg(SalesData.revenue).label('avg_revenue') + ) + .where(SalesData.tenant_id == tenant_id) + .group_by(SalesData.product_name) + .order_by(desc(func.sum(SalesData.revenue))) + ) + + result = await db.execute(query) + products_data = result.all() + + # Format the response + products = [] + for row in products_data: + products.append({ + 'product_name': row.product_name, + 'total_sales': row.total_sales, + 'total_quantity': int(row.total_quantity) if row.total_quantity else 0, + 'total_revenue': float(row.total_revenue) if row.total_revenue else 0.0, + 'first_sale_date': row.first_sale_date.isoformat() if row.first_sale_date else None, + 'last_sale_date': row.last_sale_date.isoformat() if row.last_sale_date else None, + 'avg_quantity': float(row.avg_quantity) if row.avg_quantity else 0.0, + 'avg_revenue': float(row.avg_revenue) if row.avg_revenue else 0.0 + }) + + logger.debug("Products list retrieved successfully", + tenant_id=tenant_id, + product_count=len(products)) + + return products + + except Exception as e: + logger.error("Failed to get products list from database", + error=str(e), + tenant_id=tenant_id) raise \ No newline at end of file