Files
nademitex_admin/src/utils/orderItemValidation.ts
T

50 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-09-29 22:00:50 +03:30
import type { Product } from '@/types'
export type QuantityMode = 'meter' | 'roll'
export function rollMetersForProduct(product: Product): number {
if (product.rollMeters && product.rollMeters > 0) return product.rollMeters
if (product.minMeterage > 0) return product.minMeterage
return 50
}
export function orderMultiplierForProduct(product: Product): number {
const step = product.orderMultiplier ?? product.orderStep
return step && step > 0 ? step : 10
}
export function meterageFromQuantity(product: Product, mode: QuantityMode, value: number): number {
if (mode === 'roll') return value * rollMetersForProduct(product)
return value
}
export function rollsFromMeterage(product: Product, meterage: number): number {
const rollMeters = rollMetersForProduct(product)
return rollMeters > 0 ? meterage / rollMeters : 0
}
/** همان قواعد سرور هنگام ثبت سفارش */
export function validateOrderMeterage(
product: Product,
meterage: number,
minRollsSetting = 1,
): string | null {
if (!meterage || meterage <= 0) {
return 'مقدار باید بزرگ‌تر از صفر باشد.'
}
if (meterage < product.minMeterage) {
return `حداقل متراژ برای ${product.name} برابر ${product.minMeterage} است`
}
const multiplier = orderMultiplierForProduct(product)
const rem = Math.round((meterage / multiplier) * 1000) / 1000
if (Math.abs(rem - Math.round(rem)) > 1e-6) {
return `متراژ ${product.name} باید مضرب ${multiplier} باشد`
}
const rollMeters = rollMetersForProduct(product)
const minRolls = minRollsSetting > 0 ? minRollsSetting : 1
if (meterage / rollMeters + 1e-9 < minRolls) {
return `حداقل سفارش برای ${product.name} برابر ${minRolls} طاقه است`
}
return null
}