@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.
Files changed (116) hide show
  1. package/.medusa/server/src/api/pos/customer-ledger/middleware.js +13 -0
  2. package/.medusa/server/src/api/pos/customer-ledger/route.js +50 -0
  3. package/.medusa/server/src/api/pos/generate-invoice/route.js +427 -0
  4. package/.medusa/server/src/api/pos/gold-rate/route.js +15 -9
  5. package/.medusa/server/src/api/pos/middleware.js +5 -1
  6. package/.medusa/server/src/api/pos/wallet-balance/middleware.js +13 -0
  7. package/.medusa/server/src/api/pos/wallet-balance/route.js +68 -0
  8. package/.medusa/server/src/jobs/sync-book-list-and-applicable-policy.js +77 -0
  9. package/.medusa/server/src/jobs/sync-labour-chart-master.js +20 -0
  10. package/.medusa/server/src/jobs/sync-order-erp.js +2 -2
  11. package/.medusa/server/src/jobs/sync-payment-book-master.js +63 -0
  12. package/.medusa/server/src/jobs/sync-rate-chart-master.js +20 -0
  13. package/.medusa/server/src/jobs/sync-report-master.js +40 -0
  14. package/.medusa/server/src/jobs/sync-sale-return-policy-master.js +29 -0
  15. package/.medusa/server/src/links/jewel-trans-master.js +13 -0
  16. package/.medusa/server/src/links/order-master.js +13 -0
  17. package/.medusa/server/src/modules/applicable-sale-return-policy/index.js +13 -0
  18. package/.medusa/server/src/modules/applicable-sale-return-policy/migrations/Migration20260123083526.js +15 -0
  19. package/.medusa/server/src/modules/applicable-sale-return-policy/models/applicable-sale-return-policy.js +23 -0
  20. package/.medusa/server/src/modules/applicable-sale-return-policy/service.js +10 -0
  21. package/.medusa/server/src/modules/book-list/index.js +13 -0
  22. package/.medusa/server/src/modules/book-list/migrations/Migration20260123083525.js +15 -0
  23. package/.medusa/server/src/modules/book-list/models/book-list.js +12 -0
  24. package/.medusa/server/src/modules/book-list/service.js +10 -0
  25. package/.medusa/server/src/modules/customer-receive-voucher/index.js +13 -0
  26. package/.medusa/server/src/modules/customer-receive-voucher/migrations/Migration20250115000000.js +51 -0
  27. package/.medusa/server/src/modules/customer-receive-voucher/migrations/Migration20260106050934.js +18 -0
  28. package/.medusa/server/src/modules/customer-receive-voucher/models/customer-receive-voucher.js +35 -0
  29. package/.medusa/server/src/modules/customer-receive-voucher/service.js +10 -0
  30. package/.medusa/server/src/modules/erp/service.js +416 -8
  31. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251210112341.js +18 -0
  32. package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +2 -2
  33. package/.medusa/server/src/modules/jewel-trans-master/index.js +13 -0
  34. package/.medusa/server/src/modules/jewel-trans-master/migrations/Migration20260101104355.js +51 -0
  35. package/.medusa/server/src/modules/jewel-trans-master/models/jewel-trans-master.js +151 -0
  36. package/.medusa/server/src/modules/jewel-trans-master/service.js +16 -0
  37. package/.medusa/server/src/modules/labour-chart-master/index.js +13 -0
  38. package/.medusa/server/src/modules/labour-chart-master/migrations/Migration20260101081502.js +15 -0
  39. package/.medusa/server/src/modules/labour-chart-master/models/labour-chart-master.js +16 -0
  40. package/.medusa/server/src/modules/labour-chart-master/service.js +10 -0
  41. package/.medusa/server/src/modules/order-master/index.js +13 -0
  42. package/.medusa/server/src/modules/order-master/migrations/Migration20251204071941.js +27 -0
  43. package/.medusa/server/src/modules/order-master/models/order-master.js +97 -0
  44. package/.medusa/server/src/modules/order-master/service.js +12 -0
  45. package/.medusa/server/src/modules/payment-book-master/index.js +13 -0
  46. package/.medusa/server/src/modules/payment-book-master/migrations/Migration20251203105358.js +15 -0
  47. package/.medusa/server/src/modules/payment-book-master/models/payment-book-master.js +12 -0
  48. package/.medusa/server/src/modules/payment-book-master/service.js +10 -0
  49. package/.medusa/server/src/modules/rate-chart-master/index.js +13 -0
  50. package/.medusa/server/src/modules/rate-chart-master/migrations/Migration20260101081500.js +15 -0
  51. package/.medusa/server/src/modules/rate-chart-master/models/rate-chart-master.js +13 -0
  52. package/.medusa/server/src/modules/rate-chart-master/service.js +10 -0
  53. package/.medusa/server/src/modules/report-master/index.js +13 -0
  54. package/.medusa/server/src/modules/report-master/migrations/Migration20260121060955.js +15 -0
  55. package/.medusa/server/src/modules/report-master/migrations/Migration20260121112624.js +15 -0
  56. package/.medusa/server/src/modules/report-master/models/report-master.js +12 -0
  57. package/.medusa/server/src/modules/report-master/service.js +10 -0
  58. package/.medusa/server/src/modules/sale-return-policy-master/index.js +13 -0
  59. package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260105061449.js +21 -0
  60. package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260129084920.js +14 -0
  61. package/.medusa/server/src/modules/sale-return-policy-master/migrations/Migration20260129085620.js +20 -0
  62. package/.medusa/server/src/modules/sale-return-policy-master/models/sale-return-policy-master.js +37 -0
  63. package/.medusa/server/src/modules/sale-return-policy-master/service.js +12 -0
  64. package/.medusa/server/src/subscribers/order-item-update.js +11 -0
  65. package/.medusa/server/src/subscribers/shipping-info-master.js +3 -3
  66. package/.medusa/server/src/utils/state-helper.js +3 -2
  67. package/.medusa/server/src/workflows/applicable-sale-return-policy/index.js +11 -0
  68. package/.medusa/server/src/workflows/applicable-sale-return-policy/steps/create-or-update-applicable-sale-return-policy.js +74 -0
  69. package/.medusa/server/src/workflows/applicable-sale-return-policy/steps/fetch-applicable-sale-return-policy.js +64 -0
  70. package/.medusa/server/src/workflows/book-list/index.js +11 -0
  71. package/.medusa/server/src/workflows/book-list/steps/create-or-update-book-list.js +55 -0
  72. package/.medusa/server/src/workflows/book-list/steps/fetch-book-list.js +64 -0
  73. package/.medusa/server/src/workflows/customer-advance-payment/index.js +18 -0
  74. package/.medusa/server/src/workflows/customer-advance-payment/steps/create-receive-voucher.js +71 -0
  75. package/.medusa/server/src/workflows/customer-advance-payment/steps/index.js +18 -0
  76. package/.medusa/server/src/workflows/customer-advance-payment/workflows/create-receive-voucher-workflow.js +11 -0
  77. package/.medusa/server/src/workflows/customer-advance-payment/workflows/index.js +18 -0
  78. package/.medusa/server/src/workflows/index.js +2 -1
  79. package/.medusa/server/src/workflows/jewel-trans-master/index.js +18 -0
  80. package/.medusa/server/src/workflows/jewel-trans-master/steps/create-or-update-jewel-trans-master.js +370 -0
  81. package/.medusa/server/src/workflows/jewel-trans-master/steps/index.js +18 -0
  82. package/.medusa/server/src/workflows/labour-chart-master/index.js +11 -0
  83. package/.medusa/server/src/workflows/labour-chart-master/steps/create-or-update-labour-chart-master.js +38 -0
  84. package/.medusa/server/src/workflows/labour-chart-master/steps/fetch-labour-chart.js +31 -0
  85. package/.medusa/server/src/workflows/order-master/index.js +3 -0
  86. package/.medusa/server/src/workflows/order-master/steps/create-or-update-order-master.js +239 -0
  87. package/.medusa/server/src/workflows/orders/steps/find-nearest-pincodes-step.js +336 -0
  88. package/.medusa/server/src/workflows/orders/steps/get-today-gold-rate-step.js +77 -0
  89. package/.medusa/server/src/workflows/orders/steps/index.js +13 -1
  90. package/.medusa/server/src/workflows/orders/steps/sync-advance-payment-to-erp-step.js +185 -0
  91. package/.medusa/server/src/workflows/orders/steps/sync-buyback-to-erp-step.js +99 -0
  92. package/.medusa/server/src/workflows/orders/steps/sync-cancel-to-erp-step.js +90 -0
  93. package/.medusa/server/src/workflows/orders/steps/sync-exchange-to-erp-step.js +101 -0
  94. package/.medusa/server/src/workflows/orders/steps/sync-order-to-erp.js +879 -13
  95. package/.medusa/server/src/workflows/orders/steps/sync-sale-return-to-erp-step.js +98 -0
  96. package/.medusa/server/src/workflows/orders/utils/order-helper.js +116 -28
  97. package/.medusa/server/src/workflows/orders/utils/order-request-helper.js +184 -0
  98. package/.medusa/server/src/workflows/orders/workflows/get-today-gold-rate.js +10 -0
  99. package/.medusa/server/src/workflows/orders/workflows/index.js +2 -1
  100. package/.medusa/server/src/workflows/orders/workflows/sync-advanve-payment-to-erp.js +21 -0
  101. package/.medusa/server/src/workflows/orders/workflows/sync-order-to-erp.js +28 -4
  102. package/.medusa/server/src/workflows/party-master/steps/create-customer-erp.js +8 -2
  103. package/.medusa/server/src/workflows/payment-book-master/index.js +11 -0
  104. package/.medusa/server/src/workflows/payment-book-master/steps/create-or-update-payment-book-master.js +31 -0
  105. package/.medusa/server/src/workflows/payment-book-master/steps/fetch-payment-book.js +64 -0
  106. package/.medusa/server/src/workflows/rate-chart-master/index.js +11 -0
  107. package/.medusa/server/src/workflows/rate-chart-master/steps/create-or-update-rate-chart-master.js +27 -0
  108. package/.medusa/server/src/workflows/rate-chart-master/steps/fetch-rate-chart.js +31 -0
  109. package/.medusa/server/src/workflows/report-master/index.js +11 -0
  110. package/.medusa/server/src/workflows/report-master/steps/create-or-update-report-master.js +53 -0
  111. package/.medusa/server/src/workflows/report-master/steps/fetch-report.js +71 -0
  112. package/.medusa/server/src/workflows/sale-return-policy-master/index.js +11 -0
  113. package/.medusa/server/src/workflows/sale-return-policy-master/steps/create-or-update-sale-return-policy-master.js +91 -0
  114. package/.medusa/server/src/workflows/sale-return-policy-master/steps/fetch-sale-return-policy.js +31 -0
  115. package/package.json +2 -1
  116. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3Bvcy9jdXN0b21lci1sZWRnZXIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXNFO0FBQ3RFLDREQU1tQztBQUVuQyw4Q0FBa0Q7QUFrQjNDLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBaUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sSUFBQSw4QkFBZSxFQUNwQixHQUFHLEVBQ0gsSUFBQSxrQ0FBbUIsRUFDakIsbUNBQW1DLEVBQ25DLHlCQUFVLENBQUMsV0FBVyxFQUN0Qix3QkFBUyxDQUFDLGdCQUFnQixDQUMzQixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FDVCx1RUFBdUUsV0FBVyxFQUFFLENBQ3JGLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDL0MsTUFBTSxFQUFFLFVBQVU7WUFDbEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDO1lBQ3BDLE9BQU8sRUFBRTtnQkFDUCxFQUFFLEVBQUUsV0FBVzthQUNoQjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLHFDQUFxQztRQUNyQyxNQUFNLGFBQWEsR0FBRyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxDQUFDO1FBRS9ELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsS0FBSyxDQUNWLGlFQUFpRSxXQUFXLEVBQUUsQ0FDL0UsQ0FBQztZQUNGLE9BQU8sSUFBQSw4QkFBZSxFQUNwQixHQUFHLEVBQ0gsSUFBQSxrQ0FBbUIsRUFDakIsc0VBQXNFLEVBQ3RFLHlCQUFVLENBQUMsU0FBUyxFQUNwQix3QkFBUyxDQUFDLFNBQVMsQ0FDcEIsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQ1QsNkVBQTZFLGFBQWEsa0JBQWtCLFdBQVcsR0FBRyxDQUMzSCxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQWUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQVUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUNoRCxnQkFBZ0IsRUFDaEIsYUFBYSxDQUNkLENBQW9DLENBQUM7UUFFdEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLENBQUMsS0FBSyxDQUNWLGdGQUFnRixhQUFhLEVBQUUsQ0FDaEcsQ0FBQztZQUNGLE9BQU8sSUFBQSw4QkFBZSxFQUNwQixHQUFHLEVBQ0gsSUFBQSxrQ0FBbUIsRUFDakIsa0NBQWtDLEVBQ2xDLHlCQUFVLENBQUMscUJBQXFCLEVBQ2hDLHdCQUFTLENBQUMsY0FBYyxDQUN6QixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FDVCxnREFBZ0QsVUFBVSxDQUFDLE1BQU0sdUNBQXVDLGFBQWEsRUFBRSxDQUN4SCxDQUFDO1FBRUYsT0FBTyxJQUFBLDhCQUFlLEVBQ3BCLEdBQUcsRUFDSCxJQUFBLG9DQUFxQixFQUFDLFVBQVUsRUFBRSxzQ0FBc0MsQ0FBQyxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDOUUsTUFBTSxVQUFVLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxLQUFLLENBQ1YsNERBQTRELFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN4SCxDQUFDO1FBQ0YsT0FBTyxJQUFBLDhCQUFlLEVBQ3BCLEdBQUcsRUFDSCxJQUFBLGtDQUFtQixFQUNqQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsRUFDaEUseUJBQVUsQ0FBQyxxQkFBcUIsRUFDaEMsd0JBQVMsQ0FBQyxjQUFjLENBQ3pCLENBQ0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUM7QUFwR1csUUFBQSxHQUFHLE9Bb0dkIn0=
