@pvh-afl/core 1.2.41 → 1.2.43
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/dist/integrations/engagement/index.d.ts +2 -0
- package/dist/integrations/engagement/index.d.ts.map +1 -1
- package/dist/integrations/engagement/index.js +2 -0
- package/dist/integrations/engagement/index.js.map +1 -1
- package/dist/integrations/engagement/netcore-email.service.d.ts.map +1 -1
- package/dist/integrations/engagement/netcore-email.service.js +3 -1
- package/dist/integrations/engagement/netcore-email.service.js.map +1 -1
- package/dist/integrations/engagement/netcore-whatsapp.service.d.ts +29 -0
- package/dist/integrations/engagement/netcore-whatsapp.service.d.ts.map +1 -0
- package/dist/integrations/engagement/netcore-whatsapp.service.js +171 -0
- package/dist/integrations/engagement/netcore-whatsapp.service.js.map +1 -0
- package/dist/integrations/engagement/netcore-whatsapp.types.d.ts +46 -0
- package/dist/integrations/engagement/netcore-whatsapp.types.d.ts.map +1 -0
- package/dist/integrations/engagement/netcore-whatsapp.types.js +3 -0
- package/dist/integrations/engagement/netcore-whatsapp.types.js.map +1 -0
- package/dist/integrations/integrations.module.d.ts.map +1 -1
- package/dist/integrations/integrations.module.js +3 -0
- package/dist/integrations/integrations.module.js.map +1 -1
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +2 -0
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/notifications.module.d.ts +2 -2
- package/dist/notifications/notifications.module.d.ts.map +1 -1
- package/dist/notifications/notifications.module.js +5 -4
- package/dist/notifications/notifications.module.js.map +1 -1
- package/dist/notifications/order-email.mapper.d.ts +27 -0
- package/dist/notifications/order-email.mapper.d.ts.map +1 -1
- package/dist/notifications/order-email.mapper.js +53 -9
- package/dist/notifications/order-email.mapper.js.map +1 -1
- package/dist/notifications/order-email.service.d.ts.map +1 -1
- package/dist/notifications/order-email.service.js +3 -0
- package/dist/notifications/order-email.service.js.map +1 -1
- package/dist/notifications/order-notification.types.d.ts +7 -1
- package/dist/notifications/order-notification.types.d.ts.map +1 -1
- package/dist/notifications/order-notification.types.js +4 -0
- package/dist/notifications/order-notification.types.js.map +1 -1
- package/dist/notifications/order-whatsapp.mapper.d.ts +53 -0
- package/dist/notifications/order-whatsapp.mapper.d.ts.map +1 -0
- package/dist/notifications/order-whatsapp.mapper.js +112 -0
- package/dist/notifications/order-whatsapp.mapper.js.map +1 -0
- package/dist/notifications/order-whatsapp.service.d.ts +29 -0
- package/dist/notifications/order-whatsapp.service.d.ts.map +1 -0
- package/dist/notifications/order-whatsapp.service.js +130 -0
- package/dist/notifications/order-whatsapp.service.js.map +1 -0
- package/dist/notifications/order.source.d.ts +11 -0
- package/dist/notifications/order.source.d.ts.map +1 -1
- package/dist/notifications/order.source.js +4 -0
- package/dist/notifications/order.source.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/engagement/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/engagement/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC"}
|
|
@@ -3,4 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./netcore-email.types"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./netcore-email.service"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./netcore-whatsapp.types"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./netcore-whatsapp.service"), exports);
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/engagement/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,kEAAwC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/engagement/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,kEAAwC;AACxC,mEAAyC;AACzC,qEAA2C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"netcore-email.service.d.ts","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-email.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAa/B;;;;;;;;;;;GAWG;AACH,qBACa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"netcore-email.service.d.ts","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-email.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAa/B;;;;;;;;;;;GAWG;AACH,qBACa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAkBrD,YAAY,IAAI,OAAO;IAIvB;;;;;OAKG;IACG,IAAI,CACR,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;IAiHlD,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,cAAc;CAiBvB"}
|
|
@@ -29,7 +29,9 @@ let NetcoreEmailService = class NetcoreEmailService {
|
|
|
29
29
|
// otherwise overwrite the default and produce `undefined/v5.1/mail/send`.
|
|
30
30
|
this.config = {
|
|
31
31
|
...config,
|
|
32
|
-
|
|
32
|
+
// `||` not `??`: an unset `env:` reference resolves to an empty string,
|
|
33
|
+
// which `??` would keep and post to a bare path.
|
|
34
|
+
baseUrl: config.baseUrl || DEFAULT_BASE_URL,
|
|
33
35
|
timeout: config.timeout ?? this.defaultTimeout,
|
|
34
36
|
};
|
|
35
37
|
logger_1.logger.info('Netcore email service configured', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"netcore-email.service.js","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-email.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"netcore-email.service.js","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-email.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IntegrationResponse } from '../integration.types';
|
|
2
|
+
import { IWhatsAppService, NetcoreWhatsAppConfig, WhatsAppSendResult, WhatsAppTemplateRequest } from './netcore-whatsapp.types';
|
|
3
|
+
/**
|
|
4
|
+
* Netcore WhatsApp Business API service.
|
|
5
|
+
*
|
|
6
|
+
* Sends business-initiated template messages. Auth is a Bearer JWT, unlike the
|
|
7
|
+
* email service's `api_key` header.
|
|
8
|
+
*
|
|
9
|
+
* Two differences from email that shape the contract:
|
|
10
|
+
*
|
|
11
|
+
* - Template variables are **positional**. The array order must match the
|
|
12
|
+
* template as Meta approved it, and an approved template cannot be reordered
|
|
13
|
+
* without re-approval — so the order belongs in brand config, not here.
|
|
14
|
+
* - An **empty variable is rejected**, where email would simply render a blank.
|
|
15
|
+
* This service fails the request rather than letting Meta reject it, so the
|
|
16
|
+
* cause is visible in our logs instead of a provider error.
|
|
17
|
+
*/
|
|
18
|
+
export declare class NetcoreWhatsAppService implements IWhatsAppService {
|
|
19
|
+
private config;
|
|
20
|
+
private brand;
|
|
21
|
+
private readonly defaultTimeout;
|
|
22
|
+
configure(brand: string, config: NetcoreWhatsAppConfig): void;
|
|
23
|
+
isConfigured(): boolean;
|
|
24
|
+
sendTemplate(request: WhatsAppTemplateRequest): Promise<IntegrationResponse<WhatsAppSendResult>>;
|
|
25
|
+
private parseBody;
|
|
26
|
+
private error;
|
|
27
|
+
private normalizeError;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=netcore-whatsapp.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netcore-whatsapp.service.d.ts","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-whatsapp.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAgBlC;;;;;;;;;;;;;;GAcG;AACH,qBACa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI;IAc7D,YAAY,IAAI,OAAO;IAIjB,YAAY,CAChB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAuHnD,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,cAAc;CAcvB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NetcoreWhatsAppService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const logger_1 = require("../../common/logger");
|
|
7
|
+
const DEFAULT_BASE_URL = 'https://cpaaswa.netcorecloud.net';
|
|
8
|
+
/** `/nc` identifies a direct Netcore caller; `/we` and `/ct` are for WebEngage and CleverTap. */
|
|
9
|
+
const SEND_PATH = '/api/v2/message/nc';
|
|
10
|
+
/**
|
|
11
|
+
* Netcore WhatsApp Business API service.
|
|
12
|
+
*
|
|
13
|
+
* Sends business-initiated template messages. Auth is a Bearer JWT, unlike the
|
|
14
|
+
* email service's `api_key` header.
|
|
15
|
+
*
|
|
16
|
+
* Two differences from email that shape the contract:
|
|
17
|
+
*
|
|
18
|
+
* - Template variables are **positional**. The array order must match the
|
|
19
|
+
* template as Meta approved it, and an approved template cannot be reordered
|
|
20
|
+
* without re-approval — so the order belongs in brand config, not here.
|
|
21
|
+
* - An **empty variable is rejected**, where email would simply render a blank.
|
|
22
|
+
* This service fails the request rather than letting Meta reject it, so the
|
|
23
|
+
* cause is visible in our logs instead of a provider error.
|
|
24
|
+
*/
|
|
25
|
+
let NetcoreWhatsAppService = class NetcoreWhatsAppService {
|
|
26
|
+
config = null;
|
|
27
|
+
brand = '';
|
|
28
|
+
defaultTimeout = 10000;
|
|
29
|
+
configure(brand, config) {
|
|
30
|
+
this.brand = brand;
|
|
31
|
+
// Defaults after the spread: a brand config omitting `baseUrl` passes it as
|
|
32
|
+
// undefined, which would otherwise overwrite the default.
|
|
33
|
+
this.config = {
|
|
34
|
+
...config,
|
|
35
|
+
// `||` not `??`: an unset `env:` reference resolves to an empty string,
|
|
36
|
+
// which `??` would keep and post to a bare path.
|
|
37
|
+
baseUrl: config.baseUrl || DEFAULT_BASE_URL,
|
|
38
|
+
timeout: config.timeout ?? this.defaultTimeout,
|
|
39
|
+
};
|
|
40
|
+
logger_1.logger.info('Netcore WhatsApp service configured', { brand });
|
|
41
|
+
}
|
|
42
|
+
isConfigured() {
|
|
43
|
+
return this.config !== null;
|
|
44
|
+
}
|
|
45
|
+
async sendTemplate(request) {
|
|
46
|
+
if (!this.config) {
|
|
47
|
+
return this.error('NOT_CONFIGURED', 'Netcore WhatsApp service is not configured');
|
|
48
|
+
}
|
|
49
|
+
const recipient = normalizeRecipient(request.recipient);
|
|
50
|
+
if (!recipient) {
|
|
51
|
+
return this.error('MISSING_RECIPIENT', 'WhatsApp send requires a phone number');
|
|
52
|
+
}
|
|
53
|
+
if (!request.templateName) {
|
|
54
|
+
return this.error('MISSING_TEMPLATE', 'WhatsApp send requires a template name');
|
|
55
|
+
}
|
|
56
|
+
// Fail here rather than at Meta: a blank variable is rejected by WhatsApp,
|
|
57
|
+
// and its error names neither the template nor the position.
|
|
58
|
+
const blank = request.attributes.findIndex((v) => !v || !v.trim());
|
|
59
|
+
if (blank !== -1) {
|
|
60
|
+
return this.error('EMPTY_ATTRIBUTE', `Template ${request.templateName} variable {{${blank + 1}}} is empty; WhatsApp rejects empty variables`);
|
|
61
|
+
}
|
|
62
|
+
const body = {
|
|
63
|
+
message: [
|
|
64
|
+
{
|
|
65
|
+
recipient_whatsapp: recipient,
|
|
66
|
+
recipient_type: 'individual',
|
|
67
|
+
message_type: 'template',
|
|
68
|
+
type_template: [
|
|
69
|
+
{
|
|
70
|
+
name: request.templateName,
|
|
71
|
+
attributes: request.attributes,
|
|
72
|
+
language: { locale: request.locale, policy: 'deterministic' },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout ?? this.defaultTimeout);
|
|
81
|
+
const response = await fetch(`${this.config.baseUrl}${SEND_PATH}`, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: {
|
|
84
|
+
'Content-Type': 'application/json',
|
|
85
|
+
Accept: 'application/json',
|
|
86
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify(body),
|
|
89
|
+
signal: controller.signal,
|
|
90
|
+
});
|
|
91
|
+
clearTimeout(timeoutId);
|
|
92
|
+
const raw = await response.text();
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
return { success: false, error: this.normalizeError(response.status, raw) };
|
|
95
|
+
}
|
|
96
|
+
const parsed = this.parseBody(raw);
|
|
97
|
+
// A 2xx can still carry a rejection. Treat an explicit non-success status,
|
|
98
|
+
// or an error with no status at all, as a failure.
|
|
99
|
+
if ((parsed?.status && !/success|ok|accepted/i.test(parsed.status)) ||
|
|
100
|
+
(!parsed?.status && parsed?.error)) {
|
|
101
|
+
return {
|
|
102
|
+
success: false,
|
|
103
|
+
error: {
|
|
104
|
+
code: 'SEND_REJECTED',
|
|
105
|
+
message: parsed.message ?? 'Netcore rejected the WhatsApp send',
|
|
106
|
+
details: parsed,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const messageId = parsed?.data?.id ??
|
|
111
|
+
parsed?.data?.message_id ??
|
|
112
|
+
parsed?.data?.messageId ??
|
|
113
|
+
parsed?.message_id;
|
|
114
|
+
if (!messageId) {
|
|
115
|
+
// Accepted, but nothing to correlate against later. Not fatal: treating
|
|
116
|
+
// it as failed would re-send a message the customer already has.
|
|
117
|
+
logger_1.logger.warn('Netcore WhatsApp accepted send without a message id', {
|
|
118
|
+
brand: this.brand,
|
|
119
|
+
template: request.templateName,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return { success: true, data: { messageId: messageId ?? '' } };
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger_1.logger.error('Netcore WhatsApp send failed', {
|
|
126
|
+
brand: this.brand,
|
|
127
|
+
template: request.templateName,
|
|
128
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
error: {
|
|
133
|
+
code: 'REQUEST_FAILED',
|
|
134
|
+
message: error instanceof Error ? error.message : 'Request failed',
|
|
135
|
+
details: error,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
parseBody(raw) {
|
|
141
|
+
try {
|
|
142
|
+
return raw ? JSON.parse(raw) : null;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
error(code, message) {
|
|
149
|
+
return { success: false, error: { code, message } };
|
|
150
|
+
}
|
|
151
|
+
normalizeError(status, body) {
|
|
152
|
+
const errorMap = {
|
|
153
|
+
400: 'BAD_REQUEST',
|
|
154
|
+
401: 'UNAUTHORIZED',
|
|
155
|
+
403: 'FORBIDDEN',
|
|
156
|
+
404: 'NOT_FOUND',
|
|
157
|
+
429: 'RATE_LIMITED',
|
|
158
|
+
500: 'INTERNAL_ERROR',
|
|
159
|
+
502: 'BAD_GATEWAY',
|
|
160
|
+
503: 'SERVICE_UNAVAILABLE',
|
|
161
|
+
};
|
|
162
|
+
return { code: errorMap[status] ?? 'UNKNOWN_ERROR', message: body || `HTTP ${status}` };
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
exports.NetcoreWhatsAppService = NetcoreWhatsAppService;
|
|
166
|
+
exports.NetcoreWhatsAppService = NetcoreWhatsAppService = tslib_1.__decorate([
|
|
167
|
+
(0, common_1.Injectable)()
|
|
168
|
+
], NetcoreWhatsAppService);
|
|
169
|
+
/** Digits only: WhatsApp wants `919876543210`, Shopify gives `+91 98765 43210`. */
|
|
170
|
+
const normalizeRecipient = (raw) => (raw ?? '').replace(/\D/g, '');
|
|
171
|
+
//# sourceMappingURL=netcore-whatsapp.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netcore-whatsapp.service.js","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-whatsapp.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { IntegrationResponse } from '../integration.types';
|
|
2
|
+
/**
|
|
3
|
+
* Netcore WhatsApp Business API types.
|
|
4
|
+
*
|
|
5
|
+
* Separate from the email contract: WhatsApp authenticates with a Bearer JWT
|
|
6
|
+
* rather than an `api_key` header, and templates take *positional* variables
|
|
7
|
+
* rather than named merge keys.
|
|
8
|
+
*
|
|
9
|
+
* @see https://netcorecloud.stoplight.io/docs/whatsappapidoc
|
|
10
|
+
*/
|
|
11
|
+
export interface NetcoreWhatsAppConfig {
|
|
12
|
+
/** API host (default: https://cpaaswa.netcorecloud.net). */
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
/** Bearer token issued by Netcore, bound to one WhatsApp business number. */
|
|
15
|
+
apiKey: string;
|
|
16
|
+
/** Request timeout in milliseconds (default: 10000). */
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface WhatsAppTemplateRequest {
|
|
20
|
+
/**
|
|
21
|
+
* Recipient in international format. Digits only — the service strips `+`,
|
|
22
|
+
* spaces and punctuation, so an E.164 value from Shopify is accepted as-is.
|
|
23
|
+
*/
|
|
24
|
+
recipient: string;
|
|
25
|
+
/** Template name as approved by Meta, not the numeric id shown in the panel. */
|
|
26
|
+
templateName: string;
|
|
27
|
+
/**
|
|
28
|
+
* Language the template was approved under, e.g. `en` or `en_GB`. A mismatch
|
|
29
|
+
* is reported as an unknown template rather than a language error.
|
|
30
|
+
*/
|
|
31
|
+
locale: string;
|
|
32
|
+
/**
|
|
33
|
+
* Values for `{{1}}`, `{{2}}`, … in order. Meta rejects the send if any entry
|
|
34
|
+
* is empty, so callers must substitute a fallback rather than pass ''.
|
|
35
|
+
*/
|
|
36
|
+
attributes: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface WhatsAppSendResult {
|
|
39
|
+
messageId: string;
|
|
40
|
+
}
|
|
41
|
+
export interface IWhatsAppService {
|
|
42
|
+
configure(brand: string, config: NetcoreWhatsAppConfig): void;
|
|
43
|
+
isConfigured(): boolean;
|
|
44
|
+
sendTemplate(request: WhatsAppTemplateRequest): Promise<IntegrationResponse<WhatsAppSendResult>>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=netcore-whatsapp.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netcore-whatsapp.types.d.ts","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-whatsapp.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;;;GAQG;AAEH,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC9D,YAAY,IAAI,OAAO,CAAC;IACxB,YAAY,CACV,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;CACrD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netcore-whatsapp.types.js","sourceRoot":"","sources":["../../../src/integrations/engagement/netcore-whatsapp.types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.module.d.ts","sourceRoot":"","sources":["../../src/integrations/integrations.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"integrations.module.d.ts","sourceRoot":"","sources":["../../src/integrations/integrations.module.ts"],"names":[],"mappings":"AA6BA,qBA+Ca,kBAAkB;CAAG"}
|
|
@@ -26,6 +26,7 @@ const azure_blob_service_1 = require("./storage/azure-blob.service");
|
|
|
26
26
|
const shopify_files_service_1 = require("./storage/shopify-files.service");
|
|
27
27
|
// Engagement
|
|
28
28
|
const netcore_email_service_1 = require("./engagement/netcore-email.service");
|
|
29
|
+
const netcore_whatsapp_service_1 = require("./engagement/netcore-whatsapp.service");
|
|
29
30
|
// CacheModule and ConfigModule are @Global() so no import needed
|
|
30
31
|
let IntegrationsModule = class IntegrationsModule {
|
|
31
32
|
};
|
|
@@ -57,6 +58,7 @@ exports.IntegrationsModule = IntegrationsModule = tslib_1.__decorate([
|
|
|
57
58
|
shopify_files_service_1.ShopifyFilesService,
|
|
58
59
|
// Engagement
|
|
59
60
|
netcore_email_service_1.NetcoreEmailService,
|
|
61
|
+
netcore_whatsapp_service_1.NetcoreWhatsAppService,
|
|
60
62
|
],
|
|
61
63
|
exports: [
|
|
62
64
|
integration_factory_1.IntegrationFactory,
|
|
@@ -74,6 +76,7 @@ exports.IntegrationsModule = IntegrationsModule = tslib_1.__decorate([
|
|
|
74
76
|
azure_blob_service_1.AzureBlobService,
|
|
75
77
|
shopify_files_service_1.ShopifyFilesService,
|
|
76
78
|
netcore_email_service_1.NetcoreEmailService,
|
|
79
|
+
netcore_whatsapp_service_1.NetcoreWhatsAppService,
|
|
77
80
|
],
|
|
78
81
|
})
|
|
79
82
|
], IntegrationsModule);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.module.js","sourceRoot":"","sources":["../../src/integrations/integrations.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,+DAA2D;AAC3D,yEAAoE;AAEpE,8BAA8B;AAC9B,gEAAoE;AACpE,4EAAuE;AACvE,kFAA6E;AAC7E,iEAA4D;AAC5D,uDAAmD;AACnD,oBAAoB;AACpB,6EAAwE;AACxE,iFAA4E;AAC5E,SAAS;AACT,0DAAsD;AACtD,8EAAyE;AACzE,UAAU;AACV,+DAA2D;AAC3D,WAAW;AACX,yDAAqD;AACrD,UAAU;AACV,qEAAgE;AAChE,2EAAsE;AACtE,aAAa;AACb,8EAAyE;
|
|
1
|
+
{"version":3,"file":"integrations.module.js","sourceRoot":"","sources":["../../src/integrations/integrations.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,+DAA2D;AAC3D,yEAAoE;AAEpE,8BAA8B;AAC9B,gEAAoE;AACpE,4EAAuE;AACvE,kFAA6E;AAC7E,iEAA4D;AAC5D,uDAAmD;AACnD,oBAAoB;AACpB,6EAAwE;AACxE,iFAA4E;AAC5E,SAAS;AACT,0DAAsD;AACtD,8EAAyE;AACzE,UAAU;AACV,+DAA2D;AAC3D,WAAW;AACX,yDAAqD;AACrD,UAAU;AACV,qEAAgE;AAChE,2EAAsE;AACtE,aAAa;AACb,8EAAyE;AACzE,oFAA+E;AAE/E,iEAAiE;AAiD1D,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAAG,CAAA;AAArB,gDAAkB;6BAAlB,kBAAkB;IA/C9B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,wCAAkB;YAClB,iDAAsB;YACtB,WAAW;YACX,wCAAsB;YACtB,2CAAmB;YACnB,iDAAsB;YACtB,MAAM;YACN,qCAAgB;YAChB,4BAAY;YACZ,UAAU;YACV,6CAAoB;YACpB,iDAAsB;YACtB,SAAS;YACT,4BAAY;YACZ,+CAAqB;YACrB,UAAU;YACV,gCAAc;YACd,WAAW;YACX,4BAAY;YACZ,UAAU;YACV,qCAAgB;YAChB,2CAAmB;YACnB,aAAa;YACb,2CAAmB;YACnB,iDAAsB;SACvB;QACD,OAAO,EAAE;YACP,wCAAkB;YAClB,gEAAgE;YAChE,wCAAsB;YACtB,2CAAmB;YACnB,iDAAsB;YACtB,4BAAY;YACZ,6CAAoB;YACpB,iDAAsB;YACtB,4BAAY;YACZ,+CAAqB;YACrB,gCAAc;YACd,4BAAY;YACZ,qCAAgB;YAChB,2CAAmB;YACnB,2CAAmB;YACnB,iDAAsB;SACvB;KACF,CAAC;GACW,kBAAkB,CAAG"}
|
|
@@ -2,5 +2,7 @@ export * from './order-notification.types';
|
|
|
2
2
|
export * from './order.source';
|
|
3
3
|
export * from './order-email.mapper';
|
|
4
4
|
export * from './order-email.service';
|
|
5
|
+
export * from './order-whatsapp.mapper';
|
|
6
|
+
export * from './order-whatsapp.service';
|
|
5
7
|
export * from './notifications.module';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC"}
|
|
@@ -5,5 +5,7 @@ tslib_1.__exportStar(require("./order-notification.types"), exports);
|
|
|
5
5
|
tslib_1.__exportStar(require("./order.source"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./order-email.mapper"), exports);
|
|
7
7
|
tslib_1.__exportStar(require("./order-email.service"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./order-whatsapp.mapper"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./order-whatsapp.service"), exports);
|
|
8
10
|
tslib_1.__exportStar(require("./notifications.module"), exports);
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":";;;AAAA,qEAA2C;AAC3C,yDAA+B;AAC/B,+DAAqC;AACrC,gEAAsC;AACtC,iEAAuC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":";;;AAAA,qEAA2C;AAC3C,yDAA+B;AAC/B,+DAAqC;AACrC,gEAAsC;AACtC,kEAAwC;AACxC,mEAAyC;AACzC,iEAAuC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Order notifications, shared by every brand.
|
|
3
3
|
*
|
|
4
|
-
* `OrderSource` is channel-neutral, so
|
|
5
|
-
*
|
|
4
|
+
* `OrderSource` is channel-neutral, so the email and WhatsApp senders consume
|
|
5
|
+
* the same snapshot rather than each re-querying Shopify.
|
|
6
6
|
*/
|
|
7
7
|
export declare class NotificationsModule {
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.module.d.ts","sourceRoot":"","sources":["../../src/notifications/notifications.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notifications.module.d.ts","sourceRoot":"","sources":["../../src/notifications/notifications.module.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBAKa,mBAAmB;CAAG"}
|
|
@@ -5,12 +5,13 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const common_1 = require("@nestjs/common");
|
|
6
6
|
const integrations_module_1 = require("../integrations/integrations.module");
|
|
7
7
|
const order_email_service_1 = require("./order-email.service");
|
|
8
|
+
const order_whatsapp_service_1 = require("./order-whatsapp.service");
|
|
8
9
|
const order_source_1 = require("./order.source");
|
|
9
10
|
/**
|
|
10
11
|
* Order notifications, shared by every brand.
|
|
11
12
|
*
|
|
12
|
-
* `OrderSource` is channel-neutral, so
|
|
13
|
-
*
|
|
13
|
+
* `OrderSource` is channel-neutral, so the email and WhatsApp senders consume
|
|
14
|
+
* the same snapshot rather than each re-querying Shopify.
|
|
14
15
|
*/
|
|
15
16
|
let NotificationsModule = class NotificationsModule {
|
|
16
17
|
};
|
|
@@ -18,8 +19,8 @@ exports.NotificationsModule = NotificationsModule;
|
|
|
18
19
|
exports.NotificationsModule = NotificationsModule = tslib_1.__decorate([
|
|
19
20
|
(0, common_1.Module)({
|
|
20
21
|
imports: [integrations_module_1.IntegrationsModule],
|
|
21
|
-
providers: [order_source_1.OrderSource, order_email_service_1.OrderEmailService],
|
|
22
|
-
exports: [order_source_1.OrderSource, order_email_service_1.OrderEmailService],
|
|
22
|
+
providers: [order_source_1.OrderSource, order_email_service_1.OrderEmailService, order_whatsapp_service_1.OrderWhatsAppService],
|
|
23
|
+
exports: [order_source_1.OrderSource, order_email_service_1.OrderEmailService, order_whatsapp_service_1.OrderWhatsAppService],
|
|
23
24
|
})
|
|
24
25
|
], NotificationsModule);
|
|
25
26
|
//# sourceMappingURL=notifications.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.module.js","sourceRoot":"","sources":["../../src/notifications/notifications.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,6EAAyE;AACzE,+DAA0D;AAC1D,iDAA6C;AAE7C;;;;;GAKG;AAMI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAAG,CAAA;AAAtB,kDAAmB;8BAAnB,mBAAmB;IAL/B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,wCAAkB,CAAC;QAC7B,SAAS,EAAE,CAAC,0BAAW,EAAE,uCAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"notifications.module.js","sourceRoot":"","sources":["../../src/notifications/notifications.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,6EAAyE;AACzE,+DAA0D;AAC1D,qEAAgE;AAChE,iDAA6C;AAE7C;;;;;GAKG;AAMI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAAG,CAAA;AAAtB,kDAAmB;8BAAnB,mBAAmB;IAL/B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,wCAAkB,CAAC;QAC7B,SAAS,EAAE,CAAC,0BAAW,EAAE,uCAAiB,EAAE,6CAAoB,CAAC;QACjE,OAAO,EAAE,CAAC,0BAAW,EAAE,uCAAiB,EAAE,6CAAoB,CAAC;KAChE,CAAC;GACW,mBAAmB,CAAG"}
|
|
@@ -3,6 +3,33 @@ import { OrderEmailBranding, OrderEvent } from './order-notification.types';
|
|
|
3
3
|
/** Money as the templates show it, e.g. `Rs. 2,245.00`. */
|
|
4
4
|
export declare const formatMoney: (amount: number, currency: string) => string;
|
|
5
5
|
export declare const escapeHtml: (value: string) => string;
|
|
6
|
+
/**
|
|
7
|
+
* Shopify gateway names are raw and often provider-prefixed — `Gokwik UPI`,
|
|
8
|
+
* `manual`, `ReturnPrime`. `labels` renames them for the customer, who never
|
|
9
|
+
* saw the provider; anything unmapped keeps today's behaviour so a new gateway
|
|
10
|
+
* degrades to its raw name rather than vanishing.
|
|
11
|
+
*
|
|
12
|
+
* Short names are acronyms (UPI, COD, EMI) so they upper-case whole.
|
|
13
|
+
*/
|
|
14
|
+
export declare const prettyGateway: (name: string, labels?: Readonly<Record<string, string>>) => string;
|
|
15
|
+
/**
|
|
16
|
+
* Payment method as the customer should see it.
|
|
17
|
+
*
|
|
18
|
+
* Shopify records a gateway only once a payment is taken, so a COD or unpaid
|
|
19
|
+
* order has none. The checkout provider tags the order with the method, so that
|
|
20
|
+
* is the fallback. Returns '' when neither is available and the caller decides
|
|
21
|
+
* what to show.
|
|
22
|
+
*/
|
|
23
|
+
export declare const REFUND_EVENTS: ReadonlySet<OrderEvent>;
|
|
24
|
+
export declare const resolvePaymentMethod: (order: OrderSnapshot, paymentTags?: readonly string[],
|
|
25
|
+
/**
|
|
26
|
+
* Shown instead of the tag on a refund for a gateway-less (COD) order: the
|
|
27
|
+
* customer paid the courier in cash, so the money cannot go back the way it
|
|
28
|
+
* came and is settled to a bank account instead.
|
|
29
|
+
*/
|
|
30
|
+
codRefundLabel?: string,
|
|
31
|
+
/** Customer-facing renames for raw gateway names. */
|
|
32
|
+
gatewayLabels?: Readonly<Record<string, string>>) => string;
|
|
6
33
|
export declare const renderItemsHtml: (items: OrderSnapshot["items"], currency: string, branding: OrderEmailBranding) => string;
|
|
7
34
|
export declare const renderAddressHtml: (lines: string[]) => string;
|
|
8
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-email.mapper.d.ts","sourceRoot":"","sources":["../../src/notifications/order-email.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+B5E,2DAA2D;AAC3D,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,MAG9D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAKf,CAAC;
|
|
1
|
+
{"version":3,"file":"order-email.mapper.d.ts","sourceRoot":"","sources":["../../src/notifications/order-email.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+B5E,2DAA2D;AAC3D,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,MAG9D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAKf,CAAC;AAE7B;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,SAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,KAC5C,MAQF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,UAAU,CAGhD,CAAC;AAEH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,aAAa,EACpB,cAAa,SAAS,MAAM,EAAO;AACnC;;;;GAIG;AACH,iBAAiB,MAAM;AACvB,qDAAqD;AACrD,gBAAe,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,KACnD,MAaF,CAAC;AA6CF,eAAO,MAAM,eAAe,GAC1B,OAAO,aAAa,CAAC,OAAO,CAAC,EAC7B,UAAU,MAAM,EAChB,UAAU,kBAAkB,KAC3B,MAKE,CAAC;AAEN,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,EAAE,KAAG,MACd,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,UAAU,EACjB,OAAO,aAAa,EACpB,UAAU,kBAAkB,EAC5B,cAAc,MAAM;AACpB,6EAA6E;AAC7E,eAAe,MAAM,KACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CA+CvB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildAttributes = exports.renderAddressHtml = exports.renderItemsHtml = exports.escapeHtml = exports.formatMoney = void 0;
|
|
3
|
+
exports.buildAttributes = exports.renderAddressHtml = exports.renderItemsHtml = exports.resolvePaymentMethod = exports.REFUND_EVENTS = exports.prettyGateway = exports.escapeHtml = exports.formatMoney = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Turns an order into the flat `[%KEY%]` values Netcore substitutes.
|
|
6
6
|
*
|
|
@@ -38,15 +38,60 @@ const escapeHtml = (value) => value
|
|
|
38
38
|
.replace(/>/g, '>')
|
|
39
39
|
.replace(/"/g, '"');
|
|
40
40
|
exports.escapeHtml = escapeHtml;
|
|
41
|
-
/**
|
|
42
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Shopify gateway names are raw and often provider-prefixed — `Gokwik UPI`,
|
|
43
|
+
* `manual`, `ReturnPrime`. `labels` renames them for the customer, who never
|
|
44
|
+
* saw the provider; anything unmapped keeps today's behaviour so a new gateway
|
|
45
|
+
* degrades to its raw name rather than vanishing.
|
|
46
|
+
*
|
|
47
|
+
* Short names are acronyms (UPI, COD, EMI) so they upper-case whole.
|
|
48
|
+
*/
|
|
49
|
+
const prettyGateway = (name, labels = {}) => {
|
|
43
50
|
const trimmed = name.trim();
|
|
44
51
|
if (!trimmed)
|
|
45
52
|
return '';
|
|
53
|
+
const mapped = labels[trimmed.toLowerCase()];
|
|
54
|
+
if (mapped)
|
|
55
|
+
return mapped;
|
|
46
56
|
return trimmed.length <= 4
|
|
47
57
|
? trimmed.toUpperCase()
|
|
48
58
|
: trimmed.charAt(0).toUpperCase() + trimmed.slice(1);
|
|
49
59
|
};
|
|
60
|
+
exports.prettyGateway = prettyGateway;
|
|
61
|
+
/**
|
|
62
|
+
* Payment method as the customer should see it.
|
|
63
|
+
*
|
|
64
|
+
* Shopify records a gateway only once a payment is taken, so a COD or unpaid
|
|
65
|
+
* order has none. The checkout provider tags the order with the method, so that
|
|
66
|
+
* is the fallback. Returns '' when neither is available and the caller decides
|
|
67
|
+
* what to show.
|
|
68
|
+
*/
|
|
69
|
+
exports.REFUND_EVENTS = new Set([
|
|
70
|
+
'refund_initiated',
|
|
71
|
+
'refund_complete',
|
|
72
|
+
]);
|
|
73
|
+
const resolvePaymentMethod = (order, paymentTags = [],
|
|
74
|
+
/**
|
|
75
|
+
* Shown instead of the tag on a refund for a gateway-less (COD) order: the
|
|
76
|
+
* customer paid the courier in cash, so the money cannot go back the way it
|
|
77
|
+
* came and is settled to a bank account instead.
|
|
78
|
+
*/
|
|
79
|
+
codRefundLabel,
|
|
80
|
+
/** Customer-facing renames for raw gateway names. */
|
|
81
|
+
gatewayLabels = {}) => {
|
|
82
|
+
const gateways = order.paymentMethod
|
|
83
|
+
.split(',')
|
|
84
|
+
.map((name) => (0, exports.prettyGateway)(name, gatewayLabels))
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.join(', ');
|
|
87
|
+
if (gateways)
|
|
88
|
+
return gateways;
|
|
89
|
+
if (codRefundLabel)
|
|
90
|
+
return codRefundLabel;
|
|
91
|
+
const known = paymentTags.map((tag) => tag.toLowerCase());
|
|
92
|
+
return (order.tags.find((tag) => known.includes(tag.trim().toLowerCase())) ?? '');
|
|
93
|
+
};
|
|
94
|
+
exports.resolvePaymentMethod = resolvePaymentMethod;
|
|
50
95
|
const specRow = (label, value, { fontFamily, textColor }) => {
|
|
51
96
|
const cell = `font-family:${fontFamily}; font-size:15px; line-height:26px; color:${textColor};`;
|
|
52
97
|
return `<tr>
|
|
@@ -114,16 +159,15 @@ refundAmount) => {
|
|
|
114
159
|
REFUND_AMOUNT: refundAmount === undefined ? '' : money(refundAmount),
|
|
115
160
|
BILLING_ADDRESS_HTML: (0, exports.renderAddressHtml)(order.billingAddress),
|
|
116
161
|
SHIPPING_ADDRESS_HTML: (0, exports.renderAddressHtml)(order.shippingAddress),
|
|
117
|
-
PAYMENT_METHOD: order.
|
|
118
|
-
.split(',')
|
|
119
|
-
.map(prettyGateway)
|
|
120
|
-
.filter(Boolean)
|
|
121
|
-
.join(', '),
|
|
162
|
+
PAYMENT_METHOD: (0, exports.resolvePaymentMethod)(order, branding.paymentTags, exports.REFUND_EVENTS.has(event) ? branding.codRefundLabel : undefined, branding.gatewayLabels),
|
|
122
163
|
SHIPPING_METHOD: order.shippingMethod,
|
|
123
164
|
SUPPORT_PHONE: branding.supportPhone,
|
|
124
165
|
SUPPORT_EMAIL: branding.supportEmail,
|
|
125
166
|
};
|
|
126
|
-
|
|
167
|
+
// Email keeps its tracking link on the packed event: Shopify assigns the
|
|
168
|
+
// tracking number when the fulfillment is created, and the shipped email has
|
|
169
|
+
// always gone out at that moment.
|
|
170
|
+
if (event === 'order_packed' || event === 'order_shipped') {
|
|
127
171
|
// A carrier Shopify doesn't recognise yields a tracking number with no URL,
|
|
128
172
|
// which would render the button pointing nowhere. Fall back to the order
|
|
129
173
|
// status page so it always goes somewhere useful.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-email.mapper.js","sourceRoot":"","sources":["../../src/notifications/order-email.mapper.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;GAQG;AAEH,iFAAiF;AACjF,MAAM,eAAe,GAA2B,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAE/D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;AAExD,yEAAyE;AACzE,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAqB,EAAE;IAC3D,MAAM,MAAM,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACtD,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACxC,qBAAqB,EAAE,CAAC;YACxB,qBAAqB,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,2DAA2D;AACpD,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAU,EAAE;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAHW,QAAA,WAAW,eAGtB;AAEK,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAClD,KAAK;KACF,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;KACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AALhB,QAAA,UAAU,cAKM;AAE7B
|
|
1
|
+
{"version":3,"file":"order-email.mapper.js","sourceRoot":"","sources":["../../src/notifications/order-email.mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-email.service.d.ts","sourceRoot":"","sources":["../../src/notifications/order-email.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAEvF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAEL,gBAAgB,EAChB,UAAU,EAGX,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"order-email.service.d.ts","sourceRoot":"","sources":["../../src/notifications/order-email.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAEvF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAEL,gBAAgB,EAChB,UAAU,EAGX,MAAM,4BAA4B,CAAC;AAsBpC;;;;;;;;GAQG;AACH,qBACa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW;IAGhC,IAAI,CACR,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAsE5B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAmCrB,iFAAiF;IACjF,OAAO,CAAC,iBAAiB;CA8B1B"}
|
|
@@ -106,6 +106,9 @@ let OrderEmailService = class OrderEmailService {
|
|
|
106
106
|
fontFamily: options.fontFamily ?? '',
|
|
107
107
|
textColor: options.textColor ?? '',
|
|
108
108
|
discountLabel: options.discountLabel ?? '',
|
|
109
|
+
paymentTags: options.paymentTags ?? [],
|
|
110
|
+
codRefundLabel: options.codRefundLabel ?? '',
|
|
111
|
+
gatewayLabels: options.gatewayLabels ?? {},
|
|
109
112
|
labels: {
|
|
110
113
|
size: labels?.size ?? '',
|
|
111
114
|
colour: labels?.colour ?? '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-email.service.js","sourceRoot":"","sources":["../../src/notifications/order-email.service.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAC5C,6CAA0C;AAC1C,6DAAyD;AACzD,4FAAuF;AACvF,6DAAuD;AACvD,iDAA6C;
|
|
1
|
+
{"version":3,"file":"order-email.service.js","sourceRoot":"","sources":["../../src/notifications/order-email.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* The event list is channel-neutral: email, WhatsApp and SMS all react to the
|
|
5
5
|
* same order lifecycle. Only the per-channel send settings differ.
|
|
6
6
|
*/
|
|
7
|
-
export declare const ORDER_EVENTS: readonly ["order_confirmed", "order_shipped", "order_delivered", "order_cancelled", "return_initiated", "return_complete", "refund_initiated", "refund_complete"];
|
|
7
|
+
export declare const ORDER_EVENTS: readonly ["order_confirmed", "order_packed", "order_shipped", "order_delivered", "order_cancelled", "order_cancelled_by_seller", "return_initiated", "return_complete", "return_approved", "return_rejected", "refund_initiated", "refund_complete"];
|
|
8
8
|
export type OrderEvent = (typeof ORDER_EVENTS)[number];
|
|
9
9
|
/**
|
|
10
10
|
* Per-event email settings, read from the brand's
|
|
@@ -27,6 +27,12 @@ export interface OrderItemLabels {
|
|
|
27
27
|
}
|
|
28
28
|
/** Brand presentation values for the parts rendered in code. */
|
|
29
29
|
export interface OrderEmailBranding {
|
|
30
|
+
/** Order tags naming a payment method, e.g. `COD`, used when Shopify has no gateway. */
|
|
31
|
+
paymentTags?: string[];
|
|
32
|
+
/** Refund wording for COD orders, e.g. "Bank Transfer". */
|
|
33
|
+
codRefundLabel?: string;
|
|
34
|
+
/** Customer-facing renames for raw Shopify gateway names, keyed lower-case. */
|
|
35
|
+
gatewayLabels?: Record<string, string>;
|
|
30
36
|
logoUrl: string;
|
|
31
37
|
supportPhone: string;
|
|
32
38
|
supportEmail: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-notification.types.d.ts","sourceRoot":"","sources":["../../src/notifications/order-notification.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"order-notification.types.d.ts","sourceRoot":"","sources":["../../src/notifications/order-notification.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,YAAY,sPAaf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC"}
|
|
@@ -9,11 +9,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.ORDER_EVENTS = void 0;
|
|
10
10
|
exports.ORDER_EVENTS = [
|
|
11
11
|
'order_confirmed',
|
|
12
|
+
'order_packed',
|
|
12
13
|
'order_shipped',
|
|
13
14
|
'order_delivered',
|
|
14
15
|
'order_cancelled',
|
|
16
|
+
'order_cancelled_by_seller',
|
|
15
17
|
'return_initiated',
|
|
16
18
|
'return_complete',
|
|
19
|
+
'return_approved',
|
|
20
|
+
'return_rejected',
|
|
17
21
|
'refund_initiated',
|
|
18
22
|
'refund_complete',
|
|
19
23
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-notification.types.js","sourceRoot":"","sources":["../../src/notifications/order-notification.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,YAAY,GAAG;IAC1B,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;CACT,CAAC"}
|
|
1
|
+
{"version":3,"file":"order-notification.types.js","sourceRoot":"","sources":["../../src/notifications/order-notification.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,YAAY,GAAG;IAC1B,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,2BAA2B;IAC3B,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;CACT,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { OrderSnapshot } from './order.source';
|
|
2
|
+
import { OrderEvent } from './order-notification.types';
|
|
3
|
+
/**
|
|
4
|
+
* Values a WhatsApp template variable can be filled from. The brand config
|
|
5
|
+
* lists these in template order, so `{{1}}`, `{{2}}` … are declared as data
|
|
6
|
+
* rather than hardcoded per event.
|
|
7
|
+
*/
|
|
8
|
+
export type WhatsAppField = 'customerName' | 'orderNumber' | 'products' | 'paymentMethod' | 'trackingUrl' | 'amount' | 'refundTimeframe' | 'expectedDelivery' | 'declineReason' | 'supportPhone' | 'supportEmail';
|
|
9
|
+
export interface OrderWhatsAppBranding {
|
|
10
|
+
/**
|
|
11
|
+
* Order tags that name a payment method, e.g. `COD`. Used only when Shopify
|
|
12
|
+
* records no gateway — the checkout provider tags the order even when the
|
|
13
|
+
* payment itself has not been captured.
|
|
14
|
+
*/
|
|
15
|
+
paymentTags?: string[];
|
|
16
|
+
/** Refund wording for a COD order, e.g. "Bank Transfer". */
|
|
17
|
+
codRefundLabel: string;
|
|
18
|
+
/**
|
|
19
|
+
* Customer-facing wording for Shopify's three decline reasons, keyed
|
|
20
|
+
* lower-case (`return_period_ended`, `final_sale`, `other`). The raw enum
|
|
21
|
+
* would read as machine output in a message.
|
|
22
|
+
*/
|
|
23
|
+
declineReasons: Readonly<Record<string, string>>;
|
|
24
|
+
/** Customer-facing renames for raw Shopify gateway names, keyed lower-case. */
|
|
25
|
+
gatewayLabels: Readonly<Record<string, string>>;
|
|
26
|
+
supportPhone: string;
|
|
27
|
+
supportEmail: string;
|
|
28
|
+
/** Copy for "your refund will reflect within …". Business wording, not order data. */
|
|
29
|
+
refundTimeframe: string;
|
|
30
|
+
/**
|
|
31
|
+
* Substituted when a value resolves empty. WhatsApp rejects a send with a
|
|
32
|
+
* blank variable, so every field that can be absent needs one.
|
|
33
|
+
*/
|
|
34
|
+
fallbacks: Partial<Record<WhatsAppField, string>>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* One line describing every item, comma-joined.
|
|
38
|
+
*
|
|
39
|
+
* WhatsApp variables cannot contain newlines or tabs, so the email layout's
|
|
40
|
+
* per-item table collapses to `Title (Size/Colour) x2`. A long order is
|
|
41
|
+
* truncated rather than risking Meta's length limit.
|
|
42
|
+
*/
|
|
43
|
+
export declare const renderProducts: (items: OrderSnapshot["items"]) => string;
|
|
44
|
+
export declare const formatEdd: (note: string | null) => string;
|
|
45
|
+
/**
|
|
46
|
+
* Build the positional `attributes` array for one template.
|
|
47
|
+
*
|
|
48
|
+
* `fields` comes from brand config and must match the approved template's
|
|
49
|
+
* variable order. Any value that resolves empty takes its configured fallback,
|
|
50
|
+
* because WhatsApp rejects the whole send on a blank variable.
|
|
51
|
+
*/
|
|
52
|
+
export declare const buildWhatsAppAttributes: (fields: readonly WhatsAppField[], event: OrderEvent, order: OrderSnapshot, branding: OrderWhatsAppBranding, trackingUrl?: string, refundAmount?: number, declineReason?: string) => string[];
|
|
53
|
+
//# sourceMappingURL=order-whatsapp.mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-whatsapp.mapper.d.ts","sourceRoot":"","sources":["../../src/notifications/order-whatsapp.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,aAAa,GACb,UAAU,GACV,eAAe,GACf,aAAa,GACb,QAAQ,GACR,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,GACf,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,+EAA+E;IAC/E,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD;AAKD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,aAAa,CAAC,OAAO,CAAC,KAAG,MAuB9D,CAAC;AAmBF,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,GAAG,IAAI,KAAG,MAO/C,CAAC;AAmDF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,aAAa,EAAE,EAChC,OAAO,UAAU,EACjB,OAAO,aAAa,EACpB,UAAU,qBAAqB,EAC/B,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,gBAAgB,MAAM,KACrB,MAAM,EAML,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildWhatsAppAttributes = exports.formatEdd = exports.renderProducts = void 0;
|
|
4
|
+
const order_email_mapper_1 = require("./order-email.mapper");
|
|
5
|
+
/** Max characters for the joined product list before it is summarised. */
|
|
6
|
+
const PRODUCTS_MAX_LENGTH = 700;
|
|
7
|
+
/**
|
|
8
|
+
* One line describing every item, comma-joined.
|
|
9
|
+
*
|
|
10
|
+
* WhatsApp variables cannot contain newlines or tabs, so the email layout's
|
|
11
|
+
* per-item table collapses to `Title (Size/Colour) x2`. A long order is
|
|
12
|
+
* truncated rather than risking Meta's length limit.
|
|
13
|
+
*/
|
|
14
|
+
const renderProducts = (items) => {
|
|
15
|
+
const parts = items.map((item) => {
|
|
16
|
+
const variant = [item.size, item.colour].filter(Boolean).join('/');
|
|
17
|
+
// Quantity is always shown, including x1: on a refund message the customer
|
|
18
|
+
// needs to tell one unit from three, and an absent qty reads as ambiguous.
|
|
19
|
+
return `${item.title}${variant ? ` (${variant})` : ''} x${item.quantity}`;
|
|
20
|
+
});
|
|
21
|
+
const joined = parts.join(', ');
|
|
22
|
+
if (joined.length <= PRODUCTS_MAX_LENGTH)
|
|
23
|
+
return joined;
|
|
24
|
+
// Keep whole item names: drop from the end until the remainder plus the
|
|
25
|
+
// "and N more" suffix fits.
|
|
26
|
+
const kept = [];
|
|
27
|
+
let length = 0;
|
|
28
|
+
for (const part of parts) {
|
|
29
|
+
const suffix = ` and ${parts.length - kept.length - 1} more`;
|
|
30
|
+
if (length + part.length + 2 + suffix.length > PRODUCTS_MAX_LENGTH)
|
|
31
|
+
break;
|
|
32
|
+
kept.push(part);
|
|
33
|
+
length += part.length + 2;
|
|
34
|
+
}
|
|
35
|
+
const remaining = parts.length - kept.length;
|
|
36
|
+
return remaining > 0 ? `${kept.join(', ')} and ${remaining} more` : kept.join(', ');
|
|
37
|
+
};
|
|
38
|
+
exports.renderProducts = renderProducts;
|
|
39
|
+
/** Collapse whitespace: WhatsApp rejects newlines, tabs and long space runs. */
|
|
40
|
+
const flatten = (value) => value.replace(/\s+/g, ' ').trim();
|
|
41
|
+
/**
|
|
42
|
+
* Resolve one template variable. Returns '' when there is no value, so the
|
|
43
|
+
* caller can apply the fallback and keep that decision in one place.
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* Pull the estimated delivery date out of the order note.
|
|
47
|
+
*
|
|
48
|
+
* The checkout provider writes `EDD: 26-09-2026` (day first). Returns '' when
|
|
49
|
+
* absent or unparseable, so the caller's fallback applies rather than showing
|
|
50
|
+
* a half-parsed date.
|
|
51
|
+
*/
|
|
52
|
+
const EDD_PATTERN = /EDD:\s*(\d{1,2})-(\d{1,2})-(\d{4})/i;
|
|
53
|
+
const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
54
|
+
const formatEdd = (note) => {
|
|
55
|
+
const match = note?.match(EDD_PATTERN);
|
|
56
|
+
if (!match)
|
|
57
|
+
return '';
|
|
58
|
+
const [, day, month, year] = match;
|
|
59
|
+
const monthName = MONTHS[Number(month) - 1];
|
|
60
|
+
if (!monthName)
|
|
61
|
+
return '';
|
|
62
|
+
return `${Number(day)} ${monthName} ${year}`;
|
|
63
|
+
};
|
|
64
|
+
exports.formatEdd = formatEdd;
|
|
65
|
+
const resolve = (field, event, order, branding, trackingUrl, refundAmount, declineReason) => {
|
|
66
|
+
switch (field) {
|
|
67
|
+
case 'customerName':
|
|
68
|
+
return order.customerName;
|
|
69
|
+
case 'orderNumber':
|
|
70
|
+
return order.orderNumber;
|
|
71
|
+
case 'products':
|
|
72
|
+
return (0, exports.renderProducts)(order.items);
|
|
73
|
+
case 'paymentMethod':
|
|
74
|
+
return (0, order_email_mapper_1.resolvePaymentMethod)(order, branding.paymentTags, order_email_mapper_1.REFUND_EVENTS.has(event) ? branding.codRefundLabel : undefined, branding.gatewayLabels);
|
|
75
|
+
case 'trackingUrl':
|
|
76
|
+
// Same three-level fallback as email: the parcel's link, the order's, then
|
|
77
|
+
// Shopify's order-status page.
|
|
78
|
+
return trackingUrl ?? order.trackingUrl ?? order.orderStatusUrl ?? '';
|
|
79
|
+
case 'amount':
|
|
80
|
+
return refundAmount === undefined
|
|
81
|
+
? ''
|
|
82
|
+
: (0, order_email_mapper_1.formatMoney)(refundAmount, order.currency);
|
|
83
|
+
case 'refundTimeframe':
|
|
84
|
+
return branding.refundTimeframe;
|
|
85
|
+
case 'expectedDelivery':
|
|
86
|
+
return (0, exports.formatEdd)(order.note);
|
|
87
|
+
case 'declineReason':
|
|
88
|
+
// Shopify sends an enum (`final_sale`); unmapped values resolve empty so
|
|
89
|
+
// the caller's fallback applies rather than machine wording reaching a
|
|
90
|
+
// customer.
|
|
91
|
+
return branding.declineReasons[(declineReason ?? '').toLowerCase()] ?? '';
|
|
92
|
+
case 'supportPhone':
|
|
93
|
+
return branding.supportPhone;
|
|
94
|
+
case 'supportEmail':
|
|
95
|
+
return branding.supportEmail;
|
|
96
|
+
default:
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Build the positional `attributes` array for one template.
|
|
102
|
+
*
|
|
103
|
+
* `fields` comes from brand config and must match the approved template's
|
|
104
|
+
* variable order. Any value that resolves empty takes its configured fallback,
|
|
105
|
+
* because WhatsApp rejects the whole send on a blank variable.
|
|
106
|
+
*/
|
|
107
|
+
const buildWhatsAppAttributes = (fields, event, order, branding, trackingUrl, refundAmount, declineReason) => fields.map((field) => {
|
|
108
|
+
const value = flatten(resolve(field, event, order, branding, trackingUrl, refundAmount, declineReason));
|
|
109
|
+
return value || flatten(branding.fallbacks[field] ?? '');
|
|
110
|
+
});
|
|
111
|
+
exports.buildWhatsAppAttributes = buildWhatsAppAttributes;
|
|
112
|
+
//# sourceMappingURL=order-whatsapp.mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-whatsapp.mapper.js","sourceRoot":"","sources":["../../src/notifications/order-whatsapp.mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ConfigService } from '../config/config.service';
|
|
2
|
+
import { NetcoreWhatsAppService } from '../integrations/engagement/netcore-whatsapp.service';
|
|
3
|
+
import { OrderSource } from './order.source';
|
|
4
|
+
import { OrderEmailResult, OrderEvent } from './order-notification.types';
|
|
5
|
+
/**
|
|
6
|
+
* Sends one order lifecycle WhatsApp message for any brand.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors `OrderEmailService` and reuses the same `OrderSource` snapshot, so a
|
|
9
|
+
* brand adds WhatsApp with configuration rather than code.
|
|
10
|
+
*
|
|
11
|
+
* Two behaviours differ from email deliberately:
|
|
12
|
+
*
|
|
13
|
+
* - An order with no phone number is skipped, not failed. Email always has an
|
|
14
|
+
* address; a phone is optional on a Shopify order.
|
|
15
|
+
* - The variable order lives in config, because an approved template cannot be
|
|
16
|
+
* reordered without Meta re-approving it.
|
|
17
|
+
*/
|
|
18
|
+
export declare class OrderWhatsAppService {
|
|
19
|
+
private readonly configService;
|
|
20
|
+
private readonly whatsapp;
|
|
21
|
+
private readonly source;
|
|
22
|
+
constructor(configService: ConfigService, whatsapp: NetcoreWhatsAppService, source: OrderSource);
|
|
23
|
+
send(brand: string, event: OrderEvent, orderId: string | number, trackingUrl?: string, refundAmount?: number,
|
|
24
|
+
/** Shopify's decline enum, for the return-rejected message. */
|
|
25
|
+
declineReason?: string): Promise<OrderEmailResult>;
|
|
26
|
+
private buildBranding;
|
|
27
|
+
private configureProvider;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=order-whatsapp.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-whatsapp.service.d.ts","sourceRoot":"","sources":["../../src/notifications/order-whatsapp.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAM7F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA0B1E;;;;;;;;;;;;GAYG;AACH,qBACa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,WAAW;IAGhC,IAAI,CACR,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM;IACrB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,gBAAgB,CAAC;IAiE5B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,iBAAiB;CAmB1B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OrderWhatsAppService = 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 netcore_whatsapp_service_1 = require("../integrations/engagement/netcore-whatsapp.service");
|
|
9
|
+
const order_whatsapp_mapper_1 = require("./order-whatsapp.mapper");
|
|
10
|
+
const order_source_1 = require("./order.source");
|
|
11
|
+
/**
|
|
12
|
+
* Sends one order lifecycle WhatsApp message for any brand.
|
|
13
|
+
*
|
|
14
|
+
* Mirrors `OrderEmailService` and reuses the same `OrderSource` snapshot, so a
|
|
15
|
+
* brand adds WhatsApp with configuration rather than code.
|
|
16
|
+
*
|
|
17
|
+
* Two behaviours differ from email deliberately:
|
|
18
|
+
*
|
|
19
|
+
* - An order with no phone number is skipped, not failed. Email always has an
|
|
20
|
+
* address; a phone is optional on a Shopify order.
|
|
21
|
+
* - The variable order lives in config, because an approved template cannot be
|
|
22
|
+
* reordered without Meta re-approving it.
|
|
23
|
+
*/
|
|
24
|
+
let OrderWhatsAppService = class OrderWhatsAppService {
|
|
25
|
+
configService;
|
|
26
|
+
whatsapp;
|
|
27
|
+
source;
|
|
28
|
+
constructor(configService, whatsapp, source) {
|
|
29
|
+
this.configService = configService;
|
|
30
|
+
this.whatsapp = whatsapp;
|
|
31
|
+
this.source = source;
|
|
32
|
+
}
|
|
33
|
+
async send(brand, event, orderId, trackingUrl, refundAmount,
|
|
34
|
+
/** Shopify's decline enum, for the return-rejected message. */
|
|
35
|
+
declineReason) {
|
|
36
|
+
const options = this.configureProvider(brand);
|
|
37
|
+
if (!options)
|
|
38
|
+
return 'skipped';
|
|
39
|
+
const eventConfig = options.events?.[event];
|
|
40
|
+
if (!eventConfig?.templateName) {
|
|
41
|
+
logger_1.logger.warn('No WhatsApp template configured for order event - skipping', {
|
|
42
|
+
brand,
|
|
43
|
+
event,
|
|
44
|
+
});
|
|
45
|
+
return 'skipped';
|
|
46
|
+
}
|
|
47
|
+
const order = await this.source.load(brand, orderId);
|
|
48
|
+
if (!order)
|
|
49
|
+
return 'failed';
|
|
50
|
+
if (!order.phone) {
|
|
51
|
+
logger_1.logger.warn('Order has no phone number - skipping WhatsApp', {
|
|
52
|
+
brand,
|
|
53
|
+
event,
|
|
54
|
+
orderId,
|
|
55
|
+
});
|
|
56
|
+
return 'skipped';
|
|
57
|
+
}
|
|
58
|
+
const branding = this.buildBranding(brand, options);
|
|
59
|
+
const attributes = (0, order_whatsapp_mapper_1.buildWhatsAppAttributes)(eventConfig.attributes ?? [], event, order, branding, trackingUrl, refundAmount, declineReason);
|
|
60
|
+
const result = await this.whatsapp.sendTemplate({
|
|
61
|
+
recipient: order.phone,
|
|
62
|
+
templateName: eventConfig.templateName,
|
|
63
|
+
locale: eventConfig.locale ?? options.defaultLocale ?? 'en',
|
|
64
|
+
attributes,
|
|
65
|
+
});
|
|
66
|
+
if (!result.success) {
|
|
67
|
+
logger_1.logger.error('Failed to send order WhatsApp message', {
|
|
68
|
+
brand,
|
|
69
|
+
event,
|
|
70
|
+
orderId,
|
|
71
|
+
template: eventConfig.templateName,
|
|
72
|
+
errorCode: result.error?.code,
|
|
73
|
+
errorMessage: result.error?.message,
|
|
74
|
+
});
|
|
75
|
+
return 'failed';
|
|
76
|
+
}
|
|
77
|
+
logger_1.logger.info('Order WhatsApp message sent', {
|
|
78
|
+
brand,
|
|
79
|
+
event,
|
|
80
|
+
orderId,
|
|
81
|
+
template: eventConfig.templateName,
|
|
82
|
+
messageId: result.data?.messageId,
|
|
83
|
+
});
|
|
84
|
+
return 'sent';
|
|
85
|
+
}
|
|
86
|
+
buildBranding(brand, options) {
|
|
87
|
+
const missing = ['supportPhone', 'supportEmail', 'refundTimeframe']
|
|
88
|
+
.filter((key) => !options[key]);
|
|
89
|
+
if (missing.length) {
|
|
90
|
+
logger_1.logger.warn('Brand WhatsApp config is missing presentation values', {
|
|
91
|
+
brand,
|
|
92
|
+
missing,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
supportPhone: options.supportPhone ?? '',
|
|
97
|
+
supportEmail: options.supportEmail ?? '',
|
|
98
|
+
refundTimeframe: options.refundTimeframe ?? '',
|
|
99
|
+
paymentTags: options.paymentTags ?? [],
|
|
100
|
+
codRefundLabel: options.codRefundLabel ?? '',
|
|
101
|
+
gatewayLabels: options.gatewayLabels ?? {},
|
|
102
|
+
declineReasons: options.declineReasons ?? {},
|
|
103
|
+
fallbacks: options.fallbacks ?? {},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
configureProvider(brand) {
|
|
107
|
+
const whatsapp = this.configService.getBrand(brand)?.integrations?.whatsapp;
|
|
108
|
+
if (!whatsapp?.apiKey) {
|
|
109
|
+
logger_1.logger.warn('WhatsApp integration not configured - skipping message', {
|
|
110
|
+
brand,
|
|
111
|
+
});
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
if (!this.whatsapp.isConfigured()) {
|
|
115
|
+
this.whatsapp.configure(brand, {
|
|
116
|
+
baseUrl: whatsapp.baseUrl,
|
|
117
|
+
apiKey: whatsapp.apiKey,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return (whatsapp.options ?? {});
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
exports.OrderWhatsAppService = OrderWhatsAppService;
|
|
124
|
+
exports.OrderWhatsAppService = OrderWhatsAppService = tslib_1.__decorate([
|
|
125
|
+
(0, common_1.Injectable)(),
|
|
126
|
+
tslib_1.__metadata("design:paramtypes", [config_service_1.ConfigService,
|
|
127
|
+
netcore_whatsapp_service_1.NetcoreWhatsAppService,
|
|
128
|
+
order_source_1.OrderSource])
|
|
129
|
+
], OrderWhatsAppService);
|
|
130
|
+
//# sourceMappingURL=order-whatsapp.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-whatsapp.service.js","sourceRoot":"","sources":["../../src/notifications/order-whatsapp.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,17 @@ export interface OrderSnapshot {
|
|
|
19
19
|
billingAddress: string[];
|
|
20
20
|
shippingAddress: string[];
|
|
21
21
|
paymentMethod: string;
|
|
22
|
+
/**
|
|
23
|
+
* Order tags. The checkout provider records the payment method here (e.g.
|
|
24
|
+
* `COD`), which is the only signal when Shopify has no gateway on the order.
|
|
25
|
+
*/
|
|
26
|
+
tags: string[];
|
|
27
|
+
/**
|
|
28
|
+
* Free-text order note. The checkout provider writes the estimated delivery
|
|
29
|
+
* date here as `EDD: DD-MM-YYYY`; Shopify's own `estimatedDeliveryAt` is
|
|
30
|
+
* never populated on this store.
|
|
31
|
+
*/
|
|
32
|
+
note: string | null;
|
|
22
33
|
shippingMethod: string;
|
|
23
34
|
trackingUrl: string | null;
|
|
24
35
|
/** Shopify's order-status page — the fallback when a parcel has no tracking link. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.source.d.ts","sourceRoot":"","sources":["../../src/notifications/order.source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"order.source.d.ts","sourceRoot":"","sources":["../../src/notifications/order.source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAoErF,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,kGAAkG;IAClG,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;OAIG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qFAAqF;IACrF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,KAAK,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC,CAAC;CACJ;AA0ED,qBACa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,mBAAmB;gBAAnB,mBAAmB,EAAE,mBAAmB;IAErE;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA4ClF,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,UAAU;CA4CnB"}
|
|
@@ -22,6 +22,8 @@ const ORDER_QUERY = `
|
|
|
22
22
|
shippingAddress { address1 address2 city province zip country phone }
|
|
23
23
|
shippingLine { title }
|
|
24
24
|
paymentGatewayNames
|
|
25
|
+
tags
|
|
26
|
+
note
|
|
25
27
|
lineItems(first: 50) {
|
|
26
28
|
edges {
|
|
27
29
|
node {
|
|
@@ -142,6 +144,8 @@ let OrderSource = class OrderSource {
|
|
|
142
144
|
billingAddress: formatAddress(order.billingAddress),
|
|
143
145
|
shippingAddress: formatAddress(order.shippingAddress),
|
|
144
146
|
paymentMethod: (order.paymentGatewayNames ?? []).join(', '),
|
|
147
|
+
tags: order.tags ?? [],
|
|
148
|
+
note: order.note ?? null,
|
|
145
149
|
shippingMethod: order.shippingLine?.title?.trim() ?? '',
|
|
146
150
|
trackingUrl,
|
|
147
151
|
orderStatusUrl: order.statusPageUrl ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.source.js","sourceRoot":"","sources":["../../src/notifications/order.source.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAC5C,6CAA0C;AAC1C,0FAAqF;
|
|
1
|
+
{"version":3,"file":"order.source.js","sourceRoot":"","sources":["../../src/notifications/order.source.ts"],"names":[],"mappings":"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"}
|