const fs = require('fs');
const path = require('path');
const pages = [
{
name: 'payments',
title: 'Payments',
description: 'Manage payment transactions and refunds',
api: 'paymentsApi',
columns: `[
{ key: 'reference', label: 'Reference', render: (payment: any) => {payment.reference || payment.id?.substring(0, 8)} },
{ key: 'booking', label: 'Booking', render: (payment: any) => payment.booking?.bookingRef || 'N/A' },
{ key: 'amount', label: 'Amount', render: (payment: any) => formatCurrency(payment.amountMinor, payment.currency) },
{ key: 'method', label: 'Method', render: (payment: any) => {payment.method} },
{ key: 'status', label: 'Status', render: (payment: any) => {payment.status} },
{ key: 'createdAt', label: 'Created', render: (payment: any) => formatDateTime(payment.createdAt) },
]`,
filters: `{ search: '', status: '', method: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'loyalty',
title: 'Loyalty Program',
description: 'Manage loyalty accounts and rewards',
api: 'loyaltyApi',
columns: `[
{ key: 'passenger', label: 'Passenger', render: (account: any) => account.passenger?.fullName || 'N/A' },
{ key: 'tier', label: 'Tier', render: (account: any) => {account.tier} },
{ key: 'pointsBalance', label: 'Points', render: (account: any) => account.pointsBalance?.toLocaleString() || 0 },
{ key: 'lifetimePoints', label: 'Lifetime Points', render: (account: any) => account.lifetimePoints?.toLocaleString() || 0 },
]`,
filters: `{ search: '', tier: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'wallet',
title: 'Wallet Management',
description: 'Manage passenger wallet accounts',
api: 'walletApi',
columns: `[
{ key: 'passenger', label: 'Passenger', render: (account: any) => account.passenger?.fullName || 'N/A' },
{ key: 'balanceMinor', label: 'Balance', render: (account: any) => formatCurrency(account.balanceMinor, 'ETB') },
{ key: 'status', label: 'Status', render: (account: any) => {account.isActive ? 'Active' : 'Inactive'} },
]`,
filters: `{ search: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'support',
title: 'Support Center',
description: 'Manage customer support conversations',
api: 'supportApi',
columns: `[
{ key: 'subject', label: 'Subject', render: (conv: any) => conv.subject || 'No Subject' },
{ key: 'passenger', label: 'Passenger', render: (conv: any) => conv.passenger?.fullName || 'N/A' },
{ key: 'status', label: 'Status', render: (conv: any) => {conv.status} },
{ key: 'createdAt', label: 'Created', render: (conv: any) => formatDateTime(conv.createdAt) },
]`,
filters: `{ search: '', status: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'verifayda',
title: 'Verifayda Integration',
description: 'Ethiopian national ID verification logs',
api: 'verifaydaApi',
columns: `[
{ key: 'nationalId', label: 'National ID', render: (ver: any) => {ver.nationalId} },
{ key: 'fullName', label: 'Name', render: (ver: any) => ver.fullName || 'N/A' },
{ key: 'verified', label: 'Status', render: (ver: any) => {ver.verified ? 'Verified' : 'Failed'} },
{ key: 'createdAt', label: 'Verified At', render: (ver: any) => formatDateTime(ver.createdAt) },
]`,
filters: `{ search: '', verified: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'food',
title: 'Food & Dining',
description: 'Manage food orders and menu items',
api: 'foodApi',
columns: `[
{ key: 'orderNumber', label: 'Order #', render: (order: any) => {order.orderNumber || order.id?.substring(0, 8)} },
{ key: 'passenger', label: 'Passenger', render: (order: any) => order.passenger?.fullName || 'N/A' },
{ key: 'items', label: 'Items', render: (order: any) => order.items?.length || 0 },
{ key: 'totalMinor', label: 'Total', render: (order: any) => formatCurrency(order.totalMinor, 'ETB') },
{ key: 'status', label: 'Status', render: (order: any) => {order.status} },
]`,
filters: `{ search: '', status: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'schedules',
title: 'Schedules',
description: 'Manage train schedules and trips',
api: 'schedulesApi',
columns: `[
{ key: 'train', label: 'Train', render: (schedule: any) => schedule.train?.name || 'N/A' },
{ key: 'route', label: 'Route', render: (schedule: any) => \`\${schedule.originStation?.name || 'N/A'} ā \${schedule.destinationStation?.name || 'N/A'}\` },
{ key: 'departureAt', label: 'Departure', render: (schedule: any) => formatDateTime(schedule.departureAt) },
{ key: 'status', label: 'Status', render: (schedule: any) => {schedule.status} },
]`,
filters: `{ search: '', status: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'seat-classes',
title: 'Seat Classes',
description: 'Manage seat class configurations',
api: 'seatClassesApi',
columns: `[
{ key: 'name', label: 'Name', render: (cls: any) => {cls.name} },
{ key: 'description', label: 'Description', render: (cls: any) => cls.description || 'N/A' },
{ key: 'basePrice', label: 'Base Price', render: (cls: any) => formatCurrency(cls.basePrice, 'ETB') },
{ key: 'isActive', label: 'Status', render: (cls: any) => {cls.isActive ? 'Active' : 'Inactive'} },
]`,
filters: `{ search: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
},
{
name: 'operational-reports',
title: 'Operational Reports',
description: 'View operational reports and analytics',
api: 'reportsApi',
columns: `[
{ key: 'reportType', label: 'Type', render: (report: any) => {report.reportType} },
{ key: 'period', label: 'Period', render: (report: any) => report.period || 'N/A' },
{ key: 'generatedBy', label: 'Generated By', render: (report: any) => report.generatedBy?.fullName || 'System' },
{ key: 'createdAt', label: 'Generated', render: (report: any) => formatDateTime(report.createdAt) },
]`,
filters: `{ search: '', reportType: '' }`,
filterInputs: `
setFilters({ ...filters, search: e.target.value })} />
`
}
];
const template = (page) => `'use client';
import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
import { Download } from 'lucide-react';
import DataTable from '@/components/ui/DataTable';
import Badge from '@/components/ui/Badge';
import ActionButton from '@/components/ui/ActionButton';
import { ${page.api} } from '@/lib/api';
import { formatDateTime, formatCurrency } from '@/lib/utils';
export default function ${page.name.charAt(0).toUpperCase() + page.name.slice(1).replace(/-/g, '')}Page() {
const [filters, setFilters] = useState(${page.filters});
const { data, isLoading } = useQuery({
queryKey: ['${page.name}', filters],
queryFn: () => ${page.api}.${page.name === 'seat-classes' ? 'getAll()' : page.name === 'operational-reports' ? 'getOperationalReports(filters)' : `get${page.name === 'support' ? 'Conversations' : page.name === 'loyalty' ? 'Accounts' : page.name === 'wallet' ? 'Accounts' : page.name === 'verifayda' ? 'Verifications' : page.name === 'food' ? 'Orders' : 'All'}(filters)`},
});
const columns = ${page.columns};
return (
${page.title}
${page.description}
Export
);
}
`;
pages.forEach(page => {
const filePath = path.join(__dirname, 'src', 'app', page.name, 'page.tsx');
fs.writeFileSync(filePath, template(page));
console.log(`ā
Created ${page.name}/page.tsx`);
});
console.log('\\nā
All pages created successfully!');