FPSMS-frontend
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 

39 lignes
1.5 KiB

  1. export const formatNum = (n: number) =>
  2. Number.isFinite(n) ? n.toLocaleString(undefined, { maximumFractionDigits: 4 }) : "—";
  3. /** Packaging / compound stock unit (e.g. 1包X25千克) — not a simple unit like 斤 or kg. */
  4. export const isPackagingUom = (uom?: string | null): boolean => {
  5. const unit = uom?.trim();
  6. if (!unit) return false;
  7. if (/^\d/.test(unit)) return true;
  8. if (/[xX×]/.test(unit) && /\d/.test(unit)) return true;
  9. return false;
  10. };
  11. /** Join qty with UOM; packaging units use parentheses to avoid "6 1包…" ambiguity. */
  12. export const joinQtyUom = (num: string, unit: string): string =>
  13. isPackagingUom(unit) ? `${num}(${unit})` : `${num} ${unit}`;
  14. /** Format a quantity with its unit when available. */
  15. export const formatQty = (qty: number | null | undefined, uom?: string | null): string => {
  16. if (qty == null || !Number.isFinite(Number(qty))) return "—";
  17. const num = formatNum(Number(qty));
  18. const unit = uom?.trim();
  19. return unit ? joinQtyUom(num, unit) : num;
  20. };
  21. /** Signed variance for stock adjustments: IN → +qty, OUT → −qty. */
  22. export const formatSignedQty = (
  23. qty: number | null | undefined,
  24. direction: string | null | undefined,
  25. uom?: string | null,
  26. ): string => {
  27. if (qty == null || !Number.isFinite(Number(qty))) return "—";
  28. const abs = Math.abs(Number(qty));
  29. const sign = (direction ?? "").trim().toUpperCase() === "OUT" ? "-" : "+";
  30. const num = formatNum(abs);
  31. const unit = uom?.trim();
  32. const signed = `${sign}${num}`;
  33. return unit ? joinQtyUom(signed, unit) : signed;
  34. };