medusa-pos-plugin 0.0.1
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/admin/index.js +23 -0
- package/.medusa/server/src/admin/index.mjs +24 -0
- package/.medusa/server/src/api/admin/pos/catalog/route.js +139 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/confirm-lite/route.js +41 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/customer/route.js +68 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/finalize/route.js +424 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/route.js +452 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/update/route.js +137 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/manual-discount/route.js +386 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/promotions/route.js +59 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/route.js +178 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/[id]/wallet-debit/route.js +220 -0
- package/.medusa/server/src/api/admin/pos/draft-orders/route.js +193 -0
- package/.medusa/server/src/api/admin/pos/manual-discounts/route.js +76 -0
- package/.medusa/server/src/api/admin/pos/orders/[id]/fulfill/route.js +103 -0
- package/.medusa/server/src/api/admin/pos/orders/[id]/returns/route.js +512 -0
- package/.medusa/server/src/api/admin/pos/orders/fulfill-pos-items.js +63 -0
- package/.medusa/server/src/api/admin/pos/orders/validators.js +62 -0
- package/.medusa/server/src/api/admin/pos/payments/config/route.js +15 -0
- package/.medusa/server/src/api/admin/pos/payments/device/[orderId]/route.js +39 -0
- package/.medusa/server/src/api/admin/pos/payments/device/cancel/route.js +27 -0
- package/.medusa/server/src/api/admin/pos/payments/device/route.js +107 -0
- package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/close/route.js +36 -0
- package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/route.js +42 -0
- package/.medusa/server/src/api/admin/pos/payments/qr/route.js +78 -0
- package/.medusa/server/src/index.js +8 -0
- package/.medusa/server/src/types.js +3 -0
- package/.medusa/server/src/utils/pos-draft-edit.js +178 -0
- package/.medusa/server/src/utils/pos-finalize.js +166 -0
- package/.medusa/server/src/utils/pos-inventory.js +265 -0
- package/.medusa/server/src/utils/pos-returns.js +339 -0
- package/.medusa/server/src/utils/razorpay-pos-device.js +122 -0
- package/.medusa/server/src/utils/razorpay-pos.js +134 -0
- package/README.md +39 -0
- package/index.js +9 -0
- package/package.json +82 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DELETE = DELETE;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
function log(step, detail) {
|
|
7
|
+
const payload = { step, at: new Date().toISOString(), ...detail };
|
|
8
|
+
console.log(`[POS Clear] ${step}`, payload);
|
|
9
|
+
}
|
|
10
|
+
async function snapshotOrders(query) {
|
|
11
|
+
const { data = [] } = await query.graph({
|
|
12
|
+
entity: "order",
|
|
13
|
+
fields: ["id", "display_id", "status", "is_draft_order", "created_at"],
|
|
14
|
+
filters: {},
|
|
15
|
+
pagination: {
|
|
16
|
+
skip: 0,
|
|
17
|
+
take: 50,
|
|
18
|
+
order: { created_at: "DESC" },
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
const all = (Array.isArray(data) ? data : []).map((row) => {
|
|
22
|
+
const o = row;
|
|
23
|
+
return {
|
|
24
|
+
id: o.id,
|
|
25
|
+
display_id: o.display_id ?? null,
|
|
26
|
+
status: o.status ?? null,
|
|
27
|
+
is_draft_order: o.is_draft_order ?? null,
|
|
28
|
+
created_at: o.created_at ?? null,
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
const drafts = all.filter((o) => o.is_draft_order === true || String(o.status || "").toLowerCase() === "draft");
|
|
32
|
+
const completed = all.filter((o) => o.is_draft_order !== true && String(o.status || "").toLowerCase() !== "draft");
|
|
33
|
+
return { all, drafts, completed };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* DELETE /admin/pos/draft-orders/:id
|
|
37
|
+
*
|
|
38
|
+
* Clears ONE POS draft only. Logs before/after completed-order counts so we can
|
|
39
|
+
* prove Clear does not wipe the Orders tab / completed sales.
|
|
40
|
+
*/
|
|
41
|
+
async function DELETE(req, res) {
|
|
42
|
+
const id = req.params.id;
|
|
43
|
+
if (!id) {
|
|
44
|
+
res.status(400).json({ message: "Draft order id is required" });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
48
|
+
try {
|
|
49
|
+
log("1_start", {
|
|
50
|
+
deleting_id: id,
|
|
51
|
+
focus: "checking if COMPLETED orders get removed by Clear",
|
|
52
|
+
});
|
|
53
|
+
const before = await snapshotOrders(query);
|
|
54
|
+
log("2a_completed_orders_BEFORE_clear", {
|
|
55
|
+
total_listed: before.all.length,
|
|
56
|
+
completed_count: before.completed.length,
|
|
57
|
+
completed_ids: before.completed.map((o) => ({
|
|
58
|
+
id: o.id,
|
|
59
|
+
display_id: o.display_id,
|
|
60
|
+
status: o.status,
|
|
61
|
+
})),
|
|
62
|
+
also_in_response_drafts: before.drafts.map((o) => ({
|
|
63
|
+
id: o.id,
|
|
64
|
+
display_id: o.display_id,
|
|
65
|
+
status: o.status,
|
|
66
|
+
})),
|
|
67
|
+
});
|
|
68
|
+
log("2b_held_drafts_BEFORE_clear", {
|
|
69
|
+
count: before.drafts.length,
|
|
70
|
+
ids: before.drafts.map((o) => ({ id: o.id, display_id: o.display_id })),
|
|
71
|
+
target_in_list: before.drafts.some((o) => o.id === id),
|
|
72
|
+
});
|
|
73
|
+
const target = before.all.find((o) => o.id === id);
|
|
74
|
+
if (!target) {
|
|
75
|
+
log("abort", { reason: "draft_not_found", deleting_id: id });
|
|
76
|
+
res.status(404).json({ message: `Draft order ${id} not found` });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const isDraft = target.is_draft_order === true ||
|
|
80
|
+
String(target.status || "").toLowerCase() === "draft";
|
|
81
|
+
if (!isDraft) {
|
|
82
|
+
log("abort", {
|
|
83
|
+
reason: "not_a_draft_refusing_delete",
|
|
84
|
+
deleting_id: id,
|
|
85
|
+
status: target.status,
|
|
86
|
+
is_draft_order: target.is_draft_order,
|
|
87
|
+
});
|
|
88
|
+
res.status(400).json({
|
|
89
|
+
message: `Order ${id} is not a draft — refusing delete to protect completed orders`,
|
|
90
|
+
status: target.status,
|
|
91
|
+
is_draft_order: target.is_draft_order,
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
log("4_cancel_edit", { deleting_id: id });
|
|
96
|
+
try {
|
|
97
|
+
await (0, core_flows_1.cancelDraftOrderEditWorkflow)(req.scope).run({
|
|
98
|
+
input: { order_id: id },
|
|
99
|
+
});
|
|
100
|
+
log("4_cancel_edit_ok", { deleting_id: id });
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
// No active edit is fine
|
|
104
|
+
log("4_cancel_edit_skip", {
|
|
105
|
+
deleting_id: id,
|
|
106
|
+
message: err instanceof Error ? err.message : String(err),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
log("5_delete_draft_api", {
|
|
110
|
+
deleting_id: id,
|
|
111
|
+
note: "ONLY this draft id should be deleted — completed orders must stay",
|
|
112
|
+
});
|
|
113
|
+
await (0, core_flows_1.deleteDraftOrdersWorkflow)(req.scope).run({
|
|
114
|
+
input: { order_ids: [id] },
|
|
115
|
+
});
|
|
116
|
+
log("5_delete_draft_api_ok", { deleting_id: id, deleted: true, id });
|
|
117
|
+
const after = await snapshotOrders(query);
|
|
118
|
+
const afterDraftIds = new Set(after.drafts.map((o) => o.id));
|
|
119
|
+
const removedDrafts = before.drafts.filter((o) => !afterDraftIds.has(o.id));
|
|
120
|
+
const unexpectedRemovedDrafts = removedDrafts.filter((o) => o.id !== id);
|
|
121
|
+
log("6a_held_drafts_AFTER_clear", {
|
|
122
|
+
before_count: before.drafts.length,
|
|
123
|
+
after_count: after.drafts.length,
|
|
124
|
+
removed: removedDrafts,
|
|
125
|
+
unexpected_removed: unexpectedRemovedDrafts,
|
|
126
|
+
verdict: unexpectedRemovedDrafts.length > 0
|
|
127
|
+
? "BUG: other drafts also removed"
|
|
128
|
+
: removedDrafts.length === 1 && removedDrafts[0]?.id === id
|
|
129
|
+
? "OK: only current draft removed"
|
|
130
|
+
: removedDrafts.length === 0
|
|
131
|
+
? "WARN: target not removed from held list"
|
|
132
|
+
: "CHECK: unexpected remove set",
|
|
133
|
+
});
|
|
134
|
+
const afterCompletedIds = new Set(after.completed.map((o) => o.id));
|
|
135
|
+
const missingCompleted = before.completed.filter((o) => !afterCompletedIds.has(o.id));
|
|
136
|
+
const targetWasCompleted = before.completed.some((o) => o.id === id);
|
|
137
|
+
const completedVerdict = missingCompleted.length === 0
|
|
138
|
+
? "OK: no completed orders removed"
|
|
139
|
+
: missingCompleted.every((o) => o.id === id)
|
|
140
|
+
? "WARN: deleted id appeared in completed list (maybe already converted?)"
|
|
141
|
+
: "BUG: existing completed orders were removed by Clear";
|
|
142
|
+
log("6c_COMPLETED_ORDERS_DIFF", {
|
|
143
|
+
before_count: before.completed.length,
|
|
144
|
+
after_count: after.completed.length,
|
|
145
|
+
missing_completed: missingCompleted.map((o) => ({
|
|
146
|
+
id: o.id,
|
|
147
|
+
display_id: o.display_id,
|
|
148
|
+
status: o.status,
|
|
149
|
+
})),
|
|
150
|
+
deleted_draft_id: id,
|
|
151
|
+
deleted_id_was_in_completed_list: targetWasCompleted,
|
|
152
|
+
verdict: completedVerdict,
|
|
153
|
+
});
|
|
154
|
+
log("7_done", { deleted_id: id });
|
|
155
|
+
res.status(200).json({
|
|
156
|
+
id,
|
|
157
|
+
object: "draft_order",
|
|
158
|
+
deleted: true,
|
|
159
|
+
diagnostics: {
|
|
160
|
+
completed_before: before.completed.length,
|
|
161
|
+
completed_after: after.completed.length,
|
|
162
|
+
missing_completed: missingCompleted,
|
|
163
|
+
drafts_removed: removedDrafts,
|
|
164
|
+
verdict: completedVerdict,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
log("error", {
|
|
170
|
+
deleting_id: id,
|
|
171
|
+
message: error instanceof Error ? error.message : String(error),
|
|
172
|
+
});
|
|
173
|
+
res.status(500).json({
|
|
174
|
+
message: error instanceof Error ? error.message : "Failed to delete draft order",
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvW2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZEQSx3QkF1SkM7QUFuTkQscURBQXFFO0FBQ3JFLDREQUdvQztBQVVwQyxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsTUFBZ0M7SUFDekQsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQTtJQUNqRSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDN0MsQ0FBQztBQUVELEtBQUssVUFBVSxjQUFjLENBQUMsS0FFN0I7SUFDQyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN0QyxNQUFNLEVBQUUsT0FBTztRQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQztRQUN0RSxPQUFPLEVBQUUsRUFBRTtRQUNYLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLEVBQUU7WUFDUixLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFO1NBQzlCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLEdBQWdCLENBQUE7UUFD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
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPosWalletDebit = runPosWalletDebit;
|
|
4
|
+
exports.POST = POST;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const validators_1 = require("../../../orders/validators");
|
|
7
|
+
const pos_returns_1 = require("../../../../../../utils/pos-returns");
|
|
8
|
+
const WALLET_MODULE = "wallet_ledger";
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
11
|
+
}
|
|
12
|
+
function firstKnexRow(result) {
|
|
13
|
+
const fromRows = result.rows;
|
|
14
|
+
if (Array.isArray(fromRows) && isRecord(fromRows[0])) {
|
|
15
|
+
return fromRows[0];
|
|
16
|
+
}
|
|
17
|
+
const batch = result[0];
|
|
18
|
+
if (Array.isArray(batch) && isRecord(batch[0])) {
|
|
19
|
+
return batch[0];
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
function toFlag(value) {
|
|
24
|
+
return value === true || value === "t" || value === "true" || value === 1;
|
|
25
|
+
}
|
|
26
|
+
function readCustomerId(order) {
|
|
27
|
+
if (typeof order.customer_id === "string" && order.customer_id) {
|
|
28
|
+
return order.customer_id;
|
|
29
|
+
}
|
|
30
|
+
if (isRecord(order.customer) && typeof order.customer.id === "string") {
|
|
31
|
+
return order.customer.id;
|
|
32
|
+
}
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
function readCustomerEmail(order) {
|
|
36
|
+
if (isRecord(order.customer) && typeof order.customer.email === "string") {
|
|
37
|
+
return order.customer.email;
|
|
38
|
+
}
|
|
39
|
+
if (typeof order.email === "string")
|
|
40
|
+
return order.email;
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function readCustomerPhone(order) {
|
|
44
|
+
if (isRecord(order.customer) && typeof order.customer.phone === "string") {
|
|
45
|
+
return order.customer.phone;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function pickAvailable(accounts, currency) {
|
|
50
|
+
const canonical = currency.toUpperCase();
|
|
51
|
+
const match = accounts.find((account) => (account.currency || "").toUpperCase() === canonical) ??
|
|
52
|
+
accounts[0];
|
|
53
|
+
return (0, pos_returns_1.toAmount)(match?.available);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Debit a registered customer's wallet before convert. Duplicate calls use
|
|
57
|
+
* `pos:draft:{id}:wallet` so a retry does not double-debit.
|
|
58
|
+
*/
|
|
59
|
+
async function runPosWalletDebit(req, draftOrderId, requested) {
|
|
60
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
61
|
+
const { data } = await query
|
|
62
|
+
.graph({
|
|
63
|
+
entity: "order",
|
|
64
|
+
fields: [
|
|
65
|
+
"id",
|
|
66
|
+
"status",
|
|
67
|
+
"is_draft_order",
|
|
68
|
+
"email",
|
|
69
|
+
"total",
|
|
70
|
+
"currency_code",
|
|
71
|
+
"customer_id",
|
|
72
|
+
"customer.id",
|
|
73
|
+
"customer.email",
|
|
74
|
+
"customer.phone",
|
|
75
|
+
],
|
|
76
|
+
filters: { id: draftOrderId },
|
|
77
|
+
})
|
|
78
|
+
.catch(() => ({ data: [] }));
|
|
79
|
+
const order = data[0];
|
|
80
|
+
if (!order) {
|
|
81
|
+
return { status: 404, body: { message: "Draft order not found", type: "NOT_FOUND" } };
|
|
82
|
+
}
|
|
83
|
+
const status = typeof order.status === "string" ? order.status.toLowerCase() : "";
|
|
84
|
+
const isDraft = order.is_draft_order === true || status === "draft";
|
|
85
|
+
if (!isDraft) {
|
|
86
|
+
return { status: 400, body: { message: "Order is no longer a draft", type: "INVALID_DATA" } };
|
|
87
|
+
}
|
|
88
|
+
const customerId = readCustomerId(order);
|
|
89
|
+
const customerEmail = readCustomerEmail(order);
|
|
90
|
+
const customerPhone = readCustomerPhone(order);
|
|
91
|
+
if (!customerId) {
|
|
92
|
+
return {
|
|
93
|
+
status: 400,
|
|
94
|
+
body: {
|
|
95
|
+
message: "Wallet payment requires a registered customer",
|
|
96
|
+
type: "WALLET_REQUIRES_CUSTOMER",
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
101
|
+
const flagsRow = firstKnexRow(await knex.raw(`SELECT email, phone, email_verified, phone_verified
|
|
102
|
+
FROM customer
|
|
103
|
+
WHERE id = ? AND deleted_at IS NULL`, [customerId]));
|
|
104
|
+
const emailVerified = toFlag(flagsRow?.email_verified);
|
|
105
|
+
const phoneVerified = toFlag(flagsRow?.phone_verified);
|
|
106
|
+
const walkInEmail = (typeof flagsRow?.email === "string" ? flagsRow.email : customerEmail) ?? null;
|
|
107
|
+
const walkInPhone = (typeof flagsRow?.phone === "string" ? flagsRow.phone : customerPhone) ?? null;
|
|
108
|
+
let walletService;
|
|
109
|
+
try {
|
|
110
|
+
walletService = req.scope.resolve(WALLET_MODULE);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return { status: 400, body: { message: "Wallet feature is disabled", type: "WALLET_DISABLED" } };
|
|
114
|
+
}
|
|
115
|
+
if (!walletService.isEnabled()) {
|
|
116
|
+
return { status: 400, body: { message: "Wallet feature is disabled", type: "WALLET_DISABLED" } };
|
|
117
|
+
}
|
|
118
|
+
const currency = (typeof order.currency_code === "string" ? order.currency_code : "INR").toUpperCase();
|
|
119
|
+
const total = (0, pos_returns_1.toAmount)(order.total);
|
|
120
|
+
let available = 0;
|
|
121
|
+
try {
|
|
122
|
+
const listed = await walletService.listAccounts({
|
|
123
|
+
ownerType: "customer",
|
|
124
|
+
ownerId: customerId,
|
|
125
|
+
limit: 20,
|
|
126
|
+
offset: 0,
|
|
127
|
+
});
|
|
128
|
+
available = pickAvailable(listed.accounts, currency);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
available = 0;
|
|
132
|
+
}
|
|
133
|
+
const decision = (0, pos_returns_1.decidePosWalletDebit)({
|
|
134
|
+
isWalkIn: (0, pos_returns_1.isPosWalkInCustomer)({ email: walkInEmail, phone: walkInPhone }),
|
|
135
|
+
emailVerified,
|
|
136
|
+
phoneVerified,
|
|
137
|
+
requested,
|
|
138
|
+
total,
|
|
139
|
+
available,
|
|
140
|
+
});
|
|
141
|
+
if (!decision.ok) {
|
|
142
|
+
return {
|
|
143
|
+
status: decision.status,
|
|
144
|
+
body: {
|
|
145
|
+
message: decision.message,
|
|
146
|
+
type: decision.type,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const debit = await walletService.adminDebit({
|
|
152
|
+
ownerType: "customer",
|
|
153
|
+
ownerId: customerId,
|
|
154
|
+
amount: (0, pos_returns_1.toMinorUnit)(decision.applied),
|
|
155
|
+
reason: `POS sale ${draftOrderId}`,
|
|
156
|
+
purpose: "customer_checkout_debit",
|
|
157
|
+
idempotencyKey: (0, pos_returns_1.posWalletDebitIdempotencyKey)(draftOrderId),
|
|
158
|
+
currency,
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
status: 200,
|
|
162
|
+
body: {
|
|
163
|
+
applied: decision.applied,
|
|
164
|
+
wallet: {
|
|
165
|
+
account_id: debit.account.id,
|
|
166
|
+
owner_id: debit.account.ownerId,
|
|
167
|
+
available: debit.account.availableBalance / 100,
|
|
168
|
+
currency: debit.account.currency,
|
|
169
|
+
transaction_id: debit.entry.id,
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
const message = (0, pos_returns_1.getThrownErrorMessage)(error, "Failed to debit wallet");
|
|
176
|
+
if (/insufficient/i.test(message)) {
|
|
177
|
+
return {
|
|
178
|
+
status: 400,
|
|
179
|
+
body: {
|
|
180
|
+
message: "Insufficient wallet balance",
|
|
181
|
+
type: "INSUFFICIENT_BALANCE",
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
status: 500,
|
|
187
|
+
body: {
|
|
188
|
+
message: "Failed to debit wallet",
|
|
189
|
+
error: message,
|
|
190
|
+
type: "WALLET_DEBIT_FAILED",
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* POST /admin/pos/draft-orders/:id/wallet-debit
|
|
197
|
+
*
|
|
198
|
+
* Debit a registered customer's wallet before the draft is converted, so a
|
|
199
|
+
* failed debit never ships an unpaid ledger. Duplicate calls use
|
|
200
|
+
* `pos:draft:{id}:wallet` so a retry does not double-debit.
|
|
201
|
+
*/
|
|
202
|
+
async function POST(req, res) {
|
|
203
|
+
const draftOrderId = req.params.id;
|
|
204
|
+
if (typeof draftOrderId !== "string" || !draftOrderId) {
|
|
205
|
+
res.status(400).json({ message: "Draft order id is required", type: "INVALID_DATA" });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const parseResult = validators_1.PosWalletDebitSchema.safeParse(req.body ?? {});
|
|
209
|
+
if (!parseResult.success) {
|
|
210
|
+
res.status(400).json({
|
|
211
|
+
message: "Invalid request data",
|
|
212
|
+
errors: parseResult.error.flatten(),
|
|
213
|
+
type: "INVALID_DATA",
|
|
214
|
+
});
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const result = await runPosWalletDebit(req, draftOrderId, parseResult.data.amount);
|
|
218
|
+
res.status(result.status).json(result.body);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvW2lkXS93YWxsZXQtZGViaXQvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFtSUEsOENBeUpDO0FBU0Qsb0JBbUJDO0FBdlRELHFEQUFxRTtBQUNyRSwyREFBaUU7QUFDakUscUVBTzRDO0FBRTVDLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQTtBQW9EckMsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBQzdFLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsTUFBOEQ7SUFFOUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQTtJQUM1QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEIsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxLQUFjO0lBQzVCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJ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
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/** Medusa totals often come as number | string | { numeric|value|valueOf } */
|
|
6
|
+
function resolveAmount(value) {
|
|
7
|
+
if (value == null)
|
|
8
|
+
return 0;
|
|
9
|
+
if (typeof value === "number") {
|
|
10
|
+
return Number.isFinite(value) ? value : 0;
|
|
11
|
+
}
|
|
12
|
+
if (typeof value === "string") {
|
|
13
|
+
const n = Number(value);
|
|
14
|
+
return Number.isFinite(n) ? n : 0;
|
|
15
|
+
}
|
|
16
|
+
if (typeof value === "bigint") {
|
|
17
|
+
return Number(value);
|
|
18
|
+
}
|
|
19
|
+
if (typeof value === "object") {
|
|
20
|
+
const obj = value;
|
|
21
|
+
if (typeof obj.numeric === "number")
|
|
22
|
+
return obj.numeric;
|
|
23
|
+
if (typeof obj.numeric === "string") {
|
|
24
|
+
const n = Number(obj.numeric);
|
|
25
|
+
return Number.isFinite(n) ? n : 0;
|
|
26
|
+
}
|
|
27
|
+
if (typeof obj.value === "number")
|
|
28
|
+
return obj.value;
|
|
29
|
+
if (typeof obj.value === "string") {
|
|
30
|
+
const n = Number(obj.value);
|
|
31
|
+
return Number.isFinite(n) ? n : 0;
|
|
32
|
+
}
|
|
33
|
+
if (typeof obj.valueOf === "function") {
|
|
34
|
+
const v = Number(obj.valueOf());
|
|
35
|
+
if (Number.isFinite(v))
|
|
36
|
+
return v;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const n = Number(value);
|
|
40
|
+
return Number.isFinite(n) ? n : 0;
|
|
41
|
+
}
|
|
42
|
+
function sumItemsTotal(items) {
|
|
43
|
+
return items.reduce((sum, item) => {
|
|
44
|
+
const qty = Number(item.quantity ?? 0) || 0;
|
|
45
|
+
const line = item.subtotal != null ? resolveAmount(item.subtotal) : resolveAmount(item.unit_price) * qty;
|
|
46
|
+
return sum + line;
|
|
47
|
+
}, 0);
|
|
48
|
+
}
|
|
49
|
+
function sumItemQty(items) {
|
|
50
|
+
return items.reduce((sum, item) => sum + (Number(item.quantity ?? 0) || 0), 0);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* GET /admin/pos/draft-orders
|
|
54
|
+
*
|
|
55
|
+
* Lists open POS draft orders (hold carts). Includes customer_id / customer
|
|
56
|
+
* so cashier can see whose bill is on hold and switch to another customer.
|
|
57
|
+
*/
|
|
58
|
+
async function GET(req, res) {
|
|
59
|
+
const queryParams = (req.query || {});
|
|
60
|
+
const limit = Math.min(Math.max(Number(queryParams.limit) || 50, 1), 100);
|
|
61
|
+
const offset = Math.max(Number(queryParams.offset) || 0, 0);
|
|
62
|
+
const filters = {
|
|
63
|
+
is_draft_order: true,
|
|
64
|
+
status: "draft",
|
|
65
|
+
};
|
|
66
|
+
if (queryParams.sales_channel_id) {
|
|
67
|
+
filters.sales_channel_id = queryParams.sales_channel_id;
|
|
68
|
+
}
|
|
69
|
+
if (queryParams.region_id) {
|
|
70
|
+
filters.region_id = queryParams.region_id;
|
|
71
|
+
}
|
|
72
|
+
if (queryParams.customer_id) {
|
|
73
|
+
filters.customer_id = queryParams.customer_id;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
77
|
+
const { data: draftOrders = [], metadata } = await query.graph({
|
|
78
|
+
entity: "order",
|
|
79
|
+
fields: [
|
|
80
|
+
"id",
|
|
81
|
+
"display_id",
|
|
82
|
+
"status",
|
|
83
|
+
"is_draft_order",
|
|
84
|
+
"email",
|
|
85
|
+
"currency_code",
|
|
86
|
+
"customer_id",
|
|
87
|
+
"sales_channel_id",
|
|
88
|
+
"region_id",
|
|
89
|
+
"metadata",
|
|
90
|
+
"created_at",
|
|
91
|
+
"updated_at",
|
|
92
|
+
"total",
|
|
93
|
+
"subtotal",
|
|
94
|
+
"tax_total",
|
|
95
|
+
"discount_total",
|
|
96
|
+
"item_total",
|
|
97
|
+
"summary.*",
|
|
98
|
+
"customer.id",
|
|
99
|
+
"customer.email",
|
|
100
|
+
"customer.phone",
|
|
101
|
+
"customer.first_name",
|
|
102
|
+
"customer.last_name",
|
|
103
|
+
"items.id",
|
|
104
|
+
"items.title",
|
|
105
|
+
"items.product_title",
|
|
106
|
+
"items.quantity",
|
|
107
|
+
"items.unit_price",
|
|
108
|
+
"items.subtotal",
|
|
109
|
+
"items.thumbnail",
|
|
110
|
+
],
|
|
111
|
+
filters,
|
|
112
|
+
pagination: {
|
|
113
|
+
skip: offset,
|
|
114
|
+
take: limit,
|
|
115
|
+
order: {
|
|
116
|
+
updated_at: "DESC",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const orders = (Array.isArray(draftOrders) ? draftOrders : []).map((order) => {
|
|
121
|
+
const customer = order.customer;
|
|
122
|
+
const items = (order.items || []).filter(Boolean);
|
|
123
|
+
const firstName = typeof customer?.first_name === "string" ? customer.first_name : "";
|
|
124
|
+
const lastName = typeof customer?.last_name === "string" ? customer.last_name : "";
|
|
125
|
+
const customerName = [firstName, lastName].filter(Boolean).join(" ").trim();
|
|
126
|
+
const summary = order.summary;
|
|
127
|
+
const fromOrderTotal = resolveAmount(order.total);
|
|
128
|
+
const fromItemTotal = resolveAmount(order.item_total);
|
|
129
|
+
const fromSummary = resolveAmount(summary?.current_order_total ?? summary?.accounting_total ?? summary?.total);
|
|
130
|
+
const fromItems = sumItemsTotal(items);
|
|
131
|
+
// Draft orders often expose 0 on order.total via query — prefer item sum fallback
|
|
132
|
+
const total = fromOrderTotal > 0
|
|
133
|
+
? fromOrderTotal
|
|
134
|
+
: fromSummary > 0
|
|
135
|
+
? fromSummary
|
|
136
|
+
: fromItemTotal > 0
|
|
137
|
+
? fromItemTotal
|
|
138
|
+
: fromItems;
|
|
139
|
+
const subtotalRaw = resolveAmount(order.subtotal);
|
|
140
|
+
const subtotal = subtotalRaw > 0 ? subtotalRaw : fromItems;
|
|
141
|
+
return {
|
|
142
|
+
id: order.id,
|
|
143
|
+
display_id: order.display_id ?? null,
|
|
144
|
+
status: order.status,
|
|
145
|
+
is_draft_order: true,
|
|
146
|
+
email: order.email ?? null,
|
|
147
|
+
currency_code: order.currency_code ?? null,
|
|
148
|
+
customer_id: order.customer_id ?? null,
|
|
149
|
+
sales_channel_id: order.sales_channel_id ?? null,
|
|
150
|
+
region_id: order.region_id ?? null,
|
|
151
|
+
metadata: order.metadata ?? null,
|
|
152
|
+
created_at: order.created_at ?? null,
|
|
153
|
+
updated_at: order.updated_at ?? null,
|
|
154
|
+
totals: {
|
|
155
|
+
total,
|
|
156
|
+
subtotal,
|
|
157
|
+
tax_total: resolveAmount(order.tax_total),
|
|
158
|
+
discount_total: resolveAmount(order.discount_total),
|
|
159
|
+
},
|
|
160
|
+
item_count: sumItemQty(items) || items.length,
|
|
161
|
+
customer: customer
|
|
162
|
+
? {
|
|
163
|
+
id: customer.id ?? null,
|
|
164
|
+
email: customer.email ?? null,
|
|
165
|
+
phone: customer.phone ?? null,
|
|
166
|
+
first_name: customer.first_name ?? null,
|
|
167
|
+
last_name: customer.last_name ?? null,
|
|
168
|
+
name: customerName || null,
|
|
169
|
+
}
|
|
170
|
+
: null,
|
|
171
|
+
items: items.map((item) => ({
|
|
172
|
+
...item,
|
|
173
|
+
unit_price: resolveAmount(item.unit_price),
|
|
174
|
+
subtotal: item.subtotal != null
|
|
175
|
+
? resolveAmount(item.subtotal)
|
|
176
|
+
: resolveAmount(item.unit_price) * (Number(item.quantity ?? 0) || 0),
|
|
177
|
+
})),
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
res.status(200).json({
|
|
181
|
+
draft_orders: orders,
|
|
182
|
+
count: metadata?.count ?? orders.length,
|
|
183
|
+
limit,
|
|
184
|
+
offset,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
res.status(500).json({
|
|
189
|
+
message: error instanceof Error ? error.message : "Failed to list draft orders",
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErRUEsa0JBb0pDO0FBbE9ELHFEQUFxRTtBQXFCckUsOEVBQThFO0FBQzlFLFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRTNCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFBO1FBQzVDLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUE7UUFDdkQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FB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
|