port-nimara-client-portal/server/api/get-expenses.ts

79 lines
2.6 KiB
TypeScript
Raw Normal View History

import { requireAuth } from '@/server/utils/auth';
import { getExpenses, getCurrentMonthExpenses } from '@/server/utils/nocodb';
import { processExpenseWithCurrency } from '@/server/utils/currency';
import type { ExpenseFilters } from '@/utils/types';
export default defineEventHandler(async (event) => {
await requireAuth(event);
const query = getQuery(event);
// If no date filters provided, default to current month
if (!query.startDate && !query.endDate) {
console.log('[get-expenses] No date filters provided, defaulting to current month');
const result = await getCurrentMonthExpenses();
// Process expenses with currency conversion
const processedExpenses = await Promise.all(
result.list.map(expense => processExpenseWithCurrency(expense))
);
return {
...result,
list: processedExpenses
};
}
// Build filters from query parameters
const filters: ExpenseFilters = {};
if (query.startDate && typeof query.startDate === 'string') {
filters.startDate = query.startDate;
}
if (query.endDate && typeof query.endDate === 'string') {
filters.endDate = query.endDate;
}
if (query.payer && typeof query.payer === 'string') {
filters.payer = query.payer;
}
if (query.category && typeof query.category === 'string') {
filters.category = query.category as any; // Cast to ExpenseCategory
}
console.log('[get-expenses] Fetching expenses with filters:', filters);
const result = await getExpenses(filters);
// Process expenses with currency conversion
const processedExpenses = await Promise.all(
result.list.map(expense => processExpenseWithCurrency(expense))
);
// Add formatted dates
const transformedExpenses = processedExpenses.map(expense => ({
...expense,
FormattedDate: new Date(expense.Time).toLocaleDateString(),
FormattedTime: new Date(expense.Time).toLocaleTimeString()
}));
// Calculate summary with USD totals
const usdTotal = transformedExpenses.reduce((sum, e) => sum + (e.PriceUSD || e.PriceNumber || 0), 0);
const originalTotal = transformedExpenses.reduce((sum, e) => sum + (e.PriceNumber || 0), 0);
return {
expenses: transformedExpenses,
PageInfo: result.PageInfo,
totalCount: result.PageInfo?.totalRows || transformedExpenses.length,
summary: {
total: originalTotal, // Original currency total (mixed currencies)
totalUSD: usdTotal, // USD converted total
count: transformedExpenses.length,
uniquePayers: [...new Set(transformedExpenses.map(e => e.Payer))].length,
currencies: [...new Set(transformedExpenses.map(e => e.currency))].filter(Boolean)
}
};
});