@pvh-afl/core 1.2.78 → 1.2.79

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.
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.module.d.ts","sourceRoot":"","sources":["../../src/analytics/analytics.module.ts"],"names":[],"mappings":"AAMA,oGAAoG;AACpG,qBAKa,eAAe;CAAG"}
1
+ {"version":3,"file":"analytics.module.d.ts","sourceRoot":"","sources":["../../src/analytics/analytics.module.ts"],"names":[],"mappings":"AAOA,oGAAoG;AACpG,qBAKa,eAAe;CAAG"}
@@ -7,6 +7,7 @@ const integrations_module_1 = require("../integrations/integrations.module");
7
7
  const ga4_service_1 = require("./ga4.service");
8
8
  const meta_purchase_service_1 = require("./meta-purchase.service");
9
9
  const wizzy_converted_service_1 = require("./wizzy-converted.service");
10
+ const netcore_events_service_1 = require("./netcore-events.service");
10
11
  /** Server-side analytics events, shared by every brand. Needs `QueueModule` (global) in the app. */
11
12
  let AnalyticsModule = class AnalyticsModule {
12
13
  };
@@ -14,8 +15,8 @@ exports.AnalyticsModule = AnalyticsModule;
14
15
  exports.AnalyticsModule = AnalyticsModule = tslib_1.__decorate([
15
16
  (0, common_1.Module)({
16
17
  imports: [integrations_module_1.IntegrationsModule],
17
- providers: [ga4_service_1.Ga4Service, meta_purchase_service_1.MetaPurchaseService, wizzy_converted_service_1.WizzyConvertedService],
18
- exports: [ga4_service_1.Ga4Service, meta_purchase_service_1.MetaPurchaseService, wizzy_converted_service_1.WizzyConvertedService],
18
+ providers: [ga4_service_1.Ga4Service, meta_purchase_service_1.MetaPurchaseService, wizzy_converted_service_1.WizzyConvertedService, netcore_events_service_1.NetcoreEventsService],
19
+ exports: [ga4_service_1.Ga4Service, meta_purchase_service_1.MetaPurchaseService, wizzy_converted_service_1.WizzyConvertedService, netcore_events_service_1.NetcoreEventsService],
19
20
  })
20
21
  ], AnalyticsModule);
21
22
  //# sourceMappingURL=analytics.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.module.js","sourceRoot":"","sources":["../../src/analytics/analytics.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,6EAAyE;AACzE,+CAA2C;AAC3C,mEAA8D;AAC9D,uEAAkE;AAElE,oGAAoG;AAM7F,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,wCAAkB,CAAC;QAC7B,SAAS,EAAE,CAAC,wBAAU,EAAE,2CAAmB,EAAE,+CAAqB,CAAC;QACnE,OAAO,EAAE,CAAC,wBAAU,EAAE,2CAAmB,EAAE,+CAAqB,CAAC;KAClE,CAAC;GACW,eAAe,CAAG"}
