@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.
- package/.medusa/server/src/api/admin/masters/utils.js +29 -1
- package/.medusa/server/src/api/pos/generate-invoice/route.js +92 -355
- package/.medusa/server/src/jobs/sync-customer-advance-payment-erp.js +103 -0
- package/.medusa/server/src/jobs/sync-customer-erp.js +113 -0
- package/.medusa/server/src/jobs/sync-order-erp.js +42 -20
- package/.medusa/server/src/jobs/sync-order-request-erp.js +57 -0
- package/.medusa/server/src/jobs/sync-urd-purchase-erp.js +78 -0
- package/.medusa/server/src/modules/book-list/migrations/Migration20260401051011.js +14 -0
- package/.medusa/server/src/modules/book-list/models/book-list.js +2 -1
- package/.medusa/server/src/modules/erp/service.js +16 -1
- package/.medusa/server/src/workflows/book-list/steps/create-or-update-book-list.js +6 -2
- package/.medusa/server/src/workflows/inward-master/helper/index.js +17 -8
- package/.medusa/server/src/workflows/inward-master/workflows/create-inward.js +2 -18
- package/.medusa/server/src/workflows/inward-master/workflows/delete-inward.js +4 -4
- package/.medusa/server/src/workflows/inward-master/workflows/update-instock.js +2 -1
- package/.medusa/server/src/workflows/orders/steps/sync-sale-return-to-erp-step.js +18 -2
- package/.medusa/server/src/workflows/orders/utils/order-request-helper.js +21 -8
- package/.medusa/server/src/workflows/orders/workflows/index.js +2 -1
- package/.medusa/server/src/workflows/orders/workflows/sync-sale-return-to-erp.js +11 -0
- package/.medusa/server/src/workflows/sale-return-master/steps/process-sale-return-from-webhook.js +2 -2
- 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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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,
|
|
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,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vay1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvYm9vay1saXN0L21vZGVscy9ib29rLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBRXJDLFFBQUEsUUFBUSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO0lBQ2hELEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLE9BQU8sRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFO0lBQ3ZCLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3ZCLFNBQVMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3ZCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2xCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3JDLENBQUMsQ0FBQyJ9
|