@shushed/helpers 0.0.223 → 0.0.224

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.
@@ -400,18 +400,15 @@ function transformMasterOrder(payload) {
400
400
  const desc = String(line?.description || '').trim().toLowerCase();
401
401
  return desc === 'delivery';
402
402
  };
403
- let invoicesNetMinor = 0;
404
403
  let invoicesGrossMinor = 0;
405
404
  (payload.invoices || []).forEach((inv) => {
406
405
  (inv.invoice_lines || []).forEach((line) => {
407
406
  if (!isDeliveryItem(line)) {
408
- invoicesNetMinor += toMinorUnits(Number(line?.amount || line?.amount_excl_vat || 0));
409
407
  invoicesGrossMinor += toMinorUnits(Number(line?.amount_including_vat || line?.amount_incl_vat || 0));
410
408
  }
411
409
  });
412
410
  });
413
411
  if (invoicesGrossMinor === 0 && (payload.invoices || []).length > 0) {
414
- invoicesNetMinor = toMinorUnits((payload.invoices || []).reduce((acc, inv) => acc + (inv.amount_excl_vat || 0), 0));
415
412
  invoicesGrossMinor = toMinorUnits((payload.invoices || []).reduce((acc, inv) => acc + (inv.amount_incl_vat || 0), 0));
416
413
  }
417
414
  if (invoicesGrossMinor === 0 && invoicedLineNos.size > 0 && sale0?.sale_lines) {
@@ -423,10 +420,8 @@ function transformMasterOrder(payload) {
423
420
  const lineNo = Number(l?.line_no || -1);
424
421
  return invoicedLineNos.has(lineNo);
425
422
  });
426
- invoicesNetMinor = toMinorUnits(invoicedSaleLines.reduce((acc, l) => acc + (Number(l?.amount || 0)), 0));
427
423
  invoicesGrossMinor = toMinorUnits(invoicedSaleLines.reduce((acc, l) => acc + (Number(l?.amount_including_vat || 0)), 0));
428
424
  }
429
- let nonInvSalesNetMinor = 0;
430
425
  let nonInvSalesGrossMinor = 0;
431
426
  if (sale0?.sale_lines && sale0.sale_lines.length > 0) {
432
427
  const allSaleLines = (sale0.sale_lines || []).filter((l) => {
@@ -436,26 +431,20 @@ function transformMasterOrder(payload) {
436
431
  return false;
437
432
  return true;
438
433
  });
439
- const totalSaleNetMinor = toMinorUnits(allSaleLines.reduce((acc, l) => acc + (Number(l?.amount || 0)), 0));
440
434
  const totalSaleGrossMinor = toMinorUnits(allSaleLines.reduce((acc, l) => acc + (Number(l?.amount_including_vat || 0)), 0));
441
435
  if (invoicesGrossMinor > 0) {
442
- nonInvSalesNetMinor = Math.max(0, totalSaleNetMinor - invoicesNetMinor);
443
436
  nonInvSalesGrossMinor = Math.max(0, totalSaleGrossMinor - invoicesGrossMinor);
444
437
  }
445
438
  else {
446
- nonInvSalesNetMinor = totalSaleNetMinor;
447
439
  nonInvSalesGrossMinor = totalSaleGrossMinor;
448
440
  }
449
441
  }
450
442
  else if (sale0 && (sale0.amount_excl_vat || sale0.amount_incl_vat)) {
451
- const saleNetMinor = toMinorUnits(sale0.amount_excl_vat || 0);
452
443
  const saleGrossMinor = toMinorUnits(sale0.amount_incl_vat || 0);
453
444
  if (invoicesGrossMinor > 0) {
454
- nonInvSalesNetMinor = Math.max(0, saleNetMinor - invoicesNetMinor);
455
445
  nonInvSalesGrossMinor = Math.max(0, saleGrossMinor - invoicesGrossMinor);
456
446
  }
457
447
  else {
458
- nonInvSalesNetMinor = saleNetMinor;
459
448
  nonInvSalesGrossMinor = saleGrossMinor;
460
449
  }
461
450
  }
@@ -468,32 +457,57 @@ function transformMasterOrder(payload) {
468
457
  const lineNo = Number(l?.line_no || -1);
469
458
  return !invoicedLineNos.has(lineNo);
470
459
  });