@@ -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
- const grams = 1;
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-pos", { grams });
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(`[HISTORICAL-GOLD-RATE] : Returning cached result for grams: ${grams}`);
19
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(cachedResult, "Historical gold rate fetched successfully"));
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
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("No historical gold rate data available from ERP", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
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
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(result, "Historical gold rate fetched successfully"));
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
- console.error("Error fetching historical gold rate:", error);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3Bvcy9nb2xkLXJhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQStFO0FBQy9FLG9FQUd3QztBQUN4Qyw0REFNbUM7QUFFbkMsOENBQWdEO0FBMEJ6QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUE7UUFDZixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQWUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQVUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQWEsRUFBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTNELE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsQ0FDekMsUUFBUSxDQUNULENBQUM7UUFFRixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsK0RBQStELEtBQUssRUFBRSxDQUN2RSxDQUFDO1lBQ0YsT0FBTyxJQUFBLDhCQUFlLEVBQ3BCLEdBQUcsRUFDSCxJQUFBLG9DQUFxQixFQUNuQixZQUFZLEVBQ1osMkNBQTJDLENBQzVDLENBQ0YsQ0FBQztRQUNKLENB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
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3Bvcy9nb2xkLXJhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQStFO0FBQy9FLG9FQUd3QztBQUN4Qyw0REFNbUM7QUFFbkMsOENBQWdEO0FBMEJ6QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVuRSxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFekQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELE1BQU0sVUFBVSxHQUFlLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFVLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFBLCtCQUFhLEVBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsQ0FDekMsUUFBUSxDQUNULENBQUM7UUFFRixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUN6RCxPQUFPLElBQUEsOEJBQWUsRUFDcEIsR0FBRyxFQUNILElBQUEsb0NBQXFCLEVBQ25CLFlBQVksRUFDWixnQ0FBZ0MsQ0FDakMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVE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