shareneus 1.7.314 → 1.7.316

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.
@@ -107,7 +107,7 @@ function getRenderableColumns(headerConfig, sType = '') {
107
107
  columns.push({
108
108
  type: 'tax',
109
109
  taxKind: 'rate',
110
- dbField: 'IGST',
110
+ dbField: 'GST',
111
111
  width: header.width,
112
112
  });
113
113
  continue;
@@ -116,7 +116,7 @@ function getRenderableColumns(headerConfig, sType = '') {
116
116
  columns.push({
117
117
  type: 'tax',
118
118
  taxKind: 'amount',
119
- dbField: 'IGST',
119
+ dbField: 'GST',
120
120
  width: header.width,
121
121
  });
122
122
  continue;
@@ -154,13 +154,8 @@ function getRenderableColumns(headerConfig, sType = '') {
154
154
  columns.push({
155
155
  type: 'tax',
156
156
  taxKind: 'rate',
157
- dbField: 'CGST',
158
- width: getTaxSubWidth(header.width, 'rate'),
159
- }, {
160
- type: 'tax',
161
- taxKind: 'rate',
162
- dbField: 'SGST',
163
- width: getTaxSubWidth(header.width, 'rate'),
157
+ dbField: 'GST',
158
+ width: header.width,
164
159
  });
165
160
  continue;
166
161
  }
@@ -168,13 +163,8 @@ function getRenderableColumns(headerConfig, sType = '') {
168
163
  columns.push({
169
164
  type: 'tax',
170
165
  taxKind: 'amount',
171
- dbField: 'CGST',
172
- width: getTaxSubWidth(header.width, 'amount'),
173
- }, {
174
- type: 'tax',
175
- taxKind: 'amount',
176
- dbField: 'SGST',
177
- width: getTaxSubWidth(header.width, 'amount'),
166
+ dbField: 'GST',
167
+ width: header.width,
178
168
  });
179
169
  continue;
180
170
  }
@@ -194,9 +184,9 @@ function buildHeaderRows(headerConfig, sType = '') {
194
184
  const hasDiscPercent = headerConfig.some((header) => header.text === 'Disc %');
195
185
  const hasDiscAmount = headerConfig.some((header) => isDiscountAmountHeader(header.text));
196
186
  const hasDiscGroup = hasDiscPercent && hasDiscAmount;
197
- const hasGroupedHeaders = hasTaxPercent || hasTaxAmount || hasDiscGroup;
187
+ const hasGroupedHeaders = hasTaxGroup || hasDiscGroup;
198
188
  if (!hasGroupedHeaders) {
199
- const singleRow = headerConfig.map((header) => (Object.assign({ text: header.text, alignment: header.alignment, dbFields: header.dbFields, stackFields: header.stackFields }, getHeaderCellStyle())));
189
+ const singleRow = headerConfig.map((header) => (Object.assign({ text: getSingleTaxHeaderText(header), alignment: header.alignment, dbFields: header.dbFields, stackFields: header.stackFields }, getHeaderCellStyle())));
200
190
  return [singleRow];
201
191
  }
202
192
  const topRow = [];
@@ -213,12 +203,12 @@ function buildHeaderRows(headerConfig, sType = '') {
213
203
  continue;
214
204
  }
215
205
  if (isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
216
- topRow.push(Object.assign({ text: 'IGST %', rowSpan: 2, alignment: 'center' }, getHeaderCellStyle()));
206
+ topRow.push(Object.assign({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center' }, getHeaderCellStyle()));
217
207
  subRow.push({});
218
208
  continue;
219
209
  }
220
210
  if (isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
221
- topRow.push(Object.assign({ text: 'IGST Amt', rowSpan: 2, alignment: 'center' }, getHeaderCellStyle()));
211
+ topRow.push(Object.assign({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center' }, getHeaderCellStyle()));
222
212
  subRow.push({});
223
213
  continue;
224
214
  }
@@ -234,13 +224,13 @@ function buildHeaderRows(headerConfig, sType = '') {
234
224
  continue;
235
225
  }
236
226
  if (!isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
237
- topRow.push(Object.assign({ text: header.text, colSpan: 2, alignment: 'center' }, getHeaderCellStyle()), {});
238
- subRow.push(Object.assign({ text: 'CGST', alignment: 'center' }, getHeaderCellStyle()), Object.assign({ text: 'SGST/UGST', alignment: 'center' }, getHeaderCellStyle()));
227
+ topRow.push(Object.assign({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center' }, getHeaderCellStyle()));
228
+ subRow.push({});
239
229
  continue;
240
230
  }
241
231
  if (!isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
242
- topRow.push(Object.assign({ text: header.text, colSpan: 2, alignment: 'center' }, getHeaderCellStyle()), {});
243
- subRow.push(Object.assign({ text: 'CGST', alignment: 'center' }, getHeaderCellStyle()), Object.assign({ text: 'SGST/UGST', alignment: 'center' }, getHeaderCellStyle()));
232
+ topRow.push(Object.assign({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center' }, getHeaderCellStyle()));
233
+ subRow.push({});
244
234
  continue;
245
235
  }
246
236
  if (hasDiscGroup && header.text === 'Disc %') {
@@ -272,6 +262,15 @@ function isTaxPercentHeader(header) {
272
262
  function isTaxAmountHeader(header) {
273
263
  return normalizeHeaderText(header === null || header === void 0 ? void 0 : header.text) === 'TAXAMOUNT';
274
264
  }
265
+ function getSingleTaxHeaderText(header) {
266
+ if (isTaxPercentHeader(header)) {
267
+ return 'GST(%)';
268
+ }
269
+ if (isTaxAmountHeader(header)) {
270
+ return 'GST Amt';
271
+ }
272
+ return header.text;
273
+ }
275
274
  function isTaxHeaderConfig(header) {
276
275
  var _a, _b, _c;
277
276
  const title = (_c = (_b = (_a = header === null || header === void 0 ? void 0 : header.title) !== null && _a !== void 0 ? _a : header === null || header === void 0 ? void 0 : header.CustTitle) !== null && _b !== void 0 ? _b : header === null || header === void 0 ? void 0 : header.Tital) !== null && _c !== void 0 ? _c : header === null || header === void 0 ? void 0 : header.text;
@@ -59,6 +59,20 @@ function formatFieldValue(item, fieldConfig, fixedTo) {
59
59
  return formatNumericLikeValue(signedValue, fixedTo, shouldSkipFixedTo(fieldConfig));
60
60
  }
61
61
  function getTaxValue(item, taxName, taxKind) {
62
+ if (taxName === 'GST') {
63
+ if (taxKind === 'rate') {
64
+ return getCombinedTaxValue(item, ['CombinedTaxPercentage', 'GSTPerc'], [
65
+ ['CGSTPerc', 'CGST'],
66
+ ['SGSTPerc', 'SGST'],
67
+ ['IGSTPerc', 'IGST']
68
+ ]);
69
+ }
70
+ return getCombinedTaxValue(item, ['TotalTaxAmount', 'TaxAmount', 'GSTAmt'], [
71
+ ['CGSTAmt', 'CGST'],
72
+ ['SGSTAmt', 'SGST'],
73
+ ['IGSTAmt', 'IGST']
74
+ ]);
75
+ }
62
76
  if (taxName === 'IGST') {
63
77
  const fields = taxKind === 'rate' ? ['IGSTPerc'] : ['IGSTAmt'];
64
78
  return getFirstFieldValue(item, fields);
@@ -68,6 +82,23 @@ function getTaxValue(item, taxName, taxKind) {
68
82
  : [`${taxName}Amt`, taxName];
69
83
  return getFirstFieldValue(item, fields);
70
84
  }
85
+ function getCombinedTaxValue(item, combinedFields, componentFieldGroups) {
86
+ const combinedValue = getFirstFieldValue(item, combinedFields);
87
+ if (combinedValue) {
88
+ return combinedValue;
89
+ }
90
+ const values = componentFieldGroups
91
+ .map((fields) => getFirstFieldValue(item, fields))
92
+ .filter((value) => value !== '');
93
+ if (values.length === 0) {
94
+ return '';
95
+ }
96
+ const numericValues = values.map((value) => Number(value.replace(/,/g, '').trim()));
97
+ if (numericValues.some((value) => !Number.isFinite(value))) {
98
+ return values[0];
99
+ }
100
+ return String(numericValues.reduce((sum, value) => sum + value, 0));
101
+ }
71
102
  function shouldRenderNegativeTaxAmount(item, column) {
72
103
  return !!(item === null || item === void 0 ? void 0 : item.Ret) && (column === null || column === void 0 ? void 0 : column.taxKind) === 'amount';
73
104
  }
@@ -209,7 +240,7 @@ function shouldSkipFixedTo(header) {
209
240
  var _a;
210
241
  const text = String((_a = header === null || header === void 0 ? void 0 : header.text) !== null && _a !== void 0 ? _a : '').trim().toUpperCase();
211
242
  const normalizedText = text.replace(/\s+/g, '');
212
- if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'MPN') {
243
+ if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'OFQTY' || normalizedText === 'MPN') {
213
244
  return true;
214
245
  }
215
246
  const dbFields = Array.isArray(header === null || header === void 0 ? void 0 : header.dbFields) ? header.dbFields : [];
@@ -218,9 +249,11 @@ function shouldSkipFixedTo(header) {
218
249
  return normalized === 'BN'
219
250
  || normalized === 'BNO'
220
251
  || normalized === 'QTY'
252
+ || normalized === 'OFQTY'
221
253
  || normalized === 'MPN'
222
254
  || normalized.endsWith('.BN')
223
255
  || normalized.endsWith('.QTY')
256
+ || normalized.endsWith('.OFQTY')
224
257
  || normalized.endsWith('.MPN')
225
258
  || normalized.endsWith('PERC')
226
259
  || normalized.endsWith('.PERC');
@@ -262,6 +262,9 @@ function buildSectionTotalRow(columns, label, totals, fixedTo) {
262
262
  if (column.dbField === 'IGST' && column.taxKind === 'amount') {
263
263
  return buildTotalValueCell(formatAmount(totals.igstAmount, fixedTo));
264
264
  }
265
+ if (column.dbField === 'GST' && column.taxKind === 'amount') {
266
+ return buildTotalValueCell(formatAmount(totals.cgstAmount + totals.sgstAmount + totals.igstAmount, fixedTo));
267
+ }
265
268
  return buildTotalValueCell('');
266
269
  }
267
270
  const headerText = (_b = (_a = column.header) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : '';
@@ -400,7 +403,7 @@ function shouldSkipFixedTo(header) {
400
403
  var _a;
401
404
  const text = String((_a = header === null || header === void 0 ? void 0 : header.text) !== null && _a !== void 0 ? _a : '').trim().toUpperCase();
402
405
  const normalizedText = text.replace(/\s+/g, '');
403
- if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'MPN') {
406
+ if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'OFQTY' || normalizedText === 'MPN') {
404
407
  return true;
405
408
  }
406
409
  const dbFields = Array.isArray(header === null || header === void 0 ? void 0 : header.dbFields) ? header.dbFields : [];
@@ -409,9 +412,11 @@ function shouldSkipFixedTo(header) {
409
412
  return normalized === 'BN'
410
413
  || normalized === 'BNO'
411
414
  || normalized === 'QTY'
415
+ || normalized === 'OFQTY'
412
416
  || normalized === 'MPN'
413
417
  || normalized.endsWith('.BN')
414
418
  || normalized.endsWith('.QTY')
419
+ || normalized.endsWith('.OFQTY')
415
420
  || normalized.endsWith('.MPN')
416
421
  || normalized.endsWith('PERC')
417
422
  || normalized.endsWith('.PERC');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shareneus",
3
- "version": "1.7.314",
3
+ "version": "1.7.316",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -113,25 +113,25 @@ export function getRenderableColumns(headerConfig: any[], sType: string = '') {
113
113
  continue;
114
114
  }
115
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
- }
116
+ if (isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
117
+ columns.push({
118
+ type: 'tax',
119
+ taxKind: 'rate',
120
+ dbField: 'GST',
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: 'GST',
131
+ width: header.width,
132
+ });
133
+ continue;
134
+ }
135
135
 
136
136
  // --- Intra / CGST + SGST ---
137
137
  if (!isInter && hasTaxGroup && isTaxPercentHeader(header)) {
@@ -170,41 +170,25 @@ export function getRenderableColumns(headerConfig: any[], sType: string = '') {
170
170
  continue;
171
171
  }
172
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, 'rate'),
180
- },
181
- {
182
- type: 'tax',
183
- taxKind: 'rate',
184
- dbField: 'SGST',
185
- width: getTaxSubWidth(header.width, 'rate'),
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, 'amount'),
198
- },
199
- {
200
- type: 'tax',
201
- taxKind: 'amount',
202
- dbField: 'SGST',
203
- width: getTaxSubWidth(header.width, 'amount'),
204
- }
205
- );
206
- continue;
207
- }
173
+ if (!isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
174
+ columns.push({
175
+ type: 'tax',
176
+ taxKind: 'rate',
177
+ dbField: 'GST',
178
+ width: header.width,
179
+ });
180
+ continue;
181
+ }
182
+
183
+ if (!isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
184
+ columns.push({
185
+ type: 'tax',
186
+ taxKind: 'amount',
187
+ dbField: 'GST',
188
+ width: header.width,
189
+ });
190
+ continue;
191
+ }
208
192
 
209
193
  columns.push({
210
194
  type: 'normal',
@@ -223,16 +207,16 @@ export function buildHeaderRows(headerConfig: any[], sType: string = '') {
223
207
  const hasDiscPercent = headerConfig.some((header: any) => header.text === 'Disc %');
224
208
  const hasDiscAmount = headerConfig.some((header: any) => isDiscountAmountHeader(header.text));
225
209
  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
- }));
210
+ const hasGroupedHeaders = hasTaxGroup || hasDiscGroup;
211
+
212
+ if (!hasGroupedHeaders) {
213
+ const singleRow = headerConfig.map((header: any) => ({
214
+ text: getSingleTaxHeaderText(header),
215
+ alignment: header.alignment,
216
+ dbFields: header.dbFields,
217
+ stackFields: header.stackFields,
218
+ ...getHeaderCellStyle()
219
+ }));
236
220
  return [singleRow];
237
221
  }
238
222
 
@@ -258,17 +242,17 @@ export function buildHeaderRows(headerConfig: any[], sType: string = '') {
258
242
  continue;
259
243
  }
260
244
 
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
- }
245
+ if (isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
246
+ topRow.push({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center', ...getHeaderCellStyle() });
247
+ subRow.push({});
248
+ continue;
249
+ }
250
+
251
+ if (isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
252
+ topRow.push({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center', ...getHeaderCellStyle() });
253
+ subRow.push({});
254
+ continue;
255
+ }
272
256
 
273
257
  // --- Intra / CGST + SGST ---
274
258
  if (!isInter && hasTaxGroup && isTaxPercentHeader(header)) {
@@ -295,29 +279,17 @@ export function buildHeaderRows(headerConfig: any[], sType: string = '') {
295
279
  continue;
296
280
  }
297
281
 
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
- }
282
+ if (!isInter && !hasTaxGroup && isTaxPercentHeader(header)) {
283
+ topRow.push({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center', ...getHeaderCellStyle() });
284
+ subRow.push({});
285
+ continue;
286
+ }
287
+
288
+ if (!isInter && !hasTaxGroup && isTaxAmountHeader(header)) {
289
+ topRow.push({ text: getSingleTaxHeaderText(header), rowSpan: 2, alignment: 'center', ...getHeaderCellStyle() });
290
+ subRow.push({});
291
+ continue;
292
+ }
321
293
 
322
294
  if (hasDiscGroup && header.text === 'Disc %') {
323
295
  topRow.push(
@@ -358,9 +330,19 @@ function isTaxPercentHeader(header: any) {
358
330
  return normalizeHeaderText(header?.text) === 'TAX%';
359
331
  }
360
332
 
361
- function isTaxAmountHeader(header: any) {
362
- return normalizeHeaderText(header?.text) === 'TAXAMOUNT';
363
- }
333
+ function isTaxAmountHeader(header: any) {
334
+ return normalizeHeaderText(header?.text) === 'TAXAMOUNT';
335
+ }
336
+
337
+ function getSingleTaxHeaderText(header: any) {
338
+ if (isTaxPercentHeader(header)) {
339
+ return 'GST(%)';
340
+ }
341
+ if (isTaxAmountHeader(header)) {
342
+ return 'GST Amt';
343
+ }
344
+ return header.text;
345
+ }
364
346
 
365
347
  function isTaxHeaderConfig(header: any) {
366
348
  const title = header?.title ?? header?.CustTitle ?? header?.Tital ?? header?.text;
@@ -59,16 +59,53 @@ function formatFieldValue(item: any, fieldConfig: any, fixedTo: number) {
59
59
  return formatNumericLikeValue(signedValue, fixedTo, shouldSkipFixedTo(fieldConfig));
60
60
  }
61
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
- }
62
+ function getTaxValue(item: any, taxName: 'CGST' | 'SGST' | 'IGST' | 'GST', taxKind: 'rate' | 'amount') {
63
+ if (taxName === 'GST') {
64
+ if (taxKind === 'rate') {
65
+ return getCombinedTaxValue(item, ['CombinedTaxPercentage', 'GSTPerc'], [
66
+ ['CGSTPerc', 'CGST'],
67
+ ['SGSTPerc', 'SGST'],
68
+ ['IGSTPerc', 'IGST']
69
+ ]);
70
+ }
71
+ return getCombinedTaxValue(item, ['TotalTaxAmount', 'TaxAmount', 'GSTAmt'], [
72
+ ['CGSTAmt', 'CGST'],
73
+ ['SGSTAmt', 'SGST'],
74
+ ['IGSTAmt', 'IGST']
75
+ ]);
76
+ }
77
+
78
+ if (taxName === 'IGST') {
79
+ const fields = taxKind === 'rate' ? ['IGSTPerc'] : ['IGSTAmt'];
80
+ return getFirstFieldValue(item, fields);
81
+ }
67
82
  const fields = taxKind === 'rate'
68
83
  ? [`${taxName}Perc`, taxName]
69
84
  : [`${taxName}Amt`, taxName];
70
- return getFirstFieldValue(item, fields);
71
- }
85
+ return getFirstFieldValue(item, fields);
86
+ }
87
+
88
+ function getCombinedTaxValue(item: any, combinedFields: string[], componentFieldGroups: string[][]) {
89
+ const combinedValue = getFirstFieldValue(item, combinedFields);
90
+ if (combinedValue) {
91
+ return combinedValue;
92
+ }
93
+
94
+ const values = componentFieldGroups
95
+ .map((fields: string[]) => getFirstFieldValue(item, fields))
96
+ .filter((value: string) => value !== '');
97
+
98
+ if (values.length === 0) {
99
+ return '';
100
+ }
101
+
102
+ const numericValues = values.map((value: string) => Number(value.replace(/,/g, '').trim()));
103
+ if (numericValues.some((value: number) => !Number.isFinite(value))) {
104
+ return values[0];
105
+ }
106
+
107
+ return String(numericValues.reduce((sum: number, value: number) => sum + value, 0));
108
+ }
72
109
 
73
110
  function shouldRenderNegativeTaxAmount(item: any, column: any) {
74
111
  return !!item?.Ret && column?.taxKind === 'amount';
@@ -237,21 +274,23 @@ function formatExpiryDateValue(value: string) {
237
274
  function shouldSkipFixedTo(header: any) {
238
275
  const text = String(header?.text ?? '').trim().toUpperCase();
239
276
  const normalizedText = text.replace(/\s+/g, '');
240
- if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'MPN') {
241
- return true;
242
- }
277
+ if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'OFQTY' || normalizedText === 'MPN') {
278
+ return true;
279
+ }
243
280
 
244
281
  const dbFields = Array.isArray(header?.dbFields) ? header.dbFields : [];
245
282
  return dbFields.some((field: any) => {
246
283
  const normalized = String(field ?? '').trim().toUpperCase();
247
284
  return normalized === 'BN'
248
- || normalized === 'BNO'
249
- || normalized === 'QTY'
250
- || normalized === 'MPN'
251
- || normalized.endsWith('.BN')
252
- || normalized.endsWith('.QTY')
253
- || normalized.endsWith('.MPN')
254
- || normalized.endsWith('PERC')
255
- || normalized.endsWith('.PERC');
285
+ || normalized === 'BNO'
286
+ || normalized === 'QTY'
287
+ || normalized === 'OFQTY'
288
+ || normalized === 'MPN'
289
+ || normalized.endsWith('.BN')
290
+ || normalized.endsWith('.QTY')
291
+ || normalized.endsWith('.OFQTY')
292
+ || normalized.endsWith('.MPN')
293
+ || normalized.endsWith('PERC')
294
+ || normalized.endsWith('.PERC');
256
295
  });
257
296
  }
@@ -275,11 +275,14 @@ function buildSectionTotalRow(columns: any[], label: string, totals: any, fixedT
275
275
  if (column.dbField === 'SGST' && column.taxKind === 'amount') {
276
276
  return buildTotalValueCell(formatAmount(totals.sgstAmount, fixedTo));
277
277
  }
278
- if (column.dbField === 'IGST' && column.taxKind === 'amount') {
279
- return buildTotalValueCell(formatAmount(totals.igstAmount, fixedTo));
280
- }
281
- return buildTotalValueCell('');
282
- }
278
+ if (column.dbField === 'IGST' && column.taxKind === 'amount') {
279
+ return buildTotalValueCell(formatAmount(totals.igstAmount, fixedTo));
280
+ }
281
+ if (column.dbField === 'GST' && column.taxKind === 'amount') {
282
+ return buildTotalValueCell(formatAmount(totals.cgstAmount + totals.sgstAmount + totals.igstAmount, fixedTo));
283
+ }
284
+ return buildTotalValueCell('');
285
+ }
283
286
 
284
287
  const headerText = column.header?.text ?? '';
285
288
  if (headerText === 'Description') {
@@ -452,22 +455,24 @@ function shouldNegateFallbackHeaderValue(item: any, headerText: string) {
452
455
  function shouldSkipFixedTo(header: any) {
453
456
  const text = String(header?.text ?? '').trim().toUpperCase();
454
457
  const normalizedText = text.replace(/\s+/g, '');
455
- if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'MPN') {
456
- return true;
457
- }
458
+ if (text === 'HSN/SAC' || text === 'BN' || text === 'BNO' || text.includes('%') || normalizedText === 'QTY' || normalizedText === 'OFFERQTY' || normalizedText === 'OFQTY' || normalizedText === 'MPN') {
459
+ return true;
460
+ }
458
461
 
459
462
  const dbFields = Array.isArray(header?.dbFields) ? header.dbFields : [];
460
463
  return dbFields.some((field: any) => {
461
464
  const normalized = String(field ?? '').trim().toUpperCase();
462
465
  return normalized === 'BN'
463
- || normalized === 'BNO'
464
- || normalized === 'QTY'
465
- || normalized === 'MPN'
466
- || normalized.endsWith('.BN')
467
- || normalized.endsWith('.QTY')
468
- || normalized.endsWith('.MPN')
469
- || normalized.endsWith('PERC')
470
- || normalized.endsWith('.PERC');
466
+ || normalized === 'BNO'
467
+ || normalized === 'QTY'
468
+ || normalized === 'OFQTY'
469
+ || normalized === 'MPN'
470
+ || normalized.endsWith('.BN')
471
+ || normalized.endsWith('.QTY')
472
+ || normalized.endsWith('.OFQTY')
473
+ || normalized.endsWith('.MPN')
474
+ || normalized.endsWith('PERC')
475
+ || normalized.endsWith('.PERC');
471
476
  });
472
477
  }
473
478