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.
@@ -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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