medusa-pos-plugin 0.0.18 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/api/admin/pos/orders/[id]/cancel/route.js +4 -3
- package/.medusa/server/src/api/admin/pos/orders/route.js +14 -1
- package/.medusa/server/src/api/admin/pos/orders/run-pos-order-return.js +89 -49
- package/.medusa/server/src/api/admin/pos/reports/daily/route.js +35 -0
- package/.medusa/server/src/utils/payment-refund-money.js +97 -0
- package/.medusa/server/src/utils/pos-daily-report.js +344 -0
- package/.medusa/server/src/utils/pos-order-list.js +181 -88
- package/.medusa/server/src/utils/pos-returns.js +14 -1
- package/.medusa/server/src/utils/pos-void-payment.js +56 -0
- package/package.json +1 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildDailyReportCsv = buildDailyReportCsv;
|
|
4
|
+
exports.assembleDailyReport = assembleDailyReport;
|
|
5
|
+
exports.loadPosDailyReport = loadPosDailyReport;
|
|
6
|
+
const pos_order_list_1 = require("./pos-order-list");
|
|
7
|
+
const payment_refund_money_1 = require("./payment-refund-money");
|
|
8
|
+
const POS_TIMEZONE = "Asia/Kolkata";
|
|
9
|
+
const POS_ORDER_SQL = `(
|
|
10
|
+
COALESCE(o.metadata->>'source', '') = 'pos'
|
|
11
|
+
OR COALESCE(o.metadata->>'pos_payment_method', '') <> ''
|
|
12
|
+
OR COALESCE(o.metadata->>'pos_completed_at', '') <> ''
|
|
13
|
+
)`;
|
|
14
|
+
const OCCURRED_AT_SQL = `COALESCE(
|
|
15
|
+
CASE
|
|
16
|
+
WHEN o.metadata->>'pos_completed_at' ~ '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
|
|
17
|
+
THEN (o.metadata->>'pos_completed_at')::timestamptz
|
|
18
|
+
ELSE NULL
|
|
19
|
+
END,
|
|
20
|
+
o.created_at
|
|
21
|
+
)`;
|
|
22
|
+
function dayKey(value) {
|
|
23
|
+
try {
|
|
24
|
+
const parts = new Intl.DateTimeFormat("en-CA", {
|
|
25
|
+
timeZone: POS_TIMEZONE,
|
|
26
|
+
year: "numeric",
|
|
27
|
+
month: "2-digit",
|
|
28
|
+
day: "2-digit",
|
|
29
|
+
}).formatToParts(value);
|
|
30
|
+
const y = parts.find((part) => part.type === "year")?.value;
|
|
31
|
+
const m = parts.find((part) => part.type === "month")?.value;
|
|
32
|
+
const d = parts.find((part) => part.type === "day")?.value;
|
|
33
|
+
if (y && m && d)
|
|
34
|
+
return `${y}-${m}-${d}`;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// fall through
|
|
38
|
+
}
|
|
39
|
+
return value.toISOString().slice(0, 10);
|
|
40
|
+
}
|
|
41
|
+
function timeLabel(value) {
|
|
42
|
+
try {
|
|
43
|
+
return new Intl.DateTimeFormat("en-IN", {
|
|
44
|
+
timeZone: POS_TIMEZONE,
|
|
45
|
+
hour: "numeric",
|
|
46
|
+
minute: "2-digit",
|
|
47
|
+
hour12: true,
|
|
48
|
+
}).format(value);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return value.toISOString().slice(11, 16);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function csvEscape(value) {
|
|
55
|
+
const text = value == null ? "" : String(value);
|
|
56
|
+
if (/[",\n]/.test(text))
|
|
57
|
+
return `"${text.replace(/"/g, '""')}"`;
|
|
58
|
+
return text;
|
|
59
|
+
}
|
|
60
|
+
function emptyDay(date) {
|
|
61
|
+
return { date, collected: 0, refunds: (0, payment_refund_money_1.emptyRefundsByKind)(), net: 0, saleCount: 0 };
|
|
62
|
+
}
|
|
63
|
+
function buildDailyReportCsv(report, generatedAt) {
|
|
64
|
+
const lines = [
|
|
65
|
+
["Daily report", report.from, report.to, generatedAt].map(csvEscape).join(","),
|
|
66
|
+
["Date", "Collected", "Cash refunds", "Wallet refunds", "Gift card refunds", "Net", "Sales"].join(","),
|
|
67
|
+
];
|
|
68
|
+
for (const day of report.days) {
|
|
69
|
+
lines.push([
|
|
70
|
+
day.date,
|
|
71
|
+
day.collected,
|
|
72
|
+
day.refunds.cash,
|
|
73
|
+
day.refunds.wallet,
|
|
74
|
+
day.refunds.gift_card,
|
|
75
|
+
day.net,
|
|
76
|
+
day.saleCount,
|
|
77
|
+
]
|
|
78
|
+
.map(csvEscape)
|
|
79
|
+
.join(","));
|
|
80
|
+
}
|
|
81
|
+
lines.push([
|
|
82
|
+
"Total",
|
|
83
|
+
report.totals.collected,
|
|
84
|
+
report.totals.refunds.cash,
|
|
85
|
+
report.totals.refunds.wallet,
|
|
86
|
+
report.totals.refunds.gift_card,
|
|
87
|
+
report.totals.net,
|
|
88
|
+
report.totals.saleCount,
|
|
89
|
+
]
|
|
90
|
+
.map(csvEscape)
|
|
91
|
+
.join(","));
|
|
92
|
+
lines.push("");
|
|
93
|
+
lines.push(["Payment mix", "Date", "Method", "Collected", "Refunded", "Net"].join(","));
|
|
94
|
+
for (const row of report.methods) {
|
|
95
|
+
lines.push(["", row.date, row.method, row.collected, row.refunded, row.net].map(csvEscape).join(","));
|
|
96
|
+
}
|
|
97
|
+
lines.push("");
|
|
98
|
+
lines.push(["Orders", "Date", "Order", "Time", "Method", "Collected", "Refunded", "Net", "Cancelled"].join(","));
|
|
99
|
+
for (const order of report.orders) {
|
|
100
|
+
lines.push([
|
|
101
|
+
"",
|
|
102
|
+
order.date,
|
|
103
|
+
order.displayId,
|
|
104
|
+
order.time,
|
|
105
|
+
order.method,
|
|
106
|
+
order.collected,
|
|
107
|
+
order.refunded,
|
|
108
|
+
order.net,
|
|
109
|
+
order.cancelled ? "yes" : "",
|
|
110
|
+
]
|
|
111
|
+
.map(csvEscape)
|
|
112
|
+
.join(","));
|
|
113
|
+
}
|
|
114
|
+
return `\uFEFF${lines.join("\n")}\n`;
|
|
115
|
+
}
|
|
116
|
+
function asNumber(value) {
|
|
117
|
+
const n = typeof value === "number" ? value : Number(value);
|
|
118
|
+
return Number.isFinite(n) ? n : 0;
|
|
119
|
+
}
|
|
120
|
+
function isVoided(metadata) {
|
|
121
|
+
if (!metadata || typeof metadata !== "object")
|
|
122
|
+
return false;
|
|
123
|
+
const value = metadata.pos_voided;
|
|
124
|
+
return value === true || value === "true" || value === "t" || value === 1 || value === "1";
|
|
125
|
+
}
|
|
126
|
+
function assembleDailyReport(input) {
|
|
127
|
+
const days = new Map();
|
|
128
|
+
const methods = new Map();
|
|
129
|
+
const refundedByOrder = new Map();
|
|
130
|
+
const ensureDay = (date) => {
|
|
131
|
+
const current = days.get(date) ?? emptyDay(date);
|
|
132
|
+
days.set(date, current);
|
|
133
|
+
return current;
|
|
134
|
+
};
|
|
135
|
+
const ensureMethod = (date, method) => {
|
|
136
|
+
const key = `${date}\u0000${method}`;
|
|
137
|
+
const current = methods.get(key) ?? { date, method, collected: 0, refunded: 0, net: 0 };
|
|
138
|
+
methods.set(key, current);
|
|
139
|
+
return current;
|
|
140
|
+
};
|
|
141
|
+
const listedOrders = new Set();
|
|
142
|
+
const orders = [];
|
|
143
|
+
for (const sale of input.sales) {
|
|
144
|
+
const date = dayKey(sale.at);
|
|
145
|
+
listedOrders.add(sale.orderId);
|
|
146
|
+
if (sale.cancelled) {
|
|
147
|
+
orders.push({
|
|
148
|
+
date,
|
|
149
|
+
displayId: sale.displayId,
|
|
150
|
+
time: timeLabel(sale.at),
|
|
151
|
+
method: sale.method || "unknown",
|
|
152
|
+
collected: 0,
|
|
153
|
+
refunded: 0,
|
|
154
|
+
net: 0,
|
|
155
|
+
cancelled: true,
|
|
156
|
+
});
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const day = ensureDay(date);
|
|
160
|
+
day.collected = (0, payment_refund_money_1.roundMoney)(day.collected + sale.collected);
|
|
161
|
+
day.saleCount += 1;
|
|
162
|
+
const method = ensureMethod(date, sale.method || "unknown");
|
|
163
|
+
method.collected = (0, payment_refund_money_1.roundMoney)(method.collected + sale.collected);
|
|
164
|
+
const refunded = 0;
|
|
165
|
+
orders.push({
|
|
166
|
+
date,
|
|
167
|
+
displayId: sale.displayId,
|
|
168
|
+
time: timeLabel(sale.at),
|
|
169
|
+
method: sale.method || "unknown",
|
|
170
|
+
collected: sale.collected,
|
|
171
|
+
refunded,
|
|
172
|
+
net: sale.collected,
|
|
173
|
+
cancelled: false,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
for (const refund of input.refunds) {
|
|
177
|
+
if (refund.cancelled)
|
|
178
|
+
continue;
|
|
179
|
+
const date = dayKey(refund.at);
|
|
180
|
+
const day = ensureDay(date);
|
|
181
|
+
day.refunds[refund.kind] = (0, payment_refund_money_1.roundMoney)(day.refunds[refund.kind] + refund.amount);
|
|
182
|
+
const method = ensureMethod(date, refund.method || "unknown");
|
|
183
|
+
method.refunded = (0, payment_refund_money_1.roundMoney)(method.refunded + refund.amount);
|
|
184
|
+
refundedByOrder.set(refund.orderId, (0, payment_refund_money_1.roundMoney)((refundedByOrder.get(refund.orderId) ?? 0) + refund.amount));
|
|
185
|
+
}
|
|
186
|
+
for (const sale of input.sales) {
|
|
187
|
+
if (sale.cancelled)
|
|
188
|
+
continue;
|
|
189
|
+
const refunded = refundedByOrder.get(sale.orderId) ?? 0;
|
|
190
|
+
const row = orders.find((order) => order.displayId === sale.displayId && !order.cancelled && order.date === dayKey(sale.at));
|
|
191
|
+
if (!row)
|
|
192
|
+
continue;
|
|
193
|
+
row.refunded = refunded;
|
|
194
|
+
row.net = (0, payment_refund_money_1.netCollected)(row.collected, refunded);
|
|
195
|
+
}
|
|
196
|
+
for (const day of days.values()) {
|
|
197
|
+
const refunded = day.refunds.cash + day.refunds.wallet + day.refunds.gift_card;
|
|
198
|
+
day.net = (0, payment_refund_money_1.netCollected)(day.collected, refunded);
|
|
199
|
+
}
|
|
200
|
+
for (const method of methods.values()) {
|
|
201
|
+
method.net = (0, payment_refund_money_1.netCollected)(method.collected, method.refunded);
|
|
202
|
+
}
|
|
203
|
+
const refundOnly = new Map();
|
|
204
|
+
for (const refund of input.refunds) {
|
|
205
|
+
if (refund.cancelled)
|
|
206
|
+
continue;
|
|
207
|
+
if (listedOrders.has(refund.orderId))
|
|
208
|
+
continue;
|
|
209
|
+
const date = dayKey(refund.at);
|
|
210
|
+
const current = refundOnly.get(refund.orderId) ?? {
|
|
211
|
+
date,
|
|
212
|
+
displayId: refund.displayId,
|
|
213
|
+
time: timeLabel(refund.at),
|
|
214
|
+
method: refund.method || "unknown",
|
|
215
|
+
collected: 0,
|
|
216
|
+
refunded: 0,
|
|
217
|
+
net: 0,
|
|
218
|
+
cancelled: false,
|
|
219
|
+
};
|
|
220
|
+
current.refunded = (0, payment_refund_money_1.roundMoney)(current.refunded + refund.amount);
|
|
221
|
+
current.net = (0, payment_refund_money_1.netCollected)(0, current.refunded);
|
|
222
|
+
refundOnly.set(refund.orderId, current);
|
|
223
|
+
}
|
|
224
|
+
orders.push(...refundOnly.values());
|
|
225
|
+
const dayRows = [...days.values()].sort((a, b) => a.date.localeCompare(b.date));
|
|
226
|
+
const totals = dayRows.reduce((sum, day) => ({
|
|
227
|
+
date: "Total",
|
|
228
|
+
collected: (0, payment_refund_money_1.roundMoney)(sum.collected + day.collected),
|
|
229
|
+
refunds: (0, payment_refund_money_1.sumRefundsByKind)([
|
|
230
|
+
{ amount: sum.refunds.cash + day.refunds.cash, kind: "cash" },
|
|
231
|
+
{ amount: sum.refunds.wallet + day.refunds.wallet, kind: "wallet" },
|
|
232
|
+
{ amount: sum.refunds.gift_card + day.refunds.gift_card, kind: "gift_card" },
|
|
233
|
+
]),
|
|
234
|
+
net: 0,
|
|
235
|
+
saleCount: sum.saleCount + day.saleCount,
|
|
236
|
+
}), emptyDay("Total"));
|
|
237
|
+
totals.net = (0, payment_refund_money_1.netCollected)(totals.collected, totals.refunds.cash + totals.refunds.wallet + totals.refunds.gift_card);
|
|
238
|
+
return {
|
|
239
|
+
from: input.from.toISOString(),
|
|
240
|
+
to: input.to.toISOString(),
|
|
241
|
+
days: dayRows,
|
|
242
|
+
methods: [...methods.values()].sort((a, b) => a.date === b.date ? b.net - a.net : a.date.localeCompare(b.date)),
|
|
243
|
+
orders,
|
|
244
|
+
totals,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async function loadPosDailyReport(knex, from, to) {
|
|
248
|
+
const salesResult = await knex.raw(`SELECT o.id AS order_id,
|
|
249
|
+
o.display_id,
|
|
250
|
+
o.currency_code,
|
|
251
|
+
o.metadata,
|
|
252
|
+
${OCCURRED_AT_SQL} AS occurred_at,
|
|
253
|
+
COALESCE(captures.captured, 0)::float8 AS captured,
|
|
254
|
+
COALESCE(captures.capture_count, 0)::int AS capture_count
|
|
255
|
+
FROM "order" o
|
|
256
|
+
LEFT JOIN LATERAL (
|
|
257
|
+
SELECT COALESCE(SUM(cap.amount)::float8, 0) AS captured,
|
|
258
|
+
COUNT(cap.id)::int AS capture_count
|
|
259
|
+
FROM order_payment_collection opc
|
|
260
|
+
JOIN payment pay
|
|
261
|
+
ON pay.payment_collection_id = opc.payment_collection_id
|
|
262
|
+
AND pay.deleted_at IS NULL
|
|
263
|
+
AND pay.canceled_at IS NULL
|
|
264
|
+
JOIN capture cap ON cap.payment_id = pay.id AND cap.deleted_at IS NULL
|
|
265
|
+
WHERE opc.order_id = o.id AND opc.deleted_at IS NULL
|
|
266
|
+
) captures ON true
|
|
267
|
+
WHERE o.deleted_at IS NULL
|
|
268
|
+
AND o.status::text NOT IN ('draft', 'canceled', 'cancelled')
|
|
269
|
+
AND ${POS_ORDER_SQL}
|
|
270
|
+
AND ${OCCURRED_AT_SQL} >= ?::timestamptz
|
|
271
|
+
AND ${OCCURRED_AT_SQL} <= ?::timestamptz`, [from.toISOString(), to.toISOString()]);
|
|
272
|
+
const sales = [];
|
|
273
|
+
for (const row of (0, pos_order_list_1.knexRows)(salesResult)) {
|
|
274
|
+
const at = new Date(String(row.occurred_at ?? ""));
|
|
275
|
+
if (Number.isNaN(at.getTime()))
|
|
276
|
+
continue;
|
|
277
|
+
const meta = row.metadata && typeof row.metadata === "object"
|
|
278
|
+
? row.metadata
|
|
279
|
+
: {};
|
|
280
|
+
const captureCount = asNumber(row.capture_count);
|
|
281
|
+
const captured = captureCount > 0 ? asNumber(row.captured) : 0;
|
|
282
|
+
if (isVoided(meta))
|
|
283
|
+
continue;
|
|
284
|
+
const fallback = typeof meta.pos_charged_total === "number" || typeof meta.pos_charged_total === "string"
|
|
285
|
+
? asNumber(meta.pos_charged_total)
|
|
286
|
+
: 0;
|
|
287
|
+
const collected = (0, payment_refund_money_1.roundMoney)(captured > 0 ? captured : Math.max(0, fallback));
|
|
288
|
+
if (collected <= 0)
|
|
289
|
+
continue;
|
|
290
|
+
sales.push({
|
|
291
|
+
orderId: typeof row.order_id === "string" ? row.order_id : "",
|
|
292
|
+
at,
|
|
293
|
+
displayId: row.display_id != null ? String(row.display_id) : "",
|
|
294
|
+
method: typeof meta.pos_payment_method === "string" && meta.pos_payment_method
|
|
295
|
+
? meta.pos_payment_method
|
|
296
|
+
: "unknown",
|
|
297
|
+
collected,
|
|
298
|
+
cancelled: isVoided(meta),
|
|
299
|
+
currency: typeof row.currency_code === "string" ? row.currency_code : "inr",
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const refundResult = await knex.raw(`SELECT o.id AS order_id,
|
|
303
|
+
o.display_id,
|
|
304
|
+
o.metadata,
|
|
305
|
+
ref.amount::float8 AS amount,
|
|
306
|
+
ref.created_at,
|
|
307
|
+
ref.note,
|
|
308
|
+
COALESCE(NULLIF(o.metadata->>'pos_payment_method', ''), 'unknown') AS method
|
|
309
|
+
FROM refund ref
|
|
310
|
+
JOIN payment pay ON pay.id = ref.payment_id AND pay.deleted_at IS NULL
|
|
311
|
+
JOIN order_payment_collection opc
|
|
312
|
+
ON opc.payment_collection_id = pay.payment_collection_id
|
|
313
|
+
AND opc.deleted_at IS NULL
|
|
314
|
+
JOIN "order" o ON o.id = opc.order_id AND o.deleted_at IS NULL
|
|
315
|
+
WHERE ref.deleted_at IS NULL
|
|
316
|
+
AND ${POS_ORDER_SQL}
|
|
317
|
+
AND ref.created_at >= ?::timestamptz
|
|
318
|
+
AND ref.created_at <= ?::timestamptz`, [from.toISOString(), to.toISOString()]);
|
|
319
|
+
const refunds = [];
|
|
320
|
+
for (const row of (0, pos_order_list_1.knexRows)(refundResult)) {
|
|
321
|
+
const at = new Date(String(row.created_at ?? ""));
|
|
322
|
+
if (Number.isNaN(at.getTime()))
|
|
323
|
+
continue;
|
|
324
|
+
const amount = (0, payment_refund_money_1.roundMoney)(Math.max(0, asNumber(row.amount)));
|
|
325
|
+
if (amount <= 0)
|
|
326
|
+
continue;
|
|
327
|
+
const meta = row.metadata && typeof row.metadata === "object"
|
|
328
|
+
? row.metadata
|
|
329
|
+
: {};
|
|
330
|
+
if (isVoided(meta))
|
|
331
|
+
continue;
|
|
332
|
+
refunds.push({
|
|
333
|
+
orderId: typeof row.order_id === "string" ? row.order_id : "",
|
|
334
|
+
at,
|
|
335
|
+
amount,
|
|
336
|
+
kind: (0, payment_refund_money_1.classifyRefundNote)(row.note),
|
|
337
|
+
method: typeof row.method === "string" ? row.method : "unknown",
|
|
338
|
+
displayId: row.display_id != null ? String(row.display_id) : "",
|
|
339
|
+
cancelled: isVoided(meta),
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return assembleDailyReport({ from, to, sales, refunds });
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zLWRhaWx5LXJlcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wb3MtZGFpbHktcmVwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0dBLGtEQWdFQztBQWlDRCxrREFxSUM7QUFFRCxnREEwR0M7QUExYkQscURBQTBEO0FBQzFELGlFQU8rQjtBQUUvQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUE7QUFFbkMsTUFBTSxhQUFhLEdBQUc7Ozs7RUFJcEIsQ0FBQTtBQUVGLE1BQU0sZUFBZSxHQUFHOzs7Ozs7O0VBT3RCLENBQUE7QUFzQ0YsU0FBUyxNQUFNLENBQUMsS0FBVztJQUN6QixJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQzdDLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLFNBQVM7WUFDaEIsR0FBRyxFQUFFLFNBQVM7U0FDZixDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFBO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUs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
|