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.
Files changed (39) hide show
  1. package/.medusa/server/src/admin/index.js +2427 -0
  2. package/.medusa/server/src/admin/index.mjs +2428 -0
  3. package/.medusa/server/src/api/admin/documents/[id]/document/route.js +36 -0
  4. package/.medusa/server/src/api/admin/documents/[id]/send/route.js +41 -0
  5. package/.medusa/server/src/api/admin/documents/[id]/sync-zoho/route.js +68 -0
  6. package/.medusa/server/src/api/admin/documents/custom/route.js +48 -0
  7. package/.medusa/server/src/api/admin/documents/manual/route.js +46 -0
  8. package/.medusa/server/src/api/admin/documents/route.js +36 -0
  9. package/.medusa/server/src/api/admin/documents/settings/route.js +44 -0
  10. package/.medusa/server/src/api/admin/documents/templates/preview/route.js +159 -0
  11. package/.medusa/server/src/api/admin/documents/zoho/list/route.js +51 -0
  12. package/.medusa/server/src/api/documents/[id]/document/route.js +36 -0
  13. package/.medusa/server/src/api/documents/r/[code]/route.js +29 -0
  14. package/.medusa/server/src/api/documents/templates/preview/route.js +159 -0
  15. package/.medusa/server/src/api/store/documents/r/[code]/route.js +22 -0
  16. package/.medusa/server/src/index.js +27 -0
  17. package/.medusa/server/src/modules/documents/index.js +13 -0
  18. package/.medusa/server/src/modules/documents/migrations/Migration20261012164601.js +23 -0
  19. package/.medusa/server/src/modules/documents/migrations/Migration20261014150000.js +20 -0
  20. package/.medusa/server/src/modules/documents/models/document-link.js +12 -0
  21. package/.medusa/server/src/modules/documents/models/document-record.js +33 -0
  22. package/.medusa/server/src/modules/documents/models/document-settings.js +61 -0
  23. package/.medusa/server/src/modules/documents/service.js +456 -0
  24. package/.medusa/server/src/services/notification-sender.js +293 -0
  25. package/.medusa/server/src/services/pdf-post-processor.js +64 -0
  26. package/.medusa/server/src/services/pdfkit-generator.js +438 -0
  27. package/.medusa/server/src/services/zoho-books.js +221 -0
  28. package/.medusa/server/src/subscribers/order-documents.js +178 -0
  29. package/.medusa/server/src/subscribers/repair-documents.js +162 -0
  30. package/.medusa/server/src/utils/integrate.js +37 -0
  31. package/.medusa/server/src/utils/payment-link.js +69 -0
  32. package/.medusa/server/src/workflows/create-manual-document.js +27 -0
  33. package/.medusa/server/src/workflows/generate-document.js +24 -0
  34. package/.medusa/server/src/workflows/index.js +20 -0
  35. package/.medusa/server/src/workflows/send-document-notification.js +41 -0
  36. package/CHANGELOG.md +87 -0
  37. package/LICENSE +21 -0
  38. package/README.md +201 -2
  39. 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==