Files
butcem/src/shared/products.ts
T

54 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { convertQuantity, formatQuantity, UNITS, type Unit } from "./quantity";
/**
* Ürün (marka/varyant) motoru (Bölüm 6.11). Bir paketin ürün tipinin birimindeki karşılığı:
* - paket birimi ürün tipinin birimiyle aynıysa paket miktarı,
* - aynı boyuttaysa (kg↔g, lt↔ml) çevrilmiş miktar,
* - değilse elle girilen dönüşüm ("5 kg = 50 yıkama", "1 paket = 40 tablet"); yoksa null
* (kayıtta zorunlu; ürün tipinin birimi sonradan değişirse "dönüşüm gerekli" uyarısı).
* Miktarlar binde bir.
*/
const isStandard = (u: string): u is Unit => Object.hasOwn(UNITS, u);
/** Paket birimi ürün tipinin birimine kendiliğinden çevrilebiliyor mu? */
export function autoConvertible(packageUnit: string, typeUnit: string): boolean {
if (packageUnit === typeUnit) return true;
return (
isStandard(packageUnit) &&
isStandard(typeUnit) &&
UNITS[packageUnit].dimension === UNITS[typeUnit].dimension
);
}
/** Bir paketin ürün tipinin birimindeki miktarı (çevrilemiyorsa null). */
export function packageInTypeUnit(input: {
packageQuantity: number;
packageUnit: string;
typeUnit: string;
/** Elle girilen dönüşüm: bir paket = bu kadar ürün tipi birimi. */
typeQuantity: number | null;
}): number | null {
const { packageQuantity, packageUnit, typeUnit } = input;
if (packageUnit === typeUnit) return packageQuantity;
if (autoConvertible(packageUnit, typeUnit))
return convertQuantity(packageQuantity, packageUnit as Unit, typeUnit as Unit);
return input.typeQuantity && input.typeQuantity > 0 ? input.typeQuantity : null;
}
/** "5 kg", dönüşüm varsa "5 kg · 50 yıkama". */
export function describePackage(input: {
packageQuantity: number;
packageUnit: string;
typeUnit: string;
typeQuantity: number | null;
}): string {
const pkg = formatQuantity(input.packageQuantity, input.packageUnit);
if (input.packageUnit === input.typeUnit) return pkg;
const inType = packageInTypeUnit(input);
return inType === null ? pkg : `${pkg} · ${formatQuantity(inType, input.typeUnit)}`;
}
/** Barkod: 8–14 rakam (EAN-8, UPC-A, EAN-13, GTIN-14). */
export const BARCODE_PATTERN = /^\d{8,14}$/;