471
- nonInvSalesNetMinor = toMinorUnits(nonInvoicedSales.reduce((acc, l) => acc + (Number(l?.amount || 0)), 0));
472
460
  nonInvSalesGrossMinor = toMinorUnits(nonInvoicedSales.reduce((acc, l) => acc + (Number(l?.amount_including_vat || 0)), 0));
473
461
  }
474
- const returnsNetMinor = toMinorUnits((payload.credit_memos || []).reduce((acc, cm) => acc + (cm.amount_excl_vat || 0), 0));
475
- const returnsGrossMinor = toMinorUnits((payload.credit_memos || []).reduce((acc, cm) => acc + (cm.amount_incl_vat || 0), 0));
476
- const totalNetMinor = invoicesNetMinor + nonInvSalesNetMinor;
477
462
  const totalGrossMinor = invoicesGrossMinor + nonInvSalesGrossMinor;
478
- const total = {
479
- amount_net: moneyFromMinor(totalNetMinor),
480
- amount_gross: moneyFromMinor(totalGrossMinor),
481
- discount_amount_net: money(0),
482
- discount_amount_gross: money(0),
483
- discount_amount_percent: 0,
484
- };
485
- const return_total = (payload.credit_memos && payload.credit_memos.length > 0)
486
- ? {
487
- amount_net: moneyFromMinor(returnsNetMinor),
488
- amount_gross: moneyFromMinor(returnsGrossMinor),
489
- discount_amount_net: money(0),
490
- discount_amount_gross: money(0),
491
- discount_amount_percent: 0,
463
+ const invoicesNetMinorWithDelivery = toMinorUnits((payload.invoices || []).reduce((acc, inv) => acc + (inv.amount_excl_vat || 0), 0));
464
+ const invoicesGrossMinorWithDelivery = toMinorUnits((payload.invoices || []).reduce((acc, inv) => acc + (inv.amount_incl_vat || 0), 0));
465
+ let nonInvSalesNetMinorWithDelivery = 0;
466
+ let nonInvSalesGrossMinorWithDelivery = 0;
467
+ if (sale0?.sale_lines && sale0.sale_lines.length > 0) {
468
+ const allSaleLinesWithDelivery = (sale0.sale_lines || []).filter((l) => {
469
+ if (String(l?.type || '').toLowerCase() !== 'item')
470
+ return false;
471
+ return true;
472
+ });
473
+ const totalSaleNetMinorWithDelivery = toMinorUnits(allSaleLinesWithDelivery.reduce((acc, l) => acc + (Number(l?.amount || 0)), 0));
474
+ const totalSaleGrossMinorWithDelivery = toMinorUnits(allSaleLinesWithDelivery.reduce((acc, l) => acc + (Number(l?.amount_including_vat || 0)), 0));
475
+ if (invoicesGrossMinorWithDelivery > 0) {
476
+ nonInvSalesNetMinorWithDelivery = Math.max(0, totalSaleNetMinorWithDelivery - invoicesNetMinorWithDelivery);
477
+ nonInvSalesGrossMinorWithDelivery = Math.max(0, totalSaleGrossMinorWithDelivery - invoicesGrossMinorWithDelivery);
492
478
  }
493
- : undefined;
494
- const net_total = {
495
- amount_net: moneyFromMinor(Math.max(0, totalNetMinor - returnsNetMinor)),
496
- amount_gross: moneyFromMinor(Math.max(0, totalGrossMinor - returnsGrossMinor)),
479
+ else {
480
+ nonInvSalesNetMinorWithDelivery = totalSaleNetMinorWithDelivery;
481
+ nonInvSalesGrossMinorWithDelivery = totalSaleGrossMinorWithDelivery;
482
+ }
483
+ }
484
+ else if (sale0 && (sale0.amount_excl_vat || sale0.amount_incl_vat)) {
485
+ const saleNetMinor = toMinorUnits(sale0.amount_excl_vat || 0);
486
+ const saleGrossMinor = toMinorUnits(sale0.amount_incl_vat || 0);
487
+ if (invoicesGrossMinorWithDelivery > 0) {
488
+ nonInvSalesNetMinorWithDelivery = Math.max(0, saleNetMinor - invoicesNetMinorWithDelivery);
489
+ nonInvSalesGrossMinorWithDelivery = Math.max(0, saleGrossMinor - invoicesGrossMinorWithDelivery);
490
+ }
491
+ else {
492
+ nonInvSalesNetMinorWithDelivery = saleNetMinor;
493
+ nonInvSalesGrossMinorWithDelivery = saleGrossMinor;
494
+ }
495
+ }
496
+ else {
497
+ const nonInvoicedSalesWithDelivery = (sale0?.sale_lines || []).filter((l) => {
498
+ if (String(l?.type || '').toLowerCase() !== 'item')
499
+ return false;
500
+ const lineNo = Number(l?.line_no || -1);
501
+ return !invoicedLineNos.has(lineNo);
502
+ });
503
+ nonInvSalesNetMinorWithDelivery = toMinorUnits(nonInvoicedSalesWithDelivery.reduce((acc, l) => acc + (Number(l?.amount || 0)), 0));
504
+ nonInvSalesGrossMinorWithDelivery = toMinorUnits(nonInvoicedSalesWithDelivery.reduce((acc, l) => acc + (Number(l?.amount_including_vat || 0)), 0));
505
+ }
506
+ const totalNetMinorWithDelivery = invoicesNetMinorWithDelivery + nonInvSalesNetMinorWithDelivery;
507
+ const totalGrossMinorWithDelivery = invoicesGrossMinorWithDelivery + nonInvSalesGrossMinorWithDelivery;
508
+ const total = {
509
+ amount_net: moneyFromMinor(totalNetMinorWithDelivery),
510
+ amount_gross: moneyFromMinor(totalGrossMinorWithDelivery),
497
511
  discount_amount_net: money(0),
498
512
  discount_amount_gross: money(0),
499
513
  discount_amount_percent: 0,
@@ -603,7 +617,7 @@ function transformMasterOrder(payload) {
603
617
  const merchReturnGrossFromCreditMemos = (payload.credit_memos || []).reduce((acc, cm) => {
604
618
  const lines = cm?.credit_memo_lines || [];
605
619
  let hasQualifying = false;
606
- const sum = lines.reduce((s, l) => {
620
+ const sumGross = lines.reduce((s, l) => {
607
621
  const itemNo = String(l?.item_no || l?.no || "");
608
622
  const desc = String(l?.description || "");
609
623
  const looksProduct = itemNo.includes('-') || desc.includes(' - ');
@@ -616,24 +630,36 @@ function transformMasterOrder(payload) {
616
630
  }
617
631
  return s;
618
632
  }, 0);
633
+ const sumNet = lines.reduce((s, l) => {
634
+ const itemNo = String(l?.item_no || l?.no || "");
635
+ const desc = String(l?.description || "");
636
+ const looksProduct = itemNo.includes('-') || desc.includes(' - ');
637
+ const typeStr = String(l?.type || "").toLowerCase();
638
+ const isItemish = typeStr.includes('item') || looksProduct;
639
+ const isRefund = itemNo.toUpperCase() === 'REFUND';
640
+ if ((l?.quantity || 0) > 0 && isItemish && !isRefund && !isDeliveryItem(l)) {
641
+ return s + (l?.amount || l?.amount_excl_vat || 0);
642
+ }
643
+ return s;
644
+ }, 0);
619
645
  if (!hasQualifying)
620
646
  return acc;
621
647
  if (cm?.amount_incl_vat != null && cm.amount_incl_vat > 0) {
622
- return acc + cm.amount_incl_vat;
648
+ return { gross: acc.gross + cm.amount_incl_vat, net: acc.net + (cm.amount_excl_vat || 0) };
623
649
  }
624
- return acc + sum;
625
- }, 0);
650
+ return { gross: acc.gross + sumGross, net: acc.net + sumNet };
651
+ }, { gross: 0, net: 0 });
626
652
  const merchReturnGrossFromReturnSales = (payload.sales || []).reduce((acc, sale) => {
627
653
  const docTypeRaw = String(sale?.document_type || sale?.documentType || "");
628
654
  const isReturnOrder = docTypeRaw.toLowerCase().includes('return');
629
655
  if (!isReturnOrder)
630
656
  return acc;
631
657
  if (sale?.amount_incl_vat != null && sale.amount_incl_vat > 0) {
632
- return acc + sale.amount_incl_vat;
658
+ return { gross: acc.gross + sale.amount_incl_vat, net: acc.net + (sale.amount_excl_vat || sale.amount || 0) };
633
659
  }
634
660
  const lines = sale?.sale_lines || [];
635
661
  let hasQualifying = false;
636
- const sum = lines.reduce((s, l) => {
662
+ const sumGross = lines.reduce((s, l) => {
637
663
  const itemNo = String(l?.item_no || l?.no || "");
638
664
  const desc = String(l?.description || "");
639
665
  const looksProduct = itemNo.includes('-') || desc.includes(' - ');
@@ -646,10 +672,46 @@ function transformMasterOrder(payload) {
646
672
  }
647
673
  return s;
648
674
  }, 0);
649
- return acc + (sum > 0 ? sum : (hasQualifying ? (sale?.amount_incl_vat || sale?.amount_including_vat || 0) : 0));
650
- }, 0);
651
- const merchReturnGross = merchReturnGrossFromCreditMemos + merchReturnGrossFromReturnSales;
675
+ const sumNet = lines.reduce((s, l) => {
676
+ const itemNo = String(l?.item_no || l?.no || "");
677
+ const desc = String(l?.description || "");
678
+ const looksProduct = itemNo.includes('-') || desc.includes(' - ');
679
+ const typeStr = String(l?.type || "").toLowerCase();
680
+ const isItemish = typeStr.includes('item') || looksProduct;
681
+ const isRefund = itemNo.toUpperCase() === 'REFUND';
682
+ if ((l?.quantity || 0) > 0 && isItemish && !isRefund && !isDeliveryItem(l)) {
683
+ return s + (l?.amount || l?.amount_excl_vat || 0);
684
+ }
685
+ return s;
686
+ }, 0);
687
+ if (sumGross > 0) {
688
+ return { gross: acc.gross + sumGross, net: acc.net + sumNet };
689
+ }
690
+ if (hasQualifying) {
691
+ return { gross: acc.gross + (sale?.amount_incl_vat || sale?.amount_including_vat || 0), net: acc.net + (sale?.amount_excl_vat || sale?.amount || 0) };
692
+ }
693
+ return acc;
694
+ }, { gross: 0, net: 0 });
695
+ const merchReturnGross = merchReturnGrossFromCreditMemos.gross + merchReturnGrossFromReturnSales.gross;
652
696
  const hasMerchReturn = merchReturnGross > 0;
697
+ const returnsNetMinor = toMinorUnits((payload.credit_memos || []).reduce((acc, cm) => acc + (cm.amount_excl_vat || 0), 0));
698
+ const returnsGrossMinor = toMinorUnits((payload.credit_memos || []).reduce((acc, cm) => acc + (cm.amount_incl_vat || 0), 0));
699
+ const return_total = (returnsGrossMinor > 0)
700
+ ? {
701
+ amount_net: moneyFromMinor(returnsNetMinor),
702
+ amount_gross: moneyFromMinor(returnsGrossMinor),
703
+ discount_amount_net: money(0),
704
+ discount_amount_gross: money(0),
705
+ discount_amount_percent: 0,
706
+ }
707
+ : undefined;
708
+ const net_total = {
709
+ amount_net: moneyFromMinor(Math.max(0, totalNetMinorWithDelivery - returnsNetMinor)),
710
+ amount_gross: moneyFromMinor(Math.max(0, totalGrossMinorWithDelivery - returnsGrossMinor)),
711
+ discount_amount_net: money(0),
712
+ discount_amount_gross: money(0),
713
+ discount_amount_percent: 0,
714
+ };
653
715
  const totalOrderGrossMinor = totalGrossMinor;
654
716
  const sourceLineMap = new Map();
655
717
  sourceLines.forEach((line) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shushed/helpers",
3
- "version": "0.0.223",
3
+ "version": "0.0.224",
4
4
  "author": "",
5
5
  "license": "UNLICENSED",
6
6
  "description": "",