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,386 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ exports.DELETE = DELETE;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ const pos_draft_edit_1 = require("../../../../../../utils/pos-draft-edit");
8
+ const POSMAN_PREFIX = "POSMAN-";
9
+ const manualDiscountLocks = new Map();
10
+ async function withManualDiscountLock(draftOrderId, fn) {
11
+ const prev = manualDiscountLocks.get(draftOrderId) ?? Promise.resolve();
12
+ let release = () => undefined;
13
+ const gate = new Promise((resolve) => {
14
+ release = resolve;
15
+ });
16
+ const next = prev.then(() => gate);
17
+ manualDiscountLocks.set(draftOrderId, next);
18
+ await prev;
19
+ try {
20
+ return await fn();
21
+ }
22
+ finally {
23
+ release();
24
+ if (manualDiscountLocks.get(draftOrderId) === next) {
25
+ manualDiscountLocks.delete(draftOrderId);
26
+ }
27
+ }
28
+ }
29
+ function resolveAmount(value) {
30
+ return (0, pos_draft_edit_1.toAmount)(value);
31
+ }
32
+ /** Prefer order totals; fall back to summing line items when BigNumber parse fails. */
33
+ function resolveOrderPayable(order) {
34
+ const fromTotal = resolveAmount(order.total);
35
+ if (fromTotal > 0)
36
+ return fromTotal;
37
+ const fromSubtotal = resolveAmount(order.subtotal);
38
+ if (fromSubtotal > 0)
39
+ return fromSubtotal;
40
+ const items = Array.isArray(order.items) ? order.items : [];
41
+ let sum = 0;
42
+ for (const item of items) {
43
+ const line = resolveAmount(item?.subtotal) ||
44
+ resolveAmount(item?.total) ||
45
+ resolveAmount(item?.unit_price) * (Number(item?.quantity) || 0);
46
+ sum += Math.max(0, line);
47
+ }
48
+ return sum;
49
+ }
50
+ function isPosManualCode(code) {
51
+ return typeof code === "string" && code.startsWith(POSMAN_PREFIX);
52
+ }
53
+ function collectPosManualCodes(order) {
54
+ const fromItems = order.items?.flatMap((item) => item.adjustments
55
+ ?.map((adj) => adj.code)
56
+ .filter((code) => isPosManualCode(code)) ?? []) ?? [];
57
+ const fromPromos = order.promotions
58
+ ?.map((p) => p.code)
59
+ .filter((code) => isPosManualCode(code)) ?? [];
60
+ return Array.from(new Set([...fromItems, ...fromPromos]));
61
+ }
62
+ function isDraftOrder(order) {
63
+ if (!order)
64
+ return false;
65
+ if (order.is_draft_order === true)
66
+ return true;
67
+ return String(order.status || "").toLowerCase() === "draft";
68
+ }
69
+ async function loadDraftOrder(scope, id) {
70
+ const orderModule = scope.resolve(utils_1.Modules.ORDER);
71
+ let order = null;
72
+ try {
73
+ order = (await orderModule.retrieveOrder(id, {
74
+ select: [
75
+ "id",
76
+ "display_id",
77
+ "status",
78
+ "is_draft_order",
79
+ "currency_code",
80
+ "email",
81
+ "total",
82
+ "subtotal",
83
+ "discount_total",
84
+ "metadata",
85
+ ],
86
+ relations: ["items", "items.adjustments", "promotions"],
87
+ }));
88
+ }
89
+ catch {
90
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
91
+ const { data } = await query.graph({
92
+ entity: "order",
93
+ fields: [
94
+ "id",
95
+ "display_id",
96
+ "status",
97
+ "is_draft_order",
98
+ "currency_code",
99
+ "email",
100
+ "total",
101
+ "subtotal",
102
+ "discount_total",
103
+ "metadata",
104
+ "items.*",
105
+ "items.adjustments.*",
106
+ "promotions.*",
107
+ ],
108
+ filters: { id },
109
+ });
110
+ order = (Array.isArray(data) ? data[0] : null);
111
+ }
112
+ if (!order)
113
+ return null;
114
+ // Open POS edit can leave confirmed order totals at 0 — prefer preview for payable math.
115
+ try {
116
+ const preview = await orderModule.previewOrderChange(id);
117
+ const previewItems = Array.isArray(preview?.items) ? preview.items : [];
118
+ if (previewItems.length > 0) {
119
+ return {
120
+ ...order,
121
+ items: previewItems,
122
+ total: preview.total ?? order.total,
123
+ subtotal: preview.subtotal ?? order.subtotal,
124
+ discount_total: preview.discount_total ?? order.discount_total,
125
+ promotions: preview.promotions ?? order.promotions,
126
+ };
127
+ }
128
+ }
129
+ catch {
130
+ // no active change
131
+ }
132
+ return order;
133
+ }
134
+ /** Gross item prices before any POSMAN — 10% must use this, never already-discounted totals. */
135
+ function computeGrossForManualPercent(order) {
136
+ const items = Array.isArray(order.items) ? order.items : [];
137
+ let sum = 0;
138
+ for (const item of items) {
139
+ const qty = Math.max(resolveAmount(item?.quantity) || 1, 1);
140
+ const original = resolveAmount(item?.metadata?.original_price);
141
+ const unit = resolveAmount(item?.unit_price ?? item?.raw_unit_price);
142
+ const lineGross = original > 0 ? original * qty : unit * qty;
143
+ sum += Math.max(lineGross, 0);
144
+ }
145
+ return Number(sum.toFixed(2));
146
+ }
147
+ async function deactivateManualPromos(scope, codes) {
148
+ if (!codes.length)
149
+ return;
150
+ const promotionModule = scope.resolve(utils_1.Modules.PROMOTION);
151
+ const promos = await promotionModule.listPromotions({ code: codes }, { take: codes.length });
152
+ if (promos.length) {
153
+ await promotionModule.updatePromotions(promos.map((p) => ({ id: p.id, status: "inactive" })));
154
+ }
155
+ }
156
+ /**
157
+ * POST /admin/pos/draft-orders/:id/manual-discount
158
+ * One edit session + confirm-lite (no payment-collection refresh).
159
+ */
160
+ async function POST(req, res) {
161
+ const draftOrderId = req.params.id;
162
+ const body = (req.body || {});
163
+ const t0 = performance.now();
164
+ const discountType = body.type === "percentage" ? "percentage" : "fixed";
165
+ const rawValue = body.value ?? body.amount;
166
+ const discountValue = Number(rawValue);
167
+ if (!draftOrderId) {
168
+ res.status(400).json({ message: "Draft order id is required" });
169
+ return;
170
+ }
171
+ if (!Number.isFinite(discountValue) || discountValue <= 0) {
172
+ res.status(400).json({ message: "Discount value must be greater than 0" });
173
+ return;
174
+ }
175
+ if (discountType === "percentage" && discountValue > 100) {
176
+ res.status(400).json({ message: "Percentage discount cannot exceed 100%" });
177
+ return;
178
+ }
179
+ try {
180
+ return await withManualDiscountLock(draftOrderId, async () => {
181
+ const order = await loadDraftOrder(req.scope, draftOrderId);
182
+ if (!order || !isDraftOrder(order)) {
183
+ res.status(404).json({ message: "Draft order not found" });
184
+ return;
185
+ }
186
+ const items = Array.isArray(order.items) ? order.items : [];
187
+ const itemCount = items.reduce((sum, item) => sum + (Math.max(resolveAmount(item.quantity) || 0, 0)), 0);
188
+ const grossPayable = computeGrossForManualPercent(order);
189
+ const netPayable = resolveOrderPayable(order);
190
+ if (itemCount <= 0 && grossPayable <= 0 && netPayable <= 0) {
191
+ res.status(400).json({ message: "Add items before applying a discount" });
192
+ return;
193
+ }
194
+ const metaCode = order.metadata &&
195
+ typeof order.metadata === "object" &&
196
+ typeof order.metadata.pos_manual_discount
197
+ ?.code === "string"
198
+ ? String(order.metadata.pos_manual_discount.code)
199
+ : "";
200
+ const existingManualCodes = Array.from(new Set([...collectPosManualCodes(order), metaCode].filter((code) => isPosManualCode(code))));
201
+ const basePayable = discountType === "percentage" ? grossPayable : Math.max(grossPayable, netPayable);
202
+ if (discountType === "fixed" && basePayable > 0 && discountValue >= basePayable) {
203
+ res.status(400).json({
204
+ message: "Discount must be less than the order total",
205
+ });
206
+ return;
207
+ }
208
+ const actorId = req.auth_context?.actor_id ||
209
+ req.auth?.actor_id ||
210
+ null;
211
+ const confirmedBy = actorId || "system";
212
+ const currency = String(order.currency_code || "inr").toLowerCase();
213
+ const shortId = String(draftOrderId).replace(/^order_/, "").slice(-4).toUpperCase();
214
+ const shortTs = Date.now().toString(36).slice(-5).toUpperCase();
215
+ const code = `${POSMAN_PREFIX}${shortId}-${shortTs}`;
216
+ const appliedAt = new Date().toISOString();
217
+ const calculatedAmount = discountType === "fixed"
218
+ ? discountValue
219
+ : Number(((Math.max(basePayable, 0) * discountValue) / 100).toFixed(2));
220
+ if (!Number.isFinite(calculatedAmount) || calculatedAmount <= 0) {
221
+ res.status(400).json({
222
+ message: basePayable <= 0
223
+ ? "Add items with a price before applying a percentage discount"
224
+ : "Calculated discount amount must be greater than 0",
225
+ _pos_debug: {
226
+ discountType,
227
+ discountValue,
228
+ grossPayable,
229
+ netPayable,
230
+ basePayable,
231
+ itemCount,
232
+ },
233
+ });
234
+ return;
235
+ }
236
+ const promoMetadata = {
237
+ source: "pos_manual",
238
+ type: "manual_discount",
239
+ discount_type: discountType,
240
+ discount_value: discountValue,
241
+ amount: calculatedAmount,
242
+ percentage: discountType === "percentage" ? discountValue : undefined,
243
+ currency_code: currency,
244
+ draft_order_id: draftOrderId,
245
+ applied_by: actorId,
246
+ applied_at: appliedAt,
247
+ };
248
+ const promotionModule = req.scope.resolve(utils_1.Modules.PROMOTION);
249
+ // Create promo outside the edit session (DB write only)
250
+ const created = await promotionModule.createPromotions({
251
+ code,
252
+ type: "standard",
253
+ status: "active",
254
+ is_automatic: false,
255
+ limit: 1,
256
+ metadata: promoMetadata,
257
+ application_method: {
258
+ type: "fixed",
259
+ target_type: "order",
260
+ allocation: "across",
261
+ value: calculatedAmount,
262
+ currency_code: currency,
263
+ },
264
+ });
265
+ const createdPromo = Array.isArray(created) ? created[0] : created;
266
+ // Single edit session: remove old POSMAN (if any) → add new → confirm-lite once
267
+ await (0, pos_draft_edit_1.beginEditSafe)(req.scope, draftOrderId);
268
+ if (existingManualCodes.length) {
269
+ await (0, core_flows_1.removeDraftOrderPromotionsWorkflow)(req.scope).run({
270
+ input: { order_id: draftOrderId, promo_codes: existingManualCodes },
271
+ });
272
+ }
273
+ await (0, core_flows_1.addDraftOrderPromotionWorkflow)(req.scope).run({
274
+ input: { order_id: draftOrderId, promo_codes: [code] },
275
+ });
276
+ await (0, pos_draft_edit_1.confirmEditLite)(req.scope, draftOrderId, confirmedBy);
277
+ if (existingManualCodes.length) {
278
+ await deactivateManualPromos(req.scope, existingManualCodes);
279
+ }
280
+ const orderModule = req.scope.resolve(utils_1.Modules.ORDER);
281
+ const prevMeta = order.metadata && typeof order.metadata === "object" ? order.metadata : {};
282
+ await orderModule.updateOrders(draftOrderId, {
283
+ metadata: {
284
+ ...prevMeta,
285
+ pos_manual_discount: {
286
+ code,
287
+ discount_type: discountType,
288
+ discount_value: discountValue,
289
+ amount: calculatedAmount,
290
+ currency_code: currency,
291
+ applied_by: actorId,
292
+ applied_at: appliedAt,
293
+ },
294
+ },
295
+ });
296
+ const draft_order = await (0, pos_draft_edit_1.retrievePosCart)(req.scope, draftOrderId);
297
+ const ms = Math.round(performance.now() - t0);
298
+ console.log(`[pos manual-discount] draft=${draftOrderId} ms=${ms} code=${code}`);
299
+ res.json({
300
+ code,
301
+ discount_type: discountType,
302
+ discount_value: discountValue,
303
+ amount: calculatedAmount,
304
+ currency_code: currency,
305
+ metadata: promoMetadata,
306
+ promotion_id: createdPromo?.id ?? null,
307
+ draft_order: draft_order || { id: draftOrderId },
308
+ _pos_timings_ms: { total: ms },
309
+ });
310
+ });
311
+ }
312
+ catch (error) {
313
+ console.error("[pos manual-discount] POST error:", error);
314
+ res.status(500).json({
315
+ message: error?.message || "Failed to apply manual discount",
316
+ });
317
+ }
318
+ }
319
+ /**
320
+ * DELETE /admin/pos/draft-orders/:id/manual-discount
321
+ */
322
+ async function DELETE(req, res) {
323
+ const draftOrderId = req.params.id;
324
+ const t0 = performance.now();
325
+ if (!draftOrderId) {
326
+ res.status(400).json({ message: "Draft order id is required" });
327
+ return;
328
+ }
329
+ try {
330
+ const order = await loadDraftOrder(req.scope, draftOrderId);
331
+ if (!order || !isDraftOrder(order)) {
332
+ res.status(404).json({ message: "Draft order not found" });
333
+ return;
334
+ }
335
+ const metaCode = order.metadata?.pos_manual_discount
336
+ ?.code;
337
+ const codes = Array.from(new Set([
338
+ ...collectPosManualCodes(order),
339
+ ...(typeof metaCode === "string" && isPosManualCode(metaCode) ? [metaCode] : []),
340
+ ]));
341
+ if (codes.length === 0) {
342
+ const orderModule = req.scope.resolve(utils_1.Modules.ORDER);
343
+ const prevMeta = order.metadata && typeof order.metadata === "object"
344
+ ? { ...order.metadata }
345
+ : {};
346
+ if (prevMeta.pos_manual_discount) {
347
+ delete prevMeta.pos_manual_discount;
348
+ await orderModule.updateOrders(draftOrderId, { metadata: prevMeta });
349
+ }
350
+ const draft_order = await (0, pos_draft_edit_1.retrievePosCart)(req.scope, draftOrderId);
351
+ res.json({ removed: true, draft_order: draft_order || { id: draftOrderId } });
352
+ return;
353
+ }
354
+ const confirmedBy = req.auth_context?.actor_id ||
355
+ req.auth?.actor_id ||
356
+ "system";
357
+ await (0, pos_draft_edit_1.beginEditSafe)(req.scope, draftOrderId);
358
+ await (0, core_flows_1.removeDraftOrderPromotionsWorkflow)(req.scope).run({
359
+ input: { order_id: draftOrderId, promo_codes: codes },
360
+ });
361
+ await (0, pos_draft_edit_1.confirmEditLite)(req.scope, draftOrderId, confirmedBy);
362
+ await deactivateManualPromos(req.scope, codes);
363
+ const orderModule = req.scope.resolve(utils_1.Modules.ORDER);
364
+ const prevMeta = order.metadata && typeof order.metadata === "object"
365
+ ? { ...order.metadata }
366
+ : {};
367
+ delete prevMeta.pos_manual_discount;
368
+ await orderModule.updateOrders(draftOrderId, { metadata: prevMeta });
369
+ const draft_order = await (0, pos_draft_edit_1.retrievePosCart)(req.scope, draftOrderId);
370
+ const ms = Math.round(performance.now() - t0);
371
+ console.log(`[pos manual-discount] DELETE draft=${draftOrderId} ms=${ms}`);
372
+ res.json({
373
+ removed: true,
374
+ codes,
375
+ draft_order: draft_order || { id: draftOrderId },
376
+ _pos_timings_ms: { total: ms },
377
+ });
378
+ }
379
+ catch (error) {
380
+ console.error("[pos manual-discount] DELETE error:", error);
381
+ res.status(500).json({
382
+ message: error?.message || "Failed to remove manual discount",
383
+ });
384
+ }
385
+ }
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvW2lkXS9tYW51YWwtZGlzY291bnQvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyTUEsb0JBc01DO0FBS0Qsd0JBOEVDO0FBbmVELHFEQUdrQztBQUNsQyw0REFHb0M7QUFDcEMsMkVBSytDO0FBRS9DLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQTtBQUUvQixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFBO0FBRTVELEtBQUssVUFBVSxzQkFBc0IsQ0FBSSxZQUFvQixFQUFFLEVBQW9CO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDdkUsSUFBSSxPQUFPLEdBQWUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFBO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDekMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtJQUNuQixDQUFDLENBQUMsQ0FBQTtJQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMzQyxNQUFNLElBQUksQ0FBQTtJQUNWLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQTtJQUNuQixDQUFDO1lBQVMsQ0FBQztRQUNULE9BQU8sRUFBRSxDQUFBO1FBQ1QsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkQsbUJBQW1CLENBQUMs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
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
5
+ const pos_draft_edit_1 = require("../../../../../../utils/pos-draft-edit");
6
+ /**
7
+ * POST /admin/pos/draft-orders/:id/promotions
8
+ * Add/remove promo codes with confirm-lite (no payment-collection refresh).
9
+ */
10
+ async function POST(req, res) {
11
+ const draftOrderId = req.params.id;
12
+ const body = (req.body || {});
13
+ const t0 = performance.now();
14
+ if (!draftOrderId) {
15
+ res.status(400).json({ message: "Draft order id is required" });
16
+ return;
17
+ }
18
+ const codes = (body.promo_codes || [])
19
+ .map((c) => String(c || "").trim())
20
+ .filter(Boolean);
21
+ if (!codes.length) {
22
+ res.status(400).json({ message: "At least one promo code is required" });
23
+ return;
24
+ }
25
+ const actorId = req.auth_context?.actor_id ||
26
+ req.auth?.actor_id ||
27
+ null;
28
+ const confirmedBy = actorId || "system";
29
+ try {
30
+ await (0, pos_draft_edit_1.beginEditSafe)(req.scope, draftOrderId);
31
+ if (body.remove) {
32
+ await (0, core_flows_1.removeDraftOrderPromotionsWorkflow)(req.scope).run({
33
+ input: { order_id: draftOrderId, promo_codes: codes },
34
+ });
35
+ }
36
+ else {
37
+ await (0, core_flows_1.addDraftOrderPromotionWorkflow)(req.scope).run({
38
+ input: { order_id: draftOrderId, promo_codes: codes },
39
+ });
40
+ }
41
+ await (0, pos_draft_edit_1.confirmEditLite)(req.scope, draftOrderId, confirmedBy);
42
+ const draft_order = await (0, pos_draft_edit_1.retrievePosCart)(req.scope, draftOrderId);
43
+ const ms = Math.round(performance.now() - t0);
44
+ console.log(`[pos promotions] draft=${draftOrderId} remove=${body.remove ? 1 : 0} codes=${codes.join(",")} ms=${ms}`);
45
+ res.status(200).json({
46
+ draft_order: draft_order || { id: draftOrderId },
47
+ promo_codes: codes,
48
+ removed: Boolean(body.remove),
49
+ _pos_timings_ms: { total: ms },
50
+ });
51
+ }
52
+ catch (error) {
53
+ console.error("[pos promotions] POST error:", error);
54
+ res.status(500).json({
55
+ message: String(error?.message || "Failed to update promotions"),
56
+ });
57
+ }
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvW2lkXS9wcm9tb3Rpb25zL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUJBLG9CQTBEQztBQTlFRCw0REFHb0M7QUFDcEMsMkVBSStDO0FBUS9DOzs7R0FHRztBQUNJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtJQUNsQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFjLENBQUE7SUFDMUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBRTVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDLENBQUE7UUFDL0QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxDQUFDLENBQUE7UUFDeEUsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FDVixHQUFXLENBQUMsWUFBWSxFQUFFLFFBQVE7UUFDbEMsR0FBVyxDQUFDLElBQUksRUFBRSxRQUFRO1FBQzNCLElBQUksQ0FBQTtJQUNOLE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxRQUFRLENBQUE7SUFFdkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFBLDhCQUFhLEVBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUU1QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUEsK0NBQWtDLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDdEQsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO2FBQ3RELENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFBLDJDQUE4QixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xELEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTthQUN0RCxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFBLGdDQUFlLEVBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFFM0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLGdDQUFlLEVBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUNsRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUNULDBCQUEwQixZQUFZLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDekcsQ0FBQTtRQUVELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLFdBQVcsRUFBRSxXQUFXLElBQUksRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFO1lBQ2hELFdBQVcsRUFBRSxLQUFLO1lBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUM3QixlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1NBQy9CLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDcEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLDZCQUE2QixDQUFDO1NBQ2pFLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDIn0=