@devx-commerce/plugin-gati 0.0.34-beta.24 → 0.0.34-beta.26
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/pos/customer-ledger/middleware.js +13 -0
- package/.medusa/server/src/api/pos/customer-ledger/route.js +50 -0
- package/.medusa/server/src/api/pos/generate-invoice/route.js +427 -0
- package/.medusa/server/src/api/pos/gold-rate/route.js +15 -9
- package/.medusa/server/src/api/pos/middleware.js +5 -1
- package/.medusa/server/src/api/pos/wallet-balance/middleware.js +13 -0
- package/.medusa/server/src/api/pos/wallet-balance/route.js +68 -0
- package/.medusa/server/src/jobs/sync-book-list-and-applicable-policy.js +77 -0
- package/.medusa/server/src/jobs/sync-labour-chart-master.js +20 -0
- package/.medusa/server/src/jobs/sync-order-erp.js +2 -2
- package/.medusa/server/src/jobs/sync-payment-book-master.js +63 -0
- package/.medusa/server/src/jobs/sync-rate-chart-master.js +20 -0
- package/.medusa/server/src/jobs/sync-report-master.js +40 -0
- package/.medusa/server/src/jobs/sync-sale-return-policy-master.js +29 -0
- package/.medusa/server/src/links/jewel-trans-master.js +13 -0
- package/.medusa/server/src/links/order-master.js +13 -0
- package/.medusa/server/src/modules/applicable-sale-return-policy/index.js +13 -0
- package/.medusa/server/src/modules/applicable-sale-return-policy/migrations/Migration20260123083526.js +15 -0
- package/.medusa/server/src/modules/applicable-sale-return-policy/models/applicable-sale-return-policy.js +23 -0
- package/.medusa/server/src/modules/applicable-sale-return-policy/service.js +10 -0
- package/.medusa/server/src/modules/book-list/index.js +13 -0
- package/.medusa/server/src/modules/book-list/migrations/Migration20260123083525.js +15 -0
- package/.medusa/server/src/modules/book-list/models/book-list.js +12 -0
- package/.medusa/server/src/modules/book-list/service.js +10 -0
- package/.medusa/server/src/modules/customer-receive-voucher/index.js +13 -0
- package/.medusa/server/src/modules/customer-receive-voucher/migrations/Migration20250115000000.js +51 -0
- package/.medusa/server/src/modules/customer-receive-voucher/migrations/Migration20260106050934.js +18 -0
- package/.medusa/server/src/modules/customer-receive-voucher/models/customer-receive-voucher.js +35 -0
- package/.medusa/server/src/modules/customer-receive-voucher/service.js +10 -0
- package/.medusa/server/src/modules/erp/service.js +416 -8
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251210112341.js +18 -0
- package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +2 -2
- package/.medusa/server/src/modules/jewel-trans-master/index.js +13 -0
- package/.medusa/server/src/modules/jewel-trans-master/migrations/Migration20260101104355.js +51 -0
- package/.medusa/server/src/modules/jewel-trans-master/models/jewel-trans-master.js +151 -0
- package/.medusa/server/src/modules/jewel-trans-master/service.js +16 -0
- package/.medusa/server/src/modules/labour-chart-master/index.js +13 -0
- package/.medusa/server/src/modules/labour-chart-master/migrations/Migration20260101081502.js +15 -0
- package/.medusa/server/src/modules/labour-chart-master/models/labour-chart-master.js +16 -0
- package/.medusa/server/src/modules/labour-chart-master/service.js +10 -0
- package/.medusa/server/src/modules/order-master/index.js +13 -0
- package/.medusa/server/src/modules/order-master/migrations/Migration20251204071941.js +27 -0
- package/.medusa/server/src/modules/order-master/models/order-master.js +97 -0
- package/.medusa/server/src/modules/order-master/service.js +12 -0
- package/.medusa/server/src/modules/payment-book-master/index.js +13 -0
- package/.medusa/server/src/modules/payment-book-master/migrations/Migration20251203105358.js +15 -0
- package/.medusa/server/src/modules/payment-book-master/models/payment-book-master.js +12 -0
- package/.medusa/server/src/modules/payment-book-master/service.js +10 -0
- package/.medusa/server/src/modules/rate-chart-master/index.js +13 -0
- package/.medusa/server/src/modules/rate-chart-master/migrations/Migration20260101081500.js +15 -0
- package/.medusa/server/src/modules/rate-chart-master/models/rate-chart-master.js +13 -0
- package/.medusa/server/src/modules/rate-chart-master/service.js +10 -0
- package/.medusa/server/src/modules/report-master/index.js +13 -0
- package/.medusa/server/src/modules/report-master/migrations/Migration20260121060955.js +15 -0
- package/.medusa/server/src/modules/report-master/migrations/Migration20260121112624.js +15 -0
- package/.medusa/server/src/modules/report-master/models/report-master.js +12 -0
- package/.medusa/server/src/modules/report-master/service.js +10 -0
- package/.medusa/server/src/modules/sale-return-policy-master/index.js +13 -0
- package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260105061449.js +21 -0
- package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260129084920.js +14 -0
- package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260129085620.js +20 -0
- package/.medusa/server/src/modules/sale-return-policy-master/models/sale-return-policy-master.js +37 -0
- package/.medusa/server/src/modules/sale-return-policy-master/service.js +12 -0
- package/.medusa/server/src/subscribers/order-item-update.js +11 -0
- package/.medusa/server/src/subscribers/shipping-info-master.js +3 -3
- package/.medusa/server/src/utils/state-helper.js +3 -2
- package/.medusa/server/src/workflows/applicable-sale-return-policy/index.js +11 -0
- package/.medusa/server/src/workflows/applicable-sale-return-policy/steps/create-or-update-applicable-sale-return-policy.js +74 -0
- package/.medusa/server/src/workflows/applicable-sale-return-policy/steps/fetch-applicable-sale-return-policy.js +64 -0
- package/.medusa/server/src/workflows/book-list/index.js +11 -0
- package/.medusa/server/src/workflows/book-list/steps/create-or-update-book-list.js +55 -0
- package/.medusa/server/src/workflows/book-list/steps/fetch-book-list.js +64 -0
- package/.medusa/server/src/workflows/customer-advance-payment/index.js +18 -0
- package/.medusa/server/src/workflows/customer-advance-payment/steps/create-receive-voucher.js +71 -0
- package/.medusa/server/src/workflows/customer-advance-payment/steps/index.js +18 -0
- package/.medusa/server/src/workflows/customer-advance-payment/workflows/create-receive-voucher-workflow.js +11 -0
- package/.medusa/server/src/workflows/customer-advance-payment/workflows/index.js +18 -0
- package/.medusa/server/src/workflows/index.js +2 -1
- package/.medusa/server/src/workflows/jewel-trans-master/index.js +18 -0
- package/.medusa/server/src/workflows/jewel-trans-master/steps/create-or-update-jewel-trans-master.js +370 -0
- package/.medusa/server/src/workflows/jewel-trans-master/steps/index.js +18 -0
- package/.medusa/server/src/workflows/labour-chart-master/index.js +11 -0
- package/.medusa/server/src/workflows/labour-chart-master/steps/create-or-update-labour-chart-master.js +38 -0
- package/.medusa/server/src/workflows/labour-chart-master/steps/fetch-labour-chart.js +31 -0
- package/.medusa/server/src/workflows/order-master/index.js +3 -0
- package/.medusa/server/src/workflows/order-master/steps/create-or-update-order-master.js +239 -0
- package/.medusa/server/src/workflows/orders/steps/find-nearest-pincodes-step.js +336 -0
- package/.medusa/server/src/workflows/orders/steps/get-today-gold-rate-step.js +77 -0
- package/.medusa/server/src/workflows/orders/steps/index.js +13 -1
- package/.medusa/server/src/workflows/orders/steps/sync-advance-payment-to-erp-step.js +185 -0
- package/.medusa/server/src/workflows/orders/steps/sync-buyback-to-erp-step.js +99 -0
- package/.medusa/server/src/workflows/orders/steps/sync-cancel-to-erp-step.js +90 -0
- package/.medusa/server/src/workflows/orders/steps/sync-exchange-to-erp-step.js +101 -0
- package/.medusa/server/src/workflows/orders/steps/sync-order-to-erp.js +879 -13
- package/.medusa/server/src/workflows/orders/steps/sync-sale-return-to-erp-step.js +98 -0
- package/.medusa/server/src/workflows/orders/utils/order-helper.js +116 -28
- package/.medusa/server/src/workflows/orders/utils/order-request-helper.js +184 -0
- package/.medusa/server/src/workflows/orders/workflows/get-today-gold-rate.js +10 -0
- package/.medusa/server/src/workflows/orders/workflows/index.js +2 -1
- package/.medusa/server/src/workflows/orders/workflows/sync-advanve-payment-to-erp.js +21 -0
- package/.medusa/server/src/workflows/orders/workflows/sync-order-to-erp.js +28 -4
- package/.medusa/server/src/workflows/party-master/steps/create-customer-erp.js +8 -2
- package/.medusa/server/src/workflows/payment-book-master/index.js +11 -0
- package/.medusa/server/src/workflows/payment-book-master/steps/create-or-update-payment-book-master.js +31 -0
- package/.medusa/server/src/workflows/payment-book-master/steps/fetch-payment-book.js +64 -0
- package/.medusa/server/src/workflows/rate-chart-master/index.js +11 -0
- package/.medusa/server/src/workflows/rate-chart-master/steps/create-or-update-rate-chart-master.js +27 -0
- package/.medusa/server/src/workflows/rate-chart-master/steps/fetch-rate-chart.js +31 -0
- package/.medusa/server/src/workflows/report-master/index.js +11 -0
- package/.medusa/server/src/workflows/report-master/steps/create-or-update-report-master.js +53 -0
- package/.medusa/server/src/workflows/report-master/steps/fetch-report.js +71 -0
- package/.medusa/server/src/workflows/sale-return-policy-master/index.js +11 -0
- package/.medusa/server/src/workflows/sale-return-policy-master/steps/create-or-update-sale-return-policy-master.js +91 -0
- package/.medusa/server/src/workflows/sale-return-policy-master/steps/fetch-sale-return-policy.js +31 -0
- package/package.json +2 -1
- package/.medusa/server/development/erp-order-payload-example.js +0 -76
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const http_1 = require("@medusajs/framework/http");
|
|
4
|
+
exports.default = (0, http_1.defineMiddlewares)({
|
|
5
|
+
routes: [
|
|
6
|
+
{
|
|
7
|
+
matcher: "/store/customer-ledger",
|
|
8
|
+
method: "GET",
|
|
9
|
+
middlewares: [],
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvcG9zL2N1c3RvbWVyLWxlZGdlci9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBRWtDO0FBRWxDLGtCQUFlLElBQUEsd0JBQWlCLEVBQUM7SUFDL0IsTUFBTSxFQUFFO1FBQ047WUFDRSxPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsV0FBVyxFQUFFLEVBQUU7U0FDaEI7S0FDRjtDQUNGLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const api_response_1 = require("../../../lib/api-response");
|
|
6
|
+
const erp_1 = require("../../../modules/erp");
|
|
7
|
+
const GET = async (req, res) => {
|
|
8
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
9
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
10
|
+
try {
|
|
11
|
+
const { customer_id } = req.query;
|
|
12
|
+
if (!customer_id) {
|
|
13
|
+
logger.error("[POS-CUSTOMER-LEDGER] : Missing customer_id parameter");
|
|
14
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("customer_id parameter is required", api_response_1.HttpStatus.BAD_REQUEST, api_response_1.ErrorCode.VALIDATION_ERROR));
|
|
15
|
+
}
|
|
16
|
+
logger.info(`[POS-CUSTOMER-LEDGER] : Fetching extended customer for customer_id: ${customer_id}`);
|
|
17
|
+
// Fetch customer with extended_customer
|
|
18
|
+
const { data: customerData } = await query.graph({
|
|
19
|
+
entity: "customer",
|
|
20
|
+
fields: ["*", "extended_customer.*"],
|
|
21
|
+
filters: {
|
|
22
|
+
id: customer_id,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
const customer = customerData?.[0];
|
|
26
|
+
// const transactionid = "0004000639"
|
|
27
|
+
const transactionid = customer?.extended_customer?.external_id;
|
|
28
|
+
if (!transactionid) {
|
|
29
|
+
logger.error(`[POS-CUSTOMER-LEDGER] : No external_id found for customer_id: ${customer_id}`);
|
|
30
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Customer external_id not found. Customer may not be synced with ERP.", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
|
|
31
|
+
}
|
|
32
|
+
logger.info(`[POS-CUSTOMER-LEDGER] : Fetching customer ledger data for transaction ID: ${transactionid} (customer_id: ${customer_id})`);
|
|
33
|
+
const erpService = req.scope.resolve(erp_1.ERP_MODULE);
|
|
34
|
+
const ledgerData = (await erpService.getMasterData("CustomerLedger", transactionid));
|
|
35
|
+
if (!ledgerData || !Array.isArray(ledgerData)) {
|
|
36
|
+
logger.error(`[POS-CUSTOMER-LEDGER] : Invalid response format from ERP for transaction ID: ${transactionid}`);
|
|
37
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Invalid response format from ERP", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
|
|
38
|
+
}
|
|
39
|
+
logger.info(`[POS-CUSTOMER-LEDGER] : Successfully fetched ${ledgerData.length} ledger entries for transaction ID: ${transactionid}`);
|
|
40
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(ledgerData, "Customer ledger fetched successfully"));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
44
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
45
|
+
logger.error(`[POS-CUSTOMER-LEDGER] : Error fetching customer ledger - ${errorMessage}${errorStack ? `\nStack: ${errorStack}` : ""}`);
|
|
46
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(error instanceof Error ? error.message : "Internal server error", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.GET = GET;
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3Bvcy9jdXN0b21lci1sZWRnZXIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXNFO0FBQ3RFLDREQU1tQztBQUVuQyw4Q0FBa0Q7QUFrQjNDLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBaUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sSUFBQSw4QkFBZSxFQUNwQixHQUFHLEVBQ0gsSUFBQSxrQ0FBbUIsRUFDakIsbUNBQW1DLEVBQ25DLHlCQUFVLENBQUMsV0FBVyxFQUN0Qix3QkFBUyxDQUFDLGdCQUFnQixDQUMzQixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FDVCx1RUFBdUUsV0FBVyxFQUFFLENBQ3JGLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDL0MsTUFBTSxFQUFFLFVBQVU7WUFDbEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDO1lBQ3BDLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEVBQUUs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
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const api_response_1 = require("../../../lib/api-response");
|
|
6
|
+
const erp_1 = require("../../../modules/erp");
|
|
7
|
+
const jewel_trans_master_1 = require("../../../modules/jewel-trans-master");
|
|
8
|
+
const order_master_1 = require("../../../modules/order-master");
|
|
9
|
+
const GET = async (req, res) => {
|
|
10
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
11
|
+
try {
|
|
12
|
+
logger.info("[POS-GENERATE-INVOICE] : Generating invoice file");
|
|
13
|
+
const { FileFor, FileType, order_id } = req.query;
|
|
14
|
+
// Validate required parameters
|
|
15
|
+
if (!FileFor || !FileType || !order_id) {
|
|
16
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Missing required parameters: FileFor, FileType, order_id", api_response_1.HttpStatus.BAD_REQUEST, api_response_1.ErrorCode.VALIDATION_ERROR));
|
|
17
|
+
}
|
|
18
|
+
// Validate FileFor
|
|
19
|
+
const normalizedFileFor = FileFor.toLowerCase();
|
|
20
|
+
if (normalizedFileFor !== "sale" && normalizedFileFor !== "order") {
|
|
21
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("FileFor must be 'Sale' or 'Order'", api_response_1.HttpStatus.BAD_REQUEST, api_response_1.ErrorCode.VALIDATION_ERROR));
|
|
22
|
+
}
|
|
23
|
+
// Validate FileType
|
|
24
|
+
const normalizedFileType = FileType.toLowerCase();
|
|
25
|
+
if (!["pdf", "xls", "xlsx"].includes(normalizedFileType)) {
|
|
26
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("FileType must be 'pdf', 'xls', or 'xlsx'", api_response_1.HttpStatus.BAD_REQUEST, api_response_1.ErrorCode.VALIDATION_ERROR));
|
|
27
|
+
}
|
|
28
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
29
|
+
const link = req.scope.resolve("link");
|
|
30
|
+
const erpService = req.scope.resolve(erp_1.ERP_MODULE);
|
|
31
|
+
// Fetch order
|
|
32
|
+
const { data: orderData } = await query.graph({
|
|
33
|
+
entity: "order",
|
|
34
|
+
fields: [
|
|
35
|
+
"id",
|
|
36
|
+
"customer_id",
|
|
37
|
+
"metadata",
|
|
38
|
+
"customer.*",
|
|
39
|
+
"customer.extended_customer.*",
|
|
40
|
+
],
|
|
41
|
+
filters: { id: order_id },
|
|
42
|
+
});
|
|
43
|
+
const order = orderData?.[0];
|
|
44
|
+
if (!order) {
|
|
45
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Order not found", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND_ERROR));
|
|
46
|
+
}
|
|
47
|
+
logger.info(`[POS-GENERATE-INVOICE] : Order found - OrderId: ${order_id}`);
|
|
48
|
+
// Get branch number from order_master
|
|
49
|
+
let branchNo = "";
|
|
50
|
+
let orderMasterRecord = null;
|
|
51
|
+
try {
|
|
52
|
+
logger.info(`[POS-GENERATE-INVOICE] : Fetching order_master for branch number`);
|
|
53
|
+
// Method 1: Try via link module
|
|
54
|
+
try {
|
|
55
|
+
const linkedData = await link.list({
|
|
56
|
+
[utils_1.Modules.ORDER]: { order_id: order_id },
|
|
57
|
+
[order_master_1.ORDER_MASTER_MODULE]: {},
|
|
58
|
+
});
|
|
59
|
+
logger.info(`[POS-GENERATE-INVOICE] : Order_master link data found: ${linkedData?.length || 0} links`);
|
|
60
|
+
if (linkedData && linkedData.length > 0) {
|
|
61
|
+
const orderMasterId = linkedData[0][order_master_1.ORDER_MASTER_MODULE]?.order_master_id;
|
|
62
|
+
if (orderMasterId) {
|
|
63
|
+
const { data: orderMasterData } = await query.graph({
|
|
64
|
+
entity: "order_master",
|
|
65
|
+
fields: ["id", "branch_no", "erp_order_id", "order_no"],
|
|
66
|
+
filters: { id: orderMasterId },
|
|
67
|
+
});
|
|
68
|
+
orderMasterRecord = orderMasterData?.[0];
|
|
69
|
+
logger.info(`[POS-GENERATE-INVOICE] : OrderMaster data from link: ${JSON.stringify(orderMasterRecord)}`);
|
|
70
|
+
if (orderMasterRecord?.branch_no) {
|
|
71
|
+
branchNo = orderMasterRecord.branch_no;
|
|
72
|
+
logger.info(`[POS-GENERATE-INVOICE] : Got branch_no from order_master: ${branchNo}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching order_master via link - ${error}`);
|
|
79
|
+
}
|
|
80
|
+
// Method 2: Fallback - query.graph directly by order_id
|
|
81
|
+
if (!branchNo) {
|
|
82
|
+
try {
|
|
83
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 2 - Trying query.graph for order_master`);
|
|
84
|
+
const { data: orderMasterData } = await query.graph({
|
|
85
|
+
entity: "order_master",
|
|
86
|
+
fields: ["id", "branch_no", "erp_order_id", "order_no"],
|
|
87
|
+
filters: { order_id: order_id },
|
|
88
|
+
});
|
|
89
|
+
orderMasterRecord = orderMasterData?.[0];
|
|
90
|
+
logger.info(`[POS-GENERATE-INVOICE] : OrderMaster data from query.graph: ${JSON.stringify(orderMasterRecord)}`);
|
|
91
|
+
if (orderMasterRecord?.branch_no) {
|
|
92
|
+
branchNo = orderMasterRecord.branch_no;
|
|
93
|
+
logger.info(`[POS-GENERATE-INVOICE] : Got branch_no from query.graph: ${branchNo}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching order_master via query.graph - ${error}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Method 3: Fallback - get from party_master
|
|
101
|
+
if (!branchNo) {
|
|
102
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 3 - Trying party_master for branch number`);
|
|
103
|
+
const customer = order.customer;
|
|
104
|
+
if (customer?.extended_customer?.external_id) {
|
|
105
|
+
const { data: partyData } = await query.graph({
|
|
106
|
+
entity: "party_master",
|
|
107
|
+
fields: ["branch_no", "party_no"],
|
|
108
|
+
filters: {
|
|
109
|
+
party_no: customer.extended_customer.external_id,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
const partyMaster = partyData?.[0];
|
|
113
|
+
if (partyMaster?.branch_no) {
|
|
114
|
+
branchNo = partyMaster.branch_no;
|
|
115
|
+
logger.info(`[POS-GENERATE-INVOICE] : Got branch_no from party_master: ${branchNo}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching branch number - ${error}`);
|
|
122
|
+
}
|
|
123
|
+
if (!branchNo) {
|
|
124
|
+
logger.error(`[POS-GENERATE-INVOICE] : Branch number not found for order ${order_id}`);
|
|
125
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Branch number not found in order_master. Please ensure the order has been synced to ERP.", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND_ERROR));
|
|
126
|
+
}
|
|
127
|
+
// Get transaction ID based on FileFor
|
|
128
|
+
let transactionId = null;
|
|
129
|
+
if (normalizedFileFor === "sale") {
|
|
130
|
+
// For Sale: Get JewelTransId from jewel_trans_master
|
|
131
|
+
// Try multiple methods to find the transaction ID
|
|
132
|
+
logger.info(`[POS-GENERATE-INVOICE] : Searching for JewelTransId for order ${order_id}`);
|
|
133
|
+
// Method 1: Try via link module
|
|
134
|
+
try {
|
|
135
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 1 - Trying link module`);
|
|
136
|
+
const linkedData = await link.list({
|
|
137
|
+
[utils_1.Modules.ORDER]: { order_id: order_id },
|
|
138
|
+
[jewel_trans_master_1.JEWEL_TRANS_MASTER_MODULE]: {},
|
|
139
|
+
});
|
|
140
|
+
logger.info(`[POS-GENERATE-INVOICE] : Link data found: ${linkedData?.length || 0} links`);
|
|
141
|
+
if (linkedData && linkedData.length > 0) {
|
|
142
|
+
const jewelTransMasterId = linkedData[0][jewel_trans_master_1.JEWEL_TRANS_MASTER_MODULE]?.jewel_trans_master_id;
|
|
143
|
+
logger.info(`[POS-GENERATE-INVOICE] : JewelTransMasterId from link: ${jewelTransMasterId}`);
|
|
144
|
+
if (jewelTransMasterId) {
|
|
145
|
+
const { data: jewelTransData } = await query.graph({
|
|
146
|
+
entity: "jewel_trans_master",
|
|
147
|
+
fields: ["erp_jewel_trans_id"],
|
|
148
|
+
filters: { id: jewelTransMasterId },
|
|
149
|
+
});
|
|
150
|
+
const jewelTransMaster = jewelTransData?.[0];
|
|
151
|
+
logger.info(`[POS-GENERATE-INVOICE] : JewelTransMaster data: ${JSON.stringify(jewelTransMaster)}`);
|
|
152
|
+
if (jewelTransMaster?.erp_jewel_trans_id) {
|
|
153
|
+
transactionId = String(jewelTransMaster.erp_jewel_trans_id);
|
|
154
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found JewelTransId via link: ${transactionId}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching jewel_trans_master via link - ${error}`);
|
|
161
|
+
}
|
|
162
|
+
// Method 2: Try using service directly by party_no
|
|
163
|
+
if (!transactionId && order.customer?.extended_customer?.external_id) {
|
|
164
|
+
try {
|
|
165
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 2 - Trying service by party_no`);
|
|
166
|
+
const partyNo = order.customer.extended_customer.external_id;
|
|
167
|
+
logger.info(`[POS-GENERATE-INVOICE] : PartyNo: ${partyNo}`);
|
|
168
|
+
const jewelTransMasterService = req.scope.resolve(jewel_trans_master_1.JEWEL_TRANS_MASTER_MODULE);
|
|
169
|
+
const jewelTransMasters = await jewelTransMasterService.listJewelTransMasters({
|
|
170
|
+
party_no: partyNo,
|
|
171
|
+
});
|
|
172
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found ${jewelTransMasters?.length || 0} jewel_trans_masters for party_no`);
|
|
173
|
+
if (jewelTransMasters && jewelTransMasters.length > 0) {
|
|
174
|
+
// Sort by date descending and get the most recent one with erp_jewel_trans_id
|
|
175
|
+
const sorted = jewelTransMasters
|
|
176
|
+
.filter((item) => item.erp_jewel_trans_id)
|
|
177
|
+
.sort((a, b) => {
|
|
178
|
+
const dateA = new Date(a.jewel_trans_date || 0).getTime();
|
|
179
|
+
const dateB = new Date(b.jewel_trans_date || 0).getTime();
|
|
180
|
+
return dateB - dateA;
|
|
181
|
+
});
|
|
182
|
+
if (sorted.length > 0) {
|
|
183
|
+
transactionId = String(sorted[0].erp_jewel_trans_id);
|
|
184
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found JewelTransId via service fallback (most recent): ${transactionId}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching jewel_trans_master via service - ${error}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Method 3: Try query.graph by party_no as fallback
|
|
193
|
+
if (!transactionId && order.customer?.extended_customer?.external_id) {
|
|
194
|
+
try {
|
|
195
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 3 - Trying query.graph by party_no`);
|
|
196
|
+
const partyNo = order.customer.extended_customer.external_id;
|
|
197
|
+
const { data: jewelTransData } = await query.graph({
|
|
198
|
+
entity: "jewel_trans_master",
|
|
199
|
+
fields: ["erp_jewel_trans_id", "jewel_trans_date"],
|
|
200
|
+
filters: {
|
|
201
|
+
party_no: partyNo,
|
|
202
|
+
},
|
|
203
|
+
pagination: {
|
|
204
|
+
skip: 0,
|
|
205
|
+
take: 10, // Get recent transactions
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
logger.info(`[POS-GENERATE-INVOICE] : Query.graph found ${jewelTransData?.length || 0} records`);
|
|
209
|
+
if (jewelTransData && jewelTransData.length > 0) {
|
|
210
|
+
// Sort by date descending and get the most recent one
|
|
211
|
+
const sorted = jewelTransData
|
|
212
|
+
.filter((item) => item.erp_jewel_trans_id)
|
|
213
|
+
.sort((a, b) => {
|
|
214
|
+
const dateA = new Date(a.jewel_trans_date || 0).getTime();
|
|
215
|
+
const dateB = new Date(b.jewel_trans_date || 0).getTime();
|
|
216
|
+
return dateB - dateA;
|
|
217
|
+
});
|
|
218
|
+
if (sorted.length > 0) {
|
|
219
|
+
transactionId = String(sorted[0].erp_jewel_trans_id);
|
|
220
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found JewelTransId via query.graph fallback (most recent): ${transactionId}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching jewel_trans_master via query.graph fallback - ${error}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Method 4: Check order metadata for stored jewel_trans_id
|
|
229
|
+
if (!transactionId && order.metadata) {
|
|
230
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 4 - Checking order metadata`);
|
|
231
|
+
logger.info(`[POS-GENERATE-INVOICE] : Order metadata: ${JSON.stringify(order.metadata)}`);
|
|
232
|
+
const metadataJewelTransId = order.metadata.jewel_trans_id ||
|
|
233
|
+
order.metadata.JewelTransId ||
|
|
234
|
+
order.metadata.jewelTransId;
|
|
235
|
+
if (metadataJewelTransId) {
|
|
236
|
+
transactionId = String(metadataJewelTransId);
|
|
237
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found JewelTransId from order metadata: ${transactionId}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (!transactionId) {
|
|
241
|
+
logger.error(`[POS-GENERATE-INVOICE] : All methods failed. Order ID: ${order_id}, Customer External ID: ${order.customer?.extended_customer?.external_id || 'N/A'}`);
|
|
242
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("JewelTransId not found. The sale may not be synced to ERP yet. Please ensure the order has been synced to ERP and try again.", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND_ERROR));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
// For Order: Get erp_order_id from order_master
|
|
247
|
+
logger.info(`[POS-GENERATE-INVOICE] : Searching for OrderId in order_master for order ${order_id}`);
|
|
248
|
+
// Method 1: Try via link module
|
|
249
|
+
try {
|
|
250
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 1 - Trying link module for order_master`);
|
|
251
|
+
const linkedData = await link.list({
|
|
252
|
+
[utils_1.Modules.ORDER]: { order_id: order_id },
|
|
253
|
+
[order_master_1.ORDER_MASTER_MODULE]: {},
|
|
254
|
+
});
|
|
255
|
+
logger.info(`[POS-GENERATE-INVOICE] : Order_master link data found: ${linkedData?.length || 0} links`);
|
|
256
|
+
if (linkedData && linkedData.length > 0) {
|
|
257
|
+
const orderMasterId = linkedData[0][order_master_1.ORDER_MASTER_MODULE]?.order_master_id;
|
|
258
|
+
logger.info(`[POS-GENERATE-INVOICE] : OrderMasterId from link: ${orderMasterId}`);
|
|
259
|
+
if (orderMasterId) {
|
|
260
|
+
const { data: orderMasterData } = await query.graph({
|
|
261
|
+
entity: "order_master",
|
|
262
|
+
fields: ["erp_order_id", "order_no"],
|
|
263
|
+
filters: { id: orderMasterId },
|
|
264
|
+
});
|
|
265
|
+
const orderMaster = orderMasterData?.[0];
|
|
266
|
+
logger.info(`[POS-GENERATE-INVOICE] : OrderMaster data: ${JSON.stringify(orderMaster)}`);
|
|
267
|
+
if (orderMaster?.erp_order_id) {
|
|
268
|
+
transactionId = String(orderMaster.erp_order_id);
|
|
269
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found OrderId via link: ${transactionId}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching order_master via link - ${error}`);
|
|
276
|
+
}
|
|
277
|
+
// Method 2: Try query.graph directly by medusa order_id
|
|
278
|
+
if (!transactionId) {
|
|
279
|
+
try {
|
|
280
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 2 - Trying query.graph with order_id`);
|
|
281
|
+
const { data: orderMasterData } = await query.graph({
|
|
282
|
+
entity: "order_master",
|
|
283
|
+
fields: ["erp_order_id", "order_no"],
|
|
284
|
+
filters: {
|
|
285
|
+
order_id: order_id,
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
logger.info(`[POS-GENERATE-INVOICE] : Query.graph found ${orderMasterData?.length || 0} order_master records`);
|
|
289
|
+
if (orderMasterData && orderMasterData.length > 0) {
|
|
290
|
+
const orderMaster = orderMasterData[0];
|
|
291
|
+
if (orderMaster?.erp_order_id) {
|
|
292
|
+
transactionId = String(orderMaster.erp_order_id);
|
|
293
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found OrderId via query.graph: ${transactionId}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching order_master via query.graph - ${error}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Method 3: Check order metadata for stored erp_order_id
|
|
302
|
+
if (!transactionId && order.metadata) {
|
|
303
|
+
try {
|
|
304
|
+
logger.info(`[POS-GENERATE-INVOICE] : Method 3 - Checking order metadata for erp_order_id`);
|
|
305
|
+
logger.info(`[POS-GENERATE-INVOICE] : Order metadata: ${JSON.stringify(order.metadata)}`);
|
|
306
|
+
const metadataOrderId = order.metadata.erp_order_id ||
|
|
307
|
+
order.metadata.OrderId ||
|
|
308
|
+
order.metadata.orderId;
|
|
309
|
+
if (metadataOrderId) {
|
|
310
|
+
transactionId = String(metadataOrderId);
|
|
311
|
+
logger.info(`[POS-GENERATE-INVOICE] : Found OrderId from order metadata: ${transactionId}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error checking order metadata - ${error}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (!transactionId) {
|
|
319
|
+
logger.error(`[POS-GENERATE-INVOICE] : All methods failed for order_master. Order ID: ${order_id}`);
|
|
320
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("OrderId not found. The order may not be synced to ERP yet. Please ensure the order has been synced to ERP and try again.", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND_ERROR));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Get ReportId from report_master table
|
|
324
|
+
const reportListFor = normalizedFileFor; // "sale" or "order"
|
|
325
|
+
let reportId = null;
|
|
326
|
+
let reportName = null;
|
|
327
|
+
try {
|
|
328
|
+
logger.info(`[POS-GENERATE-INVOICE] : Fetching report from report_master - BranchNo: ${branchNo}, ReportListFor: ${reportListFor}`);
|
|
329
|
+
const { data: reportMasterData } = await query.graph({
|
|
330
|
+
entity: "report_master",
|
|
331
|
+
fields: ["id", "report_id", "report_name", "branch_no", "report_list_for"],
|
|
332
|
+
filters: {
|
|
333
|
+
branch_no: branchNo,
|
|
334
|
+
report_list_for: reportListFor,
|
|
335
|
+
},
|
|
336
|
+
pagination: {
|
|
337
|
+
skip: 0,
|
|
338
|
+
take: 100, // Get all available reports for this branch
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
logger.info(`[POS-GENERATE-INVOICE] : Report_master query result - Found ${reportMasterData?.length || 0} reports: ${JSON.stringify(reportMasterData)}`);
|
|
342
|
+
if (reportMasterData && reportMasterData.length > 0) {
|
|
343
|
+
// Priority 1: Find report with "LetterHead" in the name (best for formatted invoices)
|
|
344
|
+
let selectedReport = reportMasterData.find((r) => r.report_name && r.report_name.toLowerCase().includes("letterhead"));
|
|
345
|
+
// Priority 2: Find report with "Invoice" in the name
|
|
346
|
+
if (!selectedReport) {
|
|
347
|
+
selectedReport = reportMasterData.find((r) => r.report_name && r.report_name.toLowerCase().includes("invoice"));
|
|
348
|
+
}
|
|
349
|
+
// Priority 3: Use the first report if no priority matches
|
|
350
|
+
if (!selectedReport) {
|
|
351
|
+
selectedReport = reportMasterData[0];
|
|
352
|
+
}
|
|
353
|
+
reportId = String(selectedReport.report_id);
|
|
354
|
+
reportName = selectedReport.report_name || "";
|
|
355
|
+
logger.info(`[POS-GENERATE-INVOICE] : Selected ReportId from ${reportMasterData.length} available reports - ReportId: ${reportId}, ReportName: ${reportName}`);
|
|
356
|
+
if (reportMasterData.length > 1) {
|
|
357
|
+
logger.info(`[POS-GENERATE-INVOICE] : Available reports: ${reportMasterData.map((r) => `${r.report_id}(${r.report_name})`).join(", ")}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
logger.warn(`[POS-GENERATE-INVOICE] : Error fetching report_master - ${error}`);
|
|
363
|
+
}
|
|
364
|
+
if (!reportId) {
|
|
365
|
+
logger.error(`[POS-GENERATE-INVOICE] : ReportId not found for BranchNo: ${branchNo}, ReportListFor: ${reportListFor}`);
|
|
366
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(`ReportId not found for ${reportListFor} in branch ${branchNo}. Please ensure reports are synced to report_master table.`, api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND_ERROR));
|
|
367
|
+
}
|
|
368
|
+
// Log the payload before calling GenerateFile API
|
|
369
|
+
const generateFilePayload = {
|
|
370
|
+
FileFor: FileFor,
|
|
371
|
+
FileType: FileType,
|
|
372
|
+
ReportId: reportId,
|
|
373
|
+
TransactionId: transactionId,
|
|
374
|
+
LetterHead: reportName || undefined, // Use report name as LetterHead
|
|
375
|
+
};
|
|
376
|
+
logger.info(`[POS-GENERATE-INVOICE] : Calling GenerateFile API with payload: ${JSON.stringify(generateFilePayload)}`);
|
|
377
|
+
logger.info(`[POS-GENERATE-INVOICE] : Additional info - BranchNo: ${branchNo}, ReportName: ${reportName}, OrderId: ${order_id}`);
|
|
378
|
+
logger.info(`[POS-GENERATE-INVOICE] : Request Headers - FileFor: ${FileFor}, FileType: ${FileType}, ReportId: ${reportId}, transactionid: ${transactionId}, LetterHead: ${reportName}`);
|
|
379
|
+
// Generate file
|
|
380
|
+
const result = await erpService.generateFile(generateFilePayload);
|
|
381
|
+
logger.info(`[POS-GENERATE-INVOICE] : GenerateFile API Response: ${JSON.stringify(result)}`);
|
|
382
|
+
logger.info(`[POS-GENERATE-INVOICE] : Response Status: ${result.status}, Message: ${result.message}`);
|
|
383
|
+
if (!result.status) {
|
|
384
|
+
logger.error(`[POS-GENERATE-INVOICE] : GenerateFile API failed - Status: ${result.status}, Message: ${result.message}, Payload: ${JSON.stringify(generateFilePayload)}`);
|
|
385
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(result.message || "Failed to generate invoice", api_response_1.HttpStatus.BAD_REQUEST, api_response_1.ErrorCode.VALIDATION_ERROR));
|
|
386
|
+
}
|
|
387
|
+
logger.info(`[POS-GENERATE-INVOICE] : Invoice generated successfully`);
|
|
388
|
+
logger.info(`[POS-GENERATE-INVOICE] : FileLink: ${result.data?.FileLink}`);
|
|
389
|
+
logger.info(`[POS-GENERATE-INVOICE] : Summary - OrderId: ${order_id}, FileFor: ${FileFor}, FileType: ${FileType}, ReportId: ${reportId}, ReportName: ${reportName}, TransactionId: ${transactionId}, BranchNo: ${branchNo}, LetterHead: ${reportName}`);
|
|
390
|
+
// Disable print option for PDF files
|
|
391
|
+
const responseData = { ...result.data };
|
|
392
|
+
if (FileType.toLowerCase() === "pdf" && responseData.FileLink) {
|
|
393
|
+
// Method 1: Add PDF viewer parameters to disable printing
|
|
394
|
+
// #toolbar=0 - hides the toolbar (removes print button)
|
|
395
|
+
// #navpanes=0 - hides navigation panes
|
|
396
|
+
// &embedded=true - embedded mode (further limits functionality)
|
|
397
|
+
let pdfLink = responseData.FileLink;
|
|
398
|
+
// Add parameters based on viewer type
|
|
399
|
+
if (pdfLink.includes("?")) {
|
|
400
|
+
pdfLink = `${pdfLink}&toolbar=0&navpanes=0`;
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
pdfLink = `${pdfLink}#toolbar=0&navpanes=0`;
|
|
404
|
+
}
|
|
405
|
+
responseData.FileLink = pdfLink;
|
|
406
|
+
logger.info(`[POS-GENERATE-INVOICE] : PDF print option disabled - Updated FileLink: ${responseData.FileLink}`);
|
|
407
|
+
// Method 2: Add HTTP headers to prevent printing
|
|
408
|
+
res.setHeader("X-UA-Compatible", "IE=edge");
|
|
409
|
+
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
|
410
|
+
res.setHeader("Pragma", "no-cache");
|
|
411
|
+
res.setHeader("Expires", "0");
|
|
412
|
+
res.setHeader("X-Print-Disabled", "true");
|
|
413
|
+
// Method 3: Content Security Policy - prevent print functionality
|
|
414
|
+
res.setHeader("Content-Security-Policy", "print-src 'none'");
|
|
415
|
+
// Method 4: Add iframe sandbox attributes (if PDF is embedded in iframe)
|
|
416
|
+
responseData.sandboxAttributes = "allow-same-origin";
|
|
417
|
+
logger.info(`[POS-GENERATE-INVOICE] : All print prevention methods applied`);
|
|
418
|
+
}
|
|
419
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(responseData, result.message || "Invoice generated successfully"));
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
logger.error(`[POS-GENERATE-INVOICE] : Error generating invoice - ${error}`);
|
|
423
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(error?.message || "Failed to generate invoice", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
exports.GET = GET;
|
|
427
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3Bvcy9nZW5lcmF0ZS1pbnZvaWNlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUErRTtBQUMvRSw0REFNbUM7QUFFbkMsOENBQWtEO0FBQ2xELDRFQUFnRjtBQUVoRixnRUFBb0U7QUFFN0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUFtQixFQUNuQixFQUFFO0lBQ0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUkzQyxDQUFDO1FBRUYsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUEsOEJBQWUsRUFDcEIsR0FBRyxFQUNILElBQUEsa0NBQW1CLEVBQ2pCLDBEQUEwRCxFQUMxRCx5QkFBVSxDQUFDLFdBQVcsRUFDdEIsd0JBQVMsQ0FBQyxnQkFBZ0IsQ0FDM0IsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELG1CQUFtQjtRQUNuQixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxJQUFJLGlCQUFpQixLQUFLLE1BQU0sSUFBSSxpQkFBaUIsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNsRSxPQUFPLElBQUEsOEJBQWUsRUFDcEIsR0FBRyxFQUNILElBQUEsa0NBQW1CLEVBQ2pCLG1DQUFtQyxFQUNuQyx5QkFBVSxDQUFDLFdBQVcsRUFDdEIsd0JBQVMs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
|
|
@@ -6,18 +6,19 @@ const build_redis_key_1 = require("../../../utils/build-redis-key");
|
|
|
6
6
|
const api_response_1 = require("../../../lib/api-response");
|
|
7
7
|
const erp_1 = require("../../../modules/erp");
|
|
8
8
|
const GET = async (req, res) => {
|
|
9
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
9
10
|
try {
|
|
10
|
-
|
|
11
|
+
logger.info("[POS-GOLD-RATE] : Fetching gold rate data");
|
|
11
12
|
const cacheService = req.scope.resolve(utils_1.Modules.CACHE);
|
|
12
13
|
const erpService = req.scope.resolve(erp_1.ERP_MODULE);
|
|
13
|
-
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
14
14
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
15
|
-
const cacheKey = (0, build_redis_key_1.buildRedisKey)("gold-rate
|
|
15
|
+
const cacheKey = (0, build_redis_key_1.buildRedisKey)("pos:gold-rate", {});
|
|
16
16
|
const cachedResult = await cacheService.get(cacheKey);
|
|
17
17
|
if (cachedResult) {
|
|
18
|
-
logger.info(
|
|
19
|
-
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(cachedResult, "
|
|
18
|
+
logger.info("[POS-GOLD-RATE] : Returning cached result");
|
|
19
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(cachedResult, "Gold rate fetched successfully"));
|
|
20
20
|
}
|
|
21
|
+
logger.info("[POS-GOLD-RATE] : Cache miss, fetching from ERP and quality master");
|
|
21
22
|
const [quality14Result, quality18Result, quality22Result] = await Promise.all([
|
|
22
23
|
query.graph({
|
|
23
24
|
entity: "quality_master",
|
|
@@ -50,12 +51,14 @@ const GET = async (req, res) => {
|
|
|
50
51
|
if (!qly22?.qly_mfg_clarity ||
|
|
51
52
|
!qly18?.qly_mfg_clarity ||
|
|
52
53
|
!qly14?.qly_mfg_clarity) {
|
|
54
|
+
logger.error("[POS-GOLD-RATE] : Quality masters for 14/18/22 karat not found or missing qly_mfg_clarity");
|
|
53
55
|
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Quality masters for 14/18/22 karat not found or missing qly_mfg_clarity", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
|
|
54
56
|
}
|
|
55
57
|
const goldRateData = (await erpService.getGoldRateData());
|
|
56
58
|
if (!goldRateData?.CurrentGoldRate ||
|
|
57
59
|
goldRateData.CurrentGoldRate.length === 0) {
|
|
58
|
-
|
|
60
|
+
logger.error("[POS-GOLD-RATE] : No gold rate data available from ERP");
|
|
61
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("No gold rate data available from ERP", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
|
|
59
62
|
}
|
|
60
63
|
const purity = ["14", "18", "22", "24"];
|
|
61
64
|
const qlyMap = {
|
|
@@ -85,12 +88,15 @@ const GET = async (req, res) => {
|
|
|
85
88
|
oldGoldRateList: oldGoldRateList,
|
|
86
89
|
};
|
|
87
90
|
await cacheService.set(cacheKey, result, build_redis_key_1.CACHE_VALIDATION_TIMES.GOLD_RATE);
|
|
88
|
-
|
|
91
|
+
logger.info(`[POS-GOLD-RATE] : Successfully computed and cached gold rates - Current: ${goldRateList.length} rates, Old: ${oldGoldRateList.length} rates`);
|
|
92
|
+
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(result, "Gold rate fetched successfully"));
|
|
89
93
|
}
|
|
90
94
|
catch (error) {
|
|
91
|
-
|
|
95
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
96
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
97
|
+
logger.error(`[POS-GOLD-RATE] : Error fetching gold rate - ${errorMessage}${errorStack ? `\nStack: ${errorStack}` : ""}`);
|
|
92
98
|
return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(error instanceof Error ? error.message : "Internal server error", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
|
|
93
99
|
}
|
|
94
100
|
};
|
|
95
101
|
exports.GET = GET;
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3Bvcy9nb2xkLXJhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQStFO0FBQy9FLG9FQUd3QztBQUN4Qyw0REFNbUM7QUFFbkMsOENBQWdEO0FBMEJ6QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVuRSxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFekQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELE1BQU0sVUFBVSxHQUFlLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFVLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFBLCtCQUFhLEVBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsQ0FDekMsUUFBUSxDQUNULENBQUM7UUFFRixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUN6RCxPQUFPLElBQUEsOEJBQWUsRUFDcEIsR0FBRyxFQUNILElBQUEsb0NBQXFCLEVBQ25CLFlBQVksRUFDWixnQ0FBZ0MsQ0FDakMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVE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
|