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]);
|
$days->execute([':occurrence_id' => $occurrenceId]);
|
||||||
$occurrence['days'] = $days->fetchAll();
|
$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) {
|
if (count($occurrence['days']) > 1) {
|
||||||
$firstDay = $occurrence['days'][0];
|
$firstDay = $occurrence['days'][0];
|
||||||
foreach ($occurrence['days'] as $index => $day) {
|
foreach ($occurrence['days'] as $index => $day) {
|
||||||
|
|||||||
Reference in new issue
Block a user