@devx-commerce/plugin-gati 0.0.34-beta.52 → 0.0.34-beta.54

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 (21) hide show
  1. package/.medusa/server/src/api/admin/masters/utils.js +29 -1
  2. package/.medusa/server/src/api/pos/generate-invoice/route.js +92 -355
  3. package/.medusa/server/src/jobs/sync-customer-advance-payment-erp.js +103 -0
  4. package/.medusa/server/src/jobs/sync-customer-erp.js +113 -0
  5. package/.medusa/server/src/jobs/sync-order-erp.js +42 -20
  6. package/.medusa/server/src/jobs/sync-order-request-erp.js +57 -0
  7. package/.medusa/server/src/jobs/sync-urd-purchase-erp.js +78 -0
  8. package/.medusa/server/src/modules/book-list/migrations/Migration20260401051011.js +14 -0
  9. package/.medusa/server/src/modules/book-list/models/book-list.js +2 -1
  10. package/.medusa/server/src/modules/erp/service.js +16 -1
  11. package/.medusa/server/src/workflows/book-list/steps/create-or-update-book-list.js +6 -2
  12. package/.medusa/server/src/workflows/inward-master/helper/index.js +17 -8
  13. package/.medusa/server/src/workflows/inward-master/workflows/create-inward.js +2 -18
  14. package/.medusa/server/src/workflows/inward-master/workflows/delete-inward.js +4 -4
  15. package/.medusa/server/src/workflows/inward-master/workflows/update-instock.js +2 -1
  16. package/.medusa/server/src/workflows/orders/steps/sync-sale-return-to-erp-step.js +18 -2
  17. package/.medusa/server/src/workflows/orders/utils/order-request-helper.js +21 -8
  18. package/.medusa/server/src/workflows/orders/workflows/index.js +2 -1
  19. package/.medusa/server/src/workflows/orders/workflows/sync-sale-return-to-erp.js +11 -0
  20. package/.medusa/server/src/workflows/sale-return-master/steps/process-sale-return-from-webhook.js +2 -2
  21. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = syncCustomerAdvancePaymentErp;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const sync_advanve_payment_to_erp_1 = require("../workflows/orders/workflows/sync-advanve-payment-to-erp");
