@infuro/cms-core 1.0.34 → 1.0.36

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 (152) hide show
  1. package/README.md +13 -0
  2. package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
  3. package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
  4. package/dist/admin.cjs +35254 -21613
  5. package/dist/admin.d.cts +192 -9
  6. package/dist/admin.d.ts +192 -9
  7. package/dist/admin.js +34301 -20755
  8. package/dist/api.cjs +137 -17531
  9. package/dist/api.d.cts +633 -3
  10. package/dist/api.d.ts +633 -3
  11. package/dist/api.js +15 -17528
  12. package/dist/auth.cjs +192 -1034
  13. package/dist/auth.d.cts +197 -54
  14. package/dist/auth.d.ts +197 -54
  15. package/dist/auth.js +4 -966
  16. package/dist/chunk-2AEVFOQP.cjs +30436 -0
  17. package/dist/chunk-3DZRIZOD.cjs +52 -0
  18. package/dist/chunk-5ELSW2UP.js +150 -0
  19. package/dist/chunk-7NMT3GBR.cjs +29 -0
  20. package/dist/chunk-COBORIJH.cjs +2373 -0
  21. package/dist/chunk-CRFV5WJK.js +16 -0
  22. package/dist/chunk-D5FBNKQM.cjs +104 -0
  23. package/dist/chunk-FG6I64HP.js +604 -0
  24. package/dist/chunk-GO7PPYNU.js +76 -0
  25. package/dist/chunk-HCIRL37O.js +21 -0
  26. package/dist/chunk-HF3L2GIT.cjs +194 -0
  27. package/dist/chunk-HT5DI3XW.cjs +82 -0
  28. package/dist/chunk-JC6DLWTE.js +21 -0
  29. package/dist/chunk-JS2W7XZ4.js +30312 -0
  30. package/dist/chunk-JXF23MPG.js +25 -0
  31. package/dist/chunk-KFFB6EMZ.js +123 -0
  32. package/dist/chunk-KPKFNLQQ.cjs +648 -0
  33. package/dist/chunk-LI2IXVAY.js +171 -0
  34. package/dist/chunk-MQBT33IV.js +48 -0
  35. package/dist/chunk-OOTLNH63.cjs +18 -0
  36. package/dist/chunk-PNOKNSG2.cjs +222 -0
  37. package/dist/chunk-SHUYVCID.js +4 -0
  38. package/dist/chunk-SPQFNIYJ.cjs +132 -0
  39. package/dist/chunk-SYBOCAWB.js +97 -0
  40. package/dist/chunk-TDV6EJHV.js +192 -0
  41. package/dist/chunk-UCKN4BBY.cjs +24 -0
  42. package/dist/chunk-UF3BYUXY.js +616 -0
  43. package/dist/chunk-UPLVMVRX.cjs +23 -0
  44. package/dist/chunk-USNT2KNT.cjs +6 -0
  45. package/dist/chunk-VMY2S32H.js +2342 -0
  46. package/dist/chunk-WEMDMVHQ.js +216 -0
  47. package/dist/chunk-WO2DW4AU.cjs +182 -0
  48. package/dist/chunk-X47PBV4I.js +79 -0
  49. package/dist/chunk-X6H5VBQ2.cjs +620 -0
  50. package/dist/chunk-XQ3QUHWR.cjs +83 -0
  51. package/dist/chunk-XW5ATPRW.cjs +155 -0
  52. package/dist/cli.cjs +107 -86
  53. package/dist/cli.js +66 -29
  54. package/dist/email-queue-CGZBVVAS.js +2 -0
  55. package/dist/email-queue-TPZWLTIV.cjs +23 -0
  56. package/dist/emit-order-notification-trigger-D2N3KFHL.cjs +16 -0
  57. package/dist/emit-order-notification-trigger-IVLWKKJL.js +3 -0
  58. package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
  59. package/dist/erp-config-enabled-T37X7T34.js +2 -0
  60. package/dist/erp-order-invoice-3YISSOWW.js +3 -0
  61. package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
  62. package/dist/event-order-defaults-EMWBIGL3.cjs +39 -0
  63. package/dist/event-order-defaults-SDRNAZHC.js +2 -0
  64. package/dist/hooks.cjs +259 -132
  65. package/dist/hooks.d.cts +42 -1
  66. package/dist/hooks.d.ts +42 -1
  67. package/dist/hooks.js +234 -91
  68. package/dist/index.cjs +3679 -22356
  69. package/dist/index.d.cts +2173 -643
  70. package/dist/index.d.ts +2173 -643
  71. package/dist/index.js +2587 -22119
  72. package/dist/interpolate-WAKPN56R.cjs +11 -0
  73. package/dist/interpolate-WDUWDF3I.js +2 -0
  74. package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
  75. package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
  76. package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
  77. package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
  78. package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
  79. package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
  80. package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
  81. package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
  82. package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
  83. package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
  84. package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
  85. package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
  86. package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
  87. package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
  88. package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
  89. package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
  90. package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
  91. package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
  92. package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
  93. package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
  94. package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
  95. package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
  96. package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
  97. package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
  98. package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
  99. package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
  100. package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
  101. package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
  102. package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
  103. package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
  104. package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
  105. package/dist/migrations/1781220000000-AddWhatsappTriggerBindings.ts +23 -0
  106. package/dist/migrations/1781230000000-AddOrderNotificationTriggers.ts +46 -0
  107. package/dist/migrations/1781240000000-DropEventOrderNotificationColumns.ts +29 -0
  108. package/dist/migrations/1781250000000-RemoveOrderRefundedTrigger.ts +36 -0
  109. package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
  110. package/dist/paid-order-erp-3USEG6WL.js +3 -0
  111. package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
  112. package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
  113. package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
  114. package/dist/razorpay-KLO2KNCB.js +49 -0
  115. package/dist/razorpay-U23LGY72.cjs +56 -0
  116. package/dist/rbac-debug-db-HWP65A4O.cjs +35 -0
  117. package/dist/rbac-debug-db-QJH3AD34.js +33 -0
  118. package/dist/sms-defaults-2NL24H57.js +2 -0
  119. package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
  120. package/dist/stripe-4FD27QVJ.js +51 -0
  121. package/dist/stripe-VU6OEG2D.cjs +57 -0
  122. package/dist/theme.cjs +31 -59
  123. package/dist/theme.d.cts +78 -3
  124. package/dist/theme.d.ts +78 -3
  125. package/dist/theme.js +23 -20
  126. package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
  127. package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
  128. package/dist/whatsapp-trigger-dispatcher-ONHXI7UY.cjs +19 -0
  129. package/dist/whatsapp-trigger-dispatcher-PWFI4FKP.js +6 -0
  130. package/package.json +147 -142
  131. package/dist/admin.cjs.map +0 -1
  132. package/dist/admin.js.map +0 -1
  133. package/dist/api.cjs.map +0 -1
  134. package/dist/api.js.map +0 -1
  135. package/dist/auth.cjs.map +0 -1
  136. package/dist/auth.js.map +0 -1
  137. package/dist/cli.cjs.map +0 -1
  138. package/dist/cli.js.map +0 -1
  139. package/dist/config-DJ5CmQvS.d.cts +0 -8
  140. package/dist/config-DJ5CmQvS.d.ts +0 -8
  141. package/dist/hooks.cjs.map +0 -1
  142. package/dist/hooks.js.map +0 -1
  143. package/dist/index-Bf5GO8fu.d.cts +0 -583
  144. package/dist/index-DOiJuMQA.d.ts +0 -583
  145. package/dist/index.cjs.map +0 -1
  146. package/dist/index.js.map +0 -1
  147. package/dist/theme.cjs.map +0 -1
  148. package/dist/theme.js.map +0 -1
  149. package/dist/types-DCVaXlPV.d.cts +0 -78
  150. package/dist/types-DCVaXlPV.d.ts +0 -78
  151. package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
  152. package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
