Split weekly revenue by payment channel
Browse files- API_DOCUMENTATION.md +21 -3
- src/routes/dashboard.routes.js +9 -2
API_DOCUMENTATION.md
CHANGED
|
@@ -737,14 +737,32 @@ Last 7 days of revenue broken down by day.
|
|
| 737 |
[
|
| 738 |
{
|
| 739 |
"day": "2026-04-15",
|
| 740 |
-
"
|
| 741 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 742 |
"net": 11340.00
|
| 743 |
}
|
| 744 |
]
|
| 745 |
```
|
| 746 |
|
| 747 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 748 |
> Days with no sales are omitted — fill gaps in the frontend.
|
| 749 |
|
| 750 |
---
|
|
|
|
| 737 |
[
|
| 738 |
{
|
| 739 |
"day": "2026-04-15",
|
| 740 |
+
"online_sales": 12,
|
| 741 |
+
"online_gross": 12000.00,
|
| 742 |
+
"online_net": 11340.00,
|
| 743 |
+
"manual_sales": 3,
|
| 744 |
+
"manual_gross": 2500.00,
|
| 745 |
+
"total_sales": 15,
|
| 746 |
+
"total_gross": 14500.00,
|
| 747 |
+
"sales": 15,
|
| 748 |
+
"gross": 14500.00,
|
| 749 |
"net": 11340.00
|
| 750 |
}
|
| 751 |
]
|
| 752 |
```
|
| 753 |
|
| 754 |
+
Definitions:
|
| 755 |
+
- `online_*` = platform-collected payments (`payment_channel = 'snippe'`)
|
| 756 |
+
- `manual_*` = tenant direct/manual sales (`payment_channel = 'tenant_direct_manual'`)
|
| 757 |
+
- `total_*` = combined totals across both channels
|
| 758 |
+
|
| 759 |
+
Compatibility fields:
|
| 760 |
+
- `sales` = `total_sales`
|
| 761 |
+
- `gross` = `total_gross`
|
| 762 |
+
- `net` = `online_net`
|
| 763 |
+
|
| 764 |
+
> `online_net` / `net` = online `gross` minus Snippe fee (0.5%) minus platform commission.
|
| 765 |
+
> Manual/direct sales are not payout-eligible and are not included in `net`.
|
| 766 |
> Days with no sales are omitted — fill gaps in the frontend.
|
| 767 |
|
| 768 |
---
|
src/routes/dashboard.routes.js
CHANGED
|
@@ -75,9 +75,16 @@ router.get('/revenue/weekly', async (req, res) => {
|
|
| 75 |
try {
|
| 76 |
const rows = await db.query(
|
| 77 |
`SELECT DATE(completed_at) AS day,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
COUNT(*) AS sales,
|
| 79 |
-
SUM(gross_amount) AS gross,
|
| 80 |
-
SUM(client_credit) AS net
|
| 81 |
FROM payments
|
| 82 |
WHERE client_id = ? AND status = 'completed'
|
| 83 |
AND completed_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
|
|
|
|
| 75 |
try {
|
| 76 |
const rows = await db.query(
|
| 77 |
`SELECT DATE(completed_at) AS day,
|
| 78 |
+
SUM(CASE WHEN payment_channel = 'snippe' THEN 1 ELSE 0 END) AS online_sales,
|
| 79 |
+
COALESCE(SUM(CASE WHEN payment_channel = 'snippe' THEN gross_amount ELSE 0 END), 0) AS online_gross,
|
| 80 |
+
COALESCE(SUM(CASE WHEN payment_channel = 'snippe' THEN client_credit ELSE 0 END), 0) AS online_net,
|
| 81 |
+
SUM(CASE WHEN payment_channel = 'tenant_direct_manual' THEN 1 ELSE 0 END) AS manual_sales,
|
| 82 |
+
COALESCE(SUM(CASE WHEN payment_channel = 'tenant_direct_manual' THEN gross_amount ELSE 0 END), 0) AS manual_gross,
|
| 83 |
+
COUNT(*) AS total_sales,
|
| 84 |
+
COALESCE(SUM(gross_amount), 0) AS total_gross,
|
| 85 |
COUNT(*) AS sales,
|
| 86 |
+
COALESCE(SUM(gross_amount), 0) AS gross,
|
| 87 |
+
COALESCE(SUM(CASE WHEN payment_channel = 'snippe' THEN client_credit ELSE 0 END), 0) AS net
|
| 88 |
FROM payments
|
| 89 |
WHERE client_id = ? AND status = 'completed'
|
| 90 |
AND completed_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
|