Files
star-erp/resources/js/utils/purchase-order.ts

84 lines
2.1 KiB
TypeScript
Raw Normal View History

2025-12-30 15:03:19 +08:00
/**
*
*/
import type { PurchaseOrderItem } from "@/types/purchase-order";
import { PRICE_ALERT_THRESHOLD } from "@/constants/purchase-order";
/**
*
*/
export function formatCurrency(amount: number): string {
return `$${amount.toLocaleString()}`;
}
/**
*
*/
export function calculateSubtotal(quantity: number, unitPrice: number): number {
return quantity * unitPrice;
}
/**
*
*/
export function calculateTotalAmount(items: PurchaseOrderItem[]): number {
return items.reduce((sum, item) => sum + Number(item.subtotal || 0), 0);
}
/**
*
*/
export function isPriceAlert(currentPrice: number, previousPrice?: number): boolean {
if (!previousPrice || previousPrice === 0) return false;
const increase = ((currentPrice - previousPrice) / previousPrice) * 100;
return increase > PRICE_ALERT_THRESHOLD;
}
/**
*
*/
export function calculatePriceIncrease(currentPrice: number, previousPrice?: number): number {
if (!previousPrice || previousPrice === 0) return 0;
return ((currentPrice - previousPrice) / previousPrice) * 100;
}
/**
*
*/
export function generatePONumber(): string {
const year = new Date().getFullYear();
const sequence = (Date.now() % 100000).toString().padStart(5, "0");
return `PO${year}${sequence}`;
}
/**
* YYYY-MM-DD
*/
export function getTodayDate(): string {
return new Date().toISOString().split("T")[0];
}
/**
*
*/
export function validatePurchaseOrder(
supplierId: string,
expectedDate: string,
items: PurchaseOrderItem[]
): boolean {
return !!(
supplierId &&
expectedDate &&
items.length > 0 &&
items.some((item) => item.quantity > 0)
);
}
/**
* 0
2025-12-30 15:03:19 +08:00
*/
export function filterValidItems(items: PurchaseOrderItem[]): PurchaseOrderItem[] {
return items.filter((item) => item.quantity > 0 && item.unitPrice > 0);
2025-12-30 15:03:19 +08:00
}