50 lines
1.8 KiB
TypeScript
50 lines
1.8 KiB
TypeScript
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
|
|
}
|