75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
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<SysConfigResponse[]>('/sys-config').then(r => r.data),
|
|
|
|
get: (key: string) =>
|
|
api.get<SysConfigResponse>(`/sys-config/${key}`).then(r => r.data),
|
|
|
|
set: (key: string, value: string, userId?: string | null) =>
|
|
api.put<SysConfigResponse>(`/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<string, string>): 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])))),
|
|
}
|