Aggregate OTC sales by market day

This commit is contained in:
gitea_admin committed 2026-09-19 17:42:42 +02:00
1 parent 1b553a9095
commit 3ba33f85a0
1 file changed
+59
+59
View File
@@ -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) {