diff --git a/internal/repository/analytics_repository.go b/internal/repository/analytics_repository.go index 8387181..922330a 100644 --- a/internal/repository/analytics_repository.go +++ b/internal/repository/analytics_repository.go @@ -39,6 +39,10 @@ func (r *AnalyticsRepositoryImpl) resolveOutletID(query *gorm.DB, outletID *uuid return query } +func purchaseOrderItemTotalAmountSQL() string { + return "CASE WHEN pc.type = '" + string(entities.PurchaseCategoryTypeRawMaterial) + "' THEN COALESCE(poi.quantity, 0) * poi.amount ELSE poi.amount END" +} + func (r *AnalyticsRepositoryImpl) GetPaymentMethodAnalytics(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID, dateFrom, dateTo time.Time) ([]*entities.PaymentMethodAnalytics, error) { var results []*entities.PaymentMethodAnalytics @@ -153,18 +157,19 @@ func (r *AnalyticsRepositoryImpl) getPurchaseOrderPurchasingAnalytics(ctx contex summaryQuery := r.db.WithContext(ctx). Table("purchase_orders po"). Select(` - COALESCE(SUM(poi.amount), 0) as total_purchases, + COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) as total_purchases, COUNT(DISTINCT po.id) as total_purchase_orders, COALESCE(SUM(poi.quantity), 0) as total_quantity, CASE WHEN COUNT(DISTINCT po.id) > 0 - THEN COALESCE(SUM(poi.amount), 0) / COUNT(DISTINCT po.id) + THEN COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) / COUNT(DISTINCT po.id) ELSE 0 END as average_purchase_order_value, COUNT(DISTINCT i.id) as total_ingredients, COUNT(DISTINCT COALESCE(po.vendor_id::text, 'no-vendor')) as total_vendors `). Joins("LEFT JOIN purchase_order_items poi ON poi.purchase_order_id = po.id"). + Joins("LEFT JOIN purchase_categories pc ON poi.purchase_category_id = pc.id"). Joins("LEFT JOIN ingredients i ON poi.ingredient_id = i.id"). Joins("LEFT JOIN units u ON poi.unit_id = u.id"). Where("po.organization_id = ?", organizationID). @@ -193,13 +198,14 @@ func (r *AnalyticsRepositoryImpl) getPurchaseOrderPurchasingAnalytics(ctx contex Table("purchase_orders po"). Select(` `+dateFormat+` as date, - COALESCE(SUM(poi.amount), 0) as purchases, + COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) as purchases, COUNT(DISTINCT po.id) as purchase_orders, COALESCE(SUM(poi.quantity), 0) as quantity, COUNT(DISTINCT i.id) as ingredients, COUNT(DISTINCT COALESCE(po.vendor_id::text, 'no-vendor')) as vendors `). Joins("LEFT JOIN purchase_order_items poi ON poi.purchase_order_id = po.id"). + Joins("LEFT JOIN purchase_categories pc ON poi.purchase_category_id = pc.id"). Joins("LEFT JOIN ingredients i ON poi.ingredient_id = i.id"). Joins("LEFT JOIN units u ON poi.unit_id = u.id"). Where("po.organization_id = ?", organizationID). @@ -220,15 +226,16 @@ func (r *AnalyticsRepositoryImpl) getPurchaseOrderPurchasingAnalytics(ctx contex i.id as ingredient_id, i.name as ingredient_name, COALESCE(SUM(poi.quantity), 0) as quantity, - COALESCE(SUM(poi.amount), 0) as total_cost, + COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) as total_cost, CASE WHEN SUM(poi.quantity) > 0 - THEN COALESCE(SUM(poi.amount), 0) / SUM(poi.quantity) + THEN COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) / SUM(poi.quantity) ELSE 0 END as average_unit_cost, COUNT(DISTINCT po.id) as purchase_order_count `). Joins("JOIN purchase_orders po ON poi.purchase_order_id = po.id"). + Joins("JOIN purchase_categories pc ON poi.purchase_category_id = pc.id"). Joins("JOIN ingredients i ON poi.ingredient_id = i.id"). Joins("LEFT JOIN units u ON poi.unit_id = u.id"). Where("po.organization_id = ?", organizationID). @@ -248,13 +255,14 @@ func (r *AnalyticsRepositoryImpl) getPurchaseOrderPurchasingAnalytics(ctx contex Select(` v.id as vendor_id, COALESCE(v.name, 'No Vendor') as vendor_name, - COALESCE(SUM(poi.amount), 0) as total_cost, + COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) as total_cost, COUNT(DISTINCT po.id) as purchase_order_count, COUNT(DISTINCT i.id) as ingredient_count, COALESCE(SUM(poi.quantity), 0) as quantity `). Joins("LEFT JOIN vendors v ON po.vendor_id = v.id"). Joins("LEFT JOIN purchase_order_items poi ON poi.purchase_order_id = po.id"). + Joins("LEFT JOIN purchase_categories pc ON poi.purchase_category_id = pc.id"). Joins("LEFT JOIN ingredients i ON poi.ingredient_id = i.id"). Joins("LEFT JOIN units u ON poi.unit_id = u.id"). Where("po.organization_id = ?", organizationID). @@ -750,7 +758,7 @@ func (r *AnalyticsRepositoryImpl) getExclusiveSummaryHPPBreakdown(ctx context.Co Select(` pc.code as category_code, pc.name as category_name, - COALESCE(SUM(poi.amount), 0) as amount + COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) as amount `). Joins("JOIN purchase_orders po ON poi.purchase_order_id = po.id"). Joins("JOIN purchase_categories pc ON poi.purchase_category_id = pc.id"). @@ -778,7 +786,7 @@ func (r *AnalyticsRepositoryImpl) getExclusiveSummaryOperationalExpenseBreakdown Select(` pc.code as category_code, pc.name as category_name, - COALESCE(SUM(poi.amount), 0) as amount + COALESCE(SUM(`+purchaseOrderItemTotalAmountSQL()+`), 0) as amount `). Joins("JOIN purchase_orders po ON poi.purchase_order_id = po.id"). Joins("JOIN purchase_categories pc ON poi.purchase_category_id = pc.id"). @@ -843,7 +851,7 @@ func (r *AnalyticsRepositoryImpl) exclusiveSummaryPurchaseOrderItemQuery(organiz pc.code as category_code, pc.name as category_name, COALESCE(NULLIF(poi.description, ''), i.name, pc.name) as description, - poi.amount as amount, + ` + purchaseOrderItemTotalAmountSQL() + ` as amount, 'purchase_order' as source FROM purchase_order_items poi JOIN purchase_orders po ON poi.purchase_order_id = po.id diff --git a/migrations/000082_add_outlet_id_to_purchase_orders.up.sql b/migrations/000082_add_outlet_id_to_purchase_orders.up.sql index a9dea93..c7d696c 100644 --- a/migrations/000082_add_outlet_id_to_purchase_orders.up.sql +++ b/migrations/000082_add_outlet_id_to_purchase_orders.up.sql @@ -50,3 +50,17 @@ SET outlet_id = item_outlets.outlet_id FROM item_outlets WHERE po.id = item_outlets.purchase_order_id AND po.outlet_id IS NULL; + +WITH single_outlet_organizations AS ( + SELECT + organization_id, + MIN(id) AS outlet_id + FROM outlets + GROUP BY organization_id + HAVING COUNT(*) = 1 +) +UPDATE purchase_orders po +SET outlet_id = single_outlet_organizations.outlet_id +FROM single_outlet_organizations +WHERE po.organization_id = single_outlet_organizations.organization_id + AND po.outlet_id IS NULL;