product and sales fixers
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
// Warranty period helpers. Periods are always stored in months; custom ones are the active
|
||||
// rows of the Warranty Periods master and are only offered while
|
||||
// ProductConfig.customWarrantyPeriodsEnabled is on.
|
||||
import { ProductConfig, WARRANTY_PERIOD_MONTHS_OPTIONS } from "@/types/master-data"
|
||||
|
||||
/** Server limit (WarrantyPeriodService) — mirrored so forms fail fast. */
|
||||
export const MAX_CUSTOM_WARRANTY_MONTHS = 600
|
||||
|
||||
/** "6 months", "1 month", or "24 months (2 years)" when it's a whole number of years. */
|
||||
export function formatWarrantyPeriod(months: number): string {
|
||||
const base = `${months} month${months === 1 ? "" : "s"}`
|
||||
if (months >= 12 && months % 12 === 0) {
|
||||
const years = months / 12
|
||||
return `${base} (${years} year${years === 1 ? "" : "s"})`
|
||||
}
|
||||
return base
|
||||
}
|
||||
|
||||
export type WarrantyInputUnit = "months" | "years"
|
||||
|
||||
/**
|
||||
* Validates a typed length ("2" + years) against the existing active custom periods and
|
||||
* converts it to months. Returns the months, or an error message fit to show under the input.
|
||||
*/
|
||||
export function parseWarrantyInput(
|
||||
amount: string,
|
||||
unit: WarrantyInputUnit,
|
||||
existingCustom: number[],
|
||||
): { months: number; error?: undefined } | { months?: undefined; error: string } {
|
||||
const n = Number(amount)
|
||||
if (!amount.trim() || !Number.isInteger(n) || n < 1) return { error: "Enter a whole number of 1 or more." }
|
||||
const months = unit === "years" ? n * 12 : n
|
||||
if (months > MAX_CUSTOM_WARRANTY_MONTHS)
|
||||
return { error: `A warranty period can be at most ${MAX_CUSTOM_WARRANTY_MONTHS} months (50 years).` }
|
||||
if ((WARRANTY_PERIOD_MONTHS_OPTIONS as readonly number[]).includes(months))
|
||||
return { error: `${formatWarrantyPeriod(months)} is already a default period.` }
|
||||
if (existingCustom.includes(months)) return { error: `${formatWarrantyPeriod(months)} already exists.` }
|
||||
return { months }
|
||||
}
|
||||
|
||||
/** The period choices for an item: the defaults, plus the active custom ones when enabled. */
|
||||
export function warrantyPeriodGroups(
|
||||
config: ProductConfig | null,
|
||||
customMonths: number[],
|
||||
): { defaults: number[]; custom: number[] } {
|
||||
const defaults: number[] = [...WARRANTY_PERIOD_MONTHS_OPTIONS]
|
||||
const custom = config?.customWarrantyPeriodsEnabled
|
||||
? [...new Set(customMonths)].filter((m) => !defaults.includes(m)).sort((a, b) => a - b)
|
||||
: []
|
||||
return { defaults, custom }
|
||||
}
|
||||
Reference in New Issue
Block a user