diff --git a/.DS_Store b/.DS_Store index 436958c..550843e 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/app.vue b/app.vue index e8aa8ad..4a1150f 100644 --- a/app.vue +++ b/app.vue @@ -91,7 +91,10 @@ const isCoopBuilderSection = computed( route.path === "/dashboard" || route.path === "/mix" || route.path === "/budget" || - route.path === "/cash-flow" || + route.path === "/runway-lite" || + route.path === "/scenarios" || + route.path === "/cash" || + route.path === "/session" || route.path === "/settings" || route.path === "/glossary" ); diff --git a/components/AnnualBudget.vue b/components/AnnualBudget.vue index 0e8c844..dface3c 100644 --- a/components/AnnualBudget.vue +++ b/components/AnnualBudget.vue @@ -3,18 +3,13 @@
| - Category - | -- Planned - | +Category | +Planned | % | |
|---|---|---|---|---|---|
| REVENUE | |||||
| - {{ category.name }} - | +|||||
| {{ category.name }} | {{ formatCurrency(category.planned) }} | -{{ category.percentage }}% | ++ {{ category.percentage }}% + | ||
| Total Revenue | +Total Revenue | {{ formatCurrency(totalRevenuePlanned) }} | @@ -53,15 +47,14 @@
{{ diversificationGuidance }} -- Consider developing: {{ suggestedCategories.join(", ") }} + + Consider developing: {{ suggestedCategories.join(', ') }}
- |
||
| + | |||||
| EXPENSES | |||||
| - {{ category.name }} - | +|||||
| {{ category.name }} | {{ formatCurrency(category.planned) }} | -{{ category.percentage }}% | ++ {{ category.percentage }}% + | ||
| Total Expenses | +Total Expenses | {{ formatCurrency(totalExpensesPlanned) }} | @@ -99,10 +96,8 @@|||
| NET TOTAL | +|||||
| NET TOTAL | {{ formatCurrency(netTotal) }} | @@ -112,6 +107,7 @@||||
What are payroll oncosts?
-- Payroll oncosts cover taxes, benefits, and other employee-related expenses beyond base wages. - This typically includes employer payroll taxes, worker's compensation, benefits contributions, and other statutory requirements. -
-+ Complete the Setup Wizard to see your runway projection +
+- Weekly cash flow analysis with one-off transactions -
-- {{ alert.description }} -
-- 💡 {{ alert.suggestion }} -
-| Week | -Dates | -Inflow | -Outflow | -Net Flow | -Balance | -Transactions | -
|---|---|---|---|---|---|---|
| - Week {{ week.number }} - | -- {{ formatDate(week.weekStart) }} - {{ formatDate(week.weekEnd) }} - | -- {{ formatCurrency(week.inflow) }} - | -- {{ formatCurrency(week.outflow) }} - | -- {{ week.net >= 0 ? '+' : '' }}{{ formatCurrency(week.net) }} - | -- {{ formatCurrency(week.balance) }} - | -
-
-
- —
-
- {{ event.name }} ({{ formatCurrency(event.amount) }})
-
- |
-
- Add costs like rent + utilities, software licenses, insurance, lawyer - fees, accountant fees, and other recurring expenses. -
+ ++ Add costs like rent, tools, insurance, or other recurring expenses. +
++ Choose between minimum needs or target pay for payroll calculations +
+Get started by adding your first overhead cost. @@ -39,23 +79,48 @@
- - {{ currencySymbol - }}{{ Math.round((cost.annualAmount || 0) / 12) }} per month - - - {{ currencySymbol }}{{ (cost.amount || 0) * 12 }} per year - -
-- Add everyone who'll be working in the co-op. Based on your pay approach, - we'll collect the right information for each person. -
- -+ Add everyone who'll be working in the co-op, even if they're not ready + to be paid yet. +
+Get started by adding your first team member. @@ -32,23 +52,27 @@
- This is the foundation of your co-op's finances. Choose a pay approach - and set your hourly rate. -
+ ++ Choose how to allocate payroll among members and set the base hourly rate. +
+- How should available money be shared among members? -
-- This hourly rate applies to all paid work in your co-op -
-- - {{ currencySymbol }}{{ Math.round((stream.targetAnnualAmount || 0) / 12) }} per month - - - {{ currencySymbol }}{{ (stream.targetMonthlyAmount || 0) * 12 }} per year - -
-+ Review your setup and complete the wizard to start using your co-op + tool. +
+Optional - add costs in step 3
++ Required - add streams in step 4 +
++ {{ getScenarioDescription(scenario) }} +
+No members added yet
-Complete setup wizard to add team members
+- Increase available payroll by {{ formatCurrency(totalGap) }} - through higher revenue or lower overhead costs. -
-- You have {{ formatCurrency(totalSurplus) }} surplus after covering all member needs. - Consider growth opportunities or building reserves. -
-- Available payroll exactly matches member needs. -
-Coverage Gap Analysis
-- To meet member needs, you need {{ formatCurrency(totalNeeds) }} based on their stated requirements, - but you have {{ formatCurrency(availablePayroll) }} available for payroll. -
-- Shortfall: {{ formatCurrency(Math.max(0, totalNeeds - availablePayroll)) }} -
-- 💡 Note: This reflects member-stated needs. Check your Budget page for detailed payroll planning. -
-Healthy Coverage
-- You have {{ formatCurrency(availablePayroll) }} available to cover - {{ formatCurrency(totalNeeds) }} in member needs. -
-- Surplus: {{ formatCurrency(availablePayroll - totalNeeds) }} -
-No Funds for Payroll
-- Member needs total {{ formatCurrency(totalNeeds) }} based on their stated requirements, - but current revenue minus costs leaves $0 for payroll. -
-- Consider increasing revenue or reducing overhead costs. -
-- 💡 Note: This reflects member-stated needs. Your Budget page may show different payroll amounts. -
-Add members in setup to see coverage
-- Your budget is empty. Complete the setup wizard to add your revenue - streams, team members, and expenses. -
-| + class="border-r-2 border-black px-4 py-3 text-left font-bold min-w-[250px] sticky left-0 bg-white z-10" + > Item | + class="border-r border-gray-400 px-2 py-3 text-center font-medium min-w-[80px] last:border-r-0" + > {{ month.label }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + class="px-4 py-1 font-semibold sticky left-0 bg-gray-100 z-10 border-r-2 border-black" + :colspan="monthlyHeaders.length + 1" + > {{ categoryName }} |
+ class="border-r-2 border-black px-4 py-2 sticky left-0 bg-white z-10"
+ >
@@ -135,8 +135,10 @@
size="xs"
variant="ghost"
:ui="{
- base: 'text-red-600 hover:bg-red-100 opacity-0 group-hover:opacity-100 transition-none',
- }">
+ base:
+ 'text-red-600 hover:bg-red-100 opacity-0 group-hover:opacity-100 transition-none',
+ }"
+ >
×
@@ -144,39 +146,44 @@
+ class="border-r border-gray-200 px-1 py-1 last:border-r-0"
+ >
+ 'bg-gray-50': !item.monthlyValues?.[month.key],
+ }"
+ />
|
-
+ class="border-r-2 border-black px-4 py-2 sticky left-0 bg-gray-100 z-10"
+ >
TOTAL REVENUE
|
+ class="border-r border-gray-400 px-2 py-2 text-right last:border-r-0"
+ >
{{ formatCurrency(monthlyTotals[month.key]?.revenue || 0) }}
|
+ |
@@ -186,8 +193,9 @@
@click="showAddExpenseModal = true"
size="xs"
:ui="{
- base: 'bg-white text-black hover:bg-zinc-200 transition-none',
- }">
+ base: 'bg-white text-black hover:bg-gray-200 transition-none',
+ }"
+ >
+ Add
@@ -198,11 +206,13 @@
+ :key="`expense-${categoryName}`"
+ >
|
+ class="px-4 py-1 font-semibold sticky left-0 bg-gray-100 z-10 border-r-2 border-black"
+ :colspan="monthlyHeaders.length + 1"
+ >
{{ categoryName }}
|
+ class="border-r-2 border-black px-4 py-2 sticky left-0 bg-white z-10"
+ >
|
-
-
-
-
-
+
{{ item.name }}
+
{{ item.subcategory }}
+ class="border-r border-gray-200 px-1 py-1 last:border-r-0"
+ >
+ />
|
+ class="border-r-2 border-black px-4 py-2 sticky left-0 bg-gray-100 z-10"
+ >
TOTAL EXPENSES
|
+ class="border-r border-gray-400 px-2 py-2 text-right last:border-r-0"
+ >
{{ formatCurrency(monthlyTotals[month.key]?.expenses || 0) }}
|
+ |
NET INCOME
|
+ :class="getNetIncomeClass(monthlyTotals[month.key]?.net || 0)"
+ >
{{ formatCurrency(monthlyTotals[month.key]?.net || 0) }}
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Create a new revenue stream for your budget +
- This will divide - ${{ newRevenue.annualAmount || 0 }} - equally across all 12 months (${{ - newRevenue.annualAmount - ? Math.round(newRevenue.annualAmount / 12) - : 0 - }} - per month) + This will divide ${{ newRevenue.annualAmount || 0 }} equally across all 12 months + (${{ newRevenue.annualAmount ? Math.round(newRevenue.annualAmount / 12) : 0 }} per month)
- This will set - ${{ newRevenue.monthlyAmount || 0 }} - for all 12 months + This will set ${{ newRevenue.monthlyAmount || 0 }} for all months
- The revenue item will be created with no initial values. You - can fill them in later directly in the budget table. + The revenue item will be created with no initial values. You can fill them in later.
Create a new expense for your budget
- This will divide - ${{ newExpense.annualAmount || 0 }} - equally across all 12 months (${{ - newExpense.annualAmount - ? Math.round(newExpense.annualAmount / 12) - : 0 - }} - per month) + This will divide ${{ newExpense.annualAmount || 0 }} equally across all 12 months + (${{ newExpense.annualAmount ? Math.round(newExpense.annualAmount / 12) : 0 }} per month)
- This will set - ${{ newExpense.monthlyAmount || 0 }} - for all 12 months + This will set ${{ newExpense.monthlyAmount || 0 }} for all months
- The expense item will be created with no initial values. You - can fill them in later directly in the budget table. + The expense item will be created with no initial values. You can fill them in later.