feat: core financial engine (PMT, amortization, simulation calculations)
This commit is contained in:
156
src/lib/types.ts
Normal file
156
src/lib/types.ts
Normal file
@@ -0,0 +1,156 @@
|
||||
// ─── Property Type ───────────────────────────────────────────────────────────
|
||||
|
||||
export type PropertyType = 'neuf' | 'ancien';
|
||||
|
||||
// ─── Loan Input ──────────────────────────────────────────────────────────────
|
||||
|
||||
export interface LoanInput {
|
||||
id: string;
|
||||
name: string;
|
||||
amount: number;
|
||||
rate: number; // Annual rate as decimal (3.25% → 0.0325)
|
||||
duration: number; // Years
|
||||
deferral: number; // Deferred period in years
|
||||
insuranceRate: number; // Annual rate on initial capital (0.3% → 0.003)
|
||||
isMainLoan: boolean; // If true, amount = totalCredit - sum(others)
|
||||
enabled: boolean;
|
||||
}
|
||||
|
||||
// ─── Simulation State (all inputs) ──────────────────────────────────────────
|
||||
|
||||
export interface SimulationState {
|
||||
// Project
|
||||
propertyType: PropertyType;
|
||||
propertyPrice: number;
|
||||
notaryFeesRate: number;
|
||||
guaranteeRate: number;
|
||||
bankFees: number;
|
||||
worksCost: number;
|
||||
downPayment: number;
|
||||
|
||||
// Current costs (tenant)
|
||||
currentRent: number;
|
||||
rentEvolutionRate: number; // Annual evolution (1.2% → 0.012)
|
||||
currentUtilities: number; // EDF / fibre / eau
|
||||
currentCharges: number;
|
||||
currentHomeInsurance: number;
|
||||
|
||||
// Projected costs (owner)
|
||||
projectedCharges: number; // Copropriété
|
||||
propertyTax: number; // Taxe foncière (monthly)
|
||||
projectedUtilities: number; // EDF / fibre / eau
|
||||
projectedHomeInsurance: number;
|
||||
|
||||
// Loans
|
||||
loans: LoanInput[];
|
||||
|
||||
// Resale parameters
|
||||
firstYearDepreciation: number; // e.g., -0.05 (5% loss first year)
|
||||
annualAppreciation: number; // e.g., 0.01 (1% per year)
|
||||
saleFees: number; // e.g., 0.07 (7% agency + notary)
|
||||
}
|
||||
|
||||
// ─── Monthly Amortization (per loan) ────────────────────────────────────────
|
||||
|
||||
export interface MonthlyRow {
|
||||
month: number; // 1-based global month
|
||||
monthInYear: number; // 1-12
|
||||
year: number; // 1-based year
|
||||
interest: number;
|
||||
principal: number;
|
||||
insurance: number;
|
||||
remaining: number;
|
||||
payment: number; // interest + principal + insurance
|
||||
}
|
||||
|
||||
// ─── Yearly Amortization (per loan) ─────────────────────────────────────────
|
||||
|
||||
export interface YearlyRow {
|
||||
year: number;
|
||||
interest: number;
|
||||
principal: number;
|
||||
insurance: number;
|
||||
remaining: number;
|
||||
payment: number;
|
||||
}
|
||||
|
||||
// ─── Loan Computation Result ────────────────────────────────────────────────
|
||||
|
||||
export interface LoanResult {
|
||||
loan: LoanInput;
|
||||
effectiveAmount: number; // Actual amount (auto-calculated for main)
|
||||
monthlyPayment: number; // Monthly principal + interest (excl. insurance)
|
||||
monthlyInsurance: number;
|
||||
monthly: MonthlyRow[];
|
||||
yearly: YearlyRow[];
|
||||
totalInterest: number;
|
||||
totalInsurance: number;
|
||||
totalCost: number; // amount + totalInterest + totalInsurance
|
||||
}
|
||||
|
||||
// ─── Yearly Summary (aggregated across all loans) ───────────────────────────
|
||||
|
||||
export interface YearlySummary {
|
||||
year: number;
|
||||
|
||||
// Credits aggregated
|
||||
totalInterest: number;
|
||||
totalPrincipal: number;
|
||||
totalInsurance: number;
|
||||
totalRemaining: number;
|
||||
totalPayment: number;
|
||||
|
||||
// Projected monthly costs (as owner)
|
||||
monthlyInterest: number;
|
||||
monthlyPrincipal: number;
|
||||
monthlyCharges: number; // charges + tax + utilities + home insurance
|
||||
monthlyLoanInsurance: number;
|
||||
monthlyTotal: number;
|
||||
capitalRatio: number; // Part of payment building equity
|
||||
yearlyTotal: number;
|
||||
|
||||
// Current monthly costs (as tenant)
|
||||
currentRent: number;
|
||||
currentCharges: number; // utilities + charges + insurance
|
||||
currentMonthlyTotal: number;
|
||||
currentYearlyTotal: number;
|
||||
|
||||
// Comparison
|
||||
difference: number; // projected - current (negative = savings)
|
||||
|
||||
// Resale projection
|
||||
resalePrice: number;
|
||||
netResale: number; // After fees - remaining debt - down payment
|
||||
}
|
||||
|
||||
// ─── Final Simulation Results ───────────────────────────────────────────────
|
||||
|
||||
export interface SimulationResults {
|
||||
// Financing
|
||||
notaryFees: number;
|
||||
guaranteeFees: number;
|
||||
totalFinancing: number;
|
||||
totalCredit: number;
|
||||
mainLoanAmount: number;
|
||||
|
||||
// Per-loan results
|
||||
loanResults: LoanResult[];
|
||||
|
||||
// Yearly summaries (up to 30 years)
|
||||
yearlySummaries: YearlySummary[];
|
||||
|
||||
// Global totals
|
||||
totalCapital: number;
|
||||
totalInterest: number;
|
||||
totalInsurance: number;
|
||||
grandTotal: number;
|
||||
|
||||
// Year 1 monthly snapshot
|
||||
monthlyPaymentYear1: number;
|
||||
projectedMonthlyCharges: number;
|
||||
projectedMonthlyTotal: number;
|
||||
currentMonthlyTotal: number;
|
||||
|
||||
// Max duration across all loans
|
||||
maxDuration: number;
|
||||
}
|
||||
Reference in New Issue
Block a user