import { Injectable } from '@nestjs/common';
export type SupplierSubstitutionRule = 'none' | 'equivalent_only' | 'manager_approval';
export interface SupplierOffer {
productId: string;
supplierId: string;
supplierSku: string;
packSize: number;
packUnit: string;
priceMinor: number;
leadTimeDays: number;
minimumOrderQuantity: number;
deliveryDays: number[];
contractTerms?: string;
substitution: SupplierSubstitutionRule;
available: boolean;
depositMinor?: number;
returnablePackaging?: boolean;
}
@Injectable()
export class SupplierOfferService {
normalize(input: SupplierOffer): SupplierOffer {
if (!input.productId.trim() || !input.supplierId.trim() || !input.supplierSku.trim()) {
throw new Error('supplier_offer.identity_required');
}
if (!Number.isFinite(input.packSize) || input.packSize <= 0 || !input.packUnit.trim()) {
throw new Error('supplier_offer.pack_invalid');
}
if (!Number.isInteger(input.priceMinor) || input.priceMinor < 0) {
throw new Error('supplier_offer.price_invalid');
}
if (!Number.isInteger(input.leadTimeDays) || input.leadTimeDays < 0) {
throw new Error('supplier_offer.lead_time_invalid');
}
if (!Number.isFinite(input.minimumOrderQuantity) || input.minimumOrderQuantity <= 0) {
throw new Error('supplier_offer.minimum_order_invalid');
}
if (!input.deliveryDays.length || input.deliveryDays.some(day => !Number.isInteger(day) || day < 1 || day > 7)) {
throw new Error('supplier_offer.delivery_days_invalid');
}
if (input.depositMinor !== undefined && (!Number.isInteger(input.depositMinor) || input.depositMinor < 0)) {
throw new Error('supplier_offer.deposit_invalid');
}
return {
...input,
productId: input.productId.trim(),
supplierId: input.supplierId.trim(),
supplierSku: input.supplierSku.trim(),
packUnit: input.packUnit.trim(),
contractTerms: input.contractTerms?.trim() || undefined,
deliveryDays: [...new Set(input.deliveryDays)].sort((a, b) => a - b),
returnablePackaging: input.returnablePackaging ?? false,
};
}
}
