Skip to main content
Glama
report-generator.ts2.98 kB
import { MonthlySummaryReportData } from './types.js'; import { formatAmount } from '../../utils.js'; import type { MonthData } from '../../types.js'; export class MonthlySummaryReportGenerator { generate(data: MonthlySummaryReportData): string { const { start, end, accountId, accountName, sortedMonths, avgIncome, avgExpenses, avgInvestments, avgTraditionalSavings, avgTotalSavings, avgTraditionalSavingsRate, avgTotalSavingsRate, } = data; let markdown = `# Monthly Financial Summary\n\n`; markdown += `Period: ${start} to ${end}\n\n`; if (accountId) { markdown += `Account: ${accountName || accountId}\n\n`; } else { markdown += `Accounts: All on-budget accounts\n\n`; } // Add summary table markdown += `## Monthly Breakdown\n\n`; markdown += `| Month | Income | Regular Expenses | Investments | Traditional Savings | Total Savings | Total Savings Rate |\n`; markdown += `| ----- | ------ | ---------------- | ----------- | ------------------- | ------------- | ------------------ |\n`; sortedMonths.forEach((month: MonthData) => { const monthName: string = new Date(month.year, month.month - 1, 1).toLocaleString('default', { month: 'long' }); const income: string = formatAmount(month.income); const expenses: string = formatAmount(month.expenses); const investments: string = formatAmount(month.investments); const traditionalSavings: number = month.income - month.expenses - month.investments; const totalSavings: number = traditionalSavings + month.investments; const savingsFormatted: string = formatAmount(traditionalSavings); const totalSavingsFormatted: string = formatAmount(totalSavings); const savingsRate: string = month.income > 0 ? ((totalSavings / month.income) * 100).toFixed(1) + '%' : 'N/A'; markdown += `| ${monthName} ${month.year} | ${income} | ${expenses} | ${investments} | ${savingsFormatted} | ${totalSavingsFormatted} | ${savingsRate} |\n`; }); // Add averages markdown += `\n## Averages\n\n`; markdown += `Average Monthly Income: ${formatAmount(avgIncome)}\n`; markdown += `Average Monthly Regular Expenses: ${formatAmount(avgExpenses)}\n`; markdown += `Average Monthly Investments: ${formatAmount(avgInvestments)}\n`; markdown += `Average Monthly Traditional Savings: ${formatAmount(avgTraditionalSavings)}\n`; markdown += `Average Monthly Total Savings: ${formatAmount(avgTotalSavings)}\n`; markdown += `Average Traditional Savings Rate: ${avgTraditionalSavingsRate.toFixed(1)}%\n`; markdown += `Average Total Savings Rate: ${avgTotalSavingsRate.toFixed(1)}%\n`; markdown += `\n## Definitions\n\n`; markdown += `* **Traditional Savings**: Income minus regular expenses and investments\n`; markdown += `* **Total Savings**: Traditional savings plus investments\n`; return markdown; } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/s-stefanov/actual-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server