16import { Bar, Line, Doughnut, Pie } from 'react-chartjs-2';
18// Register Chart.js components
32interface SalesHourlyChartProps {
33 data?: Array<{ hour: string; sales: number; amount: number }>;
36export function SalesHourlyChart({ data }: SalesHourlyChartProps) {
37 // Demo data if no data provided
39 { hour: '9am', sales: 0, amount: 0 },
40 { hour: '10am', sales: 0, amount: 0 },
41 { hour: '11am', sales: 0, amount: 0 },
42 { hour: '12pm', sales: 0, amount: 0 },
43 { hour: '1pm', sales: 0, amount: 0 },
44 { hour: '2pm', sales: 0, amount: 0 },
45 { hour: '3pm', sales: 0, amount: 0 },
46 { hour: '4pm', sales: 0, amount: 0 },
47 { hour: '5pm', sales: 0, amount: 0 },
48 { hour: '6pm', sales: 0, amount: 0 },
51 const chartData = data && data.length > 0 ? data : defaultData;
54 labels: chartData.map(item => item.hour),
58 data: chartData.map(item => item.sales),
59 backgroundColor: 'rgba(34, 197, 94, 0.8)',
60 borderColor: 'rgba(34, 197, 94, 1)',
65 label: 'Sales Amount ($)',
66 data: chartData.map(item => item.amount),
67 backgroundColor: 'rgba(59, 130, 246, 0.8)',
68 borderColor: 'rgba(59, 130, 246, 1)',
79 position: 'top' as const,
83 text: 'Sales Activity by Hour',
88 type: 'linear' as const,
90 position: 'left' as const,
93 text: 'Number of Sales',
97 type: 'linear' as const,
99 position: 'right' as const,
102 text: 'Sales Amount ($)',
105 drawOnChartArea: false,
111 return <Bar data={config} options={options} />;
114interface PaymentMethodsChartProps {
115 data?: Array<{ method: string; amount: number; percentage: number }>;
118export function PaymentMethodsChart({ data }: PaymentMethodsChartProps) {
119 const defaultData = [
120 { method: 'EFTPOS', amount: 1590, percentage: 65 },
121 { method: 'Cash', amount: 612, percentage: 25 },
122 { method: 'Mobile Pay', amount: 245, percentage: 10 },
125 const chartData = data || defaultData;
128 labels: chartData.map(item => `${item.method} (${item.percentage}%)`),
131 data: chartData.map(item => item.amount),
133 'rgba(34, 197, 94, 0.8)',
134 'rgba(59, 130, 246, 0.8)',
135 'rgba(168, 85, 247, 0.8)',
136 'rgba(239, 68, 68, 0.8)',
137 'rgba(245, 158, 11, 0.8)',
140 'rgba(34, 197, 94, 1)',
141 'rgba(59, 130, 246, 1)',
142 'rgba(168, 85, 247, 1)',
143 'rgba(239, 68, 68, 1)',
144 'rgba(245, 158, 11, 1)',
155 position: 'bottom' as const,
159 text: 'Payment Methods Today',
164 return <Doughnut data={config} options={options} />;
167interface TopProductsChartProps {
168 data?: Array<{ name: string; quantity: number; value: number }>;
171export function TopProductsChart({ data }: TopProductsChartProps) {
172 const defaultData = [
173 { name: 'HP 65 Black Ink', quantity: 12, value: 551.88 },
174 { name: 'Canon PG-545 Black', quantity: 9, value: 350.91 },
175 { name: 'Brother TN-2430 Toner', quantity: 4, value: 359.96 },
176 { name: 'Epson 603XL Black', quantity: 7, value: 300.93 },
177 { name: 'Samsung MLT-D111S', quantity: 3, value: 197.97 },
180 const chartData = data || defaultData;
183 labels: chartData.map(item => item.name.length > 20 ? item.name.substring(0, 20) + '...' : item.name),
186 label: 'Quantity Sold',
187 data: chartData.map(item => item.quantity),
188 backgroundColor: 'rgba(34, 197, 94, 0.8)',
189 borderColor: 'rgba(34, 197, 94, 1)',
197 indexAxis: 'y' as const,
204 text: 'Top Selling Products',
212 text: 'Quantity Sold',
218 return <Bar data={config} options={options} />;
221interface StorePerformanceChartProps {
222 data?: Array<{ store: string; sales: number; amount: number }>;
225export function StorePerformanceChart({ data }: StorePerformanceChartProps) {
226 const defaultData = [
227 { store: 'Main Store', sales: 45, amount: 1890.50 },
228 { store: 'North Branch', sales: 32, amount: 1340.25 },
229 { store: 'East Store', sales: 28, amount: 1150.75 },
232 const chartData = data || defaultData;
235 labels: chartData.map(item => item.store),
238 label: 'Sales Amount ($)',
239 data: chartData.map(item => item.amount),
240 backgroundColor: 'rgba(59, 130, 246, 0.8)',
241 borderColor: 'rgba(59, 130, 246, 1)',
255 text: 'Store Performance Today',
263 text: 'Sales Amount ($)',
269 return <Bar data={config} options={options} />;
272interface TellerPerformanceChartProps {
273 data?: Array<{ teller: string; sales: number; amount: number }>;
276export function TellerPerformanceChart({ data }: TellerPerformanceChartProps) {
277 const defaultData = [
278 { teller: 'Admin', sales: 25, amount: 1250.50 },
279 { teller: 'Sarah', sales: 22, amount: 1100.75 },
280 { teller: 'Mike', sales: 18, amount: 890.25 },
281 { teller: 'Jenny', sales: 15, amount: 720.00 },
284 const chartData = data || defaultData;
287 labels: chartData.map(item => item.teller),
290 label: 'Number of Sales',
291 data: chartData.map(item => item.sales),
292 backgroundColor: 'rgba(168, 85, 247, 0.8)',
293 borderColor: 'rgba(168, 85, 247, 1)',
298 label: 'Sales Amount ($)',
299 data: chartData.map(item => item.amount),
300 backgroundColor: 'rgba(34, 197, 94, 0.8)',
301 borderColor: 'rgba(34, 197, 94, 1)',
312 position: 'top' as const,
316 text: 'Teller Performance Today',
321 type: 'linear' as const,
323 position: 'left' as const,
326 text: 'Number of Sales',
330 type: 'linear' as const,
332 position: 'right' as const,
335 text: 'Sales Amount ($)',
338 drawOnChartArea: false,
344 return <Bar data={config} options={options} />;
347interface SalesOverTimeChartProps {
348 data?: Array<{ time: string; sales: number }>;
349 timeframe?: 'hour' | 'day' | 'week' | 'month';
352export function SalesOverTimeChart({ data, timeframe = 'hour' }: SalesOverTimeChartProps) {
353 const defaultData = {
355 { time: '9:00', sales: 3 },
356 { time: '10:00', sales: 8 },
357 { time: '11:00', sales: 12 },
358 { time: '12:00', sales: 18 },
359 { time: '13:00', sales: 15 },
360 { time: '14:00', sales: 22 },
361 { time: '15:00', sales: 19 },
362 { time: '16:00', sales: 14 },
363 { time: '17:00', sales: 9 },
366 { time: 'Mon', sales: 85 },
367 { time: 'Tue', sales: 92 },
368 { time: 'Wed', sales: 78 },
369 { time: 'Thu', sales: 105 },
370 { time: 'Fri', sales: 120 },
371 { time: 'Sat', sales: 95 },
372 { time: 'Sun', sales: 70 },
375 { time: 'Week 1', sales: 650 },
376 { time: 'Week 2', sales: 720 },
377 { time: 'Week 3', sales: 580 },
378 { time: 'Week 4', sales: 690 },
381 { time: 'Jan', sales: 2800 },
382 { time: 'Feb', sales: 3200 },
383 { time: 'Mar', sales: 2900 },
384 { time: 'Apr', sales: 3500 },
385 { time: 'May', sales: 3100 },
386 { time: 'Jun', sales: 2750 },
390 const chartData = data || defaultData[timeframe] || defaultData.hour;
393 labels: chartData.map(item => item.time),
397 data: chartData.map(item => item.sales),
398 borderColor: 'rgba(34, 197, 94, 1)',
399 backgroundColor: 'rgba(34, 197, 94, 0.1)',
414 text: `Sales Over Time (${timeframe})`,
422 text: 'Number of Sales',
428 return <Line data={config} options={options} />;
431// Top Customers Chart
432interface TopCustomersChartProps {
440export function TopCustomersChart({ data }: TopCustomersChartProps) {
441 // Default demo data if none provided
442 const defaultData = [
443 { customer: 'ABC Office Supplies', sales: 12, amount: 1450.75 },
444 { customer: 'City Print Services', sales: 8, amount: 980.50 },
445 { customer: 'Local Business Co', sales: 6, amount: 720.25 },
446 { customer: 'Quick Copy Shop', sales: 5, amount: 650.00 },
447 { customer: 'School District #42', sales: 4, amount: 480.75 }
450 const chartData = data && data.length > 0 ? data : defaultData;
453 labels: chartData.map(item => item.customer),
456 label: 'Sales Amount ($)',
457 data: chartData.map(item => item.amount),
459 'rgba(59, 130, 246, 0.8)',
460 'rgba(16, 185, 129, 0.8)',
461 'rgba(245, 158, 11, 0.8)',
462 'rgba(239, 68, 68, 0.8)',
463 'rgba(139, 92, 246, 0.8)'
466 'rgba(59, 130, 246, 1)',
467 'rgba(16, 185, 129, 1)',
468 'rgba(245, 158, 11, 1)',
469 'rgba(239, 68, 68, 1)',
470 'rgba(139, 92, 246, 1)'
479 maintainAspectRatio: false,
486 label: function(context: any) {
487 const customer = chartData[context.dataIndex];
489 `Sales: ${customer.sales}`,
490 `Amount: $${customer.amount.toFixed(2)}`
500 callback: function(value: any) {
506 text: 'Sales Amount ($)',
522 return <Bar data={config} options={options} />;