medusa-pos-plugin 0.0.5 → 0.0.6

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,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const pos_order_list_1 = require("../../../../utils/pos-order-list");
6
+ const LIST_FIELDS = [
7
+ "id",
8
+ "display_id",
9
+ "created_at",
10
+ "updated_at",
11
+ "status",
12
+ "payment_status",
13
+ "fulfillment_status",
14
+ "email",
15
+ "currency_code",
16
+ "total",
17
+ "subtotal",
18
+ "item_total",
19
+ "discount_total",
20
+ "metadata",
21
+ "customer.id",
22
+ "customer.email",
23
+ "customer.phone",
24
+ "customer.first_name",
25
+ "customer.last_name",
26
+ "items.id",
27
+ "items.quantity",
28
+ "items.unit_price",
29
+ "items.total",
30
+ "items.subtotal",
31
+ "items.metadata",
32
+ "items.adjustments.code",
33
+ "items.adjustments.amount",
34
+ ];
35
+ function orderByIds(orders, ids) {
36
+ const byId = new Map();
37
+ for (const order of orders) {
38
+ if (order && typeof order === "object" && "id" in order) {
39
+ const id = order.id;
40
+ if (typeof id === "string")
41
+ byId.set(id, order);
42
+ }
43
+ }
44
+ return ids.map((id) => byId.get(id)).filter(Boolean);
45
+ }
46
+ async function GET(req, res) {
47
+ const queryParams = (req.query || {});
48
+ const { limit, offset } = (0, pos_order_list_1.parseLimitOffset)(queryParams.limit, queryParams.offset);
49
+ const filters = (0, pos_order_list_1.buildPosOrderListFilters)(queryParams);
50
+ const includeSalesTotal = (0, pos_order_list_1.truthyFlag)(queryParams.include_sales_total);
51
+ const hasOccurredRange = !!(filters.from || filters.to);
52
+ try {
53
+ const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
54
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
55
+ let orders = [];
56
+ let count = 0;
57
+ if (hasOccurredRange) {
58
+ const page = await (0, pos_order_list_1.listOrderIdsByOccurredAt)(knex, filters, limit, offset);
59
+ count = page.count;
60
+ if (page.ids.length > 0) {
61
+ const { data = [] } = await query.graph({
62
+ entity: "order",
63
+ fields: LIST_FIELDS,
64
+ filters: { id: page.ids },
65
+ });
66
+ orders = orderByIds(Array.isArray(data) ? data : [], page.ids);
67
+ }
68
+ }
69
+ else {
70
+ // No date range: page by created_at (Medusa default).
71
+ const graphFilters = {};
72
+ if (filters.statuses.length === 1)
73
+ graphFilters.status = filters.statuses[0];
74
+ else if (filters.statuses.length > 1)
75
+ graphFilters.status = filters.statuses;
76
+ if (filters.customerIds.length === 1)
77
+ graphFilters.customer_id = filters.customerIds[0];
78
+ else if (filters.customerIds.length > 1)
79
+ graphFilters.customer_id = filters.customerIds;
80
+ if (filters.q)
81
+ graphFilters.q = filters.q;
82
+ const { data = [], metadata } = await query.graph({
83
+ entity: "order",
84
+ fields: LIST_FIELDS,
85
+ filters: graphFilters,
86
+ pagination: {
87
+ skip: offset,
88
+ take: limit || 20,
89
+ order: { created_at: "DESC" },
90
+ },
91
+ });
92
+ orders = Array.isArray(data) ? data : [];
93
+ count = metadata?.count ?? orders.length;
94
+ }
95
+ const body = {
96
+ orders,
97
+ count,
98
+ limit,
99
+ offset,
100
+ };
101
+ if (includeSalesTotal) {
102
+ if (hasOccurredRange) {
103
+ body.sales_total = await (0, pos_order_list_1.aggregateSalesTotal)(knex, filters);
104
+ }
105
+ else {
106
+ // Avoid full-table scan when "All dates" is selected.
107
+ body.sales_total = { amount: 0, currency: "INR", sale_count: 0, skipped: true };
108
+ }
109
+ }
110
+ res.json(body);
111
+ }
112
+ catch (err) {
113
+ console.error("GET /admin/pos/orders error:", err);
114
+ res.status(500).json({
115
+ message: err instanceof Error ? err.message : "Failed to list POS orders",
116
+ type: "POS_ORDERS_LIST_FAILED",
117
+ });
118
+ }
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9vcmRlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF5RUEsa0JBeUVDO0FBMUlELHFEQUFxRTtBQUNyRSxxRUFReUM7QUFlekMsTUFBTSxXQUFXLEdBQUc7SUFDbEIsSUFBSTtJQUNKLFlBQVk7SUFDWixZQUFZO0lBQ1osWUFBWTtJQUNaLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLE9BQU87SUFDUCxlQUFlO0lBQ2YsT0FBTztJQUNQLFVBQVU7SUFDVixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4QiwwQkFBMEI7Q0FDM0IsQ0FBQTtBQUVELFNBQVMsVUFBVSxDQUFDLE1BQWlCLEVBQUUsR0FBYTtJQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQTtJQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDeEQsTUFBTSxFQUFFLEdBQUksS0FBMEIsQ0FBQyxFQUFFLENBQUE7WUFDekMsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRO2dCQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFF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
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /**
3
+ * Helpers for GET /admin/pos/orders — filter by sale time (pos_completed_at)
4
+ * instead of raw created_at so held drafts still land on the completion day.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.knexRows = knexRows;
8
+ exports.parseIsoDate = parseIsoDate;
9
+ exports.parseLimitOffset = parseLimitOffset;
10
+ exports.parseStringList = parseStringList;
11
+ exports.truthyFlag = truthyFlag;
12
+ exports.litePayableAmount = litePayableAmount;
13
+ exports.buildPosOrderListFilters = buildPosOrderListFilters;
14
+ exports.buildOrderWhere = buildOrderWhere;
15
+ exports.listOrderIdsByOccurredAt = listOrderIdsByOccurredAt;
16
+ exports.aggregateSalesTotal = aggregateSalesTotal;
17
+ const OCCURRED_AT_SQL = `COALESCE(
18
+ CASE
19
+ WHEN o.metadata->>'pos_completed_at' ~ '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
20
+ THEN (o.metadata->>'pos_completed_at')::timestamptz
21
+ ELSE NULL
22
+ END,
23
+ o.created_at
24
+ )`;
25
+ function isRecord(value) {
26
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
27
+ }
28
+ function knexRows(result) {
29
+ if (!result)
30
+ return [];
31
+ if (Array.isArray(result.rows))
32
+ return result.rows.filter(isRecord);
33
+ if (Array.isArray(result[0])) {
34
+ return result[0].filter(isRecord);
35
+ }
36
+ return [];
37
+ }
38
+ function parseIsoDate(value) {
39
+ if (!value || !String(value).trim())
40
+ return null;
41
+ const d = new Date(String(value).trim());
42
+ return Number.isNaN(d.getTime()) ? null : d;
43
+ }
44
+ function parseLimitOffset(limitRaw, offsetRaw, defaults = { limit: 20, maxLimit: 100 }) {
45
+ const parsedLimit = limitRaw === undefined || limitRaw === ""
46
+ ? defaults.limit
47
+ : Number(limitRaw);
48
+ const limit = Math.min(Math.max(Number.isFinite(parsedLimit) ? parsedLimit : defaults.limit, 0), defaults.maxLimit);
49
+ const parsedOffset = Number(offsetRaw);
50
+ const offset = Math.max(Number.isFinite(parsedOffset) ? parsedOffset : 0, 0);
51
+ return { limit, offset };
52
+ }
53
+ function parseStringList(value) {
54
+ if (!value)
55
+ return [];
56
+ const parts = Array.isArray(value) ? value : String(value).split(",");
57
+ return parts.map((p) => String(p).trim()).filter(Boolean);
58
+ }
59
+ function truthyFlag(value) {
60
+ if (!value)
61
+ return false;
62
+ const v = value.trim().toLowerCase();
63
+ return v === "1" || v === "true" || v === "yes";
64
+ }
65
+ function asAmount(value) {
66
+ if (typeof value === "number")
67
+ return Number.isFinite(value) ? value : 0;
68
+ if (typeof value === "string" && value.trim()) {
69
+ const n = Number(value);
70
+ return Number.isFinite(n) ? n : 0;
71
+ }
72
+ return 0;
73
+ }
74
+ /** Prefer charged total from finalize metadata; else Medusa total. */
75
+ function litePayableAmount(row) {
76
+ const status = String(row.status || "").toLowerCase();
77
+ if (status === "canceled" || status === "cancelled" || status === "draft")
78
+ return 0;
79
+ const meta = isRecord(row.metadata) ? row.metadata : {};
80
+ const charged = asAmount(meta.pos_charged_total);
81
+ if (charged > 0)
82
+ return Math.round(charged * 100) / 100;
83
+ return Math.round(asAmount(row.total) * 100) / 100;
84
+ }
85
+ function buildPosOrderListFilters(query) {
86
+ return {
87
+ from: parseIsoDate(query.from),
88
+ to: parseIsoDate(query.to),
89
+ statuses: parseStringList(query.status),
90
+ customerIds: parseStringList(query.customer_id),
91
+ q: query.q?.trim() || null,
92
+ };
93
+ }
94
+ /**
95
+ * Build WHERE clause + bindings for occurred-at (or created_at when no range).
96
+ * Alias the order table as `o`.
97
+ */
98
+ function buildOrderWhere(filters) {
99
+ const clauses = ["o.deleted_at IS NULL"];
100
+ const bindings = [];
101
+ if (filters.from) {
102
+ clauses.push(`${OCCURRED_AT_SQL} >= ?::timestamptz`);
103
+ bindings.push(filters.from.toISOString());
104
+ }
105
+ if (filters.to) {
106
+ clauses.push(`${OCCURRED_AT_SQL} <= ?::timestamptz`);
107
+ bindings.push(filters.to.toISOString());
108
+ }
109
+ if (filters.statuses.length === 1) {
110
+ clauses.push(`o.status = ?`);
111
+ bindings.push(filters.statuses[0]);
112
+ }
113
+ else if (filters.statuses.length > 1) {
114
+ clauses.push(`o.status IN (${filters.statuses.map(() => "?").join(", ")})`);
115
+ bindings.push(...filters.statuses);
116
+ }
117
+ if (filters.customerIds.length === 1) {
118
+ clauses.push(`o.customer_id = ?`);
119
+ bindings.push(filters.customerIds[0]);
120
+ }
121
+ else if (filters.customerIds.length > 1) {
122
+ clauses.push(`o.customer_id IN (${filters.customerIds.map(() => "?").join(", ")})`);
123
+ bindings.push(...filters.customerIds);
124
+ }
125
+ if (filters.q) {
126
+ const like = `%${filters.q.replace(/[%_]/g, "\\$&")}%`;
127
+ // display_id is numeric; also match email / id substring
128
+ clauses.push(`(
129
+ o.email ILIKE ? OR
130
+ o.id ILIKE ? OR
131
+ CAST(o.display_id AS text) ILIKE ?
132
+ )`);
133
+ bindings.push(like, like, like);
134
+ }
135
+ return { whereSql: clauses.join(" AND "), bindings };
136
+ }
137
+ async function listOrderIdsByOccurredAt(knex, filters, limit, offset) {
138
+ const { whereSql, bindings } = buildOrderWhere(filters);
139
+ const countResult = await knex.raw(`SELECT COUNT(*)::int AS count FROM "order" o WHERE ${whereSql}`, bindings);
140
+ const countRow = knexRows(countResult)[0];
141
+ const count = Math.max(0, Number(countRow?.count ?? 0) || 0);
142
+ if (count === 0 || limit === 0) {
143
+ return { ids: [], count };
144
+ }
145
+ const pageResult = await knex.raw(`SELECT o.id
146
+ FROM "order" o
147
+ WHERE ${whereSql}
148
+ ORDER BY ${OCCURRED_AT_SQL} DESC, o.created_at DESC
149
+ LIMIT ? OFFSET ?`, [...bindings, limit, offset]);
150
+ const ids = knexRows(pageResult)
151
+ .map((row) => (typeof row.id === "string" ? row.id : null))
152
+ .filter((id) => !!id);
153
+ return { ids, count };
154
+ }
155
+ async function aggregateSalesTotal(knex, filters) {
156
+ const { whereSql, bindings } = buildOrderWhere(filters);
157
+ const result = await knex.raw(`SELECT
158
+ o.status,
159
+ o.total,
160
+ o.currency_code,
161
+ o.metadata
162
+ FROM "order" o
163
+ WHERE ${whereSql}`, bindings);
164
+ let amount = 0;
165
+ let saleCount = 0;
166
+ let currency = "INR";
167
+ for (const row of knexRows(result)) {
168
+ const payable = litePayableAmount(row);
169
+ if (payable <= 0)
170
+ continue;
171
+ const status = String(row.status || "").toLowerCase();
172
+ if (status === "canceled" || status === "cancelled" || status === "draft")
173
+ continue;
174
+ amount += payable;
175
+ saleCount += 1;
176
+ if (typeof row.currency_code === "string" && row.currency_code) {
177
+ currency = row.currency_code;
178
+ }
179
+ }
180
+ return {
181
+ amount: Math.round(amount * 100) / 100,
182
+ currency,
183
+ sale_count: saleCount,
184
+ };
185
+ }
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zLW9yZGVyLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcG9zLW9yZGVyLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7QUFtQ0gsNEJBT0M7QUFFRCxvQ0FJQztBQUVELDRDQWdCQztBQUVELDBDQUlDO0FBRUQsZ0NBSUM7QUFZRCw4Q0FXQztBQVVELDREQVFDO0FBTUQsMENBMkNDO0FBRUQsNERBaUNDO0FBRUQsa0RBc0NDO0FBN05ELE1BQU0sZUFBZSxHQUFHOzs7Ozs7O0VBT3RCLENBQUE7QUFFRixTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxNQUF3QztJQUMvRCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ3RCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFRLE1BQU0sQ0FBQyxDQUFDLENBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFtQyxDQUFBO0lBQ3BGLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsS0FBeUI7SUFDcEQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUNoRCxN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
package/README.md CHANGED
@@ -32,6 +32,12 @@ Razorpay credentials also fall back to `RAZORPAY_KEY_ID` / `RAZORPAY_KEY_SECRET`
32
32
 
33
33
  All routes keep the `/admin/pos/*` paths used by the `medusa-pos` client.
34
34
 
35
+ | Method | Path | Purpose |
36
+ |--------|------|---------|
37
+ | GET | `/admin/pos/orders` | Orders tab list + optional sales total, filtered by sale time (`pos_completed_at`) |
38
+ | GET | `/admin/pos/draft-orders` | Held carts |
39
+ | … | `/admin/pos/*` | Finalize, payments, returns, catalog, etc. |
40
+
35
41
  ## Build
36
42
 
37
43
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-pos-plugin",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Medusa v2 POS operations: draft carts, finalize, payments, returns, catalog, refunds.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",