shareneus 1.7.4 → 1.7.6

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 (212) hide show
  1. package/README.md +1 -0
  2. package/dist/accounting/invoice/invoice-pdf/invoice-pdf.service.js +18 -45
  3. package/dist/accounting/invoice/reports/excel/analysis-excel.service.js +17 -7
  4. package/dist/accounting/invoice/reports/excel/category-wise-item-excel.service.js +17 -7
  5. package/dist/accounting/invoice/reports/excel/cust-wise-sales-details.js +17 -7
  6. package/dist/accounting/invoice/reports/excel/cust-wise-sales-summary-excel.service.js +17 -7
  7. package/dist/accounting/invoice/reports/excel/invoice-wise-excel.service.js +17 -7
  8. package/dist/accounting/invoice/reports/excel/item-wise-doctor-sale-excel.service.js +17 -7
  9. package/dist/accounting/invoice/reports/excel/items-wise-sales-excel.service.js +17 -7
  10. package/dist/accounting/invoice/reports/excel/manf-wise-sales-excel.service.js +17 -7
  11. package/dist/accounting/invoice/reports/excel/operator-wise-details.js +17 -7
  12. package/dist/accounting/invoice/reports/excel/operator-wise-summary.js +17 -7
  13. package/dist/accounting/invoice/reports/excel/sa-wise-labor-sales-excel.service.js +17 -7
  14. package/dist/accounting/invoice/reports/excel/sa-wise-part-sales-excel.service.js +17 -7
  15. package/dist/accounting/invoice/reports/excel/sale-summary-excel.service.js +17 -7
  16. package/dist/accounting/invoice/reports/excel/sales-by-service-summary-excel.service.js +17 -7
  17. package/dist/accounting/invoice/reports/excel/scheduled-drug-summary-excel.service.js +17 -7
  18. package/dist/accounting/invoice/reports/excel/scheduled-drugs-excel.service.js +17 -7
  19. package/dist/accounting/invoice/unified-invoice-pdf.service.d.ts +1 -1
  20. package/dist/accounting/payment-receive/reports/excel/cust-balance-excel.service.js +17 -7
  21. package/dist/accounting/payment-receive/reports/excel/payment-receive-excel.service.js +17 -7
  22. package/dist/common/reports/excel/product-without-owner-excel.service.js +17 -7
  23. package/dist/gst/excel/GSTR-RO-excel.service.js +17 -7
  24. package/dist/gst/excel/GSTR1-excel.service.js +17 -7
  25. package/dist/gst/excel/GSTR2-excel.service.js +17 -7
  26. package/dist/gst/excel/hsn-summary.js +17 -7
  27. package/dist/gst/excel/tally-sales-import.service.js +17 -7
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +6 -6
  30. package/dist/inventory/items/reports/excel/expiring-drugs-excel.service.js +17 -7
  31. package/dist/inventory/items/reports/excel/item-wise-mout-details.js +17 -7
  32. package/dist/inventory/items/reports/excel/item-wise-mout-summary.js +17 -7
  33. package/dist/inventory/items/reports/excel/spares-issue-excel.service.js +17 -7
  34. package/dist/inventory/items/reports/excel/stock-excel.service.js +17 -7
  35. package/dist/purchases/payment-made/reports/excel/payments-made-excel.service.js +17 -7
  36. package/dist/purchases/payment-made/reports/excel/ven-balance-excel.service.js +17 -7
  37. package/dist/services/reports/excel/insurance-expire-excel.service.js +17 -7
  38. package/dist/services/reports/excel/next-service-date-excel.service.js +17 -7
  39. package/dist/services/reports/excel/repair-orders-excel.service.js +17 -7
  40. package/dist/shared/table-section/pdf-table.header.d.ts +1 -1
  41. package/dist/shared/table-section/pdf-table.header.js +14 -2
  42. package/dist/shared/table-section/pdf-table.section.js +6 -13
  43. package/dist/{accounting/invoice/invoice-pdf.service.js → shared/transactions-pdf.service.js} +15 -15
  44. package/package.json +1 -1
  45. package/src/accounting/counter-sales/auto-sales-receipt-pdf.service.ts +569 -0
  46. package/src/accounting/counter-sales/pos-receipt-pdf.ts +577 -0
  47. package/src/accounting/counter-sales/sales-receipt-pdf.service.ts +628 -0
  48. package/src/accounting/counter-sales/sales-receipt-print.service.ts +506 -0
  49. package/src/accounting/credit-note/cn-print.service.ts +264 -0
  50. package/src/accounting/credit-note/credit-note-pdf.service.ts +602 -0
  51. package/src/accounting/credit-note/credit-note-totals.service.ts +424 -0
  52. package/src/accounting/debit-note/debit-note-pdf.service.ts +681 -0
  53. package/src/accounting/debit-note/debit-note-print.service.ts +276 -0
  54. package/src/accounting/debit-note/debit-note-totals.service.ts +361 -0
  55. package/src/accounting/invoice/hc-inv-pdf.service.ts +880 -0
  56. package/src/accounting/invoice/inv-pdf.service.ts +812 -0
  57. package/src/accounting/invoice/inv-print.service.ts +532 -0
  58. package/src/accounting/invoice/invoice-landscape-pdf.service.ts +947 -0
  59. package/src/accounting/invoice/invoice-letterhead-pdf.service.ts +813 -0
  60. package/src/accounting/invoice/invoice-pdf/invoice-pdf.service.ts +359 -0
  61. package/src/accounting/invoice/invoice-portrait-pdf.ts +972 -0
  62. package/src/accounting/invoice/invoice-print.service.ts +2906 -0
  63. package/src/accounting/invoice/invoice-total.service.ts +834 -0
  64. package/src/accounting/invoice/reports/excel/analysis-excel.service.ts +291 -0
  65. package/src/accounting/invoice/reports/excel/category-wise-item-excel.service.ts +267 -0
  66. package/src/accounting/invoice/reports/excel/cust-wise-sales-details.ts +321 -0
  67. package/src/accounting/invoice/reports/excel/cust-wise-sales-summary-excel.service.ts +300 -0
  68. package/src/accounting/invoice/reports/excel/invoice-wise-excel.service.ts +859 -0
  69. package/src/accounting/invoice/reports/excel/item-wise-doctor-sale-excel.service.ts +255 -0
  70. package/src/accounting/invoice/reports/excel/items-wise-sales-excel.service.ts +312 -0
  71. package/src/accounting/invoice/reports/excel/manf-wise-sales-excel.service.ts +273 -0
  72. package/src/accounting/invoice/reports/excel/operator-wise-details.ts +258 -0
  73. package/src/accounting/invoice/reports/excel/operator-wise-summary.ts +259 -0
  74. package/src/accounting/invoice/reports/excel/sa-wise-labor-sales-excel.service.ts +230 -0
  75. package/src/accounting/invoice/reports/excel/sa-wise-part-sales-excel.service.ts +231 -0
  76. package/src/accounting/invoice/reports/excel/sale-summary-excel.service.ts +326 -0
  77. package/src/accounting/invoice/reports/excel/sales-by-service-details-excel.service.ts +0 -0
  78. package/src/accounting/invoice/reports/excel/sales-by-service-summary-excel.service.ts +432 -0
  79. package/src/accounting/invoice/reports/excel/scheduled-drug-summary-excel.service.ts +373 -0
  80. package/src/accounting/invoice/reports/excel/scheduled-drugs-excel.service.ts +372 -0
  81. package/src/accounting/invoice/reports/pdf/analysis-pdf.service.ts +113 -0
  82. package/src/accounting/invoice/reports/pdf/category-wise-item-pdf.service.ts +107 -0
  83. package/src/accounting/invoice/reports/pdf/cust-wise-sales-details-pdf.service.ts +125 -0
  84. package/src/accounting/invoice/reports/pdf/cust-wise-sales-summary-pdf.service.ts +119 -0
  85. package/src/accounting/invoice/reports/pdf/item-wise-doctor-sale-pdf.service.ts +180 -0
  86. package/src/accounting/invoice/reports/pdf/item-wise-sales-pdf.service.ts +193 -0
  87. package/src/accounting/invoice/reports/pdf/manf-wise-sales-pdf.service.ts +188 -0
  88. package/src/accounting/invoice/reports/pdf/operator-wise-details-pdf.service.ts +118 -0
  89. package/src/accounting/invoice/reports/pdf/operator-wise-summary-pdf.ts +116 -0
  90. package/src/accounting/invoice/reports/pdf/sales-by-service-pdf.service.ts +132 -0
  91. package/src/accounting/invoice/reports/pdf/scheduled-drug-pdf.service.ts +191 -0
  92. package/src/accounting/invoice/reports/pdf/scheduled-drug-summary-pdf.service.ts +202 -0
  93. package/src/accounting/invoice/shared-inv-pdf.service.ts +787 -0
  94. package/src/accounting/invoice/unified-invoice-pdf.service.ts +937 -0
  95. package/src/accounting/payment-receive/payment-pdf.service.ts +410 -0
  96. package/src/accounting/payment-receive/payment-receipt-pdf/receipt-pdf.service.ts +470 -0
  97. package/src/accounting/payment-receive/receipt-print.service.ts +71 -0
  98. package/src/accounting/payment-receive/reports/excel/cust-balance-excel.service.ts +298 -0
  99. package/src/accounting/payment-receive/reports/excel/payment-receive-excel.service.ts +221 -0
  100. package/src/accounting/payment-receive/reports/pdf/customer-balances-pdf.service.ts +182 -0
  101. package/src/accounting/payment-receive/reports/pdf/payment-report-pdf.service.ts +116 -0
  102. package/src/aggregation/aggregation.ts +58 -0
  103. package/src/appointments/appointments/appointment-total.service.ts +298 -0
  104. package/src/appointments/consultations/consultation-fee-receipt.service.ts +407 -0
  105. package/src/appointments/consultations/consultation-full-pdf.service.ts +238 -0
  106. package/src/appointments/consultations/consultation-letterhead-pdf.service.ts +430 -0
  107. package/src/appointments/consultations/consultation-pdf.service.ts +417 -0
  108. package/src/common/reports/excel/product-without-owner-excel.service.ts +308 -0
  109. package/src/common/reports/pdf/product-without-owner-pdf.service.ts +146 -0
  110. package/src/enums/cache-enums.ts +33 -0
  111. package/src/enums/code-enums.ts +291 -0
  112. package/src/enums/country-enums.ts +9 -0
  113. package/src/enums/enums.ts +364 -0
  114. package/src/enums/industry-enums.ts +26 -0
  115. package/src/enums/treatment-enums.ts +9 -0
  116. package/src/gst/excel/GSTR-RO-excel.service.ts +926 -0
  117. package/src/gst/excel/GSTR1-excel.service.ts +313 -0
  118. package/src/gst/excel/GSTR2-excel.service.ts +314 -0
  119. package/src/gst/excel/hsn-summary.ts +314 -0
  120. package/src/gst/excel/tally-sales-import.service.ts +767 -0
  121. package/src/gst/pdf/hsn-summary-pdf.ts +176 -0
  122. package/src/index.ts +194 -0
  123. package/src/inventory/items/adjustment-pdf.service.ts +177 -0
  124. package/src/inventory/items/issue-parts-pdf.service.ts +795 -0
  125. package/src/inventory/items/item-bar-code-label-pdf.ts +194 -0
  126. package/src/inventory/items/item-detais-pdf.ts +141 -0
  127. package/src/inventory/items/item-price-for-pricelist.ts +368 -0
  128. package/src/inventory/items/reports/excel/expiring-drugs-excel.service.ts +290 -0
  129. package/src/inventory/items/reports/excel/item-wise-mout-details.ts +284 -0
  130. package/src/inventory/items/reports/excel/item-wise-mout-summary.ts +279 -0
  131. package/src/inventory/items/reports/excel/spares-issue-excel.service.ts +494 -0
  132. package/src/inventory/items/reports/excel/stock-excel.service.ts +319 -0
  133. package/src/inventory/items/reports/pdf/expiring-drugs-pdf.service.ts +172 -0
  134. package/src/inventory/items/reports/pdf/item-wise-mout-details-pdf.ts +122 -0
  135. package/src/inventory/items/reports/pdf/item-wise-mout-summary-pdf.ts +115 -0
  136. package/src/inventory/items/reports/pdf/reorder-point-pdf.service.ts +163 -0
  137. package/src/inventory/material-out/mout-pdf.service.ts +545 -0
  138. package/src/inventory/transfer-order/transfer-order-pdf.service.ts +154 -0
  139. package/src/purchases/bills/bill-pdf/bill-pdf.service.ts +211 -0
  140. package/src/purchases/bills/bill-pdf.service.ts +21 -0
  141. package/src/purchases/payment-made/reports/excel/payments-made-excel.service.ts +313 -0
  142. package/src/purchases/payment-made/reports/excel/ven-balance-excel.service.ts +307 -0
  143. package/src/purchases/payment-made/reports/pdf/vendor-balances-pdf.service.ts +114 -0
  144. package/src/purchases/purchase-order/po-totals.service.ts +343 -0
  145. package/src/purchases/purchase-order/purchase-order-pdf.service.ts +1016 -0
  146. package/src/purchases/purchase-order/purchase-order-print.service.ts +279 -0
  147. package/src/purchases/purchase-order/purchase-order-totals.service.ts +637 -0
  148. package/src/purchases/vendor-credit-note/vendor-credit-note-pdf.service.ts +1055 -0
  149. package/src/purchases/vendor-credit-note/vendor-credit-note-print.service.ts +145 -0
  150. package/src/purchases/vendor-credit-note/vendor-credit-note-totals.service.ts +399 -0
  151. package/src/purchases/vendor-debit-note/vendor-debit-note-pdf.service.ts +582 -0
  152. package/src/purchases/vendor-debit-note/vendor-debit-note-print.service.ts +295 -0
  153. package/src/purchases/vendor-debit-note/vendor-debit-note-totals.service.ts +377 -0
  154. package/src/sales/delivery-challan/dc-landscape-pdf.service.ts +922 -0
  155. package/src/sales/delivery-challan/dc-landscape-without-price-pdf.service.ts +869 -0
  156. package/src/sales/delivery-challan/dc-without-price-pdf.service.ts +505 -0
  157. package/src/sales/delivery-challan/delivery-challan-pdf.service.ts +461 -0
  158. package/src/sales/delivery-challan/delivery-challan-print.service.ts +229 -0
  159. package/src/sales/delivery-challan/delivery-challan-totals.ts +466 -0
  160. package/src/sales/sales/equipment-design-pdf.service.ts +153 -0
  161. package/src/sales/sales/pack-ship-pdf.service.ts +128 -0
  162. package/src/sales/sales/pack-ship-print.service.ts +198 -0
  163. package/src/sales/sales/sales-pdf.service.ts +658 -0
  164. package/src/sales/sales/sales-print.service.ts +376 -0
  165. package/src/sales/sales/sales-totals.service.ts +500 -0
  166. package/src/sales-receive/sales-receive-pdf.service.ts +602 -0
  167. package/src/sales-receive/sales-receive-print.service.ts +242 -0
  168. package/src/sales-receive/sales-receive-totals.service.ts +651 -0
  169. package/src/services/checklist-pdf.ts +151 -0
  170. package/src/services/checklists-pdf.ts +133 -0
  171. package/src/services/est.print-service.ts +1155 -0
  172. package/src/services/reports/excel/insurance-expire-excel.service.ts +292 -0
  173. package/src/services/reports/excel/next-service-date-excel.service.ts +317 -0
  174. package/src/services/reports/excel/repair-orders-excel.service.ts +249 -0
  175. package/src/services/reports/pdf/insurance-expire-pdf.service.ts +115 -0
  176. package/src/services/reports/pdf/next-service-date-pdf.service.ts +198 -0
  177. package/src/services/reports/pdf/repair-orders-pdf.service.ts +184 -0
  178. package/src/services/ro-pdf.service.ts +1917 -0
  179. package/src/services/ro-print-service.ts +881 -0
  180. package/src/services/ro-totals.service.ts +1314 -0
  181. package/src/services/separate-wo-print.service.ts +396 -0
  182. package/src/services/service-history-pdf.service.ts +145 -0
  183. package/src/services/service-price-for-pricelist.ts +649 -0
  184. package/src/services/technician-pdf.service.ts +234 -0
  185. package/src/services/technician-print.service.ts +95 -0
  186. package/src/shared/header-footer-section/pdf-header-footer.section.ts +519 -0
  187. package/src/shared/header-footer-section/pdf-shared.utils.ts +46 -0
  188. package/src/shared/math-operations.ts +208 -0
  189. package/src/shared/party-details-section/pdf-party-details.section.ts +602 -0
  190. package/src/shared/shared-pdf.service.ts +3042 -0
  191. package/src/shared/shared-print.service.ts +879 -0
  192. package/src/shared/table-section/pdf-table.config.ts +8 -0
  193. package/src/shared/table-section/pdf-table.header.ts +396 -0
  194. package/src/shared/table-section/pdf-table.row.ts +248 -0
  195. package/src/shared/table-section/pdf-table.section.ts +447 -0
  196. package/src/shared/totals-section/pdf-totals.section.ts +921 -0
  197. package/src/shared/transactions-pdf.service.ts +191 -0
  198. package/src/shared/util.ts +101 -0
  199. package/src/tasks/meetings/meeting-pdf.ts +410 -0
  200. package/src/tasks/tasks/task-pdf.service.ts +238 -0
  201. package/src/tasks/tasks/task-reports-pdf.service.ts +313 -0
  202. package/src/tax/index.ts +86 -0
  203. package/src/tax/tax-calculator.ts +1025 -0
  204. package/src/tax/tax.types.ts +535 -0
  205. package/src/transaction-calculations/discounts-distribution.ts +343 -0
  206. package/src/transaction-calculations/index.ts +3 -0
  207. package/src/transaction-calculations/total-calculation.ts +443 -0
  208. package/src/transaction-calculations/transaction-calculation-engine.ts +903 -0
  209. package/src/utils/my-date.ts +111 -0
  210. package/src/utils/tr-utils.ts +104 -0
  211. package/tsconfig.json +2 -2
  212. /package/dist/{accounting/invoice/invoice-pdf.service.d.ts → shared/transactions-pdf.service.d.ts} +0 -0
