From 3ba33f85a03d1fd7a8f27838b9f9d01cf3af5378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Sat, 19 Sep 2026 17:42:42 +0200 Subject: [PATCH] Aggregate OTC sales by market day --- modules/market_management/service.php | 59 +++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/modules/market_management/service.php b/modules/market_management/service.php index 29fd303..dccdb70 100644 --- a/modules/market_management/service.php +++ b/modules/market_management/service.php @@ -554,6 +554,65 @@ function market_management_get_occurrence(PDO $pdo, int $occurrenceId, bool $inc ); $days->execute([':occurrence_id' => $occurrenceId]); $occurrence['days'] = $days->fetchAll(); + + $salesByDayStmt = $pdo->prepare( + 'WITH line_totals AS ( + SELECT sales_order_id, + SUM(CASE WHEN line_status = \'cancelled\' THEN 0 ELSE GREATEST(qty - qty_cancelled, 0) END) AS sold_item_count + ,SUM(CASE WHEN line_status = \'cancelled\' OR line_total IS NULL THEN 0 + ELSE line_total * GREATEST(qty - qty_cancelled, 0) / NULLIF(qty, 0) END) AS gross_revenue + FROM sales_order_line + GROUP BY sales_order_id + ) + SELECT so.market_occurrence_day_id AS day_id, + COUNT(*) AS sales_count, + COALESCE(SUM(COALESCE(lt.gross_revenue, 0)), 0) AS gross_revenue, + COALESCE(SUM(COALESCE(lt.sold_item_count, 0)), 0) AS sold_item_count + FROM sales_order so + LEFT JOIN line_totals lt ON lt.sales_order_id = so.id + WHERE so.market_occurrence_id = :occurrence_id + AND so.market_occurrence_day_id IS NOT NULL + AND so.order_source = \'direct\' + AND so.order_status <> \'cancelled\' + GROUP BY so.market_occurrence_day_id' + ); + $salesByDayStmt->execute([':occurrence_id' => $occurrenceId]); + $salesByDay = []; + foreach ($salesByDayStmt->fetchAll() as $salesRow) { + $salesByDay[(int) $salesRow['day_id']] = $salesRow; + } + $occurrenceGrossRevenue = 0.0; + $occurrenceSoldItemCount = 0.0; + $occurrenceSalesCount = 0; + foreach ($occurrence['days'] as &$day) { + $salesRow = $salesByDay[(int) $day['id']] ?? null; + if ($salesRow === null || (int) $salesRow['sales_count'] === 0) { + $day['gross_revenue'] = null; + $day['sold_item_count'] = null; + continue; + } + $day['gross_revenue'] = (float) $salesRow['gross_revenue']; + $day['sold_item_count'] = (float) $salesRow['sold_item_count']; + $occurrenceGrossRevenue += (float) $salesRow['gross_revenue']; + $occurrenceSoldItemCount += (float) $salesRow['sold_item_count']; + $occurrenceSalesCount += (int) $salesRow['sales_count']; + } + unset($day); + $occurrence['sales_summary'] = $occurrenceSalesCount === 0 + ? [ + 'sales_count' => 0, + 'gross_revenue' => null, + 'sold_item_count' => null, + 'average_revenue_per_day' => null, + 'average_revenue_per_item' => null, + ] + : [ + 'sales_count' => $occurrenceSalesCount, + 'gross_revenue' => $occurrenceGrossRevenue, + 'sold_item_count' => $occurrenceSoldItemCount, + 'average_revenue_per_day' => count($occurrence['days']) > 0 ? $occurrenceGrossRevenue / count($occurrence['days']) : null, + 'average_revenue_per_item' => $occurrenceSoldItemCount > 0 ? $occurrenceGrossRevenue / $occurrenceSoldItemCount : null, + ]; if (count($occurrence['days']) > 1) { $firstDay = $occurrence['days'][0]; foreach ($occurrence['days'] as $index => $day) {