Aggregate OTC sales by market day
This commit is contained in:
1 parent
1b553a9095
commit
3ba33f85a0
1 file changed
+59
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user