@@ -0,0 +1,171 @@
1
+ import { explainSessionEntityAccess, isVendorPortalUser, logRbac } from './chunk-UF3BYUXY.js';
2
+ import { __name } from './chunk-SHUYVCID.js';
3
+
4
+ // src/auth/helpers.ts
5
+ var RBAC_ADMIN_ONLY_ENTITIES = /* @__PURE__ */ new Set([
6
+ "users",
7
+ "user_groups",
8
+ "permissions"
9
+ ]);
10
+ function sessionHasEntityAccess(user, entity, action) {
11
+ return explainSessionEntityAccess(user, entity, action).allowed;
12
+ }
13
+ __name(sessionHasEntityAccess, "sessionHasEntityAccess");
14
+ function canManageRoles(user) {
15
+ return !!(user?.email && user.isRBACAdmin);
16
+ }
17
+ __name(canManageRoles, "canManageRoles");
18
+ var OPEN_ENDPOINTS = [
19
+ {
20
+ "/api/contacts": [
21
+ "POST"
22
+ ]
23
+ },
24
+ {
25
+ "/api/form-submissions": [
26
+ "POST"
27
+ ]
28
+ },
29
+ {
30
+ "/api/blogs": [
31
+ "GET"
32
+ ]
33
+ }
34
+ ];
35
+ var PERMISSION_REQUIRED_ENDPOINTS = {};
36
+ function isOpenEndpoint(pathname) {
37
+ return OPEN_ENDPOINTS.some((endpoint) => pathname.startsWith(Object.keys(endpoint)[0]));
38
+ }
39
+ __name(isOpenEndpoint, "isOpenEndpoint");
40
+ function getRequiredPermission(pathname) {
41
+ return null;
42
+ }
43
+ __name(getRequiredPermission, "getRequiredPermission");
44
+ function isPublicMethod(pathname, method) {
45
+ for (const endpoint of OPEN_ENDPOINTS) {
46
+ const key = Object.keys(endpoint)[0];
47
+ if (pathname.startsWith(key) && endpoint[key].includes(method)) return true;
48
+ }
49
+ return false;
50
+ }
51
+ __name(isPublicMethod, "isPublicMethod");
52
+ function createAuthHelpers(getSession, NextResponse) {
53
+ return createAuthHelpersFromGetSession(getSession, NextResponse);
54
+ }
55
+ __name(createAuthHelpers, "createAuthHelpers");
56
+ function createCmsAuthBundle(getSession, NextResponse) {
57
+ const auth = createAuthHelpers(getSession, NextResponse);
58
+ return {
59
+ requireAuth: auth.requireAuth,
60
+ requireAdminAccess: auth.requireAdminAccess,
61
+ requireEntityPermission: auth.requireEntityPermission,
62
+ getSessionUser: auth.getAuthenticatedUser,
63
+ getAuthenticatedUser: auth.getAuthenticatedUser
64
+ };
65
+ }
66
+ __name(createCmsAuthBundle, "createCmsAuthBundle");
67
+ function createAuthHelpersFromGetSession(getSession, NextResponse) {
68
+ return {
69
+ async requireAuth() {
70
+ const session = await getSession();
71
+ if (!session?.user?.email) {
72
+ return NextResponse.json({
73
+ error: "Unauthorized"
74
+ }, {
75
+ status: 401
76
+ });
77
+ }
78
+ return null;
79
+ },
80
+ async requirePermission() {
81
+ const session = await getSession();
82
+ if (!session?.user?.email) {
83
+ return NextResponse.json({
84
+ error: "Unauthorized"
85
+ }, {
86
+ status: 401
87
+ });
88
+ }
89
+ return null;
90
+ },
91
+ async requireEntityPermission(_req, entity, action) {
92
+ const session = await getSession();
93
+ if (!session?.user?.email) {
94
+ return NextResponse.json({
95
+ error: "Unauthorized"
96
+ }, {
97
+ status: 401
98
+ });
99
+ }
100
+ const u = session.user;
101
+ const allowed = sessionHasEntityAccess(u, entity, action);
102
+ const { reason } = explainSessionEntityAccess(u, entity, action);
103
+ logRbac("authHelpers.requireEntityPermission", {
104
+ entity,
105
+ action,
106
+ allowed,
107
+ reason,
108
+ email: u.email,
109
+ groupName: u.groupName,
110
+ vendorIds: u.vendorIds,
111
+ isVendorPortal: u.isVendorPortal,
112
+ isVendorOwner: u.isVendorOwner
113
+ });
114
+ if (allowed) return null;
115
+ return NextResponse.json({
116
+ error: "Forbidden",
117
+ entity,
118
+ action,
119
+ reason
120
+ }, {
121
+ status: 403
122
+ });
123
+ },
124
+ async requireAdminAccess() {
125
+ const session = await getSession();
126
+ if (!session?.user?.email) {
127
+ return NextResponse.json({
128
+ error: "Unauthorized"
129
+ }, {
130
+ status: 401
131
+ });
132
+ }
133
+ const u = session.user;
134
+ if (u.isRBACAdmin) return null;
135
+ if (isVendorPortalUser(u)) return null;
136
+ if (u.adminAccess === true) return null;
137
+ if (u.adminAccess === false) {
138
+ logRbac("requireAdminAccess denied (adminAccess:false)", {
139
+ email: u.email,
140
+ groupName: u.groupName,
141
+ isVendorPortal: u.isVendorPortal
142
+ });
143
+ return NextResponse.json({
144
+ error: "Forbidden",
145
+ reason: "admin_access"
146
+ }, {
147
+ status: 403
148
+ });
149
+ }
150
+ logRbac("requireAdminAccess denied (no matching rule)", {
151
+ email: u.email,
152
+ adminAccess: u.adminAccess,
153
+ groupName: u.groupName,
154
+ isVendorPortal: u.isVendorPortal
155
+ });
156
+ return NextResponse.json({
157
+ error: "Forbidden",
158
+ reason: "admin_access"
159
+ }, {
160
+ status: 403
161
+ });
162
+ },
163
+ async getAuthenticatedUser() {
164
+ const session = await getSession();
165
+ return session?.user ?? null;
166
+ }
167
+ };
168
+ }
169
+ __name(createAuthHelpersFromGetSession, "createAuthHelpersFromGetSession");
170
+
171
+ export { OPEN_ENDPOINTS, PERMISSION_REQUIRED_ENDPOINTS, RBAC_ADMIN_ONLY_ENTITIES, canManageRoles, createAuthHelpers, createCmsAuthBundle, getRequiredPermission, isOpenEndpoint, isPublicMethod, sessionHasEntityAccess };
@@ -0,0 +1,48 @@
1
+ import { __name } from './chunk-SHUYVCID.js';
2
+
3
+ // src/message-templates/sms-defaults.ts
4
+ var SMS_MESSAGE_TEMPLATE_DEFAULTS = [
5
+ {
6
+ templateKey: "auth.otp_login",
7
+ name: "Sign-in OTP (SMS)",
8
+ body: "Your sign-in code is {{code}}. Valid 10 minutes.",
9
+ providerMeta: {
10
+ otpVarKey: "var1"
11
+ }
12
+ },
13
+ {
14
+ templateKey: "auth.otp_verify_phone",
15
+ name: "Verify phone OTP (SMS)",
16
+ body: "Your verification code is {{code}}. Valid 10 minutes.",
17
+ providerMeta: {
18
+ otpVarKey: "var1"
19
+ }
20
+ }
21
+ ];
22
+ function getSmsTemplateDefault(templateKey) {
23
+ return SMS_MESSAGE_TEMPLATE_DEFAULTS.find((d) => d.templateKey === templateKey);
24
+ }
25
+ __name(getSmsTemplateDefault, "getSmsTemplateDefault");
26
+ async function resolveSmsTemplateForSend(templateKey, getRow) {
27
+ const def = getSmsTemplateDefault(templateKey);
28
+ if (!def) return null;
29
+ const row = await getRow("sms", templateKey);
30
+ let body = def.body;
31
+ let ref = def.externalTemplateRef;
32
+ let otpVarKey = def.providerMeta?.otpVarKey ?? "var1";
33
+ if (row && row.enabled !== false) {
34
+ if (row.body.trim()) body = row.body;
35
+ if (row.externalTemplateRef?.trim()) ref = row.externalTemplateRef.trim();
36
+ const pm = row.providerMeta;
37
+ const k = pm && typeof pm.otpVarKey === "string" ? pm.otpVarKey.trim() : "";
38
+ if (k) otpVarKey = k;
39
+ }
40
+ return {
41
+ body,
42
+ externalTemplateRef: ref?.trim() || void 0,
43
+ otpVarKey: otpVarKey || "var1"
44
+ };
45
+ }
46
+ __name(resolveSmsTemplateForSend, "resolveSmsTemplateForSend");
47
+
48
+ export { SMS_MESSAGE_TEMPLATE_DEFAULTS, getSmsTemplateDefault, resolveSmsTemplateForSend };
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/message-templates/interpolate.ts
6
+ function applyTemplateVars(template, variables) {
7
+ let out = template;
8
+ for (const [k, v] of Object.entries(variables)) {
9
+ out = out.split(`{{${k}}}`).join(v);
10
+ }
11
+ if (variables.code !== void 0) {
12
+ out = out.split("{{otp}}").join(variables.code);
13
+ }
14
+ return out;
15
+ }
16
+ chunkUSNT2KNT_cjs.__name(applyTemplateVars, "applyTemplateVars");
17
+
18
+ exports.applyTemplateVars = applyTemplateVars;
@@ -0,0 +1,222 @@
1
+ 'use strict';
2
+
3
+ var chunkUPLVMVRX_cjs = require('./chunk-UPLVMVRX.cjs');
4
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
+
6
+ // src/plugins/erp/erp-response-map.ts
7
+ function pickString(o, keys) {
8
+ for (const k of keys) {
9
+ const v = o[k];
10
+ if (typeof v === "string" && v.trim()) return v.trim();
11
+ }
12
+ return void 0;
13
+ }
14
+ chunkUSNT2KNT_cjs.__name(pickString, "pickString");
15
+ function unwrapErpReadData(json) {
16
+ if (!json || typeof json !== "object") return null;
17
+ const o = json;
18
+ const d = o.data;
19
+ if (d && typeof d === "object" && !Array.isArray(d)) return d;
20
+ return o;
21
+ }
22
+ chunkUSNT2KNT_cjs.__name(unwrapErpReadData, "unwrapErpReadData");
23
+ function firstObject(data, keys) {
24
+ for (const k of keys) {
25
+ const v = data[k];
26
+ if (v && typeof v === "object" && !Array.isArray(v)) return v;
27
+ }
28
+ return null;
29
+ }
30
+ chunkUSNT2KNT_cjs.__name(firstObject, "firstObject");
31
+ function extractEvents(src) {
32
+ const timeline = src.timeline ?? src.events ?? src.history ?? src.trackingEvents;
33
+ if (!Array.isArray(timeline) || !timeline.length) return void 0;
34
+ const events = [];
35
+ for (const row of timeline) {
36
+ if (!row || typeof row !== "object") continue;
37
+ const r = row;
38
+ const at = pickString(r, [
39
+ "at",
40
+ "timestamp",
41
+ "date",
42
+ "occurredAt"
43
+ ]) ?? (r.at instanceof Date ? r.at.toISOString() : void 0);
44
+ const label = pickString(r, [
45
+ "label",
46
+ "status",
47
+ "title",
48
+ "message",
49
+ "description"
50
+ ]);
51
+ const detail = pickString(r, [
52
+ "detail",
53
+ "notes",
54
+ "description"
55
+ ]);
56
+ if (at || label || detail) events.push({
57
+ at,
58
+ label,
59
+ detail
60
+ });
61
+ }
62
+ return events.length ? events : void 0;
63
+ }
64
+ chunkUSNT2KNT_cjs.__name(extractEvents, "extractEvents");
65
+ function mapErpPayloadToFulfillment(data) {
66
+ const nested = firstObject(data, [
67
+ "fulfillment",
68
+ "packaging",
69
+ "shipment",
70
+ "shipping",
71
+ "delivery"
72
+ ]);
73
+ const src = nested || data;
74
+ const status = pickString(src, [
75
+ "status",
76
+ "fulfillmentStatus",
77
+ "state",
78
+ "label",
79
+ "packagingStatus"
80
+ ]);
81
+ const trackingId = pickString(src, [
82
+ "trackingId",
83
+ "tracking_id",
84
+ "trackingNumber",
85
+ "awb",
86
+ "trackingUrl"
87
+ ]);
88
+ const events = extractEvents(src);
89
+ if (!status && !trackingId && !(events && events.length)) return void 0;
90
+ return {
91
+ status,
92
+ trackingId,
93
+ events
94
+ };
95
+ }
96
+ chunkUSNT2KNT_cjs.__name(mapErpPayloadToFulfillment, "mapErpPayloadToFulfillment");
97
+ function mapErpPayloadToInvoiceNumber(data) {
98
+ const nested = firstObject(data, [
99
+ "invoice",
100
+ "latestInvoice",
101
+ "postedInvoice"
102
+ ]);
103
+ const src = nested || data;
104
+ return pickString(src, [
105
+ "invoiceNumber",
106
+ "invoice_number",
107
+ "number",
108
+ "name",
109
+ "id"
110
+ ]);
111
+ }
112
+ chunkUSNT2KNT_cjs.__name(mapErpPayloadToInvoiceNumber, "mapErpPayloadToInvoiceNumber");
113
+ function extractChildOrderRefsFromSalePayload(data) {
114
+ const lists = [
115
+ data.returns,
116
+ data.returnOrders,
117
+ data.relatedReturns,
118
+ data.childOrders,
119
+ data.children
120
+ ];
121
+ const seen = /* @__PURE__ */ new Set();
122
+ const out = [];
123
+ for (const list of lists) {
124
+ if (!Array.isArray(list)) continue;
125
+ for (const item of list) {
126
+ if (!item || typeof item !== "object") continue;
127
+ const o = item;
128
+ const ref = pickString(o, [
129
+ "platformReturnId",
130
+ "platform_return_id",
131
+ "refId",
132
+ "ref_id"
133
+ ]) ?? (typeof o.id === "string" ? o.id : void 0);
134
+ if (!ref || seen.has(ref)) continue;
135
+ seen.add(ref);
136
+ const t = (pickString(o, [
137
+ "kind",
138
+ "type",
139
+ "orderKind"
140
+ ]) || "").toLowerCase();
141
+ const orderKind = /replac/.test(t) ? "replacement" : "return";
142
+ out.push({
143
+ ref,
144
+ orderKind
145
+ });
146
+ }
147
+ }
148
+ return out;
149
+ }
150
+ chunkUSNT2KNT_cjs.__name(extractChildOrderRefsFromSalePayload, "extractChildOrderRefsFromSalePayload");
151
+
152
+ // src/plugins/erp/erp-order-invoice.ts
153
+ function pickInvoiceId(data) {
154
+ const nested = data.invoice && typeof data.invoice === "object" && !Array.isArray(data.invoice) ? data.invoice : null;
155
+ const src = nested || data;
156
+ for (const k of [
157
+ "invoiceId",
158
+ "invoice_id",
159
+ "id"
160
+ ]) {
161
+ const v = src[k];
162
+ if (typeof v === "string" && v.trim()) return v.trim();
163
+ }
164
+ return void 0;
165
+ }
166
+ chunkUSNT2KNT_cjs.__name(pickInvoiceId, "pickInvoiceId");
167
+ async function streamOrderInvoicePdf(cms, dataSource, entityMap, orderId, options) {
168
+ const jsonErr = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name((msg, status) => new Response(JSON.stringify({
169
+ error: msg
170
+ }), {
171
+ status,
172
+ headers: {
173
+ "Content-Type": "application/json"
174
+ }
175
+ }), "jsonErr");
176
+ const on = await chunkUPLVMVRX_cjs.isErpIntegrationEnabled(cms, dataSource, entityMap);
177
+ if (!on) return jsonErr("Invoice not available", 503);
178
+ const erp = cms.getPlugin("erp");
179
+ if (!erp?.submission) return jsonErr("Invoice not available", 503);
180
+ const orderRepo = dataSource.getRepository(entityMap.orders);
181
+ const order = await orderRepo.findOne({
182
+ where: {
183
+ id: orderId,
184
+ deleted: false
185
+ }
186
+ });
187
+ if (!order) return jsonErr("Not found", 404);
188
+ const kind = order.orderKind || "sale";
189
+ if (kind !== "sale") return jsonErr("Invoice only for sale orders", 400);
190
+ if (options.ownerContactId != null && order.contactId !== options.ownerContactId) {
191
+ return jsonErr("Not found", 404);
192
+ }
193
+ const meta = order.metadata && typeof order.metadata === "object" && !Array.isArray(order.metadata) ? order.metadata : {};
194
+ const inv = meta.invoice && typeof meta.invoice === "object" && !Array.isArray(meta.invoice) ? meta.invoice : {};
195
+ let invoiceId = typeof inv.invoiceId === "string" ? inv.invoiceId.trim() : "";
196
+ if (!invoiceId) {
197
+ const refId = String(order.orderNumber || "");
198
+ const r = await erp.submission.postErpReadAction("get-invoice", {
199
+ platformOrderId: refId
200
+ });
201
+ const d = r.ok ? unwrapErpReadData(r.json) : null;
202
+ invoiceId = d ? pickInvoiceId(d) || "" : "";
203
+ }
204
+ if (!invoiceId) return jsonErr("Invoice not ready", 404);
205
+ const pdf = await erp.submission.fetchInvoicePdf(invoiceId);
206
+ if (!pdf.ok || !pdf.buffer) return jsonErr(pdf.error || "PDF fetch failed", 502);
207
+ const filename = `invoice-${orderId}.pdf`;
208
+ return new Response(pdf.buffer, {
209
+ status: 200,
210
+ headers: {
211
+ "Content-Type": pdf.contentType || "application/pdf",
212
+ "Content-Disposition": `attachment; filename="${filename}"`
213
+ }
214
+ });
215
+ }
216
+ chunkUSNT2KNT_cjs.__name(streamOrderInvoicePdf, "streamOrderInvoicePdf");
217
+
218
+ exports.extractChildOrderRefsFromSalePayload = extractChildOrderRefsFromSalePayload;
219
+ exports.mapErpPayloadToFulfillment = mapErpPayloadToFulfillment;
220
+ exports.mapErpPayloadToInvoiceNumber = mapErpPayloadToInvoiceNumber;
221
+ exports.streamOrderInvoicePdf = streamOrderInvoicePdf;
222
+ exports.unwrapErpReadData = unwrapErpReadData;
@@ -0,0 +1,4 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ export { __name };
@@ -0,0 +1,132 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/message-templates/event-order-defaults.ts
6
+ var EVENT_ORDER_TEMPLATE_KEY = "eventOrderPlaced";
7
+ var EVENT_ORDER_TEMPLATE_VARIABLES = [
8
+ "eventName",
9
+ "eventSlug",
10
+ "venue",
11
+ "startDate",
12
+ "orderNumber",
13
+ "orderTotal",
14
+ "currency",
15
+ "customerName",
16
+ "customerEmail",
17
+ "customerPhone",
18
+ "productNames",
19
+ "trackUrl",
20
+ "qrImageUrl",
21
+ "orderDetails",
22
+ "orderDetailsHtml"
23
+ ];
24
+ var EVENT_ORDER_WHATSAPP_PARAM_KEYS = [
25
+ "customerName",
26
+ "eventName",
27
+ "orderNumber",
28
+ "orderTotal",
29
+ "currency",
30
+ "venue",
31
+ "startDate",
32
+ "trackUrl"
33
+ ];
34
+ var EVENT_ORDER_TEMPLATE_VARIABLE_HINTS = {
35
+ eventName: "Event title",
36
+ eventSlug: "Event URL slug",
37
+ venue: "Venue name",
38
+ startDate: "Formatted event start",
39
+ orderNumber: "Order number",
40
+ orderTotal: "Order total amount",
41
+ currency: "Currency code",
42
+ customerName: "Buyer name",
43
+ customerEmail: "Buyer email",
44
+ customerPhone: "Buyer phone",
45
+ productNames: "Comma-separated ticket names",
46
+ trackUrl: "Public order tracking link (QR destination)",
47
+ qrImageUrl: 'QR code image URL for email (use in <img src="\u2026">)',
48
+ orderDetails: "Plain-text order summary with line items",
49
+ orderDetailsHtml: "HTML order summary block",
50
+ trackUrlWhatsApp: "Same as trackUrl \u2014 include in Meta template as last param"
51
+ };
52
+ var EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS = [
53
+ {
54
+ channel: "email",
55
+ templateKey: EVENT_ORDER_TEMPLATE_KEY,
56
+ name: "Event order placed (email)",
57
+ subject: "Your tickets \u2014 {{eventName}} ({{orderNumber}})",
58
+ body: `<p>Hi {{customerName}},</p>
59
+ <p>Thank you for registering for <strong>{{eventName}}</strong>.</p>
60
+ {{orderDetailsHtml}}
61
+ <p><strong>Venue:</strong> {{venue}}<br/>
62
+ <strong>Date:</strong> {{startDate}}</p>
63
+ <p>Show this QR code at the venue or scan to open your order:</p>
64
+ <p style="text-align:center;margin:20px 0">
65
+ <img src="{{qrImageUrl}}" alt="Order QR" width="180" height="180" style="border:1px solid #e5e7eb;border-radius:8px" />
66
+ </p>
67
+ <p style="text-align:center"><a href="{{trackUrl}}">View order online</a></p>
68
+ <p>We look forward to seeing you there.</p>`
69
+ },
70
+ {
71
+ channel: "whatsapp",
72
+ templateKey: EVENT_ORDER_TEMPLATE_KEY,
73
+ name: "Event order placed (WhatsApp)",
74
+ body: "Hi {{customerName}}, your registration for {{eventName}} is confirmed. Order {{orderNumber}} \u2014 {{orderTotal}} {{currency}}. Venue: {{venue}}. Date: {{startDate}}. Track: {{trackUrl}}",
75
+ externalTemplateRef: "event_order_placed"
76
+ }
77
+ ];
78
+ function getEventOrderTemplateDefault(channel) {
79
+ return EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS.find((d) => d.channel === channel);
80
+ }
81
+ chunkUSNT2KNT_cjs.__name(getEventOrderTemplateDefault, "getEventOrderTemplateDefault");
82
+ async function resolveEventOrderTemplate(channel, getRow, eventOverride) {
83
+ const def = getEventOrderTemplateDefault(channel);
84
+ if (!def) return null;
85
+ const row = await getRow(channel, EVENT_ORDER_TEMPLATE_KEY);
86
+ let subject = def.subject;
87
+ let body = def.body;
88
+ let externalTemplateRef = def.externalTemplateRef;
89
+ let name;
90
+ let language;
91
+ let paramOrder;
92
+ let enabled = true;
93
+ if (row) {
94
+ enabled = row.enabled !== false;
95
+ if (row.subject?.trim()) subject = row.subject.trim();
96
+ if (row.body.trim()) body = row.body;
97
+ if (row.externalTemplateRef?.trim()) externalTemplateRef = row.externalTemplateRef.trim();
98
+ name = row.name?.trim() || void 0;
99
+ language = row.language?.trim() || void 0;
100
+ paramOrder = row.paramOrder?.length ? row.paramOrder : void 0;
101
+ }
102
+ if (eventOverride) {
103
+ if (eventOverride.subject?.trim()) subject = eventOverride.subject.trim();
104
+ if (eventOverride.body?.trim()) body = eventOverride.body;
105
+ if (eventOverride.externalTemplateRef?.trim()) {
106
+ externalTemplateRef = eventOverride.externalTemplateRef.trim();
107
+ }
108
+ }
109
+ return {
110
+ subject,
111
+ body,
112
+ externalTemplateRef: externalTemplateRef?.trim() || void 0,
113
+ name,
114
+ language,
115
+ paramOrder,
116
+ enabled
117
+ };
118
+ }
119
+ chunkUSNT2KNT_cjs.__name(resolveEventOrderTemplate, "resolveEventOrderTemplate");
120
+ function pickWhatsAppTemplateParams(variables) {
121
+ return EVENT_ORDER_WHATSAPP_PARAM_KEYS.map((key) => String(variables[key] ?? "").slice(0, 1024));
122
+ }
123
+ chunkUSNT2KNT_cjs.__name(pickWhatsAppTemplateParams, "pickWhatsAppTemplateParams");
124
+
125
+ exports.EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS = EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS;
126
+ exports.EVENT_ORDER_TEMPLATE_KEY = EVENT_ORDER_TEMPLATE_KEY;
127
+ exports.EVENT_ORDER_TEMPLATE_VARIABLES = EVENT_ORDER_TEMPLATE_VARIABLES;
128
+ exports.EVENT_ORDER_TEMPLATE_VARIABLE_HINTS = EVENT_ORDER_TEMPLATE_VARIABLE_HINTS;
129
+ exports.EVENT_ORDER_WHATSAPP_PARAM_KEYS = EVENT_ORDER_WHATSAPP_PARAM_KEYS;
130
+ exports.getEventOrderTemplateDefault = getEventOrderTemplateDefault;
131
+ exports.pickWhatsAppTemplateParams = pickWhatsAppTemplateParams;
132
+ exports.resolveEventOrderTemplate = resolveEventOrderTemplate;
@@ -0,0 +1,97 @@
1
+ import { __name } from './chunk-SHUYVCID.js';
2
+
3
+ // src/plugins/erp/erp-log.ts
4
+ var ERP_LOG = "[webcore:erp]";
5
+ function logErp(event, detail) {
6
+ if (detail && Object.keys(detail).length) console.info(ERP_LOG, event, detail);
7
+ else console.info(ERP_LOG, event);
8
+ }
9
+ __name(logErp, "logErp");
10
+ function warnErp(event, detail) {
11
+ console.warn(ERP_LOG, event, detail);
12
+ }
13
+ __name(warnErp, "warnErp");
14
+ function errorErp(event, detail) {
15
+ console.error(ERP_LOG, event, detail);
16
+ }
17
+ __name(errorErp, "errorErp");
18
+ function erpSafeWebhookUrl(url) {
19
+ try {
20
+ const u = new URL(url);
21
+ return `${u.origin}${u.pathname}`;
22
+ } catch {
23
+ return "(invalid webhook URL)";
24
+ }
25
+ }
26
+ __name(erpSafeWebhookUrl, "erpSafeWebhookUrl");
27
+
28
+ // src/plugins/erp/erp-queue.ts
29
+ var ERP_QUEUE_NAME = "erp";
30
+ function queuePayloadSummary(payload) {
31
+ if (payload.kind === "order") {
32
+ const o = payload.order;
33
+ return {
34
+ kind: payload.kind,
35
+ platformOrderId: o.platformOrderId ?? o.platformOrderNumber,
36
+ itemCount: Array.isArray(o.items) ? o.items.length : 0
37
+ };
38
+ }
39
+ return {
40
+ kind: payload.kind
41
+ };
42
+ }
43
+ __name(queuePayloadSummary, "queuePayloadSummary");
44
+ async function queueErp(cms, payload) {
45
+ const queue = cms.getPlugin("queue");
46
+ if (!queue) {
47
+ warnErp("queue:add_skipped", {
48
+ reason: "queue_plugin_missing",
49
+ ...queuePayloadSummary(payload)
50
+ });
51
+ return;
52
+ }
53
+ logErp("queue:add", {
54
+ job: ERP_QUEUE_NAME,
55
+ ...queuePayloadSummary(payload)
56
+ });
57
+ await queue.add(ERP_QUEUE_NAME, payload);
58
+ }
59
+ __name(queueErp, "queueErp");
60
+ function registerErpQueueProcessor(cms) {
61
+ const queue = cms.getPlugin("queue");
62
+ if (!queue) return;
63
+ queue.registerProcessor(ERP_QUEUE_NAME, async (data) => {
64
+ const erp = cms.getPlugin("erp");
65
+ if (!erp) {
66
+ warnErp("queue:processor_skip", {
67
+ reason: "erp_plugin_missing"
68
+ });
69
+ return;
70
+ }
71
+ const payload = data;
72
+ logErp("queue:job_start", queuePayloadSummary(payload));
73
+ try {
74
+ if (payload.kind === "lead") {
75
+ await erp.submission.submitContact(payload.contact);
76
+ } else if (payload.kind === "formOpportunity") {
77
+ await erp.submission.submitFormOpportunity(payload.contact);
78
+ } else if (payload.kind === "createContact") {
79
+ await erp.submission.submitCreateContact(payload.contact);
80
+ } else if (payload.kind === "order") {
81
+ await erp.submission.submitOrder(payload.order);
82
+ } else if (payload.kind === "productUpsert") {
83
+ await erp.submission.submitProductUpsert(payload.product);
84
+ }
85
+ logErp("queue:job_done", queuePayloadSummary(payload));
86
+ } catch (e) {
87
+ errorErp("queue:job_failed", {
88
+ ...queuePayloadSummary(payload),
89
+ message: e instanceof Error ? e.message : String(e)
90
+ });
91
+ throw e;
92
+ }
93
+ });
94
+ }
95
+ __name(registerErpQueueProcessor, "registerErpQueueProcessor");
96
+
97
+ export { erpSafeWebhookUrl, errorErp, logErp, queueErp, registerErpQueueProcessor, warnErp };