app/composables/useBudget.ts
2025-09-04 10:42:03 +01:00

108 lines
No EOL
3.2 KiB
TypeScript

import type { BudgetLine, OrgYearSettings } from '~/types/budget'
export function useBudget(orgId: string = 'default', year: number = new Date().getFullYear()) {
const budgetStore = useBudgetStore()
const cashStore = useCashStore()
const { analyzeConcentration } = useConcentration()
// Initialize budget from wizard data if needed
const initialized = ref(false)
onMounted(async () => {
if (!budgetStore.isInitialized) {
await budgetStore.initializeFromWizardData()
}
initialized.value = true
})
// Get starting cash from cash store
const startingCash = computed(() => {
const cash = cashStore.currentCash || 0
const savings = cashStore.currentSavings || 0
return cash + savings
})
// Build revenue and expense arrays for the 12 months
const revenuePlanned = computed(() => {
const revenue = Array(12).fill(0)
if (!budgetStore.budgetWorksheet?.revenue) {
return revenue
}
budgetStore.budgetWorksheet.revenue.forEach(item => {
// Get monthly values for the current year
const today = new Date()
for (let i = 0; i < 12; i++) {
const date = new Date(year, i, 1)
const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`
revenue[i] += item.monthlyValues?.[monthKey] || 0
}
})
return revenue
})
const expensePlanned = computed(() => {
const expenses = Array(12).fill(0)
if (!budgetStore.budgetWorksheet?.expenses) {
return expenses
}
budgetStore.budgetWorksheet.expenses.forEach(item => {
// Get monthly values for the current year
const today = new Date()
for (let i = 0; i < 12; i++) {
const date = new Date(year, i, 1)
const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`
expenses[i] += item.monthlyValues?.[monthKey] || 0
}
})
return expenses
})
// Calculate diversification percentage by category
const diversification = computed(() => {
const revTotalsByCat: Record<string, number> = {}
if (!budgetStore.budgetWorksheet?.revenue) {
return {
byCategoryPct: {},
guidance: 'No revenue data available'
}
}
// Sum annual revenue by category
budgetStore.budgetWorksheet.revenue.forEach(item => {
const category = item.mainCategory || 'Other'
const annualAmount = Object.values(item.monthlyValues || {}).reduce((sum, val) => sum + val, 0)
revTotalsByCat[category] = (revTotalsByCat[category] || 0) + annualAmount
})
const totalRev = Object.values(revTotalsByCat).reduce((a, b) => a + b, 0) || 1
const byCategoryPct = Object.fromEntries(
Object.entries(revTotalsByCat).map(([k, v]) => [k, (v / totalRev) * 100])
)
// Use existing concentration analysis
const revenueStreams = Object.entries(byCategoryPct).map(([category, pct]) => ({
targetPct: pct
}))
const analysis = analyzeConcentration(revenueStreams)
return {
byCategoryPct,
guidance: analysis.message
}
})
return {
startingCash,
revenuePlanned,
expensePlanned,
diversification
}
}