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,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PosFinalizeDraftSchema = exports.PosWalletDebitSchema = exports.PosFulfillOrderSchema = exports.PosCreateReturnSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.PosCreateReturnSchema = zod_1.z.object({
6
+ items: zod_1.z
7
+ .array(zod_1.z.object({
8
+ id: zod_1.z.string().min(1),
9
+ quantity: zod_1.z.number().int().positive(),
10
+ note: zod_1.z.string().optional(),
11
+ }))
12
+ .min(1),
13
+ refund_method: zod_1.z.enum(["cash", "wallet"]),
14
+ location_id: zod_1.z.string().min(1).optional(),
15
+ note: zod_1.z.string().optional(),
16
+ customer: zod_1.z
17
+ .object({
18
+ email: zod_1.z.string().trim().optional(),
19
+ phone: zod_1.z.string().optional(),
20
+ first_name: zod_1.z.string().optional(),
21
+ last_name: zod_1.z.string().optional(),
22
+ })
23
+ .optional(),
24
+ });
25
+ exports.PosFulfillOrderSchema = zod_1.z.object({
26
+ location_id: zod_1.z.string().min(1),
27
+ items: zod_1.z
28
+ .array(zod_1.z.object({
29
+ id: zod_1.z.string().min(1),
30
+ quantity: zod_1.z.number().int().positive(),
31
+ }))
32
+ .optional(),
33
+ });
34
+ exports.PosWalletDebitSchema = zod_1.z.object({
35
+ amount: zod_1.z.number().positive(),
36
+ });
37
+ const PosAddressSchema = zod_1.z.object({
38
+ first_name: zod_1.z.string().optional(),
39
+ last_name: zod_1.z.string().optional(),
40
+ company: zod_1.z.string().optional(),
41
+ address_1: zod_1.z.string().min(1),
42
+ address_2: zod_1.z.string().optional(),
43
+ city: zod_1.z.string().optional(),
44
+ province: zod_1.z.string().optional(),
45
+ postal_code: zod_1.z.string().optional(),
46
+ country_code: zod_1.z.string().min(2),
47
+ phone: zod_1.z.string().optional(),
48
+ });
49
+ exports.PosFinalizeDraftSchema = zod_1.z.object({
50
+ payment_method: zod_1.z.enum(["cash", "google_pay", "upi_qr", "pos_machine", "wallet"]),
51
+ wallet_amount: zod_1.z.number().positive().optional(),
52
+ charged_total: zod_1.z.number().positive().optional(),
53
+ razorpay_qr_id: zod_1.z.string().min(1).optional(),
54
+ razorpay_payment_id: zod_1.z.string().min(1).optional(),
55
+ location_id: zod_1.z.string().min(1).optional(),
56
+ sales_channel_id: zod_1.z.string().min(1).optional(),
57
+ cart_opened_at: zod_1.z.string().min(1).optional(),
58
+ checkout_duration_ms: zod_1.z.number().nonnegative().optional(),
59
+ shipping_address: PosAddressSchema.optional(),
60
+ billing_address: PosAddressSchema.optional(),
61
+ });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vcG9zL29yZGVycy92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF1QjtBQUVWLFFBQUEscUJBQXFCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxLQUFLLEVBQUUsT0FBQztTQUNMLEtBQUssQ0FDSixPQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQ3JDLElBQUksRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQzVCLENBQUMsQ0FDSDtTQUNBLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDVCxhQUFhLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6QyxXQUFXLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDekMsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsUUFBUSxFQUFFLE9BQUM7U0FDUixNQUFNLENBQUM7UUFDTixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUNuQyxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUM1QixVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUNqQyxTQUFTLEVBQUUsT0FBQyxDQUFD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
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const razorpay_pos_1 = require("../../../../../utils/razorpay-pos");
5
+ /**
6
+ * GET /admin/pos/payments/config
7
+ *
8
+ * Lets POS hide Online · Razorpay when credentials are not configured.
9
+ */
10
+ async function GET(_req, res) {
11
+ res.status(200).json({
12
+ razorpay_enabled: (0, razorpay_pos_1.isRazorpayConfigured)(),
13
+ });
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9jb25maWcvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxrQkFJQztBQVhELG9FQUF3RTtBQUV4RTs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLEdBQUcsQ0FBQyxJQUFtQixFQUFFLEdBQW1CO0lBQ2hFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLGdCQUFnQixFQUFFLElBQUEsbUNBQW9CLEdBQUU7S0FDekMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const razorpay_pos_device_1 = require("../../../../../../utils/razorpay-pos-device");
5
+ async function GET(req, res) {
6
+ const { orderId } = req.params;
7
+ if (!orderId) {
8
+ res.status(400).json({ message: "orderId is required" });
9
+ return;
10
+ }
11
+ // Integration-test pseudo ids are not on Razorpay
12
+ if (orderId.startsWith("sim_")) {
13
+ res.status(200).json({
14
+ razorpay_order_id: orderId,
15
+ status: "pending",
16
+ integration_test: true,
17
+ });
18
+ return;
19
+ }
20
+ try {
21
+ const order = await (0, razorpay_pos_device_1.fetchPosDeviceOrder)(orderId);
22
+ const status = (0, razorpay_pos_device_1.getPosOrderPaymentStatus)(order);
23
+ res.status(200).json({
24
+ razorpay_order_id: order.id,
25
+ status,
26
+ amount: order.amount,
27
+ amount_paid: order.amount_paid,
28
+ currency: order.currency,
29
+ integration_test: false,
30
+ });
31
+ }
32
+ catch (error) {
33
+ console.error("Failed to fetch POS device order:", error);
34
+ res.status(500).json({
35
+ message: error?.error?.description || error?.message || "Failed to fetch POS payment status",
36
+ });
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9kZXZpY2UvW29yZGVySWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsa0JBb0NDO0FBekNELHFGQUdvRDtBQUU3QyxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFFOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELE9BQU07SUFDUixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLGlCQUFpQixFQUFFLE9BQU87WUFDMUIsTUFBTSxFQUFFLFNBQVM7WUFDakIsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUE7UUFDRixPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSx5Q0FBbUIsRUFBQyxPQUFPLENBQUMsQ0FBQTtRQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFBLDhDQUF3QixFQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTlDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE1BQU07WUFDTixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixnQkFBZ0IsRUFBRSxLQUFLO1NBQ3hCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDekQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxJQUFJLEtBQUssRUFBRSxPQUFPLElBQUksb0NBQW9DO1NBQzdGLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const razorpay_pos_device_1 = require("../../../../../../utils/razorpay-pos-device");
5
+ async function POST(req, res) {
6
+ if ((0, razorpay_pos_device_1.isPosIntegrationTestMode)()) {
7
+ res.status(200).json({ closed: true, integration_test: true });
8
+ return;
9
+ }
10
+ try {
11
+ await (0, razorpay_pos_device_1.closePosDeviceCheckout)();
12
+ res.status(200).json({ closed: true, integration_test: false });
13
+ }
14
+ catch (error) {
15
+ // Soft-success for UX when nothing to close
16
+ const description = error?.error?.description || error?.message || "";
17
+ if (/close|not found|no active|already/i.test(description)) {
18
+ res.status(200).json({ closed: true, soft: true });
19
+ return;
20
+ }
21
+ console.error("Failed to close POS checkout:", error);
22
+ res.status(500).json({
23
+ message: description || "Failed to cancel POS checkout",
24
+ });
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9kZXZpY2UvY2FuY2VsL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0Esb0JBc0JDO0FBNUJELHFGQUE4RztBQU12RyxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQThCLEVBQUUsR0FBbUI7SUFDNUUsSUFBSSxJQUFBLDhDQUF3QixHQUFFLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM5RCxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBQSw0Q0FBc0IsR0FBRSxDQUFBO1FBQzlCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLDRDQUE0QztRQUM1QyxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUNyRSxJQUFJLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNsRCxPQUFNO1FBQ1IsQ0FBQztRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDckQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLFdBQVcsSUFBSSwrQkFBK0I7U0FDeEQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const razorpay_pos_device_1 = require("../../../../../utils/razorpay-pos-device");
6
+ const razorpay_pos_1 = require("../../../../../utils/razorpay-pos");
7
+ function resolveAmount(value) {
8
+ if (value == null)
9
+ return null;
10
+ if (typeof value === "object") {
11
+ const obj = value;
12
+ if (typeof obj.numeric === "number")
13
+ return obj.numeric;
14
+ if (typeof obj.numeric === "string")
15
+ return Number(obj.numeric);
16
+ if (typeof obj.value === "number")
17
+ return obj.value;
18
+ if (typeof obj.value === "string")
19
+ return Number(obj.value);
20
+ }
21
+ const n = Number(value);
22
+ return Number.isFinite(n) ? n : null;
23
+ }
24
+ /**
25
+ * Option B — start POS machine payment (integration-test friendly).
26
+ * When RAZORPAY_POS_INTEGRATION_TEST=true, UI can simulate success/fail without a device.
27
+ */
28
+ async function POST(req, res) {
29
+ const draftOrderId = req.body?.draft_order_id;
30
+ const amount = resolveAmount(req.body?.amount);
31
+ const integrationTest = (0, razorpay_pos_device_1.isPosIntegrationTestMode)();
32
+ if (!draftOrderId) {
33
+ res.status(400).json({ message: "draft_order_id is required" });
34
+ return;
35
+ }
36
+ if (amount == null || amount <= 0) {
37
+ res.status(400).json({ message: "Valid amount is required" });
38
+ return;
39
+ }
40
+ try {
41
+ const orderModule = req.scope.resolve(utils_1.Modules.ORDER);
42
+ const order = await orderModule.retrieveOrder(draftOrderId, {
43
+ select: ["id", "status", "display_id", "currency_code"],
44
+ });
45
+ if (order.status !== "draft") {
46
+ res.status(400).json({ message: "Order is no longer a draft" });
47
+ return;
48
+ }
49
+ const description = `POS Machine Order #${order.display_id ?? draftOrderId}`;
50
+ // Integration test mode: no Razorpay device required — client simulates success/fail
51
+ if (integrationTest) {
52
+ res.status(200).json({
53
+ mode: "integration_test",
54
+ integration_test: true,
55
+ draft_order_id: draftOrderId,
56
+ amount: (0, razorpay_pos_1.toPaise)(amount),
57
+ currency: order.currency_code?.toUpperCase() || "INR",
58
+ razorpay_order_id: null,
59
+ activity_id: null,
60
+ status: "pending",
61
+ message: "Integration test mode: use Simulate Success / Simulate Failed (no physical device needed).",
62
+ });
63
+ return;
64
+ }
65
+ const rzOrder = await (0, razorpay_pos_device_1.createPosDeviceOrder)({
66
+ amount,
67
+ draftOrderId,
68
+ description,
69
+ });
70
+ let activity = null;
71
+ let initiateError = null;
72
+ try {
73
+ activity = await (0, razorpay_pos_device_1.initiatePosDeviceCheckout)({
74
+ razorpayOrderId: rzOrder.id,
75
+ amount,
76
+ draftOrderId,
77
+ description,
78
+ });
79
+ }
80
+ catch (error) {
81
+ initiateError = error?.error?.description || error?.message || "initiate_checkout failed";
82
+ console.warn("POS initiate_checkout failed (order still created):", initiateError);
83
+ }
84
+ res.status(200).json({
85
+ mode: "live_device",
86
+ integration_test: false,
87
+ draft_order_id: draftOrderId,
88
+ amount: rzOrder.amount,
89
+ currency: rzOrder.currency || "INR",
90
+ razorpay_order_id: rzOrder.id,
91
+ activity_id: activity?.id ?? null,
92
+ status: "pending",
93
+ initiate_error: initiateError,
94
+ message: initiateError
95
+ ? `Order created but device checkout failed: ${initiateError}`
96
+ : "Checkout sent to POS device. Waiting for payment.",
97
+ });
98
+ }
99
+ catch (error) {
100
+ console.error("Failed to start POS machine payment:", error);
101
+ res.status(500).json({
102
+ message: error?.error?.description || error?.message || "Failed to start POS machine payment",
103
+ integration_test: integrationTest,
104
+ });
105
+ }
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9kZXZpY2Uvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErQkEsb0JBdUZDO0FBckhELHFEQUFtRDtBQUNuRCxrRkFJaUQ7QUFDakQsb0VBQTJEO0FBTzNELFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLElBQUksSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQzlCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsS0FBZ0MsQ0FBQTtRQUM1QyxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxRQUFRO1lBQUUsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFBO1FBQ3ZELElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDL0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQTtRQUNuRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN0QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUE4QixFQUFFLEdBQW1CO0lBQzVFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FB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
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const razorpay_pos_1 = require("../../../../../../../utils/razorpay-pos");
5
+ async function POST(req, res) {
6
+ const { qrId } = req.params;
7
+ if (!qrId) {
8
+ res.status(400).json({ message: "qrId is required" });
9
+ return;
10
+ }
11
+ try {
12
+ const qr = await (0, razorpay_pos_1.closePosUpiQr)(qrId);
13
+ const status = (0, razorpay_pos_1.getUpiQrStatus)(qr);
14
+ res.status(200).json({
15
+ qr_id: qr.id,
16
+ status,
17
+ closed: true,
18
+ });
19
+ }
20
+ catch (error) {
21
+ const description = error?.error?.description || error?.message || "";
22
+ if (/closed|paid|already/i.test(description)) {
23
+ res.status(200).json({
24
+ qr_id: qrId,
25
+ status: "closed",
26
+ closed: true,
27
+ });
28
+ return;
29
+ }
30
+ console.error("Failed to close POS UPI QR:", error);
31
+ res.status(500).json({
32
+ message: description || "Failed to close UPI QR",
33
+ });
34
+ }
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9xci9bcXJJZF0vY2xvc2Uvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxvQkFpQ0M7QUFuQ0QsMEVBQXVGO0FBRWhGLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUUzQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUE7UUFDckQsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsNEJBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFBLDZCQUFjLEVBQUMsRUFBRSxDQUFDLENBQUE7UUFFakMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ1osTUFBTTtZQUNOLE1BQU0sRUFBRSxJQUFJO1NBQ2IsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDckUsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxJQUFJO2FBQ2IsQ0FBQyxDQUFBO1lBQ0YsT0FBTTtRQUNSLENBQUM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ25ELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxXQUFXLElBQUksd0JBQXdCO1NBQ2pELENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const razorpay_pos_1 = require("../../../../../../utils/razorpay-pos");
5
+ async function GET(req, res) {
6
+ const { qrId } = req.params;
7
+ if (!qrId) {
8
+ res.status(400).json({ message: "qrId is required" });
9
+ return;
10
+ }
11
+ try {
12
+ const qr = await (0, razorpay_pos_1.fetchPosUpiQr)(qrId);
13
+ const status = (0, razorpay_pos_1.getUpiQrStatus)(qr);
14
+ let paymentId = null;
15
+ if (status === "paid") {
16
+ try {
17
+ const payments = await (0, razorpay_pos_1.fetchPosUpiQrPayments)(qrId);
18
+ paymentId = payments?.items?.[0]?.id ?? null;
19
+ }
20
+ catch (error) {
21
+ console.warn("Could not fetch QR payments:", error);
22
+ }
23
+ }
24
+ res.status(200).json({
25
+ qr_id: qr.id,
26
+ status,
27
+ image_url: qr.image_url,
28
+ payment_url: null,
29
+ amount: qr.payment_amount,
30
+ draft_order_id: qr.notes?.draft_order_id ?? null,
31
+ razorpay_payment_id: paymentId,
32
+ payments_count_received: qr.payments_count_received ?? 0,
33
+ });
34
+ }
35
+ catch (error) {
36
+ console.error("Failed to fetch POS UPI QR:", error);
37
+ res.status(500).json({
38
+ message: error?.error?.description || error?.message || "Failed to fetch UPI QR status",
39
+ });
40
+ }
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9xci9bcXJJZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxrQkFzQ0M7QUE1Q0QsdUVBSTZDO0FBRXRDLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUUzQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUE7UUFDckQsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsNEJBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFBLDZCQUFjLEVBQUMsRUFBRSxDQUFDLENBQUE7UUFFakMsSUFBSSxTQUFTLEdBQWtCLElBQUksQ0FBQTtRQUNuQyxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLG9DQUFxQixFQUFDLElBQUksQ0FBQyxDQUFBO2dCQUNsRCxTQUFTLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUE7WUFDOUMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUVELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNaLE1BQU07WUFDTixTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVM7WUFDdkIsV0FBVyxFQUFFLElBQUk7WUFDakIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxjQUFjO1lBQ3pCLGNBQWMsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsSUFBSSxJQUFJO1lBQ2hELG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixJQUFJLENBQUM7U0FDekQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNuRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSyxFQUFFLE9BQU8sSUFBSSwrQkFBK0I7U0FDeEYsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const razorpay_pos_1 = require("../../../../../utils/razorpay-pos");
6
+ function resolveAmount(value) {
7
+ if (value == null)
8
+ return null;
9
+ if (typeof value === "object") {
10
+ const obj = value;
11
+ if (typeof obj.numeric === "number")
12
+ return obj.numeric;
13
+ if (typeof obj.numeric === "string")
14
+ return Number(obj.numeric);
15
+ if (typeof obj.value === "number")
16
+ return obj.value;
17
+ if (typeof obj.value === "string")
18
+ return Number(obj.value);
19
+ if (typeof obj.valueOf === "function") {
20
+ const v = Number(obj.valueOf());
21
+ if (Number.isFinite(v))
22
+ return v;
23
+ }
24
+ }
25
+ const n = Number(value);
26
+ return Number.isFinite(n) ? n : null;
27
+ }
28
+ async function POST(req, res) {
29
+ const draftOrderId = req.body?.draft_order_id;
30
+ const bodyAmount = resolveAmount(req.body?.amount);
31
+ if (!draftOrderId) {
32
+ res.status(400).json({ message: "draft_order_id is required" });
33
+ return;
34
+ }
35
+ try {
36
+ const orderModule = req.scope.resolve(utils_1.Modules.ORDER);
37
+ const order = await orderModule.retrieveOrder(draftOrderId, {
38
+ select: ["id", "status", "currency_code", "display_id"],
39
+ });
40
+ if (order.status !== "draft") {
41
+ res.status(400).json({ message: "Order is no longer a draft" });
42
+ return;
43
+ }
44
+ const amount = bodyAmount;
45
+ if (amount == null || amount <= 0) {
46
+ res.status(400).json({
47
+ message: "Could not determine order total for payment. Pass amount in request body.",
48
+ });
49
+ return;
50
+ }
51
+ const qr = await (0, razorpay_pos_1.createPosUpiQr)({
52
+ amount,
53
+ draftOrderId,
54
+ description: `POS Order #${order.display_id ?? draftOrderId}`,
55
+ });
56
+ res.status(200).json({
57
+ qr_id: qr.id,
58
+ // Razorpay-hosted QR image (contains native UPI payload when scanned)
59
+ image_url: qr.image_url,
60
+ payment_url: null,
61
+ amount: qr.payment_amount,
62
+ currency: order.currency_code?.toUpperCase() || "INR",
63
+ status: qr.status,
64
+ draft_order_id: draftOrderId,
65
+ });
66
+ }
67
+ catch (error) {
68
+ console.error("Failed to create POS UPI QR:", error);
69
+ if (error?.type === "not_found" || /not found/i.test(error?.message || "")) {
70
+ res.status(404).json({ message: "Draft order not found" });
71
+ return;
72
+ }
73
+ res.status(500).json({
74
+ message: error?.error?.description || error?.message || "Failed to create UPI QR",
75
+ });
76
+ }
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9wYXltZW50cy9xci9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTRCQSxvQkF3REM7QUFuRkQscURBQW1EO0FBQ25ELG9FQUFrRTtBQU9sRSxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksS0FBSyxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUU5QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLEtBQWdDLENBQUE7UUFDNUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUFFLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQTtRQUN2RCxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxRQUFRO1lBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9ELElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUE7UUFDbkQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMzRCxJQUFJLE9BQVEsR0FBbUMsQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDdkUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFFLEdBQWtDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUMvRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZCLE9BQU8s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
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Plugin entry point. API routes are discovered from the file structure.
5
+ */
6
+ const plugin = {};
7
+ exports.default = plugin;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7R0FFRztBQUNILE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtBQUNqQixrQkFBZSxNQUFNLENBQUEifQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POS_CART_FIELDS = exports.toAmount = exports.timed = void 0;
4
+ exports.normalizeCartItems = normalizeCartItems;
5
+ exports.normalizeCartOrder = normalizeCartOrder;
6
+ exports.beginEditSafe = beginEditSafe;
7
+ exports.confirmEditLite = confirmEditLite;
8
+ exports.retrievePosCart = retrievePosCart;
9
+ const utils_1 = require("@medusajs/framework/utils");
10
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
11
+ const timed = async (label, timings, fn) => {
12
+ const t0 = performance.now();
13
+ try {
14
+ return await fn();
15
+ }
16
+ finally {
17
+ timings[label] = Math.round(performance.now() - t0);
18
+ }
19
+ };
20
+ exports.timed = timed;
21
+ /** Medusa query may return BigNumber-like `{ value, precision }` instead of a plain number. */
22
+ const toAmount = (value) => {
23
+ if (typeof value === "number" && Number.isFinite(value))
24
+ return value;
25
+ if (typeof value === "string" && value.trim() !== "") {
26
+ const n = Number(value);
27
+ return Number.isFinite(n) ? n : 0;
28
+ }
29
+ if (value && typeof value === "object") {
30
+ const obj = value;
31
+ if ("numeric" in obj) {
32
+ const n = Number(obj.numeric);
33
+ if (Number.isFinite(n))
34
+ return n;
35
+ }
36
+ if ("value" in obj) {
37
+ const n = Number(obj.value);
38
+ if (Number.isFinite(n))
39
+ return n;
40
+ }
41
+ if (typeof obj.valueOf === "function") {
42
+ const n = Number(obj.valueOf());
43
+ if (Number.isFinite(n))
44
+ return n;
45
+ }
46
+ }
47
+ const n = Number(value);
48
+ return Number.isFinite(n) ? n : 0;
49
+ };
50
+ exports.toAmount = toAmount;
51
+ exports.POS_CART_FIELDS = [
52
+ "id",
53
+ "display_id",
54
+ "status",
55
+ "is_draft_order",
56
+ "currency_code",
57
+ "email",
58
+ "total",
59
+ "subtotal",
60
+ "tax_total",
61
+ "discount_total",
62
+ "metadata",
63
+ "customer.id",
64
+ "customer.email",
65
+ "customer.phone",
66
+ "customer.first_name",
67
+ "customer.last_name",
68
+ "items.id",
69
+ "items.title",
70
+ "items.subtitle",
71
+ "items.thumbnail",
72
+ "items.variant_id",
73
+ "items.product_title",
74
+ "items.variant_title",
75
+ "items.quantity",
76
+ "items.unit_price",
77
+ "items.subtotal",
78
+ "items.total",
79
+ "items.metadata",
80
+ "items.variant.id",
81
+ "items.variant.title",
82
+ "items.variant.sku",
83
+ "items.variant.barcode",
84
+ "items.variant.inventory_quantity",
85
+ "items.variant.options.value",
86
+ "items.variant.options.option.title",
87
+ "items.adjustments.id",
88
+ "items.adjustments.code",
89
+ "items.adjustments.amount",
90
+ ];
91
+ function normalizeCartItems(items) {
92
+ if (!items || !Array.isArray(items))
93
+ return items;
94
+ return items.map((item) => {
95
+ const quantity = (0, exports.toAmount)(item?.quantity ?? item?.raw_quantity) || 1;
96
+ const unit_price = (0, exports.toAmount)(item?.unit_price ?? item?.raw_unit_price);
97
+ const subtotal = (0, exports.toAmount)(item?.subtotal ?? item?.raw_subtotal) || unit_price * quantity;
98
+ const total = (0, exports.toAmount)(item?.total ?? item?.raw_total) || subtotal;
99
+ return {
100
+ ...item,
101
+ quantity,
102
+ unit_price,
103
+ subtotal,
104
+ total,
105
+ };
106
+ });
107
+ }
108
+ function normalizeCartOrder(order) {
109
+ if (!order)
110
+ return order;
111
+ const items = normalizeCartItems(order.items);
112
+ return {
113
+ ...order,
114
+ items,
115
+ total: (0, exports.toAmount)(order.total ?? order.raw_total) || order.total,
116
+ subtotal: (0, exports.toAmount)(order.subtotal ?? order.raw_subtotal) || order.subtotal,
117
+ tax_total: (0, exports.toAmount)(order.tax_total ?? order.raw_tax_total) || order.tax_total,
118
+ discount_total: (0, exports.toAmount)(order.discount_total ?? order.raw_discount_total) || order.discount_total,
119
+ };
120
+ }
121
+ async function beginEditSafe(scope, orderId) {
122
+ try {
123
+ await (0, core_flows_1.beginDraftOrderEditWorkflow)(scope).run({
124
+ input: { order_id: orderId },
125
+ });
126
+ }
127
+ catch (err) {
128
+ const msg = String(err?.message || "").toLowerCase();
129
+ // Match upstream: treat "already open" as success; do not cancel/retry on soft failures.
130
+ if (msg.includes("active order change") ||
131
+ msg.includes("already has an existing") ||
132
+ msg.includes("existing active") ||
133
+ msg.includes("order change") ||
134
+ msg.includes("already")) {
135
+ return;
136
+ }
137
+ console.warn(`[pos begin_edit] Note: ${err?.message || err}`);
138
+ }
139
+ }
140
+ /**
141
+ * Confirm pending draft edit WITHOUT payment-collection refresh.
142
+ * Full confirmDraftOrderEditWorkflow is slow mainly due to payment collection;
143
+ * but skip confirm entirely and Medusa retrieve returns items:[] → POS cart wipes.
144
+ */
145
+ async function confirmEditLite(scope, orderId, confirmedBy) {
146
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
147
+ const orderModule = scope.resolve(utils_1.Modules.ORDER);
148
+ const { data: changes = [] } = await query.graph({
149
+ entity: "order_change",
150
+ fields: ["id", "status", "order_id"],
151
+ filters: {
152
+ order_id: orderId,
153
+ status: [utils_1.OrderChangeStatus.PENDING, utils_1.OrderChangeStatus.REQUESTED],
154
+ },
155
+ });
156
+ const list = Array.isArray(changes) ? changes : changes ? [changes] : [];
157
+ const change = list[0];
158
+ if (!change?.id) {
159
+ return false;
160
+ }
161
+ await orderModule.confirmOrderChange({
162
+ id: change.id,
163
+ confirmed_by: confirmedBy,
164
+ });
165
+ return true;
166
+ }
167
+ /** Slim draft/order payload for POS cart paint after customer/discount/item writes. */
168
+ async function retrievePosCart(scope, orderId) {
169
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
170
+ const { data: orders = [] } = await query.graph({
171
+ entity: "order",
172
+ fields: exports.POS_CART_FIELDS,
173
+ filters: { id: orderId },
174
+ });
175
+ const order = Array.isArray(orders) ? orders[0] : null;
176
+ return normalizeCartOrder(order);
177
+ }
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zLWRyYWZ0LWVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcG9zLWRyYWZ0LWVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMkZBLGdEQWVDO0FBRUQsZ0RBV0M7QUFFRCxzQ0FtQkM7QUFPRCwwQ0E0QkM7QUFHRCwwQ0FZQztBQTdMRCxxREFJa0M7QUFFbEMsNERBRW9DO0FBRTdCLE1BQU0sS0FBSyxHQUFHLEtBQUssRUFDeEIsS0FBYSxFQUNiLE9BQStCLEVBQy9CLEVBQW9CLEVBQ1IsRUFBRTtJQUNkLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUM1QixJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUE7SUFDbkIsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDckQsQ0FBQztBQUNILENBQUMsQ0FBQTtBQVhZLFFBQUEsS0FBSyxTQVdqQjtBQUVELCtGQUErRjtBQUN4RixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQ2pELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDckUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFD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