import { api } from '@/lib/api' import type { SysConfigResponse } from '@/types/api' // ─── Item tracking feature keys (must match Distribution.Features.SysConfig.SysConfigService) ── export const ITEM_TRACKING_KEYS = { serialNumberTracking: 'Feature.SerialNumberTracking', batchTracking: 'Feature.BatchTracking', expiryDateTracking: 'Feature.ExpiryDateTracking', warrantyTracking: 'Feature.WarrantyTracking', customWarrantyOverride: 'Feature.CustomWarrantyOverride', defaultWarrantyPeriodDays: 'Feature.DefaultWarrantyPeriodDays', } as const export const sysConfig = { getAll: () => api.get('/sys-config').then(r => r.data), get: (key: string) => api.get(`/sys-config/${key}`).then(r => r.data), set: (key: string, value: string, userId?: string | null) => api.put(`/sys-config/${key}`, { value, userId }).then(r => r.data), } // ─── GRN tax settings (must match Distribution.Features.SysConfig.SysConfigService) ────────── export type TaxMode = 'Disabled' | 'Optional' | 'Mandatory' export const GRN_TAX_KEYS = { vatMode: 'Grn.Tax.Vat.Mode', vatRate: 'Grn.Tax.Vat.DefaultRate', nbtMode: 'Grn.Tax.Nbt.Mode', nbtRate: 'Grn.Tax.Nbt.DefaultRate', } as const export interface GrnTaxSettings { vatMode: TaxMode vatDefaultRate: number nbtMode: TaxMode nbtDefaultRate: number } const TAX_MODES: TaxMode[] = ['Disabled', 'Optional', 'Mandatory'] /** Unconfigured, VAT is Optional (as GRNs behaved before the setting existed) and NBT is off. */ export const DEFAULT_GRN_TAX_SETTINGS: GrnTaxSettings = { vatMode: 'Optional', vatDefaultRate: 0, nbtMode: 'Disabled', nbtDefaultRate: 0, } export function parseGrnTaxSettings(byKey: Record): GrnTaxSettings { const mode = (raw: string | undefined, fallback: TaxMode): TaxMode => TAX_MODES.includes(raw as TaxMode) ? (raw as TaxMode) : fallback const rate = (raw: string | undefined) => { const n = Number(raw) return raw !== undefined && Number.isFinite(n) && n >= 0 && n <= 100 ? n : 0 } return { vatMode: mode(byKey[GRN_TAX_KEYS.vatMode], DEFAULT_GRN_TAX_SETTINGS.vatMode), vatDefaultRate: rate(byKey[GRN_TAX_KEYS.vatRate]), nbtMode: mode(byKey[GRN_TAX_KEYS.nbtMode], DEFAULT_GRN_TAX_SETTINGS.nbtMode), nbtDefaultRate: rate(byKey[GRN_TAX_KEYS.nbtRate]), } } export const grnTaxSettings = { get: () => sysConfig .getAll() .then(all => parseGrnTaxSettings(Object.fromEntries(all.map(c => [c.key, c.value])))), }