import React, { useState } from 'react'; import { Download } from 'lucide-react'; import { Button } from '../ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '../ui/table'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../ui/select'; // Notes: // 1. Query purchasing modules under Partner, Group and Location; fees and payment status // 2. Invoice permission for finance: view and export bills after login // 3. Report generation: historical bills, unpaid bills, rates, overdue situations export type InvoiceStatus = 'Paid' | 'Overdue'; export interface InvoiceRow { id: string; locationId: string; subscription: string; ratePerMonth: string; discountRate: string; totalAmount: string; period: string; status: InvoiceStatus; isOverdue?: boolean; // highlight rate and total in red when overdue } const MOCK_INVOICES: InvoiceRow[] = [ { id: '1', locationId: '12345', subscription: 'Labeling', ratePerMonth: '9.99', discountRate: '1', totalAmount: '$9.99', period: 'October', status: 'Paid' }, { id: '2', locationId: '12345', subscription: 'Tasks', ratePerMonth: '20', discountRate: '0.5', totalAmount: '10', period: 'October', status: 'Paid' }, { id: '3', locationId: '12345', subscription: 'Sensor', ratePerMonth: '30', discountRate: '1', totalAmount: '30', period: 'October', status: 'Paid' }, { id: '4', locationId: '12345', subscription: 'e-label', ratePerMonth: '25', discountRate: '1', totalAmount: '50', period: 'October', status: 'Overdue', isOverdue: true }, { id: '5', locationId: '12345', subscription: 'Food Waste', ratePerMonth: '35', discountRate: '1', totalAmount: '35', period: 'October', status: 'Paid' }, ]; export function InvoicesView() { const [invoices] = useState(MOCK_INVOICES); const [periodFilter, setPeriodFilter] = useState('October'); const [subscriptionFilter, setSubscriptionFilter] = useState('all'); const filteredInvoices = invoices.filter((row) => { const matchPeriod = !periodFilter || row.period === periodFilter; const matchSub = subscriptionFilter === 'all' || row.subscription === subscriptionFilter; return matchPeriod && matchSub; }); const handleExportBills = () => { // Finance personnel: export bills (e.g. CSV or PDF) const csv = [ ['Location ID', 'Subscription', 'Rate/month', 'Discount Rate', 'Total Amount', 'Period', 'Status'].join(','), ...filteredInvoices.map((r) => [r.locationId, r.subscription, r.ratePerMonth, r.discountRate, r.totalAmount, r.period, r.status].join(',')), ].join('\n'); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `invoices-${periodFilter || 'all'}.csv`; link.click(); URL.revokeObjectURL(link.href); }; return (
{/* Toolbar:与 Products/Locations 一致 — 单行、圆角、细边框、bg-gray-50、无标题、框内文字黑色 */}
{/* Content Area:与 Products 一致,无内边距、表格包在白色圆角框内 */}
Location ID Subscription Rate/month Discount Rate Total Amount Period Status {filteredInvoices.map((row) => ( {row.locationId} {row.subscription} {row.ratePerMonth} {row.discountRate} {row.totalAmount} {row.period} {row.status} ))}
); }