7
+ const BATCH_SIZE = 50;
8
+ async function syncCustomerAdvancePaymentErp(container) {
9
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
10
+ const erpService = container.resolve("erp");
11
+ const healthy = await erpService.checkServiceHealth();
12
+ if (!healthy) {
13
+ logger.warn("[sync-customer-advance-payment-erp] ERP service unavailable, skipping sync");
14
+ return;
15
+ }
16
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
17
+ let skip = 0;
18
+ let totalSynced = 0;
19
+ // Track IDs attempted this run to avoid re-processing orders whose advance_payment_synced
20
+ // flag was just set (they remain in the DB query result until the next read reflects the update).
21
+ const attemptedIds = new Set();
22
+ while (true) {
23
+ // Query orders where order was synced to ERP but advance payment was not yet synced.
24
+ // The DB filter is stable (status doesn't change here), so we use normal skip pagination.
25
+ const { data: batch } = await query.graph({
26
+ entity: "order",
27
+ fields: [
28
+ "id",
29
+ "metadata",
30
+ "payment_collections.*",
31
+ "payment_collections.payments.*",
32
+ "order_master.*",
33
+ ],
34
+ filters: { status: ["pending", "completed"] },
35
+ pagination: { skip, take: BATCH_SIZE },
36
+ });
37
+ if (!batch?.length)
38
+ break;
39
+ // Only retry orders that:
40
+ // 1. Have a captured payment collection
41
+ // 2. Were synced to ERP (metadata.sync_erp === true)
42
+ // 3. Advance payment was not yet marked synced (metadata.advance_payment_synced !== true)
43
+ // 4. Not already attempted this run
44
+ const toSync = batch.filter((order) => {
45
+ const paymentCaptured = order.payment_collections?.[0]?.status === "completed";
46
+ const orderSynced = order.metadata?.sync_erp === true;
47
+ const advancePaymentNotSynced = order.metadata?.advance_payment_synced !== true;
48
+ return paymentCaptured && orderSynced && advancePaymentNotSynced && !attemptedIds.has(order.id);
49
+ });
50
+ logger.info(`[sync-customer-advance-payment-erp] Batch at skip=${skip}: ${toSync.length} orders pending advance payment sync`);
51
+ for (const order of toSync) {
52
+ attemptedIds.add(order.id);
53
+ const paymentCollection = order.payment_collections?.[0];
54
+ if (!paymentCollection?.payments?.length)
55
+ continue;
56
+ let allSucceeded = true;
57
+ for (const payment of paymentCollection.payments) {
58
+ try {
59
+ await (0, sync_advanve_payment_to_erp_1.syncAdvancePaymentToERPWorkflow)(container).run({
60
+ input: {
61
+ order_id: order.id,
62
+ payment_collection_id: paymentCollection.id,
63
+ payment_id: payment.id,
64
+ },
65
+ });
66
+ totalSynced++;
67
+ logger.info(`[sync-customer-advance-payment-erp] Synced advance payment ${payment.id} for order ${order.id}`);
68
+ }
69
+ catch (err) {
70
+ allSucceeded = false;
71
+ logger.error(`[sync-customer-advance-payment-erp] Failed for order ${order.id}, payment ${payment.id}: ${err?.message}`);
72
+ }
73
+ }
74
+ // Only mark as synced if ALL payments in the collection succeeded
75
+ if (allSucceeded) {
76
+ try {
77
+ const orderService = container.resolve("order");
78
+ await orderService.updateOrders({
79
+ selector: { id: order.id },
80
+ data: {
81
+ metadata: {
82
+ ...(order.metadata ?? {}),
83
+ advance_payment_synced: true,
84
+ },
85
+ },
86
+ });
87
+ }
88
+ catch (err) {
89
+ logger.warn(`[sync-customer-advance-payment-erp] Could not mark advance_payment_synced for order ${order.id}: ${err?.message}`);
90
+ }
91
+ }
92
+ }
93
+ if (batch.length < BATCH_SIZE)
94
+ break;
95
+ skip += BATCH_SIZE;
96
+ }
97
+ logger.info(`[sync-customer-advance-payment-erp] Done. Total synced: ${totalSynced}`);
98
+ }
99
+ exports.config = {
100
+ name: "sync-customer-advance-payment-erp",
101
+ schedule: "*/10 * * * *", // Every 10 minutes
102
+ };
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jdXN0b21lci1hZHZhbmNlLXBheW1lbnQtZXJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvc3luYy1jdXN0b21lci1hZHZhbmNlLXBheW1lbnQtZXJwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLGdEQTBHQztBQWhIRCxxREFBc0U7QUFFdEUsMkdBQTRHO0FBRTVHLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUVQLEtBQUssVUFBVSw2QkFBNkIsQ0FBQyxTQUEwQjtJQUNwRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLE1BQU0sVUFBVSxHQUFlLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUN0RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLDRFQUE0RSxDQUFDLENBQUM7UUFDMUYsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQiwwRkFBMEY7SUFDMUYsa0dBQWtHO0lBQ2xHLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFdkMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLHFGQUFxRjtRQUNyRiwwRkFBMEY7UUFDMUYsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDeEMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ04s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
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = syncCustomerErp;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const workflows_1 = require("../workflows/party-master/workflows");
7
+ const BATCH_SIZE = 50;
8
+ async function syncCustomerErp(container) {
9
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
10
+ const erpService = container.resolve("erp");
11
+ const healthy = await erpService.checkServiceHealth();
12
+ if (!healthy) {
13
+ logger.warn("[sync-customer-erp] ERP service unavailable, skipping sync");
14
+ return;
15
+ }
16
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
17
+ let totalSynced = 0;
18
+ // Track IDs attempted this run to avoid infinite loop when records persistently fail
19
+ const attemptedIds = new Set();
20
+ while (true) {
21
+ // Always query at skip=0: synced customers gain external_id and leave this filter,
22
+ // so the set naturally shrinks — incrementing skip would cause records to be missed.
23
+ const { data: batch } = await query.graph({
24
+ entity: "customer",
25
+ fields: ["id", "first_name", "last_name", "email", "phone", "extended_customer.*"],
26
+ filters: {
27
+ // @ts-ignore
28
+ "extended_customer.external_id": null,
29
+ },
30
+ pagination: { skip: 0, take: BATCH_SIZE },
31
+ });
32
+ if (!batch?.length)
33
+ break;
34
+ // Filter: must have extended_customer but no external_id, must have phone, not yet attempted
35
+ const unsynced = batch.filter((c) => c.extended_customer &&
36
+ !c.extended_customer.external_id &&
37
+ c.phone &&
38
+ !attemptedIds.has(c.id));
39
+ if (!unsynced.length)
40
+ break; // All records in this batch already attempted this run
41
+ logger.info(`[sync-customer-erp] Processing ${unsynced.length} unsynced customers`);
42
+ for (const customer of unsynced) {
43
+ attemptedIds.add(customer.id);
44
+ try {
45
+ const fullName = `${customer.first_name || ""} ${customer.last_name || ""}`.trim();
46
+ const erpCustomerData = {
47
+ PartyNo: "",
48
+ FirmName: fullName || customer.email || "",
49
+ LegalName: fullName || customer.email || "",
50
+ FirmAdd1: "",
51
+ FirmAdd2: "",
52
+ FirmAdd3: "",
53
+ FirmPinCode: "",
54
+ FirmEmail: customer.email || "",
55
+ OwnerMobile: customer.phone?.replace("+91", "") || "",
56
+ WhatsAppNo: "",
57
+ Country: "",
58
+ State: "",
59
+ FirmCity: "",
60
+ FirmBirthDate: customer.extended_customer?.birth_date
61
+ ? String(customer.extended_customer.birth_date)
62
+ : "",
63
+ FirmAnniversaryDate: customer.extended_customer?.anniversary_date
64
+ ? String(customer.extended_customer.anniversary_date)
65
+ : "",
66
+ BranchNo: "",
67
+ BranchName: "Self",
68
+ LocationId: "",
69
+ LocationName: "All",
70
+ AadhaarNo: "",
71
+ FirmPan: customer.extended_customer?.pan_number || "",
72
+ GSTNo: customer.extended_customer?.gst_number || "",
73
+ LUTNo: "",
74
+ IdentityProof: "",
75
+ CSTNo: "",
76
+ LSTNo: "",
77
+ ServiceTaxNo: "",
78
+ BankAccNo: "",
79
+ BankName: "",
80
+ BankAdd1: "",
81
+ BankAdd2: "",
82
+ BankAdd3: "",
83
+ BankPinCode: "",
84
+ BankIFSCCode: "",
85
+ BankSwiftCode: "",
86
+ IsCustomer: true,
87
+ IsSupplier: false,
88
+ IsAccount: false,
89
+ IsSalesMan: false,
90
+ IsFactory: false,
91
+ FactoryType: false,
92
+ IsTools: false,
93
+ IsLocation: false,
94
+ IsPdHead: 0,
95
+ IsInlineBranch: false,
96
+ IsSchemeMember: false,
97
+ };
98
+ await (0, workflows_1.createCustomerErpWorkflow)(container).run({ input: erpCustomerData });
99
+ totalSynced++;
100
+ logger.info(`[sync-customer-erp] Synced customer ${customer.id}`);
101
+ }
102
+ catch (err) {
103
+ logger.error(`[sync-customer-erp] Failed for customer ${customer.id}: ${err?.message}`);
104
+ }
105
+ }
106
+ }
107
+ logger.info(`[sync-customer-erp] Done. Total synced: ${totalSynced}`);
108
+ }
109
+ exports.config = {
110
+ name: "sync-customer-erp",
111
+ schedule: "*/10 * * * *", // Every 10 minutes
112
+ };
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jdXN0b21lci1lcnAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9zeW5jLWN1c3RvbWVyLWVycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxrQ0FnSEM7QUF2SEQscURBQXNFO0FBRXRFLG1FQUFnRjtBQUdoRixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFFUCxLQUFLLFVBQVUsZUFBZSxDQUFDLFNBQTBCO0lBQ3RFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxVQUFVLEdBQWUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3RELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUMxRSxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLHFGQUFxRjtJQUNyRixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRXZDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixtRkFBbUY7UUFDbkYscUZBQXFGO1FBQ3JGLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUscUJBQXFCLENBQUM7WUFDbEYsT0FBTyxFQUFF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
@@ -4,32 +4,54 @@ exports.config = void 0;
4
4
  exports.default = syncOrderErp;
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  const orders_1 = require("../workflows/orders");
7
+ const BATCH_SIZE = 50;
7
8
  async function syncOrderErp(container) {
9
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
10
+ const erpService = container.resolve("erp");
11
+ const healthy = await erpService.checkServiceHealth();
12
+ if (!healthy) {
13
+ logger.warn("[sync-order-erp] ERP service unavailable, skipping sync");
14
+ return;
15
+ }
8
16
  const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
9
- const { data: orders } = await query.graph({
10
- entity: "order",
11
- fields: [
12
- "id",
13
- "created_at",
14
- "payment_collections.*",
15
- "payment_collections.payments.*",
16
- ],
17
- filters: { status: "pending" },
18
- pagination: { skip: 0, take: 100 },
19
- });
20
- console.log("Pushing orders to ERP", orders.length);
21
- const capturedOrders = orders.filter((o) => o?.payment_collections[0]?.status === "completed");
22
- console.log("capturedOrders", capturedOrders);
23
- for (const order of capturedOrders) {
24
- await (0, orders_1.syncOrderToErpWorkflow)(container).run({
25
- input: {
26
- order_id: order.id,
27
- },
17
+ let skip = 0;
18
+ let totalSynced = 0;
19
+ while (true) {
20
+ const { data: batch } = await query.graph({
21
+ entity: "order",
22
+ fields: [
23
+ "id",
24
+ "created_at",
25
+ "payment_collections.*",
26
+ "payment_collections.payments.*",
27
+ ],
28
+ filters: { status: "pending" },
29
+ pagination: { skip, take: BATCH_SIZE },
28
30
  });
31
+ if (!batch?.length)
32
+ break;
33
+ const capturedOrders = batch.filter((o) => o?.payment_collections?.[0]?.status === "completed");
34
+ logger.info(`[sync-order-erp] Batch at skip=${skip}: ${capturedOrders.length} orders to sync`);
35
+ for (const order of capturedOrders) {
36
+ try {
37
+ await (0, orders_1.syncOrderToErpWorkflow)(container).run({
38
+ input: { order_id: order.id },
39
+ });
40
+ totalSynced++;
41
+ logger.info(`[sync-order-erp] Synced order ${order.id}`);
42
+ }
43
+ catch (err) {
44
+ logger.error(`[sync-order-erp] Failed for order ${order.id}: ${err?.message}`);
45
+ }
46
+ }
47
+ if (batch.length < BATCH_SIZE)
48
+ break;
49
+ skip += BATCH_SIZE;
29
50
  }
51
+ logger.info(`[sync-order-erp] Done. Total synced: ${totalSynced}`);
30
52
  }
31
53
  exports.config = {
32
54
  name: "sync-order-erp",
33
55
  schedule: "*/5 * * * *", // Every 5 minutes
34
56
  };
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1vcmRlci1lcnAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9zeW5jLW9yZGVyLWVycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSwrQkE2QkM7QUFoQ0QscURBQXNFO0FBQ3RFLGdEQUE2RDtBQUU5QyxLQUFLLFVBQVUsWUFBWSxDQUFDLFNBQTBCO0lBQ25FLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekMsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUU7WUFDTixJQUFJO1lBQ0osWUFBWTtZQUNaLHVCQUF1QjtZQUN2QixnQ0FBZ0M7U0FDakM7UUFDRCxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO1FBQzlCLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtLQUNuQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQzlELENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRTlDLEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFBLCtCQUFzQixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2FBQ25CO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLFFBQVEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCO0NBQzVDLENBQUMifQ==
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1vcmRlci1lcnAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9zeW5jLW9yZGVyLWVycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSwrQkFvREM7QUExREQscURBQXNFO0FBQ3RFLGdEQUE2RDtBQUc3RCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFFUCxLQUFLLFVBQVUsWUFBWSxDQUFDLFNBQTBCO0lBQ25FLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxVQUFVLEdBQWUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3RELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztRQUN2RSxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN4QyxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osdUJBQXVCO2dCQUN2QixnQ0FBZ0M7YUFDakM7WUFDRCxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO1lBQzlCLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1NBQ3ZDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtZQUFFLE1BQU07UUFFMUIsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDakMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQ2hFLENBQUM7UUFFRixNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxJQUFJLEtBQUssY0FBYyxDQUFDLE1BQU0saUJBQWlCLENBQUMsQ0FBQztRQUUvRixLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUEsK0JBQXNCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUMxQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtpQkFDOUIsQ0FBQyxDQUFDO2dCQUNILFdBQVcsRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO2dCQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxLQUFLLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVU7WUFBRSxNQUFNO1FBQ3JDLElBQUksSUFBSSxVQUFVLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsUUFBUSxFQUFFLGFBQWEsRUFBRSxrQkFBa0I7Q0FDNUMsQ0FBQyJ9
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = syncOrderRequestErp;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const sync_sale_return_to_erp_1 = require("../workflows/orders/workflows/sync-sale-return-to-erp");
7
+ const BATCH_SIZE = 50;
8
+ async function syncOrderRequestErp(container) {
9
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
10
+ const erpService = container.resolve("erp");
11
+ const healthy = await erpService.checkServiceHealth();
12
+ if (!healthy) {
13
+ logger.warn("[sync-order-request-erp] ERP service unavailable, skipping sync");
14
+ return;
15
+ }
16
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
17
+ let skip = 0;
18
+ let totalSynced = 0;
19
+ while (true) {
20
+ const { data: batch } = await query.graph({
21
+ entity: "order_request",
22
+ fields: ["*", "items.*"],
23
+ filters: { status: "approved" },
24
+ pagination: { skip, take: BATCH_SIZE },
25
+ });
26
+ if (!batch?.length)
27
+ break;
28
+ // Filter those not yet synced
29
+ const unsynced = batch.filter((req) => req?.metadata?.sync_status !== "synced" && !req?.metadata?.external_id);
30
+ for (const req of unsynced) {
31
+ try {
32
+ await (0, sync_sale_return_to_erp_1.syncSaleReturnToErpWorkflow)(container).run({
33
+ input: {
34
+ order_id: req.order_id,
35
+ request_id: req.id,
36
+ request_items: req.items ?? [],
37
+ customer_note: req.note ?? "",
38
+ },
39
+ });
40
+ totalSynced++;
41
+ logger.info(`[sync-order-request-erp] Synced order request ${req.id}`);
42
+ }
43
+ catch (err) {
44
+ logger.error(`[sync-order-request-erp] Failed for order request ${req.id}: ${err?.message}`);
45
+ }
46
+ }
47
+ if (batch.length < BATCH_SIZE)
48
+ break;
49
+ skip += BATCH_SIZE;
50
+ }
51
+ logger.info(`[sync-order-request-erp] Done. Total synced: ${totalSynced}`);
52
+ }
53
+ exports.config = {
54
+ name: "sync-order-request-erp",
55
+ schedule: "*/10 * * * *", // Every 10 minutes
56
+ };
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1vcmRlci1yZXF1ZXN0LWVycC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3N5bmMtb3JkZXItcmVxdWVzdC1lcnAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0Esc0NBdURDO0FBN0RELHFEQUFzRTtBQUV0RSxtR0FBb0c7QUFFcEcsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBRVAsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFNBQTBCO0lBQzFFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxVQUFVLEdBQWUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3RELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUVBQWlFLENBQUMsQ0FBQztRQUMvRSxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN4QyxNQUFNLEVBQUUsZUFBZTtZQUN2QixNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUU7WUFDL0IsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7U0FDdkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNO1lBQUUsTUFBTTtRQUUxQiw4QkFBOEI7UUFDOUIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUNYLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxLQUFLLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUN6RSxDQUFDO1FBRUYsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFBLHFEQUEyQixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDL0MsS0FBSyxFQUFFO3dCQUNMLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTt3QkFDdEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFO3dCQUNsQixhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO3dCQUM5QixhQUFhLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFO3FCQUM5QjtpQkFDRixDQUFDLENBQUM7Z0JBQ0gsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxpREFBaUQsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQyxLQUFLLENBQ1YscURBQXFELEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUMvRSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVTtZQUFFLE1BQU07UUFDckMsSUFBSSxJQUFJLFVBQVUsQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLHdCQUF3QjtJQUM5QixRQUFRLEVBQUUsY0FBYyxFQUFFLG1CQUFtQjtDQUM5QyxDQUFDIn0=
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = syncUrdPurchaseErp;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const sync_old_gold_to_erp_1 = require("../workflows/orders/workflows/sync-old-gold-to-erp");
7
+ async function syncUrdPurchaseErp(container) {
8
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
9
+ const erpService = container.resolve("erp");
10
+ const healthy = await erpService.checkServiceHealth();
11
+ if (!healthy) {
12
+ logger.warn("[sync-urd-purchase-erp] ERP service unavailable, skipping sync");
13
+ return;
14
+ }
15
+ const oldGoldService = container.resolve("old_gold");
16
+ // List old gold entries not yet synced to ERP (sync_erp: false) and not from ERP source
17
+ const entries = await oldGoldService.listOldGoldEntries({ sync_erp: false });
18
+ const toSync = (entries ?? []).filter((entry) => entry.source !== "erp");
19
+ logger.info(`[sync-urd-purchase-erp] Found ${toSync.length} unsynced URD/old-gold entries`);
20
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
21
+ for (const entry of toSync) {
22
+ try {
23
+ // Resolve party_no from customer if customer_id present
24
+ let partyNo;
25
+ if (entry.customer_id) {
26
+ try {
27
+ const { data: customers } = await query.graph({
28
+ entity: "customer",
29
+ fields: ["extended_customer.*"],
30
+ filters: { id: entry.customer_id },
31
+ });
32
+ const extId = customers?.[0]?.extended_customer?.external_id;
33
+ if (extId)
34
+ partyNo = String(extId).trim();
35
+ }
36
+ catch {
37
+ // ignore, partyNo stays undefined
38
+ }
39
+ }
40
+ await (0, sync_old_gold_to_erp_1.syncOldGoldToErpWorkflow)(container).run({
41
+ input: {
42
+ old_gold_entry: {
43
+ id: entry.id,
44
+ reference_number: entry.reference_number ?? null,
45
+ customer_name: entry.customer_name ?? "",
46
+ customer_phone: entry.customer_phone ?? null,
47
+ customer_id: entry.customer_id ?? null,
48
+ staff_name: entry.staff_name ?? null,
49
+ staff_id: entry.staff_id ?? null,
50
+ staff_party_no: entry.staff_party_no ?? null,
51
+ branch_id: entry.branch_id ?? null,
52
+ store_id: entry.store_id ?? null,
53
+ metal_purity: entry.metal_purity ?? "",
54
+ net_weight_gms: Number(entry.net_weight_gms) || 0,
55
+ item_description: entry.item_description ?? "",
56
+ item_code: entry.item_code ?? null,
57
+ item_name: entry.item_name ?? null,
58
+ rate_per_gms: Number(entry.rate_per_gms) || 0,
59
+ total_amount: Number(entry.total_amount) || 0,
60
+ pieces: entry.pieces ?? null,
61
+ staff_notes: entry.staff_notes ?? null,
62
+ created_at: entry.created_at ? new Date(entry.created_at).toISOString() : null,
63
+ },
64
+ party_no: partyNo,
65
+ },
66
+ });
67
+ logger.info(`[sync-urd-purchase-erp] Synced old gold entry ${entry.id}`);
68
+ }
69
+ catch (err) {
70
+ logger.error(`[sync-urd-purchase-erp] Failed for entry ${entry.id}: ${err?.message}`);
71
+ }
72
+ }
73
+ }
74
+ exports.config = {
75
+ name: "sync-urd-purchase-erp",
76
+ schedule: "*/10 * * * *", // Every 10 minutes
77
+ };
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy11cmQtcHVyY2hhc2UtZXJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvc3luYy11cmQtcHVyY2hhc2UtZXJwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLHFDQTBFQztBQTlFRCxxREFBc0U7QUFFdEUsNkZBQThGO0FBRS9FLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxTQUEwQjtJQUN6RSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLE1BQU0sVUFBVSxHQUFlLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUN0RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDOUUsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBUSxDQUFDO0lBRTVELHdGQUF3RjtJQUN4RixNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sTUFBTSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDbkMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUN2QyxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLENBQUMsQ0FBQztJQUU1RixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lB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
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260401051011 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260401051011 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "book_list" add column if not exists "book_prefix" text null;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "book_list" drop column if exists "book_prefix";`);
11
+ }
12
+ }
13
+ exports.Migration20260401051011 = Migration20260401051011;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDEwNTEwMTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9ib29rLWxpc3QvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MDQwMTA1MTAxMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUUzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMscUZBQXFGLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7Q0FFRjtBQVZELDBEQVVDIn0=
@@ -8,5 +8,6 @@ exports.BookList = utils_1.model.define("book_list", {
8
8
  book_name: utils_1.model.text(),
9
9
  branch_no: utils_1.model.text(),
10
10
  type: utils_1.model.text(),
11
+ book_prefix: utils_1.model.text().nullable(),
11
12
  });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vay1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvYm9vay1saXN0L21vZGVscy9ib29rLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBRXJDLFFBQUEsUUFBUSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO0lBQ2hELEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLE9BQU8sRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFO0lBQ3ZCLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3ZCLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3ZCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0NBQ25CLENBQUMsQ0FBQyJ9
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vay1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvYm9vay1saXN0L21vZGVscy9ib29rLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBRXJDLFFBQUEsUUFBUSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO0lBQ2hELEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLE9BQU8sRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFO0lBQ3ZCLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3ZCLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3ZCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2xCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3JDLENBQUMsQ0FBQyJ9