1
+ {"version":3,"file":"analytics.module.js","sourceRoot":"","sources":["../../src/analytics/analytics.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,6EAAyE;AACzE,+CAA2C;AAC3C,mEAA8D;AAC9D,uEAAkE;AAClE,qEAAgE;AAEhE,oGAAoG;AAM7F,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,wCAAkB,CAAC;QAC7B,SAAS,EAAE,CAAC,wBAAU,EAAE,2CAAmB,EAAE,+CAAqB,EAAE,6CAAoB,CAAC;QACzF,OAAO,EAAE,CAAC,wBAAU,EAAE,2CAAmB,EAAE,+CAAqB,EAAE,6CAAoB,CAAC;KACxF,CAAC;GACW,eAAe,CAAG"}
@@ -1,5 +1,6 @@
1
1
  export * from './ga4.service';
2
2
  export * from './meta-purchase.service';
3
3
  export * from './wizzy-converted.service';
4
+ export * from './netcore-events.service';
4
5
  export * from './analytics.module';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
@@ -4,5 +4,6 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./ga4.service"), exports);
5
5
  tslib_1.__exportStar(require("./meta-purchase.service"), exports);
6
6
  tslib_1.__exportStar(require("./wizzy-converted.service"), exports);
7
+ tslib_1.__exportStar(require("./netcore-events.service"), exports);
7
8
  tslib_1.__exportStar(require("./analytics.module"), exports);
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":";;;AAAA,wDAA8B;AAC9B,kEAAwC;AACxC,oEAA0C;AAC1C,6DAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":";;;AAAA,wDAA8B;AAC9B,kEAAwC;AACxC,oEAA0C;AAC1C,mEAAyC;AACzC,6DAAmC"}
@@ -0,0 +1,44 @@
1
+ import { ConfigService } from '../config/config.service';
2
+ import { QueueService } from '../queue/queue.service';
3
+ import { ShopifyAdminService } from '../integrations/commerce/shopify-admin.service';
4
+ import { CapillaryCouponService } from '../integrations/loyalty/capillary-coupon.service';
5
+ /**
6
+ * Netcore CE server-side events: `order_return` per refund (returned units
7
+ * only), `item_delivered` / `item_rto` per shipment. The consumer re-reads the
8
+ * order, so each event reflects it as it stands now.
9
+ */
10
+ export type NetcoreEventName = 'order_return' | 'item_delivered' | 'item_rto';
11
+ /** `rejected` is permanent (4xx); `failed` is worth a retry. */
12
+ export type NetcoreEventResult = 'sent' | 'skipped' | 'rejected' | 'failed';
13
+ export interface NetcoreEventsRetryPolicy {
14
+ attempts: number;
15
+ delaySeconds: number;
16
+ }
17
+ export declare class NetcoreEventsService {
18
+ private readonly configService;
19
+ private readonly shopifyAdminService;
20
+ private readonly queueService;
21
+ private readonly capillaryCouponService;
22
+ constructor(configService: ConfigService, shopifyAdminService: ShopifyAdminService, queueService: QueueService, capillaryCouponService: CapillaryCouponService);
23
+ getRetryPolicy(): NetcoreEventsRetryPolicy;
24
+ /** `order_return` for one refund: only its returned (non-cancel) units. */
25
+ sendOrderReturn(brand: string, orderId: string | number, refundId: string | number): Promise<NetcoreEventResult>;
26
+ /** `item_delivered` / `item_rto` for one shipment (fulfillment). */
27
+ sendShipmentEvent(brand: string, event: 'item_delivered' | 'item_rto', orderId: string | number, fulfillmentId: string | number): Promise<NetcoreEventResult>;
28
+ private fetchOrder;
29
+ /**
30
+ * Discount of the Capillary coupon on the order, as the webhook finds it: the
31
+ * legacy attribute, else a discount code tagged or known as Capillary, whose
32
+ * amount GoKwik writes as a `{ "<code>": "<amount>" }` attribute.
33
+ */
34
+ private capillaryCouponValue;
35
+ private attributes;
36
+ /** Fields every event carries. */
37
+ private common;
38
+ /** One item per order line in `picked`, with the picked quantity. */
39
+ private items;
40
+ /** Judge.me average rating and review count, as text. */
41
+ private reviews;
42
+ private send;
43
+ }
44
+ //# sourceMappingURL=netcore-events.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"netcore-events.service.d.ts","sourceRoot":"","sources":["../../src/analytics/netcore-events.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F;;;;GAIG;AAEH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAE9E,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAmJD,qBACa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBAHtB,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB,EACxC,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,sBAAsB;IAGjE,cAAc,IAAI,wBAAwB;IAI1C,2EAA2E;IACrE,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,QAAQ,EAAE,MAAM,GAAG,MAAM,GACxB,OAAO,CAAC,kBAAkB,CAAC;IAiD9B,oEAAoE;IAC9D,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,GAAG,UAAU,EACpC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,aAAa,EAAE,MAAM,GAAG,MAAM,GAC7B,OAAO,CAAC,kBAAkB,CAAC;YA+BhB,UAAU;IAmBxB;;;;OAIG;YACW,oBAAoB;IAelC,OAAO,CAAC,UAAU;IAIlB,kCAAkC;IAClC,OAAO,CAAC,MAAM;IAad,qEAAqE;IACrE,OAAO,CAAC,KAAK;IA+Cb,yDAAyD;IACzD,OAAO,CAAC,OAAO;YAYD,IAAI;CAoFnB"}
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NetcoreEventsService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const logger_1 = require("../common/logger");
7
+ const config_service_1 = require("../config/config.service");
8
+ const queue_service_1 = require("../queue/queue.service");
9
+ const shopify_admin_service_1 = require("../integrations/commerce/shopify-admin.service");
10
+ const commerce_utils_1 = require("../integrations/commerce/commerce.utils");
11
+ const utils_1 = require("../auth/utils");
12
+ const capillary_coupon_service_1 = require("../integrations/loyalty/capillary-coupon.service");
13
+ const RETRY = { attempts: 3, delaySeconds: 60 };
14
+ /** Matches the webhook dedup window. */
15
+ const DEDUP_TTL_SECONDS = 7 * 24 * 60 * 60;
16
+ const DEFAULT_TIMEOUT_MS = 10000;
17
+ /** Cart line attribute holding the MRP the line was sold against. */
18
+ const COMPARE_AT_LINE_ATTRIBUTE = '_compareAtPrice';
19
+ const CAPILLARY_COUPON_CODE_KEY = 'CAPILLARY_COUPON_CODE';
20
+ const CAPILLARY_COUPON_DISCOUNT_KEY = 'CAPILLARY_COUPON_DISCOUNT';
21
+ const ORDER_QUERY = `query NetcoreEventOrder($id: ID!) {
22
+ order(id: $id) {
23
+ legacyResourceId
24
+ name
25
+ createdAt
26
+ cancelledAt
27
+ displayFinancialStatus
28
+ discountCodes
29
+ phone
30
+ customer { legacyResourceId numberOfOrders defaultPhoneNumber { phoneNumber } }
31
+ customAttributes { key value }
32
+ totalPriceSet { shopMoney { amount } }
33
+ totalDiscountsSet { shopMoney { amount } }
34
+ shippingAddress { address1 address2 city province zip }
35
+ shippingLines(first: 1) { nodes { title } }
36
+ refunds(first: 50) {
37
+ legacyResourceId
38
+ refundLineItems(first: 250) { nodes { quantity restockType lineItem { id } } }
39
+ }
40
+ fulfillments(first: 50) {
41
+ legacyResourceId
42
+ createdAt
43
+ trackingInfo(first: 1) { company }
44
+ fulfillmentLineItems(first: 250) { nodes { quantity lineItem { id } } }
45
+ }
46
+ lineItems(first: 250) {
47
+ nodes {
48
+ id
49
+ title
50
+ quantity
51
+ customAttributes { key value }
52
+ image { url }
53
+ originalUnitPriceSet { shopMoney { amount } }
54
+ discountedUnitPriceAfterAllDiscountsSet { shopMoney { amount } }
55
+ variant { compareAtPrice selectedOptions { name value } }
56
+ product {
57
+ legacyResourceId
58
+ vendor
59
+ productType
60
+ tags
61
+ onlineStoreUrl
62
+ styleNumber: metafield(namespace: "custom", key: "style_number") { value }
63
+ season: metafield(namespace: "custom", key: "season") { value }
64
+ category: metafield(namespace: "custom", key: "breadcrumb_l2") { value }
65
+ reviews: metafield(namespace: "judgeme", key: "review_widget_data") { value }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }`;
71
+ /** Amount to the paisa. */
72
+ const amount = (value) => Math.round(value * 100) / 100;
73
+ const num = (value) => Number(value ?? 0) || 0;
74
+ /** IST date time, e.g. `2026-10-22 10:00:00` (`T` as separator for the timestamp). */
75
+ const istDateTime = (value, separator = ' ') => {
76
+ const time = value ? new Date(value).getTime() : NaN;
77
+ if (Number.isNaN(time))
78
+ return '';
79
+ return new Date(time + 330 * 60 * 1000).toISOString().slice(0, 19).replace('T', separator);
80
+ };
81
+ let NetcoreEventsService = class NetcoreEventsService {
82
+ configService;
83
+ shopifyAdminService;
84
+ queueService;
85
+ capillaryCouponService;
86
+ constructor(configService, shopifyAdminService, queueService, capillaryCouponService) {
87
+ this.configService = configService;
88
+ this.shopifyAdminService = shopifyAdminService;
89
+ this.queueService = queueService;
90
+ this.capillaryCouponService = capillaryCouponService;
91
+ }
92
+ getRetryPolicy() {
93
+ return RETRY;
94
+ }
95
+ /** `order_return` for one refund: only its returned (non-cancel) units. */
96
+ async sendOrderReturn(brand, orderId, refundId) {
97
+ const order = await this.fetchOrder(brand, orderId);
98
+ if (!order)
99
+ return 'failed';
100
+ // A cancellation refunds too; its event is Order Cancelled, not a return.
101
+ if (order.cancelledAt || !order.fulfillments?.length) {
102
+ logger_1.logger.info('Netcore order_return skipped - order cancelled or unfulfilled', { brand, orderId, refundId });
103
+ return 'skipped';
104
+ }
105
+ const refund = order.refunds?.find((r) => r.legacyResourceId === String(refundId));
106
+ if (!refund) {
107
+ logger_1.logger.error('Netcore order_return refund not found on order', { brand, orderId, refundId });
108
+ return 'failed';
109
+ }
110
+ const returned = (refund.refundLineItems?.nodes ?? []).filter((n) => n.restockType !== 'CANCEL');
111
+ const items = this.items(order, returned, true);
112
+ if (!items.length) {
113
+ logger_1.logger.info('Netcore order_return skipped - refund has no returned units', { brand, orderId, refundId });
114
+ return 'skipped';
115
+ }
116
+ const attrs = this.attributes(order);
117
+ const loyalty = await this.capillaryCouponValue(brand, order, attrs);
118
+ const address = order.shippingAddress;
119
+ const properties = {
120
+ ...this.common(order, attrs),
121
+ amount: amount(items.reduce((s, i) => s + i.price * i.prqt, 0)),
122
+ total_selling_price: amount(items.reduce((s, i) => s + i.sellingprice * i.prqt, 0)),
123
+ coupon_applied: (order.discountCodes ?? []).join(','),
124
+ coupon_value: amount(num(order.totalDiscountsSet?.shopMoney?.amount)),
125
+ order_value: amount(num(order.totalPriceSet?.shopMoney?.amount)),
126
+ payment_method_selected: attrs.get('Payment_Method') ?? '',
127
+ shipping_address: [address?.address1, address?.address2].filter(Boolean).join(', '),
128
+ shipping_pincode: address?.zip ?? '',
129
+ shipping_city: address?.city ?? '',
130
+ shipping_state: address?.province ?? '',
131
+ total_quantity: items.reduce((s, i) => s + i.prqt, 0),
132
+ order_name: (order.name ?? '').replace(/^#/, ''),
133
+ order_date: istDateTime(order.createdAt),
134
+ order_status: 'Returned',
135
+ payment_status: order.displayFinancialStatus ?? '',
136
+ // Only Capillary coupon orders carry loyalty value; a return reverts the same points.
137
+ ...(loyalty !== undefined && { loyalty_points: loyalty, loyalty_points_reverted: loyalty }),
138
+ item: items,
139
+ };
140
+ return this.send(brand, 'order_return', `${orderId}:${refundId}`, refundId, order, properties);
141
+ }
142
+ /** `item_delivered` / `item_rto` for one shipment (fulfillment). */
143
+ async sendShipmentEvent(brand, event, orderId, fulfillmentId) {
144
+ const order = await this.fetchOrder(brand, orderId);
145
+ if (!order)
146
+ return 'failed';
147
+ const fulfillment = order.fulfillments?.find((f) => f.legacyResourceId === String(fulfillmentId));
148
+ if (!fulfillment) {
149
+ logger_1.logger.error(`Netcore ${event} fulfillment not found on order`, { brand, orderId, fulfillmentId });
150
+ return 'failed';
151
+ }
152
+ const items = this.items(order, fulfillment.fulfillmentLineItems?.nodes ?? [], false);
153
+ if (!items.length) {
154
+ logger_1.logger.info(`Netcore ${event} skipped - shipment has no items`, { brand, orderId, fulfillmentId });
155
+ return 'skipped';
156
+ }
157
+ const attrs = this.attributes(order);
158
+ const properties = {
159
+ ...this.common(order, attrs),
160
+ pincode: order.shippingAddress?.zip ?? '',
161
+ state: order.shippingAddress?.province ?? '',
162
+ city: order.shippingAddress?.city ?? '',
163
+ shipment_id: String(fulfillmentId),
164
+ shipment_date: istDateTime(fulfillment.createdAt),
165
+ shipment_method: order.shippingLines?.nodes?.[0]?.title ?? '',
166
+ carrier: fulfillment.trackingInfo?.[0]?.company ?? '',
167
+ item: items,
168
+ };
169
+ return this.send(brand, event, `${orderId}:${fulfillmentId}`, fulfillmentId, order, properties);
170
+ }
171
+ async fetchOrder(brand, orderId) {
172
+ try {
173
+ const result = await this.shopifyAdminService.adminGraphQL(brand, ORDER_QUERY, { id: `gid://shopify/Order/${orderId}` });
174
+ if (!result.data?.order)
175
+ logger_1.logger.error('Netcore event order not found', { brand, orderId });
176
+ return result.data?.order ?? undefined;
177
+ }
178
+ catch (error) {
179
+ logger_1.logger.error('Netcore event order fetch failed', {
180
+ brand,
181
+ orderId,
182
+ error: error instanceof Error ? error.message : 'Unknown',
183
+ });
184
+ return undefined;
185
+ }
186
+ }
187
+ /**
188
+ * Discount of the Capillary coupon on the order, as the webhook finds it: the
189
+ * legacy attribute, else a discount code tagged or known as Capillary, whose
190
+ * amount GoKwik writes as a `{ "<code>": "<amount>" }` attribute.
191
+ */
192
+ async capillaryCouponValue(brand, order, attrs) {
193
+ if (attrs.get(CAPILLARY_COUPON_CODE_KEY))
194
+ return amount(num(attrs.get(CAPILLARY_COUPON_DISCOUNT_KEY)));
195
+ for (const code of order.discountCodes ?? []) {
196
+ const isCapillary = (await this.shopifyAdminService.isCapillaryDiscount(brand, code).catch(() => false)) ||
197
+ (await this.capillaryCouponService.isCapillaryCoupon(brand, code).catch(() => false));
198
+ if (isCapillary)
199
+ return amount(num(attrs.get(code)));
200
+ }
201
+ return undefined;
202
+ }
203
+ attributes(order) {
204
+ return new Map((order.customAttributes ?? []).map((a) => [a.key, a.value ?? '']));
205
+ }
206
+ /** Fields every event carries. */
207
+ common(order, attrs) {
208
+ // numberOfOrders counts this order too, so "repeat" means more than one.
209
+ const orders = Number(order.customer?.numberOfOrders ?? 0);
210
+ return {
211
+ user_id: order.customer?.legacyResourceId ?? '',
212
+ order_id: order.legacyResourceId,
213
+ user_type: orders > 1 ? 'repeat' : 'new',
214
+ channel_source: attrs.get('utm_source') ?? '',
215
+ channel_medium: attrs.get('utm_medium') ?? '',
216
+ channel_campaign: attrs.get('utm_campaign') ?? '',
217
+ };
218
+ }
219
+ /** One item per order line in `picked`, with the picked quantity. */
220
+ items(order, picked, full) {
221
+ const qty = new Map();
222
+ for (const p of picked) {
223
+ const id = p.lineItem?.id;
224
+ if (id && (p.quantity ?? 0) > 0)
225
+ qty.set(id, (qty.get(id) ?? 0) + (p.quantity ?? 0));
226
+ }
227
+ return (order.lineItems?.nodes ?? [])
228
+ .filter((line) => qty.has(line.id))
229
+ .map((line) => {
230
+ const product = line.product;
231
+ const selling = num(line.discountedUnitPriceAfterAllDiscountsSet?.shopMoney?.amount);
232
+ // MRP as sold; older lines predate the attribute, so fall back to the variant.
233
+ const mrp = num(line.customAttributes?.find((a) => a.key === COMPARE_AT_LINE_ATTRIBUTE)?.value) ||
234
+ num(line.variant?.compareAtPrice) ||
235
+ num(line.originalUnitPriceSet?.shopMoney?.amount);
236
+ const discount = Math.max(0, mrp - selling);
237
+ const item = {
238
+ styleid: product?.styleNumber?.value ?? '',
239
+ prid: product?.legacyResourceId ?? '',
240
+ name: line.title ?? '',
241
+ brand: product?.vendor ?? '',
242
+ category1: product?.category?.value ?? '',
243
+ category2: product?.productType ?? '',
244
+ gender: (0, commerce_utils_1.resolveGender)(product?.tags) ?? '',
245
+ image: line.image?.url ?? '',
246
+ produrl: product?.onlineStoreUrl ?? '',
247
+ season: product?.season?.value ?? '',
248
+ price: amount(mrp),
249
+ sellingprice: amount(selling),
250
+ discount: amount(discount),
251
+ };
252
+ if (!full)
253
+ return item;
254
+ const reviews = this.reviews(product?.reviews?.value);
255
+ return {
256
+ ...item,
257
+ discountpercent: mrp > 0 ? Math.round((discount / mrp) * 100) : 0,
258
+ size: line.variant?.selectedOptions?.find((o) => o.name.toLowerCase() === 'size')?.value ?? '',
259
+ rating: reviews.rating,
260
+ review: reviews.count,
261
+ prqt: qty.get(line.id) ?? 0,
262
+ };
263
+ });
264
+ }
265
+ /** Judge.me average rating and review count, as text. */
266
+ reviews(json) {
267
+ try {
268
+ const data = json ? JSON.parse(json) : {};
269
+ return {
270
+ rating: data.average_rating != null ? String(data.average_rating) : '',
271
+ count: data.number_of_reviews != null ? String(data.number_of_reviews) : '',
272
+ };
273
+ }
274
+ catch {
275
+ return { rating: '', count: '' };
276
+ }
277
+ }
278
+ async send(brand, event, key, tx, order, properties) {
279
+ const options = (this.configService.getBrand(brand)?.integrations?.netcoreEvents ?? {});
280
+ if (!options.baseUrl || !options.token || !options.assetId) {
281
+ logger_1.logger.warn(`Netcore ${event} skipped - not configured`, { brand, key });
282
+ return 'skipped';
283
+ }
284
+ if (!order.customer?.legacyResourceId) {
285
+ logger_1.logger.info(`Netcore ${event} skipped - order has no customer`, { brand, key });
286
+ return 'skipped';
287
+ }
288
+ // Netcore identity is the mobile as `91XXXXXXXXXX`.
289
+ const rawPhone = order.customer.defaultPhoneNumber?.phoneNumber ?? order.phone ?? '';
290
+ const identity = rawPhone ? (0, utils_1.normalizePhone)(rawPhone) : '';
291
+ if (!identity) {
292
+ logger_1.logger.info(`Netcore ${event} skipped - order has no mobile`, { brand, key });
293
+ return 'skipped';
294
+ }
295
+ // Claimed per refund / shipment, so a redelivery doesn't send it twice.
296
+ const dedupKey = `netcore:${brand}:${event}:${key}`;
297
+ if (!(await this.queueService.claimOnce(dedupKey, DEDUP_TTL_SECONDS))) {
298
+ logger_1.logger.info(`Netcore ${event} already sent`, { brand, key });
299
+ return 'sent';
300
+ }
301
+ const body = [
302
+ {
303
+ asset_id: options.assetId,
304
+ activity_name: event,
305
+ timestamp: istDateTime(Date.now(), 'T'),
306
+ identity,
307
+ activity_source: 'web',
308
+ tx: Number(tx),
309
+ activity_params: properties,
310
+ },
311
+ ];
312
+ const started = Date.now();
313
+ const controller = new AbortController();
314
+ const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? DEFAULT_TIMEOUT_MS);
315
+ try {
316
+ const response = await fetch(options.baseUrl, {
317
+ method: 'POST',
318
+ headers: { 'Content-Type': 'application/json', authorization: `Bearer ${options.token}` },
319
+ body: JSON.stringify(body),
320
+ signal: controller.signal,
321
+ });
322
+ const raw = await response.text();
323
+ logger_1.logger.info(`Netcore ${event} request`, {
324
+ brand,
325
+ key,
326
+ request: body,
327
+ status: response.status,
328
+ response: raw,
329
+ durationMs: Date.now() - started,
330
+ });
331
+ if (!response.ok) {
332
+ await this.queueService.release(dedupKey);
333
+ const permanent = response.status >= 400 && response.status < 500 && response.status !== 429;
334
+ logger_1.logger.error(`Netcore ${event} failed`, { brand, key, status: response.status });
335
+ return permanent ? 'rejected' : 'failed';
336
+ }
337
+ }
338
+ catch (error) {
339
+ await this.queueService.release(dedupKey);
340
+ logger_1.logger.error(`Netcore ${event} failed`, {
341
+ brand,
342
+ key,
343
+ error: error instanceof Error ? error.message : 'Unknown',
344
+ durationMs: Date.now() - started,
345
+ });
346
+ return 'failed';
347
+ }
348
+ finally {
349
+ clearTimeout(timeoutId);
350
+ }
351
+ logger_1.logger.info(`Netcore ${event} sent`, { brand, key });
352
+ return 'sent';
353
+ }
354
+ };
355
+ exports.NetcoreEventsService = NetcoreEventsService;
356
+ exports.NetcoreEventsService = NetcoreEventsService = tslib_1.__decorate([
357
+ (0, common_1.Injectable)(),
358
+ tslib_1.__metadata("design:paramtypes", [config_service_1.ConfigService,
359
+ shopify_admin_service_1.ShopifyAdminService,
360
+ queue_service_1.QueueService,
361
+ capillary_coupon_service_1.CapillaryCouponService])
362
+ ], NetcoreEventsService);
363
+ //# sourceMappingURL=netcore-events.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"netcore-events.service.js","sourceRoot":"","sources":["../../src/analytics/netcore-events.service.ts"],"names":[],"mappings":"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"}
@@ -36,4 +36,6 @@ export declare function isAppsFlyerEnabled(): boolean;
36
36
  export declare function isGa4Enabled(): boolean;
37
37
  /** Meta Conversions API relay for app events. Same contract: only the exact string "true". */
38
38
  export declare function isMetaCapiEnabled(): boolean;
39
+ /** Netcore CE server-side events (order_return, item_delivered, item_rto). Same contract: only the exact string "true". */
40
+ export declare function isNetcoreEventsEnabled(): boolean;
39
41
  //# sourceMappingURL=feature-flags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../src/common/feature-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,oFAAoF;AACpF,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
1
+ {"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../src/common/feature-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,oFAAoF;AACpF,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,2HAA2H;AAC3H,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD"}
@@ -7,6 +7,7 @@ exports.isOrderSmsEnabled = isOrderSmsEnabled;
7
7
  exports.isAppsFlyerEnabled = isAppsFlyerEnabled;
8
8
  exports.isGa4Enabled = isGa4Enabled;
9
9
  exports.isMetaCapiEnabled = isMetaCapiEnabled;
10
+ exports.isNetcoreEventsEnabled = isNetcoreEventsEnabled;
10
11
  /**
11
12
  * Master runtime switch for the Capillary loyalty integration.
12
13
  *
@@ -59,4 +60,8 @@ function isGa4Enabled() {
59
60
  function isMetaCapiEnabled() {
60
61
  return process.env.META_CAPI_ENABLED === 'true';
61
62
  }
63
+ /** Netcore CE server-side events (order_return, item_delivered, item_rto). Same contract: only the exact string "true". */
64
+ function isNetcoreEventsEnabled() {
65
+ return process.env.NETCORE_EVENTS_ENABLED === 'true';
66
+ }
62
67
  //# sourceMappingURL=feature-flags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../../src/common/feature-flags.ts"],"names":[],"mappings":";;AAeA,gDAEC;AAeD,kDAEC;AAED,wDAEC;AAED,8CAEC;AAGD,gDAEC;AAGD,oCAEC;AAGD,8CAEC;AAzDD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,CAAC;AACpD,CAAC;AAED,SAAgB,sBAAsB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,MAAM,CAAC;AACvD,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED,kFAAkF;AAClF,SAAgB,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED,oFAAoF;AACpF,SAAgB,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,8FAA8F;AAC9F,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../../src/common/feature-flags.ts"],"names":[],"mappings":";;AAeA,gDAEC;AAeD,kDAEC;AAED,wDAEC;AAED,8CAEC;AAGD,gDAEC;AAGD,oCAEC;AAGD,8CAEC;AAGD,wDAEC;AA9DD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,CAAC;AACpD,CAAC;AAED,SAAgB,sBAAsB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,MAAM,CAAC;AACvD,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED,kFAAkF;AAClF,SAAgB,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED,oFAAoF;AACpF,SAAgB,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,8FAA8F;AAC9F,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAClD,CAAC;AAED,2HAA2H;AAC3H,SAAgB,sBAAsB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,MAAM,CAAC;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pvh-afl/core",
3
- "version": "1.2.78",
3
+ "version": "1.2.79",
4
4
  "description": "AFL Core - Shared services for multi-brand commerce platform",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",