@@ -0,0 +1,8 @@
1
+ export const pdfTableStyleConfig = {
2
+ headerFontSize: 10,
3
+ bodyFontSize: 9,
4
+ stackFieldFontSize: 8,
5
+ headerBgColor: '#eeeeee',
6
+ headerFontColor: '#111827',
7
+ bodyFontColor: '#111827'
8
+ };
@@ -0,0 +1,396 @@
1
+ import { pdfTableStyleConfig } from './pdf-table.config';
2
+
3
+ export function GetTableHeader(itemsHeader: any[], taxMode: string = '') {
4
+ const orderedHeaders = getHeadersBySequence(itemsHeader);
5
+ const filteredHeaders = shouldHideTaxHeaders(taxMode)
6
+ ? orderedHeaders.filter((item: any) => !isTaxHeaderConfig(item))
7
+ : orderedHeaders;
8
+
9
+ const toHeaderObject = (item: any) => {
10
+ const itemTitle = item?.title ?? item?.CustTitle ?? item?.Tital ?? '';
11
+ const itemWidth = item?.width ?? item?.Width;
12
+ const itemDbFields = item?.dbFields ?? item?.DBFields ?? [];
13
+ const stackSource = item?.stackFields ?? item?.Stacked;
14
+ const stackTitle = stackSource?.title ?? stackSource?.Tital ?? null;
15
+ const stackSeq = stackSource?.seq ?? stackSource?.Seq;
16
+ return {
17
+ text: itemTitle,
18
+ width: itemWidth,
19
+ bold: item.bold ?? true,
20
+ fontSize: 9,
21
+ alignment: resolveHeaderAlignment(itemTitle),
22
+ dbFields: itemDbFields,
23
+ stackParent: stackTitle,
24
+ stackSeq: typeof stackSeq === 'number' ? stackSeq : Number.MAX_SAFE_INTEGER
25
+ };
26
+ };
27
+
28
+ const visibleHeaders = filteredHeaders.filter((item: any) => (item?.show ?? item?.Show) !== false);
29
+
30
+ const headerRow = visibleHeaders
31
+ .filter((item: any) => !(item?.stackFields ?? item?.Stacked))
32
+ .map((item: any) => {
33
+ const parentTitle = item?.title ?? item?.CustTitle ?? item?.Tital;
34
+ const stackFields = visibleHeaders
35
+ .filter((stackedItem: any) => {
36
+ const stackedParent = stackedItem?.stackFields?.title
37
+ ?? stackedItem?.stackFields?.Tital
38
+ ?? stackedItem?.Stacked?.title
39
+ ?? stackedItem?.Stacked?.Tital;
40
+ return stackedParent === parentTitle;
41
+ })
42
+ .sort((a: any, b: any) => {
43
+ const aSeqRaw = a?.stackFields?.seq ?? a?.stackFields?.Seq ?? a?.Stacked?.seq ?? a?.Stacked?.Seq;
44
+ const bSeqRaw = b?.stackFields?.seq ?? b?.stackFields?.Seq ?? b?.Stacked?.seq ?? b?.Stacked?.Seq;
45
+ const aSeq = typeof aSeqRaw === 'number' ? aSeqRaw : Number.MAX_SAFE_INTEGER;
46
+ const bSeq = typeof bSeqRaw === 'number' ? bSeqRaw : Number.MAX_SAFE_INTEGER;
47
+ if (aSeq !== bSeq) {
48
+ return aSeq - bSeq;
49
+ }
50
+ const aHeaderSeqRaw = a?.seq ?? a?.Seq;
51
+ const bHeaderSeqRaw = b?.seq ?? b?.Seq;
52
+ const aHeaderSeq = typeof aHeaderSeqRaw === 'number' ? aHeaderSeqRaw : Number.MAX_SAFE_INTEGER;
53
+ const bHeaderSeq = typeof bHeaderSeqRaw === 'number' ? bHeaderSeqRaw : Number.MAX_SAFE_INTEGER;
54
+ return aHeaderSeq - bHeaderSeq;
55
+ })
56
+ .map((stackedItem: any) => toHeaderObject(stackedItem));
57
+
58
+ return {
59
+ ...toHeaderObject(item),
60
+ stackFields
61
+ };
62
+ });
63
+
64
+ const header: any[] = [headerRow];
65
+
66
+ return header;
67
+ }
68
+
69
+ function getHeadersBySequence(headers: any[]) {
70
+ return headers
71
+ .map((header: any, index: number) => ({ header, index }))
72
+ .sort((a: any, b: any) => {
73
+ const aSeqRaw = a?.header?.seq ?? a?.header?.Seq;
74
+ const bSeqRaw = b?.header?.seq ?? b?.header?.Seq;
75
+ const aSeq = typeof aSeqRaw === 'number' ? aSeqRaw : Number.MAX_SAFE_INTEGER;
76
+ const bSeq = typeof bSeqRaw === 'number' ? bSeqRaw : Number.MAX_SAFE_INTEGER;
77
+ if (aSeq !== bSeq) {
78
+ return aSeq - bSeq;
79
+ }
80
+ return a.index - b.index;
81
+ })
82
+ .map((entry: any) => entry.header);
83
+ }
84
+
85
+ export function getRenderableColumns(headerConfig: any[], sType: string = '') {
86
+ const isInter = sType === 'Inter';
87
+ const hasTaxPercent = headerConfig.some((header: any) => isTaxPercentHeader(header));
88
+ const hasTaxAmount = headerConfig.some((header: any) => isTaxAmountHeader(header));
89
+ const hasTaxGroup = hasTaxPercent && hasTaxAmount;
90
+ const columns: any[] = [];
91
+ for (const header of headerConfig) {
92
+ // --- Inter / IGST ---
93
+ if (isInter && hasTaxGroup && isTaxPercentHeader(header)) {
94
+ columns.push(
95
+ {
96
+ type: 'tax',
97
+ taxKind: 'rate',
98
+ dbField: 'IGST',
99
+ width: getTaxSubWidth(header.width),
100
+ },
101
+ {
102
+ type: 'tax',
103
+ taxKind: 'amount',
104
+ dbField: 'IGST',
105
+ width: getTaxSubWidth(header.width),
106
+ }
107
+ );
108
+ continue;
109
+ }
110
+
111
+ // Tax Amt header is skipped for Inter when hasTaxGroup (IGST already handled by Tax%)
112
+ if (isInter && hasTaxGroup && isTaxAmountHeader(header)) {
113
+ continue;
114
+ }
115
+
116
+ if (isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
117
+ columns.push({
118
+ type: 'tax',
119
+ taxKind: 'rate',
120
+ dbField: 'IGST',
121
+ width: header.width,
122
+ });
123
+ continue;
124
+ }
125
+
126
+ if (isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
127
+ columns.push({
128
+ type: 'tax',
129
+ taxKind: 'amount',
130
+ dbField: 'IGST',
131
+ width: header.width,
132
+ });
133
+ continue;
134
+ }
135
+
136
+ // --- Intra / CGST + SGST ---
137
+ if (!isInter && hasTaxGroup && isTaxPercentHeader(header)) {
138
+ columns.push(
139
+ {
140
+ type: 'tax',
141
+ taxKind: 'rate',
142
+ dbField: 'CGST',
143
+ width: getTaxSubWidth(header.width),
144
+ },
145
+ {
146
+ type: 'tax',
147
+ taxKind: 'amount',
148
+ dbField: 'CGST',
149
+ width: getTaxSubWidth(header.width),
150
+ }
151
+ );
152
+ continue;
153
+ }
154
+
155
+ if (!isInter && hasTaxGroup && isTaxAmountHeader(header)) {
156
+ columns.push(
157
+ {
158
+ type: 'tax',
159
+ taxKind: 'rate',
160
+ dbField: 'SGST',
161
+ width: getTaxSubWidth(header.width),
162
+ },
163
+ {
164
+ type: 'tax',
165
+ taxKind: 'amount',
166
+ dbField: 'SGST',
167
+ width: getTaxSubWidth(header.width),
168
+ }
169
+ );
170
+ continue;
171
+ }
172
+
173
+ if (!isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
174
+ columns.push(
175
+ {
176
+ type: 'tax',
177
+ taxKind: 'rate',
178
+ dbField: 'CGST',
179
+ width: getTaxSubWidth(header.width),
180
+ },
181
+ {
182
+ type: 'tax',
183
+ taxKind: 'rate',
184
+ dbField: 'SGST',
185
+ width: getTaxSubWidth(header.width),
186
+ }
187
+ );
188
+ continue;
189
+ }
190
+
191
+ if (!isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
192
+ columns.push(
193
+ {
194
+ type: 'tax',
195
+ taxKind: 'amount',
196
+ dbField: 'CGST',
197
+ width: getTaxSubWidth(header.width),
198
+ },
199
+ {
200
+ type: 'tax',
201
+ taxKind: 'amount',
202
+ dbField: 'SGST',
203
+ width: getTaxSubWidth(header.width),
204
+ }
205
+ );
206
+ continue;
207
+ }
208
+
209
+ columns.push({
210
+ type: 'normal',
211
+ width: header.width,
212
+ header
213
+ });
214
+ }
215
+ return columns;
216
+ }
217
+
218
+ export function buildHeaderRows(headerConfig: any[], sType: string = '') {
219
+ const isInter = sType === 'Inter';
220
+ const hasTaxPercent = headerConfig.some((header: any) => isTaxPercentHeader(header));
221
+ const hasTaxAmount = headerConfig.some((header: any) => isTaxAmountHeader(header));
222
+ const hasTaxGroup = hasTaxPercent && hasTaxAmount;
223
+ const hasDiscPercent = headerConfig.some((header: any) => header.text === 'Disc %');
224
+ const hasDiscAmount = headerConfig.some((header: any) => isDiscountAmountHeader(header.text));
225
+ const hasDiscGroup = hasDiscPercent && hasDiscAmount;
226
+ const hasGroupedHeaders = hasTaxPercent || hasTaxAmount || hasDiscGroup;
227
+
228
+ if (!hasGroupedHeaders) {
229
+ const singleRow = headerConfig.map((header: any) => ({
230
+ text: header.text,
231
+ alignment: header.alignment,
232
+ dbFields: header.dbFields,
233
+ stackFields: header.stackFields,
234
+ ...getHeaderCellStyle()
235
+ }));
236
+ return [singleRow];
237
+ }
238
+
239
+ const topRow: any[] = [];
240
+ const subRow: any[] = [];
241
+
242
+ for (const header of headerConfig) {
243
+ // --- Inter / IGST ---
244
+ if (isInter && hasTaxGroup && isTaxPercentHeader(header)) {
245
+ topRow.push(
246
+ { text: 'IGST', colSpan: 2, alignment: 'center', ...getHeaderCellStyle() },
247
+ {}
248
+ );
249
+ subRow.push(
250
+ { text: '%', alignment: 'center', ...getHeaderCellStyle() },
251
+ { text: 'Amt', alignment: 'center', ...getHeaderCellStyle() }
252
+ );
253
+ continue;
254
+ }
255
+
256
+ // Tax Amt header is skipped for Inter when hasTaxGroup (IGST already handled by Tax%)
257
+ if (isInter && hasTaxGroup && isTaxAmountHeader(header)) {
258
+ continue;
259
+ }
260
+
261
+ if (isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
262
+ topRow.push({ text: 'IGST %', rowSpan: 2, alignment: 'center', ...getHeaderCellStyle() });
263
+ subRow.push({});
264
+ continue;
265
+ }
266
+
267
+ if (isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
268
+ topRow.push({ text: 'IGST Amt', rowSpan: 2, alignment: 'center', ...getHeaderCellStyle() });
269
+ subRow.push({});
270
+ continue;
271
+ }
272
+
273
+ // --- Intra / CGST + SGST ---
274
+ if (!isInter && hasTaxGroup && isTaxPercentHeader(header)) {
275
+ topRow.push(
276
+ { text: 'CGST', colSpan: 2, alignment: 'center', ...getHeaderCellStyle() },
277
+ {}
278
+ );
279
+ subRow.push(
280
+ { text: '%', alignment: 'center', ...getHeaderCellStyle() },
281
+ { text: 'Amt', alignment: 'center', ...getHeaderCellStyle() }
282
+ );
283
+ continue;
284
+ }
285
+
286
+ if (!isInter && hasTaxGroup && isTaxAmountHeader(header)) {
287
+ topRow.push(
288
+ { text: 'SGST/UGST', colSpan: 2, alignment: 'center', ...getHeaderCellStyle() },
289
+ {}
290
+ );
291
+ subRow.push(
292
+ { text: '%', alignment: 'center', ...getHeaderCellStyle() },
293
+ { text: 'Amt', alignment: 'center', ...getHeaderCellStyle() }
294
+ );
295
+ continue;
296
+ }
297
+
298
+ if (!isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
299
+ topRow.push(
300
+ { text: header.text, colSpan: 2, alignment: 'center', ...getHeaderCellStyle() },
301
+ {}
302
+ );
303
+ subRow.push(
304
+ { text: 'CGST', alignment: 'center', ...getHeaderCellStyle() },
305
+ { text: 'SGST/UGST', alignment: 'center', ...getHeaderCellStyle() }
306
+ );
307
+ continue;
308
+ }
309
+
310
+ if (!isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
311
+ topRow.push(
312
+ { text: header.text, colSpan: 2, alignment: 'center', ...getHeaderCellStyle() },
313
+ {}
314
+ );
315
+ subRow.push(
316
+ { text: 'CGST', alignment: 'center', ...getHeaderCellStyle() },
317
+ { text: 'SGST/UGST', alignment: 'center', ...getHeaderCellStyle() }
318
+ );
319
+ continue;
320
+ }
321
+
322
+ if (hasDiscGroup && header.text === 'Disc %') {
323
+ topRow.push(
324
+ { text: 'Discount', colSpan: 2, alignment: 'center', ...getHeaderCellStyle() },
325
+ {}
326
+ );
327
+ subRow.push(
328
+ { text: '%', alignment: 'center', ...getHeaderCellStyle() },
329
+ { text: 'Amt', alignment: 'center', ...getHeaderCellStyle() }
330
+ );
331
+ continue;
332
+ }
333
+
334
+ if (hasDiscGroup && isDiscountAmountHeader(header.text)) {
335
+ continue;
336
+ }
337
+
338
+ topRow.push({ text: header.text, rowSpan: 2, alignment: header.alignment, ...getHeaderCellStyle() });
339
+ subRow.push({});
340
+ }
341
+
342
+ return [topRow, subRow];
343
+ }
344
+
345
+ function getTaxSubWidth(width: any) {
346
+ if (typeof width !== 'number') {
347
+ return 'auto';
348
+ }
349
+ return Math.max(1, width / 2);
350
+ }
351
+
352
+ function isDiscountAmountHeader(text: string) {
353
+ return text === 'Disc Amount' || text === 'Adisc Amount';
354
+ }
355
+
356
+ function isTaxPercentHeader(header: any) {
357
+ return normalizeHeaderText(header?.text) === 'TAX%';
358
+ }
359
+
360
+ function isTaxAmountHeader(header: any) {
361
+ return normalizeHeaderText(header?.text) === 'TAXAMOUNT';
362
+ }
363
+
364
+ function isTaxHeaderConfig(header: any) {
365
+ const title = header?.title ?? header?.CustTitle ?? header?.Tital ?? header?.text;
366
+ const normalizedTitle = normalizeHeaderText(title);
367
+ return normalizedTitle === 'TAX%' || normalizedTitle === 'TAXAMOUNT';
368
+ }
369
+
370
+ function shouldHideTaxHeaders(taxMode: string) {
371
+ return taxMode === 'BS' || taxMode === 'NO';
372
+ }
373
+
374
+ function normalizeHeaderText(value: any) {
375
+ return String(value ?? '')
376
+ .replace(/\s+/g, '')
377
+ .trim()
378
+ .toUpperCase();
379
+ }
380
+
381
+ function resolveHeaderAlignment(title: any) {
382
+ const normalizedTitle = normalizeHeaderText(title);
383
+ if (normalizedTitle === 'LINETOTAL' || normalizedTitle === 'PRICE' || normalizedTitle === 'QTY') {
384
+ return 'right';
385
+ }
386
+ return undefined;
387
+ }
388
+
389
+ function getHeaderCellStyle() {
390
+ return {
391
+ bold: true,
392
+ fontSize: pdfTableStyleConfig.headerFontSize,
393
+ fillColor: pdfTableStyleConfig.headerBgColor,
394
+ color: pdfTableStyleConfig.headerFontColor
395
+ };
396
+ }
@@ -0,0 +1,248 @@
1
+ import { pdfTableStyleConfig } from './pdf-table.config';
2
+ import { MyDate } from '../../utils/my-date';
3
+
4
+ export function buildDataRow(item: any, index: number, headerConfig: any[], fixedTo: number = 2) {
5
+ return headerConfig.map((column: any) => {
6
+ if (column.type === 'tax') {
7
+ const taxValue = getTaxValue(item, column.dbField, column.taxKind);
8
+ const signedTaxValue = shouldRenderNegativeTaxAmount(item, column)
9
+ ? negateNumericLikeValue(taxValue)
10
+ : taxValue;
11
+ const renderedTaxValue = formatNumericLikeValue(signedTaxValue, fixedTo);
12
+ return { text: renderedTaxValue, fontSize: pdfTableStyleConfig.bodyFontSize, color: pdfTableStyleConfig.bodyFontColor, alignment: getNumericAlignment(renderedTaxValue) };
13
+ }
14
+
15
+ const header = column.header;
16
+ if (header.text === 'S.No') {
17
+ const serial = String(index + 1);
18
+ return { text: serial, fontSize: pdfTableStyleConfig.bodyFontSize, color: pdfTableStyleConfig.bodyFontColor, alignment: getNumericAlignment(serial) };
19
+ }
20
+
21
+ const mainValue = formatFieldValue(item, header, fixedTo);
22
+ const stackedLines = (header.stackFields ?? [])
23
+ .map((stackField: any) => {
24
+ const stackValue = formatFieldValue(item, stackField, fixedTo);
25
+ if (!stackValue) {
26
+ return null;
27
+ }
28
+ return { text: `${stackField.text}: ${stackValue}`, fontSize: pdfTableStyleConfig.stackFieldFontSize, color: pdfTableStyleConfig.bodyFontColor, italics: true };
29
+ })
30
+ .filter((line: any) => !!line);
31
+
32
+ if (stackedLines.length === 0) {
33
+ return {
34
+ text: mainValue,
35
+ fontSize: pdfTableStyleConfig.bodyFontSize,
36
+ color: pdfTableStyleConfig.bodyFontColor,
37
+ alignment: getCellAlignment(header.text, mainValue)
38
+ };
39
+ }
40
+
41
+ return {
42
+ stack: [
43
+ { text: mainValue, fontSize: pdfTableStyleConfig.bodyFontSize, color: pdfTableStyleConfig.bodyFontColor },
44
+ ...stackedLines
45
+ ]
46
+ };
47
+ });
48
+ }
49
+
50
+ function formatFieldValue(item: any, fieldConfig: any, fixedTo: number) {
51
+ const rawValue = getFirstFieldValue(item, fieldConfig?.dbFields);
52
+ if (isExpiryField(fieldConfig)) {
53
+ return formatExpiryDateValue(rawValue);
54
+ }
55
+
56
+ const signedValue = shouldRenderNegativeField(item, fieldConfig)
57
+ ? negateNumericLikeValue(rawValue)
58
+ : rawValue;
59
+ return formatNumericLikeValue(signedValue, fixedTo, shouldSkipFixedTo(fieldConfig));
60
+ }
61
+
62
+ function getTaxValue(item: any, taxName: 'CGST' | 'SGST' | 'IGST', taxKind: 'rate' | 'amount') {
63
+ if (taxName === 'IGST') {
64
+ const fields = taxKind === 'rate' ? ['IGSTPerc'] : ['IGSTAmt'];
65
+ return getFirstFieldValue(item, fields);
66
+ }
67
+ const fields = taxKind === 'rate'
68
+ ? [`${taxName}Perc`, taxName]
69
+ : [`${taxName}Amt`, taxName];
70
+ return getFirstFieldValue(item, fields);
71
+ }
72
+
73
+ function shouldRenderNegativeTaxAmount(item: any, column: any) {
74
+ return !!item?.Ret && column?.taxKind === 'amount';
75
+ }
76
+
77
+ function shouldRenderNegativeField(item: any, fieldConfig: any) {
78
+ if (!item?.Ret) {
79
+ return false;
80
+ }
81
+
82
+ const headerText = String(fieldConfig?.text ?? '').trim().toUpperCase();
83
+ return headerText === 'QTY'
84
+ || headerText === 'OFFER QTY'
85
+ || headerText === 'PRICE'
86
+ || headerText === 'LINE TOTAL';
87
+ }
88
+
89
+ function negateNumericLikeValue(value: string) {
90
+ if (!isNumericLike(String(value ?? ''))) {
91
+ return value;
92
+ }
93
+
94
+ const normalized = Number(String(value).replace(/,/g, '').trim());
95
+ if (!Number.isFinite(normalized)) {
96
+ return value;
97
+ }
98
+
99
+ return String(normalized === 0 ? 0 : -Math.abs(normalized));
100
+ }
101
+
102
+ export function getFirstFieldValue(item: any, dbFields: string[] = []) {
103
+ for (const field of dbFields) {
104
+ const value = readValue(item, field);
105
+ if (value !== undefined && value !== null && value !== '') {
106
+ return String(value);
107
+ }
108
+ }
109
+ return '';
110
+ }
111
+
112
+ function readValue(item: any, field: string) {
113
+ if (!item || !field) {
114
+ return undefined;
115
+ }
116
+
117
+ if (item[field] !== undefined) {
118
+ return item[field];
119
+ }
120
+
121
+ const dottedPathValue = field.split('.').reduce((current: any, key: string) => {
122
+ if (current && current[key] !== undefined) {
123
+ return current[key];
124
+ }
125
+ return undefined;
126
+ }, item);
127
+
128
+ if (dottedPathValue !== undefined) {
129
+ return dottedPathValue;
130
+ }
131
+
132
+ return deepFindByKey(item, field);
133
+ }
134
+
135
+ function deepFindByKey(source: any, field: string): any {
136
+ if (!source || typeof source !== 'object') {
137
+ return undefined;
138
+ }
139
+
140
+ if (source[field] !== undefined) {
141
+ return source[field];
142
+ }
143
+
144
+ for (const key of Object.keys(source)) {
145
+ const value = source[key];
146
+ if (value && typeof value === 'object') {
147
+ const nestedValue = deepFindByKey(value, field);
148
+ if (nestedValue !== undefined) {
149
+ return nestedValue;
150
+ }
151
+ }
152
+ }
153
+
154
+ return undefined;
155
+ }
156
+
157
+ export function getNumericAlignment(value: string) {
158
+ return isNumericLike(value) ? 'right' : 'left';
159
+ }
160
+
161
+ export function getCellAlignment(headerText: string, value: string) {
162
+ if (isRightAlignedHeader(headerText)) {
163
+ return 'right';
164
+ }
165
+ if (isLeftAlignedHeader(headerText)) {
166
+ return 'left';
167
+ }
168
+ return getNumericAlignment(value);
169
+ }
170
+
171
+ function isNumericLike(value: string) {
172
+ if (!value) {
173
+ return false;
174
+ }
175
+ const normalized = value.replace(/,/g, '').trim();
176
+ return /^-?\d+(\.\d+)?$/.test(normalized);
177
+ }
178
+
179
+ function isLeftAlignedHeader(headerText: string) {
180
+ return false;
181
+ }
182
+
183
+ function isRightAlignedHeader(headerText: string) {
184
+ const normalizedHeader = String(headerText ?? '').replace(/\s+/g, '').trim().toUpperCase();
185
+ return normalizedHeader === 'QTY' || normalizedHeader === 'OFFERQTY';
186
+ }
187
+
188
+ function formatNumericLikeValue(value: string, fixedTo: number, skipFixedTo: boolean = false) {
189
+ if (skipFixedTo) {
190
+ return value;
191
+ }
192
+ if (!isNumericLike(value)) {
193
+ return value;
194
+ }
195
+ const normalized = Number(String(value).replace(/,/g, '').trim());
196
+ if (!Number.isFinite(normalized)) {
197
+ return value;
198
+ }
199
+ return normalized.toFixed(fixedTo);
200
+ }
201
+
202
+ function isExpiryField(fieldConfig: any) {
203
+ const text = String(fieldConfig?.text ?? '').trim().toUpperCase();
204
+ if (text === 'EXPIRY' || text === 'EXPIRY DATE' || text === 'EXDT') {
205
+ return true;
206
+ }
207
+
208
+ const dbFields = Array.isArray(fieldConfig?.dbFields) ? fieldConfig.dbFields : [];
209
+ return dbFields.some((field: any) => {
210
+ const normalized = String(field ?? '').trim().toUpperCase();
211
+ return normalized === 'EXDT' || normalized.endsWith('.EXDT') || normalized.endsWith('.EXPIRY');
212
+ });
213
+ }
214
+
215
+ function formatExpiryDateValue(value: string) {
216
+ if (!value) {
217
+ return value;
218
+ }
219
+
220
+ const input = String(value).trim();
221
+ if (!input) {
222
+ return '';
223
+ }
224
+
225
+ if (/^\d{2}\/\d{2}$/.test(input)) {
226
+ return input;
227
+ }
228
+
229
+ const parsed = new Date(input);
230
+ if (Number.isNaN(parsed.getTime())) {
231
+ return input;
232
+ }
233
+
234
+ return MyDate.ConvertUTCDateToReadableExDate(input) || input;
235
+ }
236
+
237
+ function shouldSkipFixedTo(header: any) {
238
+ const text = String(header?.text ?? '').trim().toUpperCase();
239
+ if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO') {
240
+ return true;
241
+ }
242
+
243
+ const dbFields = Array.isArray(header?.dbFields) ? header.dbFields : [];
244
+ return dbFields.some((field: any) => {
245
+ const normalized = String(field ?? '').trim().toUpperCase();
246
+ return normalized === 'BN' || normalized === 'BNO' || normalized.endsWith('.BN');
247
+ });
248
+ }