@infuro/cms-core 1.0.33 → 1.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -6
- package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
- package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
- package/dist/admin.cjs +34072 -20487
- package/dist/admin.d.cts +191 -9
- package/dist/admin.d.ts +191 -9
- package/dist/admin.js +33913 -20423
- package/dist/api.cjs +123 -16508
- package/dist/api.d.cts +633 -3
- package/dist/api.d.ts +633 -3
- package/dist/api.js +14 -16519
- package/dist/auth.cjs +196 -955
- package/dist/auth.d.cts +201 -42
- package/dist/auth.d.ts +201 -42
- package/dist/auth.js +4 -888
- package/dist/chunk-2XE4X74C.js +29602 -0
- package/dist/chunk-3DZRIZOD.cjs +52 -0
- package/dist/chunk-3KPNTQBV.cjs +620 -0
- package/dist/chunk-46GKADYE.cjs +84 -0
- package/dist/chunk-4TRPKBKO.js +589 -0
- package/dist/chunk-5ELSW2UP.js +150 -0
- package/dist/chunk-6KPQWRFW.js +171 -0
- package/dist/chunk-7NMT3GBR.cjs +29 -0
- package/dist/chunk-7YIBMQDR.cjs +86 -0
- package/dist/chunk-BGJAV67S.cjs +29710 -0
- package/dist/chunk-CNTSLED2.cjs +559 -0
- package/dist/chunk-CRFV5WJK.js +16 -0
- package/dist/chunk-D5FBNKQM.cjs +104 -0
- package/dist/chunk-EF2JBPDM.js +114 -0
- package/dist/chunk-EQPITOP6.js +543 -0
- package/dist/chunk-GO7PPYNU.js +76 -0
- package/dist/chunk-HF3L2GIT.cjs +194 -0
- package/dist/chunk-J7XHLOLO.js +830 -0
- package/dist/chunk-JBRR5UYL.js +87 -0
- package/dist/chunk-JC6DLWTE.js +21 -0
- package/dist/chunk-JHF4YYRC.cjs +188 -0
- package/dist/chunk-JXF23MPG.js +25 -0
- package/dist/chunk-MQBT33IV.js +48 -0
- package/dist/chunk-N44BJZ4C.cjs +123 -0
- package/dist/chunk-OOTLNH63.cjs +18 -0
- package/dist/chunk-PAMVINEX.cjs +577 -0
- package/dist/chunk-PNOKNSG2.cjs +222 -0
- package/dist/chunk-QM733NUK.js +186 -0
- package/dist/chunk-R73BKDRO.cjs +90 -0
- package/dist/chunk-SHUYVCID.js +4 -0
- package/dist/chunk-SYBOCAWB.js +97 -0
- package/dist/chunk-TDV6EJHV.js +192 -0
- package/dist/chunk-TFUOHI37.cjs +839 -0
- package/dist/chunk-TIAEXJLI.cjs +182 -0
- package/dist/chunk-UPLVMVRX.cjs +23 -0
- package/dist/chunk-USNT2KNT.cjs +6 -0
- package/dist/chunk-WEMDMVHQ.js +216 -0
- package/dist/chunk-XDSNZUW7.js +564 -0
- package/dist/chunk-XQ3QUHWR.cjs +83 -0
- package/dist/chunk-XW5ATPRW.cjs +155 -0
- package/dist/chunk-ZQ4X6OAU.js +82 -0
- package/dist/chunk-ZSVCP6N3.js +83 -0
- package/dist/cli.cjs +142 -84
- package/dist/cli.js +101 -27
- package/dist/email-FKR4FXFI.js +5 -0
- package/dist/email-KVKVPNCL.cjs +58 -0
- package/dist/email-queue-CGZBVVAS.js +2 -0
- package/dist/email-queue-TPZWLTIV.cjs +23 -0
- package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
- package/dist/erp-config-enabled-T37X7T34.js +2 -0
- package/dist/erp-order-invoice-3YISSOWW.js +3 -0
- package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
- package/dist/event-order-defaults-6E543227.js +2 -0
- package/dist/event-order-defaults-DUGDVGJI.cjs +39 -0
- package/dist/event-order-notifications-5GSAOYVS.cjs +27 -0
- package/dist/event-order-notifications-IIIF23D5.js +10 -0
- package/dist/hooks.cjs +259 -132
- package/dist/hooks.d.cts +42 -1
- package/dist/hooks.d.ts +42 -1
- package/dist/hooks.js +234 -91
- package/dist/index.cjs +3884 -21070
- package/dist/index.d.cts +2255 -749
- package/dist/index.d.ts +2255 -749
- package/dist/index.js +1925 -19891
- package/dist/interpolate-WAKPN56R.cjs +11 -0
- package/dist/interpolate-WDUWDF3I.js +2 -0
- package/dist/layout-36UFTHC5.cjs +11 -0
- package/dist/layout-AOBN26XG.js +2 -0
- package/dist/migrations/1778660000004-CreateCustomerAndCustomerContacts.ts +99 -0
- package/dist/migrations/1778660000005-AddCustomerIdToVendorCustomers.ts +39 -0
- package/dist/migrations/1778660000006-UpdateVendorCustomersContactNullable.ts +36 -0
- package/dist/migrations/1778660000007-VendorOwnerCustomerContactsPermission.ts +39 -0
- package/dist/migrations/1779300000000-VendorOwnerContactsPermission.ts +39 -0
- package/dist/migrations/1779400000000-AddCustomerContactIdToOrders.ts +33 -0
- package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
- package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
- package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
- package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
- package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
- package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
- package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
- package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
- package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
- package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
- package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
- package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
- package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
- package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
- package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
- package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
- package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
- package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
- package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
- package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
- package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
- package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
- package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
- package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
- package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
- package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
- package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
- package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
- package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
- package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
- package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
- package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
- package/dist/paid-order-erp-3USEG6WL.js +3 -0
- package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
- package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
- package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
- package/dist/razorpay-KLO2KNCB.js +49 -0
- package/dist/razorpay-U23LGY72.cjs +56 -0
- package/dist/rbac-debug-db-D7ME7QUY.cjs +35 -0
- package/dist/rbac-debug-db-MTCTVNNM.js +33 -0
- package/dist/sms-defaults-2NL24H57.js +2 -0
- package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
- package/dist/stripe-4FD27QVJ.js +51 -0
- package/dist/stripe-VU6OEG2D.cjs +57 -0
- package/dist/theme.cjs +31 -59
- package/dist/theme.d.cts +78 -3
- package/dist/theme.d.ts +78 -3
- package/dist/theme.js +23 -20
- package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
- package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
- package/dist/whatsapp-queue-3DXA4MXU.js +2 -0
- package/dist/whatsapp-queue-KG65MXD5.cjs +15 -0
- package/package.json +147 -141
- package/dist/admin.cjs.map +0 -1
- package/dist/admin.js.map +0 -1
- package/dist/api.cjs.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/auth.cjs.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config-DJ5CmQvS.d.cts +0 -8
- package/dist/config-DJ5CmQvS.d.ts +0 -8
- package/dist/hooks.cjs.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/index-DWd5Gjc4.d.ts +0 -582
- package/dist/index-rZTnpK7y.d.cts +0 -582
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/theme.cjs.map +0 -1
- package/dist/theme.js.map +0 -1
- package/dist/types-DCVaXlPV.d.cts +0 -78
- package/dist/types-DCVaXlPV.d.ts +0 -78
- package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
- package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
|
@@ -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,186 @@
|
|
|
1
|
+
import { renderLayout } from './chunk-ZQ4X6OAU.js';
|
|
2
|
+
import { applyTemplateVars } from './chunk-CRFV5WJK.js';
|
|
3
|
+
import { queueWhatsApp } from './chunk-ZSVCP6N3.js';
|
|
4
|
+
import { resolvePublicSiteUrl, buildEventOrderTemplateVariables } from './chunk-JBRR5UYL.js';
|
|
5
|
+
import { mergeEmailLayoutCompanyDetails } from './chunk-XDSNZUW7.js';
|
|
6
|
+
import { queueEmail } from './chunk-5ELSW2UP.js';
|
|
7
|
+
import { resolveEventOrderTemplate, EVENT_ORDER_TEMPLATE_KEY } from './chunk-EF2JBPDM.js';
|
|
8
|
+
import { __name } from './chunk-SHUYVCID.js';
|
|
9
|
+
|
|
10
|
+
// src/lib/event-order-notifications.ts
|
|
11
|
+
async function getSettingsGroup(deps, group) {
|
|
12
|
+
const rows = await deps.dataSource.getRepository(deps.entityMap["configs"]).find({
|
|
13
|
+
where: {
|
|
14
|
+
settings: group,
|
|
15
|
+
deleted: false
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return Object.fromEntries(rows.map((r) => [
|
|
19
|
+
r.key,
|
|
20
|
+
r.value
|
|
21
|
+
]));
|
|
22
|
+
}
|
|
23
|
+
__name(getSettingsGroup, "getSettingsGroup");
|
|
24
|
+
function channelEnabled(channels, ch) {
|
|
25
|
+
if (!Array.isArray(channels) || channels.length === 0) return false;
|
|
26
|
+
return channels.includes(ch);
|
|
27
|
+
}
|
|
28
|
+
__name(channelEnabled, "channelEnabled");
|
|
29
|
+
async function dispatchEventOrderNotifications(orderId, deps) {
|
|
30
|
+
const orderRepo = deps.dataSource.getRepository(deps.entityMap["orders"]);
|
|
31
|
+
const order = await orderRepo.findOne({
|
|
32
|
+
where: {
|
|
33
|
+
id: orderId,
|
|
34
|
+
deleted: false
|
|
35
|
+
},
|
|
36
|
+
relations: [
|
|
37
|
+
"contact"
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
if (!order) return;
|
|
41
|
+
const o = order;
|
|
42
|
+
const contact = o.contact ?? {};
|
|
43
|
+
const siteUrl = resolvePublicSiteUrl();
|
|
44
|
+
const itemRows = await deps.dataSource.getRepository(deps.entityMap["order_items"]).find({
|
|
45
|
+
where: {
|
|
46
|
+
orderId
|
|
47
|
+
},
|
|
48
|
+
relations: [
|
|
49
|
+
"product"
|
|
50
|
+
],
|
|
51
|
+
order: {
|
|
52
|
+
id: "ASC"
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
if (!itemRows.length) return;
|
|
56
|
+
const epRepo = deps.dataSource.getRepository(deps.entityMap["event_products"]);
|
|
57
|
+
const eventRepo = deps.dataSource.getRepository(deps.entityMap["events"]);
|
|
58
|
+
const templateRepo = deps.dataSource.getRepository(deps.entityMap["message_templates"]);
|
|
59
|
+
const getTemplateRow = /* @__PURE__ */ __name(async (channel, templateKey) => {
|
|
60
|
+
const row = await templateRepo.findOne({
|
|
61
|
+
where: {
|
|
62
|
+
channel,
|
|
63
|
+
templateKey,
|
|
64
|
+
deleted: false
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (!row) return null;
|
|
68
|
+
const r = row;
|
|
69
|
+
return {
|
|
70
|
+
subject: r.subject,
|
|
71
|
+
body: r.body,
|
|
72
|
+
externalTemplateRef: r.externalTemplateRef,
|
|
73
|
+
enabled: r.enabled
|
|
74
|
+
};
|
|
75
|
+
}, "getTemplateRow");
|
|
76
|
+
const orderLines = itemRows.map((item) => {
|
|
77
|
+
const row = item;
|
|
78
|
+
const name = row.product?.name || row.product?.title || `Product #${row.productId}`;
|
|
79
|
+
return {
|
|
80
|
+
name: String(name),
|
|
81
|
+
quantity: Number(row.quantity) || 1,
|
|
82
|
+
total: row.total,
|
|
83
|
+
currency: String(o.currency ?? "INR")
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
const eventMap = /* @__PURE__ */ new Map();
|
|
87
|
+
for (const item of itemRows) {
|
|
88
|
+
const productId = item.productId;
|
|
89
|
+
const productName = item.product?.name || item.product?.title || `Product #${productId}`;
|
|
90
|
+
const eps = await epRepo.find({
|
|
91
|
+
where: {
|
|
92
|
+
productId,
|
|
93
|
+
isActive: true
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
for (const ep of eps) {
|
|
97
|
+
const eventId = ep.eventId;
|
|
98
|
+
const existing = eventMap.get(eventId);
|
|
99
|
+
if (existing) {
|
|
100
|
+
if (!existing.productNames.includes(productName)) {
|
|
101
|
+
existing.productNames.push(productName);
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
const event = await eventRepo.findOne({
|
|
105
|
+
where: {
|
|
106
|
+
id: eventId,
|
|
107
|
+
deleted: false
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
if (event) {
|
|
111
|
+
eventMap.set(eventId, {
|
|
112
|
+
event,
|
|
113
|
+
productNames: [
|
|
114
|
+
productName
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (eventMap.size === 0) return;
|
|
122
|
+
const notifSettings = await getSettingsGroup(deps, "event_notifications");
|
|
123
|
+
if (notifSettings.enabled === "false" || notifSettings.enabled === "0") return;
|
|
124
|
+
const cms = await deps.getCms();
|
|
125
|
+
const branding = await getSettingsGroup(deps, "branding");
|
|
126
|
+
const emailSettings = await getSettingsGroup(deps, "email");
|
|
127
|
+
const companyDetails = mergeEmailLayoutCompanyDetails(branding, emailSettings);
|
|
128
|
+
for (const { event, productNames: eventProductNames } of eventMap.values()) {
|
|
129
|
+
if (!event.orderNotificationsEnabled) continue;
|
|
130
|
+
const channels = event.orderNotificationChannels;
|
|
131
|
+
const overrides = event.orderNotificationTemplates;
|
|
132
|
+
const vars = buildEventOrderTemplateVariables({
|
|
133
|
+
event,
|
|
134
|
+
order: {
|
|
135
|
+
orderNumber: o.orderNumber,
|
|
136
|
+
total: o.total,
|
|
137
|
+
currency: o.currency,
|
|
138
|
+
qrToken: o.qrToken
|
|
139
|
+
},
|
|
140
|
+
contact,
|
|
141
|
+
productNames: eventProductNames.join(", "),
|
|
142
|
+
orderLines,
|
|
143
|
+
siteUrl
|
|
144
|
+
});
|
|
145
|
+
if (channelEnabled(channels, "email") && contact.email?.trim()) {
|
|
146
|
+
const resolved = await resolveEventOrderTemplate("email", getTemplateRow, overrides?.email ?? null);
|
|
147
|
+
if (resolved?.enabled) {
|
|
148
|
+
const subject = applyTemplateVars(resolved.subject ?? "Event registration confirmed", vars);
|
|
149
|
+
const bodyHtml = applyTemplateVars(resolved.body, vars);
|
|
150
|
+
const html = renderLayout({
|
|
151
|
+
bodyHtml,
|
|
152
|
+
companyDetails
|
|
153
|
+
});
|
|
154
|
+
await queueEmail(cms, {
|
|
155
|
+
to: contact.email.trim(),
|
|
156
|
+
subject,
|
|
157
|
+
html,
|
|
158
|
+
text: bodyHtml.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim()
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (channelEnabled(channels, "whatsapp") && contact.phone?.trim()) {
|
|
163
|
+
const resolved = await resolveEventOrderTemplate("whatsapp", getTemplateRow, overrides?.whatsapp ?? null);
|
|
164
|
+
if (resolved?.enabled) {
|
|
165
|
+
const { EVENT_ORDER_WHATSAPP_PARAM_KEYS } = await import('./event-order-defaults-6E543227.js');
|
|
166
|
+
const sent = await queueWhatsApp(cms, {
|
|
167
|
+
to: contact.phone.trim(),
|
|
168
|
+
templateKey: EVENT_ORDER_TEMPLATE_KEY,
|
|
169
|
+
externalTemplateRef: resolved.externalTemplateRef,
|
|
170
|
+
body: resolved.body,
|
|
171
|
+
variables: vars,
|
|
172
|
+
templateParamOrder: EVENT_ORDER_WHATSAPP_PARAM_KEYS
|
|
173
|
+
});
|
|
174
|
+
if (!sent) {
|
|
175
|
+
console.warn("[event-order-notifications] WhatsApp not sent for order", {
|
|
176
|
+
orderId,
|
|
177
|
+
eventId: event.id
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
__name(dispatchEventOrderNotifications, "dispatchEventOrderNotifications");
|
|
185
|
+
|
|
186
|
+
export { dispatchEventOrderNotifications };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
|
|
4
|
+
|
|
5
|
+
// src/lib/event-order-template-context.ts
|
|
6
|
+
function resolvePublicSiteUrl() {
|
|
7
|
+
if (typeof process !== "undefined") {
|
|
8
|
+
const u = (process.env.CMS_PUBLIC_URL || process.env.NEXT_PUBLIC_SITE_URL || "").trim();
|
|
9
|
+
if (u) return u.replace(/\/+$/, "");
|
|
10
|
+
const v = (process.env.VERCEL_URL || "").trim();
|
|
11
|
+
if (v) return v.startsWith("http") ? v.replace(/\/+$/, "") : `https://${v.replace(/\/+$/, "")}`;
|
|
12
|
+
}
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
chunkUSNT2KNT_cjs.__name(resolvePublicSiteUrl, "resolvePublicSiteUrl");
|
|
16
|
+
function buildOrderTrackUrl(qrToken, siteUrl) {
|
|
17
|
+
const token = qrToken?.trim();
|
|
18
|
+
if (!token) return "";
|
|
19
|
+
const base = (siteUrl ?? resolvePublicSiteUrl()).replace(/\/+$/, "");
|
|
20
|
+
if (!base) return `/track/${token}`;
|
|
21
|
+
return `${base}/track/${token}`;
|
|
22
|
+
}
|
|
23
|
+
chunkUSNT2KNT_cjs.__name(buildOrderTrackUrl, "buildOrderTrackUrl");
|
|
24
|
+
function buildOrderQrImageUrl(trackUrl, size = 200) {
|
|
25
|
+
if (!trackUrl.trim()) return "";
|
|
26
|
+
return `https://api.qrserver.com/v1/create-qr-code/?size=${size}x${size}&data=${encodeURIComponent(trackUrl)}`;
|
|
27
|
+
}
|
|
28
|
+
chunkUSNT2KNT_cjs.__name(buildOrderQrImageUrl, "buildOrderQrImageUrl");
|
|
29
|
+
function formatOrderDetailsText(input) {
|
|
30
|
+
const { orderNumber, total, currency, lines } = input;
|
|
31
|
+
const header = `Order: ${orderNumber}
|
|
32
|
+
Total: ${total} ${currency}`;
|
|
33
|
+
if (!lines.length) return header;
|
|
34
|
+
const items = lines.map((line) => `- ${line.name} \xD7 ${line.quantity} (${line.total} ${line.currency})`).join("\n");
|
|
35
|
+
return `${header}
|
|
36
|
+
|
|
37
|
+
Items:
|
|
38
|
+
${items}`;
|
|
39
|
+
}
|
|
40
|
+
chunkUSNT2KNT_cjs.__name(formatOrderDetailsText, "formatOrderDetailsText");
|
|
41
|
+
function formatOrderDetailsHtml(input) {
|
|
42
|
+
const text = formatOrderDetailsText(input);
|
|
43
|
+
const escaped = text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
44
|
+
return `<pre style="font-family:inherit;white-space:pre-wrap;margin:0">${escaped}</pre>`;
|
|
45
|
+
}
|
|
46
|
+
chunkUSNT2KNT_cjs.__name(formatOrderDetailsHtml, "formatOrderDetailsHtml");
|
|
47
|
+
function buildEventOrderTemplateVariables(input) {
|
|
48
|
+
const { event, order, contact, productNames, orderLines = [], siteUrl } = input;
|
|
49
|
+
const trackUrl = buildOrderTrackUrl(order.qrToken, siteUrl);
|
|
50
|
+
const qrImageUrl = buildOrderQrImageUrl(trackUrl);
|
|
51
|
+
const orderDetailsPayload = {
|
|
52
|
+
orderNumber: String(order.orderNumber ?? ""),
|
|
53
|
+
total: String(order.total ?? ""),
|
|
54
|
+
currency: String(order.currency ?? "INR"),
|
|
55
|
+
lines: orderLines
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
eventName: event.name ?? "",
|
|
59
|
+
eventSlug: event.slug ?? "",
|
|
60
|
+
venue: event.venue ?? "",
|
|
61
|
+
startDate: formatEventDate(event.startDate),
|
|
62
|
+
orderNumber: String(order.orderNumber ?? ""),
|
|
63
|
+
orderTotal: String(order.total ?? ""),
|
|
64
|
+
currency: String(order.currency ?? "INR"),
|
|
65
|
+
customerName: contact.name?.trim() || contact.email?.split("@")[0] || "Guest",
|
|
66
|
+
customerEmail: contact.email?.trim() || "",
|
|
67
|
+
customerPhone: contact.phone?.trim() || "",
|
|
68
|
+
productNames,
|
|
69
|
+
trackUrl,
|
|
70
|
+
qrImageUrl,
|
|
71
|
+
orderDetails: formatOrderDetailsText(orderDetailsPayload),
|
|
72
|
+
orderDetailsHtml: formatOrderDetailsHtml(orderDetailsPayload)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
chunkUSNT2KNT_cjs.__name(buildEventOrderTemplateVariables, "buildEventOrderTemplateVariables");
|
|
76
|
+
function formatEventDate(d) {
|
|
77
|
+
if (!d) return "";
|
|
78
|
+
try {
|
|
79
|
+
return new Date(d).toLocaleString(void 0, {
|
|
80
|
+
dateStyle: "medium",
|
|
81
|
+
timeStyle: "short"
|
|
82
|
+
});
|
|
83
|
+
} catch {
|
|
84
|
+
return String(d);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
chunkUSNT2KNT_cjs.__name(formatEventDate, "formatEventDate");
|
|
88
|
+
|
|
89
|
+
exports.buildEventOrderTemplateVariables = buildEventOrderTemplateVariables;
|
|
90
|
+
exports.resolvePublicSiteUrl = resolvePublicSiteUrl;
|
|
@@ -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 };
|