medusajs-documents-plugin 0.0.0-stage → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +2427 -0
- package/.medusa/server/src/admin/index.mjs +2428 -0
- package/.medusa/server/src/api/admin/documents/[id]/document/route.js +36 -0
- package/.medusa/server/src/api/admin/documents/[id]/send/route.js +41 -0
- package/.medusa/server/src/api/admin/documents/[id]/sync-zoho/route.js +68 -0
- package/.medusa/server/src/api/admin/documents/custom/route.js +48 -0
- package/.medusa/server/src/api/admin/documents/manual/route.js +46 -0
- package/.medusa/server/src/api/admin/documents/route.js +36 -0
- package/.medusa/server/src/api/admin/documents/settings/route.js +44 -0
- package/.medusa/server/src/api/admin/documents/templates/preview/route.js +159 -0
- package/.medusa/server/src/api/admin/documents/zoho/list/route.js +51 -0
- package/.medusa/server/src/api/documents/[id]/document/route.js +36 -0
- package/.medusa/server/src/api/documents/r/[code]/route.js +29 -0
- package/.medusa/server/src/api/documents/templates/preview/route.js +159 -0
- package/.medusa/server/src/api/store/documents/r/[code]/route.js +22 -0
- package/.medusa/server/src/index.js +27 -0
- package/.medusa/server/src/modules/documents/index.js +13 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20261012164601.js +23 -0
- package/.medusa/server/src/modules/documents/migrations/Migration20261014150000.js +20 -0
- package/.medusa/server/src/modules/documents/models/document-link.js +12 -0
- package/.medusa/server/src/modules/documents/models/document-record.js +33 -0
- package/.medusa/server/src/modules/documents/models/document-settings.js +61 -0
- package/.medusa/server/src/modules/documents/service.js +456 -0
- package/.medusa/server/src/services/notification-sender.js +293 -0
- package/.medusa/server/src/services/pdf-post-processor.js +64 -0
- package/.medusa/server/src/services/pdfkit-generator.js +438 -0
- package/.medusa/server/src/services/zoho-books.js +221 -0
- package/.medusa/server/src/subscribers/order-documents.js +178 -0
- package/.medusa/server/src/subscribers/repair-documents.js +162 -0
- package/.medusa/server/src/utils/integrate.js +37 -0
- package/.medusa/server/src/utils/payment-link.js +69 -0
- package/.medusa/server/src/workflows/create-manual-document.js +27 -0
- package/.medusa/server/src/workflows/generate-document.js +24 -0
- package/.medusa/server/src/workflows/index.js +20 -0
- package/.medusa/server/src/workflows/send-document-notification.js +41 -0
- package/CHANGELOG.md +87 -0
- package/LICENSE +21 -0
- package/README.md +201 -2
- package/package.json +86 -4
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZohoBooksService = void 0;
|
|
4
|
+
class ZohoBooksService {
|
|
5
|
+
constructor(config, logger) {
|
|
6
|
+
this.access_token = null;
|
|
7
|
+
this.token_expires_at = 0;
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
get baseAccountsUrl() {
|
|
12
|
+
return `https://accounts.zoho.${this.config.domain || "com"}`;
|
|
13
|
+
}
|
|
14
|
+
get baseApiUrl() {
|
|
15
|
+
return `https://www.zohoapis.${this.config.domain || "com"}/books/v3`;
|
|
16
|
+
}
|
|
17
|
+
async getAccessToken() {
|
|
18
|
+
if (this.access_token && Date.now() < this.token_expires_at) {
|
|
19
|
+
return this.access_token;
|
|
20
|
+
}
|
|
21
|
+
this.logger?.info(`[Zoho Books] Refreshing access token...`);
|
|
22
|
+
const params = new URLSearchParams();
|
|
23
|
+
params.append("refresh_token", this.config.refresh_token);
|
|
24
|
+
params.append("client_id", this.config.client_id);
|
|
25
|
+
params.append("client_secret", this.config.client_secret);
|
|
26
|
+
params.append("grant_type", "refresh_token");
|
|
27
|
+
const response = await fetch(`${this.baseAccountsUrl}/oauth/v2/token`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
body: params,
|
|
30
|
+
});
|
|
31
|
+
const data = await response.json();
|
|
32
|
+
if (!response.ok || data.error) {
|
|
33
|
+
this.logger?.error(`[Zoho Books] Failed to refresh token: ${JSON.stringify(data)}`);
|
|
34
|
+
throw new Error(`Zoho authentication failed: ${data.error || response.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
this.access_token = data.access_token;
|
|
37
|
+
this.token_expires_at = Date.now() + (data.expires_in - 300) * 1000;
|
|
38
|
+
return this.access_token;
|
|
39
|
+
}
|
|
40
|
+
async request(method, endpoint, body, isBlob = false) {
|
|
41
|
+
const token = await this.getAccessToken();
|
|
42
|
+
const separator = endpoint.includes("?") ? "&" : "?";
|
|
43
|
+
const url = `${this.baseApiUrl}${endpoint}${separator}organization_id=${this.config.organization_id}`;
|
|
44
|
+
const headers = {
|
|
45
|
+
Authorization: `Zoho-oauthtoken ${token}`,
|
|
46
|
+
};
|
|
47
|
+
if (body) {
|
|
48
|
+
headers["Content-Type"] = "application/json";
|
|
49
|
+
}
|
|
50
|
+
const res = await fetch(url, {
|
|
51
|
+
method,
|
|
52
|
+
headers,
|
|
53
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
54
|
+
});
|
|
55
|
+
if (isBlob) {
|
|
56
|
+
if (!res.ok) {
|
|
57
|
+
throw new Error(`Zoho API Blob Error: ${res.statusText}`);
|
|
58
|
+
}
|
|
59
|
+
return await res.arrayBuffer();
|
|
60
|
+
}
|
|
61
|
+
const data = await res.json();
|
|
62
|
+
if (!res.ok || data.code !== 0) {
|
|
63
|
+
this.logger?.error(`[Zoho Books] API Error: ${JSON.stringify(data)}`);
|
|
64
|
+
throw new Error(`Zoho API Error: ${data.message || res.statusText}`);
|
|
65
|
+
}
|
|
66
|
+
return data;
|
|
67
|
+
}
|
|
68
|
+
async syncContact(customer) {
|
|
69
|
+
const email = customer.email;
|
|
70
|
+
const name = customer.first_name
|
|
71
|
+
? `${customer.first_name} ${customer.last_name || ""}`.trim()
|
|
72
|
+
: customer.company_name || email || "Guest Customer";
|
|
73
|
+
// 1. Search by email
|
|
74
|
+
if (email && email.includes("@")) {
|
|
75
|
+
try {
|
|
76
|
+
const searchRes = await this.request("GET", `/contacts?email=${encodeURIComponent(email)}`);
|
|
77
|
+
if (searchRes.contacts && searchRes.contacts.length > 0) {
|
|
78
|
+
return searchRes.contacts[0].contact_id;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
this.logger?.warn(`[Zoho Books] Failed searching contact by email: ${e.message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 2. Search by contact name
|
|
86
|
+
if (name) {
|
|
87
|
+
try {
|
|
88
|
+
const searchNameRes = await this.request("GET", `/contacts?contact_name=${encodeURIComponent(name)}`);
|
|
89
|
+
if (searchNameRes.contacts && searchNameRes.contacts.length > 0) {
|
|
90
|
+
return searchNameRes.contacts[0].contact_id;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
this.logger?.warn(`[Zoho Books] Failed searching contact by name: ${e.message}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 3. Create new contact
|
|
98
|
+
const payload = {
|
|
99
|
+
contact_name: name,
|
|
100
|
+
company_name: customer.company_name || name,
|
|
101
|
+
contact_type: "customer",
|
|
102
|
+
contact_persons: [
|
|
103
|
+
{
|
|
104
|
+
first_name: customer.first_name || "Valued",
|
|
105
|
+
last_name: customer.last_name || "Customer",
|
|
106
|
+
email: email || "",
|
|
107
|
+
phone: customer.phone || "",
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
const createRes = await this.request("POST", "/contacts", payload);
|
|
112
|
+
return createRes.contact.contact_id;
|
|
113
|
+
}
|
|
114
|
+
async createInvoice(contactId, invoiceData) {
|
|
115
|
+
const payload = {
|
|
116
|
+
customer_id: contactId,
|
|
117
|
+
reference_number: invoiceData.reference_number,
|
|
118
|
+
invoice_number: invoiceData.invoice_number,
|
|
119
|
+
due_date: invoiceData.due_date,
|
|
120
|
+
payment_terms: invoiceData.payment_terms || 0,
|
|
121
|
+
line_items: invoiceData.line_items,
|
|
122
|
+
notes: invoiceData.notes || "Thank you for your business.",
|
|
123
|
+
terms: invoiceData.terms || "",
|
|
124
|
+
is_inclusive_tax: invoiceData.is_inclusive_tax ?? false,
|
|
125
|
+
};
|
|
126
|
+
if (invoiceData.custom_fields && invoiceData.custom_fields.length > 0) {
|
|
127
|
+
payload.custom_fields = invoiceData.custom_fields;
|
|
128
|
+
}
|
|
129
|
+
const res = await this.request("POST", "/invoices", payload);
|
|
130
|
+
return {
|
|
131
|
+
invoice_id: res.invoice.invoice_id,
|
|
132
|
+
invoice_number: res.invoice.invoice_number,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async getInvoicePaymentQrCode(invoiceId) {
|
|
136
|
+
try {
|
|
137
|
+
return await this.request("GET", `/invoices/${invoiceId}/payment-qr-code`, undefined, true);
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
try {
|
|
141
|
+
return await this.request("GET", `/invoices/${invoiceId}/qr_code`, undefined, true);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async createEstimate(contactId, estimateData) {
|
|
149
|
+
const payload = {
|
|
150
|
+
customer_id: contactId,
|
|
151
|
+
reference_number: estimateData.reference_number,
|
|
152
|
+
line_items: estimateData.line_items,
|
|
153
|
+
notes: estimateData.notes || "Estimate for goods/services.",
|
|
154
|
+
terms: estimateData.terms || "",
|
|
155
|
+
is_inclusive_tax: estimateData.is_inclusive_tax ?? false,
|
|
156
|
+
};
|
|
157
|
+
const res = await this.request("POST", "/estimates", payload);
|
|
158
|
+
return {
|
|
159
|
+
estimate_id: res.estimate.estimate_id,
|
|
160
|
+
estimate_number: res.estimate.estimate_number,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async registerPayment(invoiceId, amount, contactId, paymentMode = "Online", referenceNumber) {
|
|
164
|
+
const payload = {
|
|
165
|
+
customer_id: contactId,
|
|
166
|
+
payment_mode: paymentMode,
|
|
167
|
+
amount: Number(amount).toFixed(2),
|
|
168
|
+
date: new Date().toISOString().split("T")[0],
|
|
169
|
+
invoices: [
|
|
170
|
+
{
|
|
171
|
+
invoice_id: invoiceId,
|
|
172
|
+
amount_applied: Number(amount).toFixed(2),
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
};
|
|
176
|
+
if (referenceNumber) {
|
|
177
|
+
payload.reference_number = referenceNumber;
|
|
178
|
+
}
|
|
179
|
+
const res = await this.request("POST", "/customerpayments", payload);
|
|
180
|
+
return res.payment.payment_id;
|
|
181
|
+
}
|
|
182
|
+
async getDocumentPdf(documentId, type) {
|
|
183
|
+
const endpoint = type === "estimate" ? `/estimates/${documentId}` : `/invoices/${documentId}`;
|
|
184
|
+
return await this.request("GET", `${endpoint}?accept=pdf`, undefined, true);
|
|
185
|
+
}
|
|
186
|
+
async getPaymentReceiptPdf(paymentId) {
|
|
187
|
+
return await this.request("GET", `/customerpayments/${paymentId}?accept=pdf`, undefined, true);
|
|
188
|
+
}
|
|
189
|
+
async listInvoices(params = {}) {
|
|
190
|
+
const query = new URLSearchParams();
|
|
191
|
+
if (params.page)
|
|
192
|
+
query.append("page", String(params.page));
|
|
193
|
+
if (params.per_page)
|
|
194
|
+
query.append("per_page", String(params.per_page));
|
|
195
|
+
if (params.search_text)
|
|
196
|
+
query.append("search_text", params.search_text);
|
|
197
|
+
const res = await this.request("GET", `/invoices?${query.toString()}`);
|
|
198
|
+
return res.invoices || [];
|
|
199
|
+
}
|
|
200
|
+
async listEstimates(params = {}) {
|
|
201
|
+
const query = new URLSearchParams();
|
|
202
|
+
if (params.page)
|
|
203
|
+
query.append("page", String(params.page));
|
|
204
|
+
if (params.per_page)
|
|
205
|
+
query.append("per_page", String(params.per_page));
|
|
206
|
+
const res = await this.request("GET", `/estimates?${query.toString()}`);
|
|
207
|
+
return res.estimates || [];
|
|
208
|
+
}
|
|
209
|
+
async listPayments(params = {}) {
|
|
210
|
+
const query = new URLSearchParams();
|
|
211
|
+
if (params.page)
|
|
212
|
+
query.append("page", String(params.page));
|
|
213
|
+
if (params.per_page)
|
|
214
|
+
query.append("per_page", String(params.per_page));
|
|
215
|
+
const res = await this.request("GET", `/customerpayments?${query.toString()}`);
|
|
216
|
+
return res.customerpayments || [];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.ZohoBooksService = ZohoBooksService;
|
|
220
|
+
exports.default = ZohoBooksService;
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9oby1ib29rcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy96b2hvLWJvb2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZCQSxNQUFhLGdCQUFnQjtJQU0zQixZQUFZLE1BQWtCLEVBQUUsTUFBZTtRQUh2QyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBR25DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFZLGVBQWU7UUFDekIsT0FBTyx5QkFBeUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQVksVUFBVTtRQUNwQixPQUFPLHdCQUF3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLFdBQVcsQ0FBQztJQUN4RSxDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWM7UUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxl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
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = orderDocumentsSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const documents_1 = require("../modules/documents");
|
|
7
|
+
const payment_link_1 = require("../utils/payment-link");
|
|
8
|
+
async function orderDocumentsSubscriber({ event, container, }) {
|
|
9
|
+
const logger = container.resolve("logger");
|
|
10
|
+
const eventName = event.name;
|
|
11
|
+
const data = event.data;
|
|
12
|
+
logger.info(`[Documents-Subscriber] Handling '${eventName}' event (Order ID: ${data?.id})`);
|
|
13
|
+
try {
|
|
14
|
+
const documentService = container.resolve(documents_1.DOCUMENTS_MODULE, {
|
|
15
|
+
allowUnregistered: true,
|
|
16
|
+
});
|
|
17
|
+
if (!documentService) {
|
|
18
|
+
logger.warn(`[Documents-Subscriber] Documents module not registered in container. Aborting.`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const settings = await documentService.getSettings();
|
|
22
|
+
// Check on/off toggles from DocumentSettings
|
|
23
|
+
if (eventName === "order.placed" && !settings.event_order_placed_enabled) {
|
|
24
|
+
logger.info(`[Documents-Subscriber] 'order.placed' event processing is disabled in Documents settings.`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (eventName === "order.completed" && !settings.event_order_completed_enabled) {
|
|
28
|
+
logger.info(`[Documents-Subscriber] 'order.completed' event processing is disabled in Documents settings.`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (eventName === "payment.captured" && !settings.event_payment_captured_enabled) {
|
|
32
|
+
logger.info(`[Documents-Subscriber] 'payment.captured' event processing is disabled in Documents settings.`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (eventName === "order.fulfillment_created" && !settings.event_order_fulfillment_enabled) {
|
|
36
|
+
logger.info(`[Documents-Subscriber] 'order.fulfillment_created' event processing is disabled in Documents settings.`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const orderId = data.id || data.order_id;
|
|
40
|
+
if (!orderId) {
|
|
41
|
+
logger.warn(`[Documents-Subscriber] No order ID found in '${eventName}' payload.`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
45
|
+
const { data: orders } = await query.graph({
|
|
46
|
+
entity: "order",
|
|
47
|
+
fields: [
|
|
48
|
+
"id",
|
|
49
|
+
"display_id",
|
|
50
|
+
"email",
|
|
51
|
+
"created_at",
|
|
52
|
+
"currency_code",
|
|
53
|
+
"total",
|
|
54
|
+
"subtotal",
|
|
55
|
+
"shipping_total",
|
|
56
|
+
"discount_total",
|
|
57
|
+
"tax_total",
|
|
58
|
+
"customer.first_name",
|
|
59
|
+
"customer.last_name",
|
|
60
|
+
"customer.email",
|
|
61
|
+
"customer.phone",
|
|
62
|
+
"shipping_address.first_name",
|
|
63
|
+
"shipping_address.last_name",
|
|
64
|
+
"shipping_address.address_1",
|
|
65
|
+
"shipping_address.city",
|
|
66
|
+
"shipping_address.phone",
|
|
67
|
+
"items.id",
|
|
68
|
+
"items.title",
|
|
69
|
+
"items.quantity",
|
|
70
|
+
"items.unit_price",
|
|
71
|
+
"payment_collections.captured_amount",
|
|
72
|
+
"payment_collections.amount",
|
|
73
|
+
"payment_collections.payments.amount",
|
|
74
|
+
"payment_collections.payments.captured_at",
|
|
75
|
+
"payment_collections.payments.canceled_at",
|
|
76
|
+
],
|
|
77
|
+
filters: { id: orderId },
|
|
78
|
+
});
|
|
79
|
+
if (!orders || orders.length === 0) {
|
|
80
|
+
logger.warn(`[Documents-Subscriber] Order ${orderId} not found in database.`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const order = orders[0];
|
|
84
|
+
const customerName = order.customer?.first_name
|
|
85
|
+
? `${order.customer.first_name} ${order.customer.last_name || ""}`.trim()
|
|
86
|
+
: order.shipping_address?.first_name || "Valued Customer";
|
|
87
|
+
const customerEmail = order.email || order.customer?.email;
|
|
88
|
+
const customerPhone = order.shipping_address?.phone || order.customer?.phone;
|
|
89
|
+
const storeUrl = settings.storefront_url || process.env.STOREFRONT_URL || "http://localhost:5173";
|
|
90
|
+
// Format Line Items
|
|
91
|
+
const lineItems = (order.items || []).map((it) => ({
|
|
92
|
+
title: it.title,
|
|
93
|
+
quantity: Number(it.quantity || 1),
|
|
94
|
+
unit_price: Number(it.unit_price || 0),
|
|
95
|
+
total: Number(it.quantity || 1) * Number(it.unit_price || 0),
|
|
96
|
+
}));
|
|
97
|
+
// Handle 'order.placed' -> Tax Invoice
|
|
98
|
+
if (eventName === "order.placed") {
|
|
99
|
+
const paymentInfo = (0, payment_link_1.generateOrderPaymentLink)(order, storeUrl);
|
|
100
|
+
await documentService.generateDocument({
|
|
101
|
+
display_id: `INV-${order.display_id || order.id.slice(-6)}`,
|
|
102
|
+
title: "Tax Invoice",
|
|
103
|
+
type: "invoice",
|
|
104
|
+
order_id: order.id,
|
|
105
|
+
customer: {
|
|
106
|
+
name: customerName,
|
|
107
|
+
email: customerEmail,
|
|
108
|
+
phone: customerPhone,
|
|
109
|
+
address: order.shipping_address?.address_1,
|
|
110
|
+
},
|
|
111
|
+
items: lineItems,
|
|
112
|
+
subtotal: Number(order.subtotal || 0),
|
|
113
|
+
tax_total: Number(order.tax_total || 0),
|
|
114
|
+
shipping_total: Number(order.shipping_total || 0),
|
|
115
|
+
discount_total: Number(order.discount_total || 0),
|
|
116
|
+
total: Number(order.total || 0),
|
|
117
|
+
currency_code: order.currency_code,
|
|
118
|
+
payment_status: paymentInfo.isUnpaid ? "unpaid" : "paid",
|
|
119
|
+
payment_link: paymentInfo.paymentLink || undefined,
|
|
120
|
+
auto_send: true,
|
|
121
|
+
email_subject: `Invoice for Order #${order.display_id || order.id}`,
|
|
122
|
+
}, container);
|
|
123
|
+
}
|
|
124
|
+
// Handle 'payment.captured' -> Payment Receipt
|
|
125
|
+
else if (eventName === "payment.captured") {
|
|
126
|
+
await documentService.generateDocument({
|
|
127
|
+
display_id: `RCPT-${order.display_id || order.id.slice(-6)}`,
|
|
128
|
+
title: "Payment Receipt",
|
|
129
|
+
type: "receipt",
|
|
130
|
+
order_id: order.id,
|
|
131
|
+
customer: {
|
|
132
|
+
name: customerName,
|
|
133
|
+
email: customerEmail,
|
|
134
|
+
phone: customerPhone,
|
|
135
|
+
},
|
|
136
|
+
items: lineItems,
|
|
137
|
+
total: Number(order.total || 0),
|
|
138
|
+
currency_code: order.currency_code,
|
|
139
|
+
payment_status: "paid",
|
|
140
|
+
auto_send: true,
|
|
141
|
+
email_subject: `Payment Receipt for Order #${order.display_id || order.id}`,
|
|
142
|
+
}, container);
|
|
143
|
+
}
|
|
144
|
+
// Handle 'order.completed' or 'order.fulfillment_created' -> Packing Slip
|
|
145
|
+
else if (eventName === "order.completed" || eventName === "order.fulfillment_created") {
|
|
146
|
+
await documentService.generateDocument({
|
|
147
|
+
display_id: `PACK-${order.display_id || order.id.slice(-6)}`,
|
|
148
|
+
title: "Packing Slip",
|
|
149
|
+
type: "packing_slip",
|
|
150
|
+
order_id: order.id,
|
|
151
|
+
customer: {
|
|
152
|
+
name: customerName,
|
|
153
|
+
email: customerEmail,
|
|
154
|
+
phone: customerPhone,
|
|
155
|
+
address: `${order.shipping_address?.address_1 || ""}, ${order.shipping_address?.city || ""}`,
|
|
156
|
+
},
|
|
157
|
+
items: lineItems,
|
|
158
|
+
total: 0,
|
|
159
|
+
currency_code: order.currency_code,
|
|
160
|
+
payment_status: "not_applicable",
|
|
161
|
+
force_source: "pdfkit", // Packing slips generated via PDFKit
|
|
162
|
+
auto_send: false,
|
|
163
|
+
}, container);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
logger.error(`[Documents-Subscriber] Error processing '${eventName}': ${error.message}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.config = {
|
|
171
|
+
event: [
|
|
172
|
+
"order.placed",
|
|
173
|
+
"order.completed",
|
|
174
|
+
"payment.captured",
|
|
175
|
+
"order.fulfillment_created",
|
|
176
|
+
],
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLWRvY3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSwyQ0F5TEM7QUE5TEQscURBQXNFO0FBQ3RFLG9EQUF3RDtBQUV4RCx3REFBaUU7QUFFbEQsS0FBSyxVQUFVLHdCQUF3QixDQUFDLEVBQ3JELEtBQUssRUFDTCxTQUFTLEdBQ1c7SUFDcEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFFeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsU0FBUyxzQkFBc0IsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFNUYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsNEJBQWdCLEVBQUU7WUFDakYsaUJBQWlCLEVBQUUsSUFBSTtTQUN4QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1lBQzlGLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFckQsNkNBQTZDO1FBQzdDLElBQUksU0FBUyxLQUFLLGNBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkZBQTJGLENBQUMsQ0FBQztZQUN6RyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLGlCQUFpQixJQUFJLENBQUMsUUFBUSxDQUFD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
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = repairDocumentsSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const documents_1 = require("../modules/documents");
|
|
7
|
+
const payment_link_1 = require("../utils/payment-link");
|
|
8
|
+
async function repairDocumentsSubscriber({ event, container, }) {
|
|
9
|
+
const logger = container.resolve("logger");
|
|
10
|
+
const eventName = event.name;
|
|
11
|
+
const data = event.data;
|
|
12
|
+
logger.info(`[Documents-Subscriber] Handling repair event '${eventName}'`);
|
|
13
|
+
try {
|
|
14
|
+
const documentService = container.resolve(documents_1.DOCUMENTS_MODULE, {
|
|
15
|
+
allowUnregistered: true,
|
|
16
|
+
});
|
|
17
|
+
if (!documentService)
|
|
18
|
+
return;
|
|
19
|
+
const settings = await documentService.getSettings();
|
|
20
|
+
// Check on/off toggles
|
|
21
|
+
if (eventName === "repair.status_changed" && !settings.event_repair_status_changed_enabled)
|
|
22
|
+
return;
|
|
23
|
+
if (eventName === "repair.ticket.compliance_requested" && !settings.event_repair_compliance_enabled)
|
|
24
|
+
return;
|
|
25
|
+
if (eventName === "repair.created" && !settings.event_repair_created_enabled)
|
|
26
|
+
return;
|
|
27
|
+
if (eventName === "repair.completed" && !settings.event_repair_completed_enabled)
|
|
28
|
+
return;
|
|
29
|
+
if (eventName === "repair.customer_reminder" && !settings.event_repair_reminder_enabled)
|
|
30
|
+
return;
|
|
31
|
+
const ticketId = data.id || data.repair_ticket_id;
|
|
32
|
+
if (!ticketId)
|
|
33
|
+
return;
|
|
34
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
35
|
+
const { data: tickets } = await query.graph({
|
|
36
|
+
entity: "repair_ticket",
|
|
37
|
+
fields: [
|
|
38
|
+
"*",
|
|
39
|
+
"device.*",
|
|
40
|
+
"product_variants.*",
|
|
41
|
+
],
|
|
42
|
+
filters: { id: ticketId },
|
|
43
|
+
}).catch(() => ({ data: [] }));
|
|
44
|
+
if (!tickets || tickets.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
const ticket = tickets[0];
|
|
47
|
+
// Customer resolution
|
|
48
|
+
let customerName = "Valued Customer";
|
|
49
|
+
let customerEmail = undefined;
|
|
50
|
+
let customerPhone = undefined;
|
|
51
|
+
if (ticket.customer_id) {
|
|
52
|
+
try {
|
|
53
|
+
const customerModule = container.resolve("customer", { allowUnregistered: true });
|
|
54
|
+
if (customerModule) {
|
|
55
|
+
const c = await customerModule.retrieveCustomer(ticket.customer_id);
|
|
56
|
+
if (c) {
|
|
57
|
+
customerName = c.first_name ? `${c.first_name} ${c.last_name || ""}`.trim() : c.email;
|
|
58
|
+
customerEmail = c.email || undefined;
|
|
59
|
+
customerPhone = c.phone || undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) { }
|
|
64
|
+
}
|
|
65
|
+
const storeUrl = settings.storefront_url || process.env.STORE_URL || "http://localhost:3000";
|
|
66
|
+
const paymentInfo = (0, payment_link_1.generateRepairPaymentLink)(ticket, storeUrl);
|
|
67
|
+
// Build line items
|
|
68
|
+
const lineItems = [];
|
|
69
|
+
if (ticket.device?.parts_used && ticket.device.parts_used.length > 0) {
|
|
70
|
+
for (const part of ticket.device.parts_used) {
|
|
71
|
+
lineItems.push({
|
|
72
|
+
title: part.name || "Replacement Part",
|
|
73
|
+
description: part.sku ? `SKU: ${part.sku}` : "",
|
|
74
|
+
quantity: 1,
|
|
75
|
+
unit_price: Number(part.price || 0),
|
|
76
|
+
total: Number(part.price || 0),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (Number(ticket.labor_estimate || 0) > 0) {
|
|
81
|
+
lineItems.push({
|
|
82
|
+
title: "Labor Charge",
|
|
83
|
+
quantity: 1,
|
|
84
|
+
unit_price: Number(ticket.labor_estimate),
|
|
85
|
+
total: Number(ticket.labor_estimate),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (ticket.custom_parts && ticket.custom_parts.length > 0) {
|
|
89
|
+
for (const cp of ticket.custom_parts) {
|
|
90
|
+
lineItems.push({
|
|
91
|
+
title: cp.name || "Custom Service",
|
|
92
|
+
quantity: 1,
|
|
93
|
+
unit_price: Number(cp.price || 0),
|
|
94
|
+
total: Number(cp.price || 0),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (lineItems.length === 0) {
|
|
99
|
+
const tot = Number(ticket.total_actual || ticket.total_estimate || 0);
|
|
100
|
+
lineItems.push({
|
|
101
|
+
title: `Repair Service (#${ticket.ticket_number})`,
|
|
102
|
+
quantity: 1,
|
|
103
|
+
unit_price: tot,
|
|
104
|
+
total: tot,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const isPaid = ticket.payment_status === "captured" || ticket.payment_status === "paid" || eventName === "repair.payment_received";
|
|
108
|
+
const isAwaitingApproval = ticket.status === "awaiting_approval";
|
|
109
|
+
let docType = isPaid ? "receipt" : (isAwaitingApproval ? "estimate" : "invoice");
|
|
110
|
+
let docTitle = isPaid ? "Repair Payment Receipt" : (isAwaitingApproval ? "Repair Estimate / Quote" : "Repair Invoice");
|
|
111
|
+
if (eventName === "repair.created") {
|
|
112
|
+
docType = "job_card";
|
|
113
|
+
docTitle = "Repair Job Card";
|
|
114
|
+
}
|
|
115
|
+
const displayId = docType === "job_card" ? `JOB-${ticket.ticket_number}` : `RT-${ticket.ticket_number}`;
|
|
116
|
+
const totalEstimate = Number(ticket.total_actual && ticket.total_actual > 0 ? ticket.total_actual : ticket.total_estimate || 0);
|
|
117
|
+
const trackingUrl = ticket.approval_token ? `${storeUrl}/repairs/track?token=${ticket.approval_token}` : undefined;
|
|
118
|
+
const paymentOrTrackingLink = docType === "job_card" ? (trackingUrl || paymentInfo.paymentLink) : paymentInfo.paymentLink;
|
|
119
|
+
await documentService.generateDocument({
|
|
120
|
+
display_id: displayId,
|
|
121
|
+
title: docTitle,
|
|
122
|
+
type: docType,
|
|
123
|
+
repair_ticket_id: ticket.id,
|
|
124
|
+
customer: {
|
|
125
|
+
name: customerName,
|
|
126
|
+
email: customerEmail,
|
|
127
|
+
phone: customerPhone,
|
|
128
|
+
},
|
|
129
|
+
items: lineItems,
|
|
130
|
+
total: totalEstimate,
|
|
131
|
+
currency_code: "usd",
|
|
132
|
+
payment_status: isPaid ? "paid" : "unpaid",
|
|
133
|
+
payment_link: paymentOrTrackingLink || undefined,
|
|
134
|
+
auto_send: docType !== "job_card", // Invoices/receipts/estimates auto-send, Job cards are primarily for intake workshop
|
|
135
|
+
email_subject: `${docTitle} for Ticket #${ticket.ticket_number} (${ticket.device?.model_name || "Device"})`,
|
|
136
|
+
notes: ticket.terms_accepted != null ? `Intake Consent: Terms Accepted: ${ticket.terms_accepted ? "Yes" : "No"} | Data Wipe: ${ticket.data_wiped_consent ? "Yes" : "No"}` : undefined,
|
|
137
|
+
custom_fields: {
|
|
138
|
+
"Device Model": ticket.device?.model_name || "N/A",
|
|
139
|
+
"Brand": ticket.device?.brand || "N/A",
|
|
140
|
+
"Serial / IMEI": ticket.device?.serial_number || ticket.device?.imei || "N/A",
|
|
141
|
+
"Condition": ticket.device?.condition || "Not specified",
|
|
142
|
+
"Accessories": ticket.accessories || "None",
|
|
143
|
+
"Technician": ticket.technician_name || "Unassigned",
|
|
144
|
+
"Issue": ticket.issue_description || "Standard Repair",
|
|
145
|
+
},
|
|
146
|
+
}, container);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logger.error(`[Documents-Subscriber] Failed processing repair event '${eventName}': ${error.message}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.config = {
|
|
153
|
+
event: [
|
|
154
|
+
"repair.status_changed",
|
|
155
|
+
"repair.ticket.compliance_requested",
|
|
156
|
+
"repair.customer_reminder",
|
|
157
|
+
"repair.created",
|
|
158
|
+
"repair.completed",
|
|
159
|
+
"repair.payment_received",
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwYWlyLWRvY3VtZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9yZXBhaXItZG9jdW1lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLDRDQTRKQztBQWpLRCxxREFBc0U7QUFDdEUsb0RBQXdEO0FBRXhELHdEQUFrRTtBQUVuRCxLQUFLLFVBQVUseUJBQXlCLENBQUMsRUFDdEQsS0FBSyxFQUNMLFNBQVMsR0FDVztJQUNwQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUV4QixNQUFNLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRTNFLElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUEwQixTQUFTLENBQUMsT0FBTyxDQUFDLDRCQUFnQixFQUFFO1lBQ2pGLGlCQUFpQixFQUFFLElBQUk7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBRTdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXJELHVCQUF1QjtRQUN2QixJQUFJLFNBQVMsS0FBSyx1QkFBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQ0FBbUM7WUFBRSxPQUFPO1FBQ25HLElBQUksU0FBUyxLQUFLLG9DQUFvQyxJQUFJLENBQUMsUUFBUSxDQUFDLCtCQUErQjtZQUFFLE9BQU87UUFDNUcsSUFBSSxTQUFTLEtBQUssZ0JBQWdCLElBQUksQ0FBQyxRQUFRLENBQUMsNEJBQTRCO1lBQUUsT0FBTztRQUNyRixJQUFJLFNBQVMsS0FBSyxrQkFBa0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEI7WUFBRSxP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
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.delegateDocumentGeneration = delegateDocumentGeneration;
|
|
4
|
+
/**
|
|
5
|
+
* Universal helper for third-party plugins (e.g. medusajs-repairshop-plugin, custom checkout)
|
|
6
|
+
* to delegate document generation to the Documents Plugin when installed.
|
|
7
|
+
*
|
|
8
|
+
* Usage in another plugin:
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { delegateDocumentGeneration } from "medusajs-documents-plugin";
|
|
11
|
+
*
|
|
12
|
+
* const result = await delegateDocumentGeneration(container, {
|
|
13
|
+
* display_id: "RT-1001",
|
|
14
|
+
* title: "Repair Invoice",
|
|
15
|
+
* type: "invoice",
|
|
16
|
+
* customer: { name: "John Doe", email: "john@example.com" },
|
|
17
|
+
* items: [{ title: "Screen Repair", quantity: 1, unit_price: 120 }],
|
|
18
|
+
* total: 120,
|
|
19
|
+
* currency_code: "usd",
|
|
20
|
+
* auto_send: true
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
async function delegateDocumentGeneration(container, input) {
|
|
25
|
+
try {
|
|
26
|
+
const documentService = container.resolve("documents", { allowUnregistered: true });
|
|
27
|
+
if (documentService) {
|
|
28
|
+
return await documentService.generateDocument(input, container);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.warn("[Documents-Integration] Failed to resolve documents module:", err);
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
exports.default = delegateDocumentGeneration;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL2ludGVncmF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVCQSxnRUFhQztBQWpDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNJLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsU0FBMEIsRUFDMUIsS0FBNEI7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQVEsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsT0FBTyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyw2REFBNkQsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsa0JBQWUsMEJBQTBCLENBQUMifQ==
|