export function formatCurrency(amount: number, currency: string = 'IRR'): string { if (currency === 'IRR') { return `${amount.toLocaleString('fa-IR')} ریال`; } return `$${amount.toFixed(2)}`; } export function formatDate(dateString: string): string { if (!dateString) return '-'; const date = new Date(dateString); return date.toLocaleDateString('fa-IR', { year: 'numeric', month: 'long', day: 'numeric', }); } export function formatDateTime(dateString: string): string { if (!dateString) return '-'; const date = new Date(dateString); return date.toLocaleDateString('fa-IR', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', }); } export function getStatusColor(status: string): string { const colorMap: Record = { active: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', inactive: 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400', pending: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400', accepted: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400', rejected: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400', delivered: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', 'assigned-sender-agent': 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400', 'assigned-receiver-agent': 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900/30 dark:text-indigo-400', 'ready-to-return': 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400', returned: 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400', enumerated: 'bg-teal-100 text-teal-800 dark:bg-teal-900/30 dark:text-teal-400', draft: 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400', completed: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', paused: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400', cancelled: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400', paid: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', unpaid: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400', 'waiting-to-pay': 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400', processing: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400', preparing: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400', prepared: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900/30 dark:text-indigo-400', 'given-to-post': 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-400', 'system-cancellation': 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400', Success: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400', Failed: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400', frozen: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400', closed: 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400', }; return colorMap[status] || 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400'; } export function getStatusLabel(status: string): string { const labelMap: Record = { 'on-table': 'On Table', cylindrical: 'Cylindrical', 'stand-up': 'Stand Up', 'assigned-sender-agent': 'Assigned Sender', 'assigned-receiver-agent': 'Assigned Receiver', 'ready-to-return': 'Ready to Return', 'given-to-post': 'Given to Post', 'system-cancellation': 'System Cancellation', 'waiting-to-pay': 'Waiting to Pay', }; return labelMap[status] || status.charAt(0).toUpperCase() + status.slice(1).replace(/-/g, ' '); } export function getKindBoxTypeIcon(type: string): string { const icons: Record = { 'on-table': '📦', cylindrical: '🥫', 'stand-up': '🗄️', }; return icons[type] || '📦'; } export function cn(...classes: (string | undefined | null | false)[]): string { return classes.filter(Boolean).join(' '); } export function truncateText(text: string, maxLength: number): string { if (text.length <= maxLength) return text; return text.substring(0, maxLength) + '...'; } export function generatePagination(currentPage: number, totalPages: number): (number | '...')[] { if (totalPages <= 7) { return Array.from({ length: totalPages }, (_, i) => i + 1); } const pages: (number | '...')[] = []; pages.push(1); if (currentPage > 3) { pages.push('...'); } const start = Math.max(2, currentPage - 1); const end = Math.min(totalPages - 1, currentPage + 1); for (let i = start; i <= end; i++) { pages.push(i); } if (currentPage < totalPages - 2) { pages.push('...'); } pages.push(totalPages); return pages; }