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.
Files changed (36) hide show
  1. package/.medusa/server/src/admin/index.js +23 -0
  2. package/.medusa/server/src/admin/index.mjs +24 -0
  3. package/.medusa/server/src/api/admin/pos/catalog/route.js +139 -0
  4. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/confirm-lite/route.js +41 -0
  5. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/customer/route.js +68 -0
  6. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/finalize/route.js +424 -0
  7. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/route.js +452 -0
  8. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/update/route.js +137 -0
  9. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/manual-discount/route.js +386 -0
  10. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/promotions/route.js +59 -0
  11. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/route.js +178 -0
  12. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/wallet-debit/route.js +220 -0
  13. package/.medusa/server/src/api/admin/pos/draft-orders/route.js +193 -0
  14. package/.medusa/server/src/api/admin/pos/manual-discounts/route.js +76 -0
  15. package/.medusa/server/src/api/admin/pos/orders/[id]/fulfill/route.js +103 -0
  16. package/.medusa/server/src/api/admin/pos/orders/[id]/returns/route.js +512 -0
  17. package/.medusa/server/src/api/admin/pos/orders/fulfill-pos-items.js +63 -0
  18. package/.medusa/server/src/api/admin/pos/orders/validators.js +62 -0
  19. package/.medusa/server/src/api/admin/pos/payments/config/route.js +15 -0
  20. package/.medusa/server/src/api/admin/pos/payments/device/[orderId]/route.js +39 -0
  21. package/.medusa/server/src/api/admin/pos/payments/device/cancel/route.js +27 -0
  22. package/.medusa/server/src/api/admin/pos/payments/device/route.js +107 -0
  23. package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/close/route.js +36 -0
  24. package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/route.js +42 -0
  25. package/.medusa/server/src/api/admin/pos/payments/qr/route.js +78 -0
  26. package/.medusa/server/src/index.js +8 -0
  27. package/.medusa/server/src/types.js +3 -0
  28. package/.medusa/server/src/utils/pos-draft-edit.js +178 -0
  29. package/.medusa/server/src/utils/pos-finalize.js +166 -0
  30. package/.medusa/server/src/utils/pos-inventory.js +265 -0
  31. package/.medusa/server/src/utils/pos-returns.js +339 -0
  32. package/.medusa/server/src/utils/razorpay-pos-device.js +122 -0
  33. package/.medusa/server/src/utils/razorpay-pos.js +134 -0
  34. package/README.md +39 -0
  35. package/index.js +9 -0
  36. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErRUEsa0JBb0pDO0FBbE9ELHFEQUFxRTtBQXFCckUsOEVBQThFO0FBQzlFLFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRTNCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFBO1FBQzVDLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUE7UUFDdkQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM3QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ25DLENBQUM7UUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFBO1FBQ25ELElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDM0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNuQyxDQUFDO1FBQ0QsSUFBSSxPQUFRLEdBQW1DLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBRSxHQUFrQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDL0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQTtRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ25DLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFpQjtJQUN0QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDaEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzNDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUN4RyxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUE7SUFDbkIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ1AsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWlCO0lBQ25DLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ2hGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFxQixDQUFBO0lBRXpELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN6RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRTNELE1BQU0sT0FBTyxHQUE0QjtRQUN2QyxjQUFjLEVBQUUsSUFBSTtRQUNwQixNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFBO0lBRUQsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFBO0lBQ3pELENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUE7SUFDM0MsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM3RCxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixnQkFBZ0I7Z0JBQ2hCLE9BQU87Z0JBQ1AsZUFBZTtnQkFDZixhQUFhO2dCQUNiLGtCQUFrQjtnQkFDbEIsV0FBVztnQkFDWCxVQUFVO2dCQUNWLFlBQVk7Z0JBQ1osWUFBWTtnQkFDWixPQUFPO2dCQUNQLFVBQVU7Z0JBQ1YsV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLFlBQVk7Z0JBQ1osV0FBVztnQkFDWCxhQUFhO2dCQUNiLGdCQUFnQjtnQkFDaEIsZ0JBQWdCO2dCQUNoQixxQkFBcUI7Z0JBQ3JCLG9CQUFvQjtnQkFDcEIsVUFBVTtnQkFDVixhQUFhO2dCQUNiLHFCQUFxQjtnQkFDckIsZ0JBQWdCO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLGdCQUFnQjtnQkFDaEIsaUJBQWlCO2FBQ2xCO1lBQ0QsT0FBTztZQUNQLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsS0FBSztnQkFDWCxLQUFLLEVBQUU7b0JBQ0wsVUFBVSxFQUFFLE1BQU07aUJBQ25CO2FBQ0Y7U0FDRixDQUFDLENBQUE7UUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0UsTUFBTSxRQUFRLEdBQUksS0FBdUQsQ0FBQyxRQUFRLENBQUE7WUFDbEYsTUFBTSxLQUFLLEdBQUcsQ0FBRSxLQUF1QyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEYsTUFBTSxTQUFTLEdBQUcsT0FBTyxRQUFRLEVBQUUsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ3JGLE1BQU0sUUFBUSxHQUFHLE9BQU8sUUFBUSxFQUFFLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNsRixNQUFNLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1lBRTNFLE1BQU0sT0FBTyxHQUFJLEtBQXNELENBQUMsT0FBTyxDQUFBO1lBQy9FLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBRSxLQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzFFLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBRSxLQUFrQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ25GLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FDL0IsT0FBTyxFQUFFLG1CQUFtQixJQUFJLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxPQUFPLEVBQUUsS0FBSyxDQUM1RSxDQUFBO1lBQ0QsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBRXRDLGtGQUFrRjtZQUNsRixNQUFNLEtBQUssR0FDVCxjQUFjLEdBQUcsQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLGNBQWM7Z0JBQ2hCLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQztvQkFDZixDQUFDLENBQUMsV0FBVztvQkFDYixDQUFDLENBQUMsYUFBYSxHQUFHLENBQUM7d0JBQ2pCLENBQUMsQ0FBQyxhQUFhO3dCQUNmLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFbkIsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFFLEtBQWdDLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDN0UsTUFBTSxRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFMUQsT0FBTztnQkFDTCxFQUFFLEVBQUcsS0FBd0IsQ0FBQyxFQUFFO2dCQUNoQyxVQUFVLEVBQUcsS0FBaUQsQ0FBQyxVQUFVLElBQUksSUFBSTtnQkFDakYsTUFBTSxFQUFHLEtBQTZCLENBQUMsTUFBTTtnQkFDN0MsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLEtBQUssRUFBRyxLQUFtQyxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUN6RCxhQUFhLEVBQUcsS0FBMkMsQ0FBQyxhQUFhLElBQUksSUFBSTtnQkFDakYsV0FBVyxFQUFHLEtBQXlDLENBQUMsV0FBVyxJQUFJLElBQUk7Z0JBQzNFLGdCQUFnQixFQUFHLEtBQThDLENBQUMsZ0JBQWdCLElBQUksSUFBSTtnQkFDMUYsU0FBUyxFQUFHLEtBQXVDLENBQUMsU0FBUyxJQUFJLElBQUk7Z0JBQ3JFLFFBQVEsRUFBRyxLQUF1RCxDQUFDLFFBQVEsSUFBSSxJQUFJO2dCQUNuRixVQUFVLEVBQUcsS0FBaUMsQ0FBQyxVQUFVLElBQUksSUFBSTtnQkFDakUsVUFBVSxFQUFHLEtBQWlDLENBQUMsVUFBVSxJQUFJLElBQUk7Z0JBQ2pFLE1BQU0sRUFBRTtvQkFDTixLQUFLO29CQUNMLFFBQVE7b0JBQ1IsU0FBUyxFQUFFLGFBQWEsQ0FBRSxLQUFpQyxDQUFDLFNBQVMsQ0FBQztvQkFDdEUsY0FBYyxFQUFFLGFBQWEsQ0FBRSxLQUFzQyxDQUFDLGNBQWMsQ0FBQztpQkFDdEY7Z0JBQ0QsVUFBVSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTTtnQkFDN0MsUUFBUSxFQUFFLFFBQVE7b0JBQ2hCLENBQUMsQ0FBQzt3QkFDRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxJQUFJO3dCQUN2QixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJO3dCQUM3QixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJO3dCQUM3QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJO3dCQUN2QyxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsSUFBSSxJQUFJO3dCQUNyQyxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUk7cUJBQzNCO29CQUNILENBQUMsQ0FBQyxJQUFJO2dCQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMxQixHQUFHLElBQUk7b0JBQ1AsVUFBVSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUMxQyxRQUFRLEVBQ04sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO3dCQUNuQixDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN6RSxDQUFDLENBQUM7YUFDSixDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTTtZQUN2QyxLQUFLO1lBQ0wsTUFBTTtTQUNQLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDZCQUE2QjtTQUNoRixDQUFDLENBQUE7SUFDSixDQUFDO0FBQ0gsQ0FBQyJ9