@jjlmoya/utils-finance 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +2 -1
  3. package/src/index.ts +1 -0
  4. package/src/pages/[locale]/[slug].astro +1 -1
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/mortgageExtraPaymentPlanner/bibliography.astro +14 -0
  8. package/src/tool/mortgageExtraPaymentPlanner/bibliography.ts +12 -0
  9. package/src/tool/mortgageExtraPaymentPlanner/component.astro +138 -0
  10. package/src/tool/mortgageExtraPaymentPlanner/controller.ts +150 -0
  11. package/src/tool/mortgageExtraPaymentPlanner/currency-defaults.ts +25 -0
  12. package/src/tool/mortgageExtraPaymentPlanner/dom-views.ts +161 -0
  13. package/src/tool/mortgageExtraPaymentPlanner/entry.ts +31 -0
  14. package/src/tool/mortgageExtraPaymentPlanner/evaluator.ts +24 -0
  15. package/src/tool/mortgageExtraPaymentPlanner/i18n/de.ts +74 -0
  16. package/src/tool/mortgageExtraPaymentPlanner/i18n/en.ts +185 -0
  17. package/src/tool/mortgageExtraPaymentPlanner/i18n/es.ts +49 -0
  18. package/src/tool/mortgageExtraPaymentPlanner/i18n/fr.ts +25 -0
  19. package/src/tool/mortgageExtraPaymentPlanner/i18n/id.ts +18 -0
  20. package/src/tool/mortgageExtraPaymentPlanner/i18n/it.ts +20 -0
  21. package/src/tool/mortgageExtraPaymentPlanner/i18n/ja.ts +18 -0
  22. package/src/tool/mortgageExtraPaymentPlanner/i18n/ko.ts +18 -0
  23. package/src/tool/mortgageExtraPaymentPlanner/i18n/nl.ts +18 -0
  24. package/src/tool/mortgageExtraPaymentPlanner/i18n/pl.ts +18 -0
  25. package/src/tool/mortgageExtraPaymentPlanner/i18n/pt.ts +18 -0
  26. package/src/tool/mortgageExtraPaymentPlanner/i18n/ru.ts +18 -0
  27. package/src/tool/mortgageExtraPaymentPlanner/i18n/sv.ts +18 -0
  28. package/src/tool/mortgageExtraPaymentPlanner/i18n/tr.ts +18 -0
  29. package/src/tool/mortgageExtraPaymentPlanner/i18n/zh.ts +18 -0
  30. package/src/tool/mortgageExtraPaymentPlanner/index.ts +11 -0
  31. package/src/tool/mortgageExtraPaymentPlanner/logic.test.ts +67 -0
  32. package/src/tool/mortgageExtraPaymentPlanner/logic.ts +263 -0
  33. package/src/tool/mortgageExtraPaymentPlanner/mortgage-amortization-extra-payment-planner.css +551 -0
  34. package/src/tool/mortgageExtraPaymentPlanner/seo.astro +14 -0
  35. package/src/tool/mortgageExtraPaymentPlanner/storage.ts +65 -0
  36. package/src/tool/mortgageExtraPaymentPlanner/ui.ts +48 -0
  37. package/src/tools.ts +2 -1
@@ -0,0 +1,74 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { MortgageExtraPaymentPlannerUI } from '../ui';
5
+
6
+ const slug = 'hypotheken-amortisationsrechner-sondertilgung';
7
+ const title = 'Hypothekenrechner mit Sondertilgungen';
8
+ const description = 'Plane eine Hypothek mit festem Zinssatz und regelmäßigen oder einmaligen Sondertilgungen, vergleiche die gesparten Zinsen und zeige alle Beträge in einer Währung an.';
9
+
10
+ const ui: MortgageExtraPaymentPlannerUI = {
11
+ currencyLabel: 'Währung', currencyHelp: 'Einmal auswählen. Jeder Betrag im Plan verwendet diese Währung.',
12
+ principalLabel: 'Anfangsschuld', principalHelp: 'Noch geschuldeter Betrag zu Beginn dieses Plans',
13
+ annualRateLabel: 'Jährlicher Zinssatz', annualRateHelp: 'Nominaler fester Zinssatz für jede Zahlungsperiode',
14
+ termLabel: 'Verbleibende Laufzeit in Jahren', termHelp: 'Geplante Laufzeit ohne Sondertilgungen',
15
+ frequencyLabel: 'Zahlungsrhythmus', recurringExtraLabel: 'Regelmäßige Sondertilgung', recurringExtraHelp: 'Zusätzlicher Tilgungsbetrag pro Periode',
16
+ oneOffExtraLabel: 'Einmalige Sondertilgung', oneOffExtraHelp: 'Eine einzelne Tilgung in der unten gewählten Periode',
17
+ oneOffPeriodLabel: 'Periode der Einmalzahlung', oneOffPeriodHelp: '1 bedeutet die erste Zahlungsperiode',
18
+ startDateLabel: 'Erster Zahlungstermin', startDateHelp: 'Wird zur Schätzung des Rückzahlungstermins verwendet',
19
+ extraSectionTitle: 'Sondertilgungsplan', outputTitle: 'Schuldenverlauf', regularPaymentLabel: 'Regelmäßige Zahlung ohne Extras',
20
+ interestSavedLabel: 'Gesparte Zinsen', periodsSavedLabel: 'Perioden gespart', payoffDateLabel: 'Geschätzte Rückzahlung',
21
+ totalInterestLabel: 'Gezahlte Zinsen mit diesem Plan', totalExtraLabel: 'Zusätzliche Tilgung', baselineLabel: 'Ursprünglicher Plan', planLabel: 'Mit deinen Sondertilgungen',
22
+ balanceSceneLabel: 'Ursprüngliche Restschuld im Vergleich zur Restschuld nach Sondertilgungen', balanceSceneHelp: 'Die gestrichelte Linie zeigt den ursprünglichen Plan. Die kupferfarbene Linie zeigt deinen Plan. Grüne Markierungen zeigen zusätzliche Tilgung.',
23
+ annualScheduleTitle: 'Jährlicher Zahlungsplan', yearLabel: 'Jahr', paymentLabel: 'Gesamtzahlung', interestLabel: 'Zinsen', principalPaidLabel: 'Planmäßige Tilgung', extraPaidLabel: 'Zusätzliche Tilgung', endingBalanceLabel: 'Restschuld',
24
+ formulaTitle: 'Modell und Grenzen', formulaText: 'Der Rechner verwendet ein Amortisationsmodell mit festem Zinssatz. In jeder Periode werden Zinsen auf die Eröffnungsschuld berechnet, die reguläre Zahlung auf Zinsen und Tilgung verteilt und danach regelmäßige sowie einmalige Sondertilgungen angewendet. Der jährliche Zinssatz wird durch die Zahl der Perioden geteilt. Die letzte Zahlung wird reduziert, wenn die Restschuld kleiner als die geplante Zahlung ist. Beim Wechsel der Währung werden die Geldbeträge mit einem internen Planungsfaktor umgerechnet und dasselbe Szenario neu berechnet.',
25
+ riskNote: 'Dies ist eine Schätzung, keine Abrechnung des Kreditgebers. Der Währungswähler verwendet interne Planungsfaktoren, keine Live-Wechselkurse. Variable Zinsen, Gebühren, Versicherungen, Steuern, Zahlungspausen, Tageszinsen, Entschädigungen und Vertragsregeln zur Sondertilgung sind nicht enthalten.',
26
+ emptyMessage: 'Gib eine gültige Schuld, einen Zinssatz, eine Laufzeit und ein Datum ein, um den Plan zu sehen.', invalidInputMessage: 'Prüfe die Eingaben, um den Plan zu sehen',
27
+ currencyOptions: { AUD: 'A$ AUD · Australischer Dollar', BRL: 'R$ BRL · Brasilianischer Real', CAD: 'C$ CAD · Kanadischer Dollar', CHF: 'CHF · Schweizer Franken', CNY: '¥ CNY · Chinesischer Yuan', CZK: 'Kč CZK · Tschechische Krone', DKK: 'kr DKK · Dänische Krone', EUR: '€ EUR · Euro', GBP: '£ GBP · Britisches Pfund', IDR: 'Rp IDR · Indonesische Rupiah', INR: '₹ INR · Indische Rupie', JPY: '¥ JPY · Japanischer Yen', KRW: '₩ KRW · Südkoreanischer Won', MXN: 'MX$ MXN · Mexikanischer Peso', NOK: 'kr NOK · Norwegische Krone', PLN: 'zł PLN · Polnischer Zloty', RUB: '₽ RUB · Russischer Rubel', SEK: 'kr SEK · Schwedische Krone', TRY: '₺ TRY · Türkische Lira', USD: '$ USD · US-Dollar' },
28
+ currencySymbols: { AUD: 'A$', BRL: 'R$', CAD: 'C$', CHF: 'CHF', CNY: '¥', CZK: 'Kč', DKK: 'kr', EUR: '€', GBP: '£', IDR: 'Rp', INR: '₹', JPY: '¥', KRW: '₩', MXN: 'MX$', NOK: 'kr', PLN: 'zł', RUB: '₽', SEK: 'kr', TRY: '₺', USD: '$' },
29
+ frequencyOptions: { monthly: 'Monatlich', biweekly: 'Alle zwei Wochen', weekly: 'Wöchentlich' },
30
+ };
31
+
32
+ const faq = [
33
+ { question: 'Wie verändern zusätzliche Hypothekenzahlungen den Plan?', answer: 'Der Rechner lässt die reguläre Zahlung unverändert und wendet deine zusätzliche Tilgung nach jeder planmäßigen Zahlung an. Die Schuld kann dadurch früher auf null sinken und die Gesamtzinsen können fallen. Dein Kreditgeber kann Sondertilgungen anders behandeln, daher vergleiche das Ergebnis mit dem Vertrag.' },
34
+ { question: 'Was passiert beim Wechsel der Währung?', answer: 'Der Rechner rechnet die Geldbeträge mit einem internen Planungsfaktor in die neue Währung um und berechnet dasselbe Szenario neu. Der Faktor ist kein Live-Kurs; nutze das Ergebnis zur Planung, nicht als aktuelle Wechselkursangabe.' },
35
+ { question: 'Warum gibt es nur einen Währungswähler?', answer: 'Die ausgewählte Währung gilt für Schuld, Sondertilgungen, reguläre Zahlungen, Zinsen, Restschulden und die Jahrestabelle. Eine gemeinsame Einheit hält das Formular verständlich und verhindert vermischte Währungen.' },
36
+ { question: 'Berechnet der Rechner meine echte Kreditrate?', answer: 'Er schätzt einen Amortisationsplan mit festem Zinssatz. Vertragsregeln, Zinstage, Gebühren, Versicherungen, Steuern, Zinsänderungen, Entschädigungen und die genaue Behandlung vorzeitiger Tilgung sind nicht bekannt. Für den vertraglichen Betrag zählen Abrechnung und Vertrag.' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: 'Währung festlegen', text: 'Wähle die eine Währung, die du verwenden möchtest. Sie gilt für alle Geldbeträge und Ergebnisse.' },
41
+ { name: 'Kredit beschreiben', text: 'Gib Anfangsschuld, nominalen Jahreszins, Restlaufzeit, ersten Zahlungstermin und Zahlungsrhythmus ein.' },
42
+ { name: 'Sondertilgungen hinzufügen', text: 'Trage einen Betrag pro Periode ein und ergänze optional eine Einmalzahlung mit ihrer Periode.' },
43
+ { name: 'Vergleich lesen', text: 'Vergleiche die ursprüngliche Restschuld mit deinem Plan und prüfe gesparte Zinsen, gesparte Perioden, Rückzahlungstermin und Jahrestabelle.' },
44
+ ];
45
+
46
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
47
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
48
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' }, inLanguage: 'de' };
49
+
50
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = {
51
+ slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema],
52
+ seo: [
53
+ { type: 'title', text: 'Plane, was Sondertilgungen an deiner Hypothek ändern', level: 2 },
54
+ { type: 'paragraph', html: '<p>Ein Tilgungsplan trennt jede Zahlung in Zinsen und Tilgung. Wenn du zusätzliche Tilgung leistest und die reguläre Zahlung gleich bleibt, kann die Restschuld früher auf null sinken. Dieser Rechner macht den Unterschied zwischen ursprünglichem Verlauf und deinem Plan sichtbar.</p>' },
55
+ { type: 'paragraph', html: '<p>Das Ergebnis ist eine Schätzung für ein Darlehen mit festem Zinssatz. Es berücksichtigt Schuld, nominalen Jahreszins, Zahlungsperioden und den nach jeder Zahlung sinkenden Saldo. Vertragsregeln, Rundungen und Gebühren können beim Kreditgeber anders sein.</p>' },
56
+ { type: 'title', text: 'So funktioniert die Amortisationsrechnung', level: 3 },
57
+ { type: 'paragraph', html: '<p>In jeder Periode werden die Zinsen aus der Eröffnungsschuld berechnet. Der Jahreszins wird durch die Zahl der Perioden geteilt. Danach wird die reguläre Zahlung auf Zinsen und Tilgung verteilt; regelmäßige und einmalige Sondertilgungen senken die Restschuld zusätzlich.</p>' },
58
+ { type: 'table', headers: ['Wert', 'Berechnung', 'Bedeutung'], rows: [['Periodischer Zins', 'Jahreszins / Perioden pro Jahr', 'Zins für eine Zahlungsperiode'], ['Reguläre Zahlung', 'Feste Zahlungsformel', 'Zahlung vor zusätzlicher Tilgung'], ['Periodenzins', 'Eröffnungsschuld x periodischer Zins', 'Vom Modell angenommener Zins'], ['Restschuld', 'Eröffnungsschuld - Tilgung - Extras', 'Im Plan noch geschuldeter Betrag']] },
59
+ { type: 'title', text: 'Was Sondertilgungen tatsächlich ändern', level: 3 },
60
+ { type: 'paragraph', html: '<p>Eine Sondertilgung senkt in diesem Modell direkt die Schuld. Künftige Zinsen werden deshalb auf einen kleineren Betrag berechnet. Sieh dir sowohl gesparte Zinsen als auch gesparte Perioden an: Der erste Wert beschreibt vermiedene Finanzierungskosten, der zweite den früheren Rückzahlungstermin.</p>' },
61
+ { type: 'paragraph', html: '<p>Der Kreditgeber kann stattdessen die reguläre Rate senken, die Laufzeit beibehalten oder eine formelle Anfrage verlangen. Prüfe daher Grenzen, Mindestbeträge und mögliche Entschädigungen vor einer Zahlung.</p>' },
62
+ { type: 'title', text: 'Währungen einfach und ohne Mischrechnung verwenden', level: 3 },
63
+ { type: 'paragraph', html: '<p>Wähle eine Währung für den Haushaltsplan oder die Kreditabrechnung. Sie gilt für Schuld, Sondertilgungen, Zahlungen, Zinsen und Restschulden. Beim Wechsel werden die Geldbeträge intern umgerechnet, die Struktur des Szenarios bleibt gleich.</p>' },
64
+ { type: 'list', items: ['Wähle die Währung deines Budgets oder der Kreditabrechnung.', 'Gib Schuld und jede Sondertilgung in der ausgewählten Einheit ein.', 'Behandle den Wechsel als neue Planungseinheit, nicht als Änderung des Kreditvertrags.', 'Prüfe den zulässigen Zahlungsrhythmus und die Regeln für vorzeitige Tilgung.', 'Nutze die Jahrestabelle, um die Wirkung einer Einmalzahlung zu erkennen.'] },
65
+ { type: 'title', text: 'Ein einfaches Beispiel für die Ausgabe', level: 3 },
66
+ { type: 'paragraph', html: '<p>Bei 250.000 EUR, 3,5 Prozent festem Jahreszins und 25 Jahren Restlaufzeit verändern 150 EUR monatliche Sondertilgung sowie 5.000 EUR in Periode 12 die ursprüngliche reguläre Zahlung in diesem Modell nicht. Sie senken aber die Restschuld und damit spätere Zinsen.</p>' },
67
+ { type: 'paragraph', html: '<p>Wenn du zu USD wechselst, rechnet der Rechner die Beträge mit dem internen Planungsfaktor um und berechnet dasselbe Szenario neu. Das ist eine übersichtliche Planungshilfe, aber keine aktuelle Markt- oder Vertragsbewertung.</p>' },
68
+ { type: 'title', text: 'Vor einer Entscheidung prüfen', level: 3 },
69
+ { type: 'list', items: ['Frage, ob eine Sondertilgung Laufzeit oder Rate reduziert.', 'Prüfe jährliche Grenzen, Mindestbeträge und Entschädigungen.', 'Bestätige, ob der genannte Zins nominal, effektiv, fest oder variabel ist.', 'Vergleiche den Saldo mit einer aktuellen Abrechnung des Kreditgebers.', 'Notiere bei internationaler Planung den verwendeten Wechselkurs und das Datum.'] },
70
+ { type: 'tip', title: 'Die Grafik ist ein Vergleich, kein Versprechen', html: '<p>Die gestrichelte Linie zeigt den ursprünglichen festen Plan ohne Extras. Die kupferfarbene Linie folgt deinen Eingaben. Gebühren, Versicherungen, Steuern, tägliche Zinsen, Wechselkursbewegungen und Vertragsregeln sind nicht enthalten.</p>' },
71
+ { type: 'title', text: 'Grenzen dieses Hypothekenrechners', level: 3 },
72
+ { type: 'paragraph', html: '<p>Das Werkzeug modelliert ein vollständig tilgendes Darlehen mit festem Zinssatz, regelmäßigen Zahlungen und optionaler zusätzlicher Tilgung. Es hilft bei Szenarien und Fragen an den Kreditgeber. Es beurteilt keine Tragbarkeit, erteilt keine Steuer- oder Rechtsberatung und ersetzt keine Abrechnung.</p>' },
73
+ ],
74
+ };
@@ -0,0 +1,185 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { MortgageExtraPaymentPlannerUI } from '../ui';
5
+
6
+ const slug = 'mortgage-amortization-extra-payment-planner';
7
+ const title = 'Mortgage Amortization Planner with Extra Payments';
8
+ const description = 'Plan a fixed rate mortgage with recurring or one off extra payments, compare interest saved and view every amount in one chosen currency.';
9
+
10
+ const ui: MortgageExtraPaymentPlannerUI = {
11
+ currencyLabel: 'Currency',
12
+ currencyHelp: 'Choose once. Every amount in the plan uses this currency.',
13
+ principalLabel: 'Starting principal',
14
+ principalHelp: 'The amount still owed at the start of this plan',
15
+ annualRateLabel: 'Annual interest rate',
16
+ annualRateHelp: 'Nominal fixed rate used for each payment period',
17
+ termLabel: 'Remaining term in years',
18
+ termHelp: 'The planned duration before extra payments',
19
+ frequencyLabel: 'Payment frequency',
20
+ recurringExtraLabel: 'Recurring extra payment',
21
+ recurringExtraHelp: 'Additional principal paid every period',
22
+ oneOffExtraLabel: 'One off extra payment',
23
+ oneOffExtraHelp: 'A single principal payment in the period below',
24
+ oneOffPeriodLabel: 'One off payment period',
25
+ oneOffPeriodHelp: '1 means the first payment period',
26
+ startDateLabel: 'First payment date',
27
+ startDateHelp: 'Used to estimate the payoff date',
28
+ extraSectionTitle: 'Extra payment plan',
29
+ outputTitle: 'Balance path',
30
+ regularPaymentLabel: 'Regular payment before extras',
31
+ interestSavedLabel: 'Interest saved',
32
+ periodsSavedLabel: 'periods saved',
33
+ payoffDateLabel: 'Estimated payoff',
34
+ totalInterestLabel: 'Interest paid with this plan',
35
+ totalExtraLabel: 'Extra principal paid',
36
+ baselineLabel: 'Original schedule',
37
+ planLabel: 'With your extra payments',
38
+ balanceSceneLabel: 'Original mortgage balance compared with the balance after extra payments',
39
+ balanceSceneHelp: 'The dashed line is the original schedule. The copper line is your plan. Green marks show periods with extra principal.',
40
+ annualScheduleTitle: 'Annual payment schedule',
41
+ yearLabel: 'Year',
42
+ paymentLabel: 'Total paid',
43
+ interestLabel: 'Interest',
44
+ principalPaidLabel: 'Scheduled principal',
45
+ extraPaidLabel: 'Extra principal',
46
+ endingBalanceLabel: 'Ending balance',
47
+ formulaTitle: 'Model and limits',
48
+ formulaText: 'The planner uses a fixed rate amortization model. Each period calculates interest on the opening balance, applies the regular payment to interest and principal, then applies recurring and one off extra principal. Interest is annual rate divided by the number of periods per year. The final payment is reduced when the remaining balance is smaller than the planned payment. Changing the currency converts the monetary inputs with an internal planning ratio before calculating the same scenario again.',
49
+ riskNote: 'This is an estimate, not a lender statement. The currency selector uses internal planning ratios, not live market rates. The model does not include variable rates, fees, insurance, taxes, payment holidays, daily interest, penalties or the contract rules that determine how your lender applies an overpayment.',
50
+ emptyMessage: 'Enter a valid principal, rate, term and date to see the plan.',
51
+ invalidInputMessage: 'Check the inputs to see the plan',
52
+ currencyOptions: {
53
+ AUD: 'A$ AUD · Australian dollar',
54
+ BRL: 'R$ BRL · Brazilian real',
55
+ CAD: 'C$ CAD · Canadian dollar',
56
+ CHF: 'CHF · Swiss franc',
57
+ CNY: '¥ CNY · Chinese yuan',
58
+ CZK: 'Kč CZK · Czech koruna',
59
+ DKK: 'kr DKK · Danish krone',
60
+ EUR: '€ EUR · Euro',
61
+ GBP: '£ GBP · Pound sterling',
62
+ IDR: 'Rp IDR · Indonesian rupiah',
63
+ INR: '₹ INR · Indian rupee',
64
+ JPY: '¥ JPY · Japanese yen',
65
+ KRW: '₩ KRW · South Korean won',
66
+ MXN: 'MX$ MXN · Mexican peso',
67
+ NOK: 'kr NOK · Norwegian krone',
68
+ PLN: 'zł PLN · Polish zloty',
69
+ RUB: '₽ RUB · Russian ruble',
70
+ SEK: 'kr SEK · Swedish krona',
71
+ TRY: '₺ TRY · Turkish lira',
72
+ USD: '$ USD · US dollar',
73
+ },
74
+ currencySymbols: {
75
+ AUD: 'A$',
76
+ BRL: 'R$',
77
+ CAD: 'C$',
78
+ CHF: 'CHF',
79
+ CNY: '¥',
80
+ CZK: 'Kč',
81
+ DKK: 'kr',
82
+ EUR: '€',
83
+ GBP: '£',
84
+ IDR: 'Rp',
85
+ INR: '₹',
86
+ JPY: '¥',
87
+ KRW: '₩',
88
+ MXN: 'MX$',
89
+ NOK: 'kr',
90
+ PLN: 'zł',
91
+ RUB: '₽',
92
+ SEK: 'kr',
93
+ TRY: '₺',
94
+ USD: '$',
95
+ },
96
+ frequencyOptions: {
97
+ monthly: 'Monthly',
98
+ biweekly: 'Every two weeks',
99
+ weekly: 'Weekly',
100
+ },
101
+ };
102
+
103
+ const faq = [
104
+ {
105
+ question: 'How do extra mortgage payments change the schedule?',
106
+ answer: 'This planner keeps the regular payment unchanged and applies your extra principal after each scheduled payment. The balance can therefore reach zero earlier and the interest total can fall. Your lender may apply an overpayment differently, so compare the result with your contract.',
107
+ },
108
+ {
109
+ question: 'What happens when I change the currency?',
110
+ answer: 'The planner converts the monetary inputs to the new currency with an internal planning ratio, then recalculates the same scenario. The ratio is not a live market quote, so use the result for planning rather than as a current exchange-rate statement.',
111
+ },
112
+ {
113
+ question: 'Why is there only one currency selector?',
114
+ answer: 'The selected currency applies to the principal, extra payments, regular payments, interest, balances and annual schedule. One shared unit keeps the form readable and prevents accidentally mixing currencies inside one calculation.',
115
+ },
116
+ {
117
+ question: 'Does the planner calculate my real lender payment?',
118
+ answer: 'It estimates a fixed rate amortization schedule. It does not know your lender contract, day count convention, fees, insurance, taxes, rate revisions, penalties or the exact treatment of an early repayment. Use your statement and contract for the contractual figure.',
119
+ },
120
+ ];
121
+
122
+ const howTo = [
123
+ { name: 'Set the currency', text: 'Choose the single currency you want to use. The planner applies it to every monetary input and result.' },
124
+ { name: 'Describe the loan', text: 'Enter the principal, nominal annual rate, remaining term, first payment date and payment frequency.' },
125
+ { name: 'Add extra payments', text: 'Enter an extra amount paid every period, then add one optional lump sum and the period when it happens.' },
126
+ { name: 'Read the comparison', text: 'Compare the dashed original balance with your plan, then review interest saved, periods saved, payoff date and the annual schedule.' },
127
+ ];
128
+
129
+ const faqSchema: WithContext<FAQPage> = {
130
+ '@context': 'https://schema.org',
131
+ '@type': 'FAQPage',
132
+ mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
133
+ };
134
+
135
+ const howToSchema: WithContext<HowTo> = {
136
+ '@context': 'https://schema.org',
137
+ '@type': 'HowTo',
138
+ name: title,
139
+ description,
140
+ step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })),
141
+ };
142
+
143
+ const appSchema: WithContext<SoftwareApplication> = {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ name: title,
147
+ description,
148
+ applicationCategory: 'FinanceApplication',
149
+ operatingSystem: 'All',
150
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
151
+ inLanguage: 'en',
152
+ };
153
+
154
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = {
155
+ slug,
156
+ title,
157
+ description,
158
+ ui,
159
+ faq,
160
+ bibliography,
161
+ howTo,
162
+ schemas: [appSchema, faqSchema, howToSchema],
163
+ seo: [
164
+ { type: 'title', text: 'Plan what extra mortgage payments can change', level: 2 },
165
+ { type: 'paragraph', html: '<p>An amortization schedule separates each payment into interest and principal. When you pay extra principal and the lender keeps the regular payment unchanged, the balance can reach zero sooner. This planner makes that tradeoff visible by comparing the original balance path with the path created by your recurring and one off extra payments.</p>' },
166
+ { type: 'paragraph', html: '<p>The result is a planning estimate for a fixed rate loan. It uses the principal, nominal annual rate, number of payment periods, and an opening balance that changes after each payment. It does not promise the exact amount your lender will charge because contracts can use different day counts, fees, rounding rules, or overpayment instructions.</p>' },
167
+ { type: 'title', text: 'How the amortization calculation works', level: 3 },
168
+ { type: 'paragraph', html: '<p>For each period, the model calculates interest from the opening balance. The periodic rate is the annual rate divided by the number of periods per year. The regular payment is then found with the fixed payment formula. After the scheduled principal, the recurring extra and the selected one off payment reduce the balance further.</p>' },
169
+ { type: 'table', headers: ['Figure', 'Calculation', 'Interpretation'], rows: [['Periodic rate', 'Annual rate / periods per year', 'The rate applied in each payment period'], ['Regular payment', 'Principal x rate x (1 + rate)^n / ((1 + rate)^n - 1)', 'The fixed payment before extra principal'], ['Interest in a period', 'Opening balance x periodic rate', 'The interest implied by the model for that period'], ['Balance after payment', 'Opening balance - scheduled principal - extra principal', 'The amount still owed in the plan']] },
170
+ { type: 'title', text: 'What extra payments actually change', level: 3 },
171
+ { type: 'paragraph', html: '<p>An extra payment is applied to principal in this model, so future interest is calculated on a smaller balance. The useful comparison is not only the amount of extra cash paid. Look at both interest saved and periods saved: one shows the financing cost avoided, while the other shows how much earlier the model reaches zero.</p>' },
172
+ { type: 'paragraph', html: '<p>The lender may instead reduce the regular payment, keep the term, or require a formal request before changing the schedule. Some contracts also impose limits or compensation for early repayment. Use this output to prepare a question for the lender, not to replace the lender statement.</p>' },
173
+ { type: 'title', text: 'Use currencies without mixing the math', level: 3 },
174
+ { type: 'paragraph', html: '<p>Choose one currency before entering the loan amounts. The selector applies to the principal, recurring extra, lump sum, payments, interest and balances, so the form never asks you to reconcile two currency columns. Switching currency converts the monetary inputs internally and keeps the scenario structure intact.</p>' },
175
+ { type: 'list', items: ['Choose the currency you use for the household budget or lender statement.', 'Keep the principal and every extra payment in the selected currency.', 'Treat a currency switch as a planning-unit change, not as a change to the lender contract.', 'Check whether your lender permits the selected frequency and how it applies early principal.', 'Review the annual table to find the years in which the lump sum makes the largest difference.'] },
176
+ { type: 'title', text: 'A simple example to interpret the output', level: 3 },
177
+ { type: 'paragraph', html: '<p>Suppose the starting principal is 250,000 EUR at a fixed nominal rate of 3.5% over 25 years. A recurring extra of 150 EUR and a 5,000 EUR lump sum in period 12 do not change the original regular payment in this model. They do lower the balance after the relevant periods, which reduces later interest and moves the estimated payoff date earlier.</p>' },
178
+ { type: 'paragraph', html: '<p>If you switch the currency to USD, the tool converts the monetary inputs with its internal planning ratio and recalculates the same loan scenario in dollars. That keeps the interface simple, but the result is not a live market valuation and should not replace a lender statement or current FX quote.</p>' },
179
+ { type: 'title', text: 'What to check before acting', level: 3 },
180
+ { type: 'list', items: ['Ask the lender whether an overpayment reduces the term or the regular payment.', 'Check any early repayment compensation, annual limits and minimum lump sum.', 'Confirm whether the stated rate is nominal, effective, fixed, variable or subject to a review.', 'Compare the calculated balance with a recent lender statement before making a payment.', 'Save the exchange rate and date if the result is part of an international household budget.'] },
181
+ { type: 'tip', title: 'The chart is a comparison, not a promise', html: '<p>The dashed line assumes the original fixed schedule without extra payments. The copper line follows the inputs you entered. Neither line includes contract specific fees, insurance, taxes, variable rate changes, daily interest, currency market movements or a guarantee that the lender will apply an overpayment in the same way.</p>' },
182
+ { type: 'title', text: 'Limits of this mortgage planner', level: 3 },
183
+ { type: 'paragraph', html: '<p>This tool models a fully amortizing fixed rate loan with regular payments and optional extra principal. It is useful for exploring scenarios and preparing questions. It cannot determine affordability, approve a loan, provide tax or legal advice, forecast exchange rates, reproduce a lender statement, or establish which early repayment rules apply in your country.</p>' },
184
+ ],
185
+ };
@@ -0,0 +1,49 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { MortgageExtraPaymentPlannerUI } from '../ui';
5
+
6
+ const slug = 'calculadora-amortizacion-hipoteca-pagos-extra';
7
+ const title = 'Calculadora de amortización hipotecaria con pagos extra';
8
+ const description = 'Planifica una hipoteca a tipo fijo con pagos extra periódicos o puntuales, compara los intereses ahorrados y muestra todos los importes en una sola moneda.';
9
+ const ui: MortgageExtraPaymentPlannerUI = {
10
+ currencyLabel: 'Moneda', currencyHelp: 'Elige una vez. Todos los importes del plan usarán esta moneda.', principalLabel: 'Capital pendiente inicial', principalHelp: 'Importe que queda por pagar al comenzar este plan', annualRateLabel: 'Tipo de interés anual', annualRateHelp: 'Tipo nominal fijo aplicado en cada periodo de pago', termLabel: 'Plazo restante en años', termHelp: 'Duración prevista antes de los pagos extra', frequencyLabel: 'Frecuencia de pago', recurringExtraLabel: 'Pago extra periódico', recurringExtraHelp: 'Capital adicional pagado en cada periodo', oneOffExtraLabel: 'Pago extra puntual', oneOffExtraHelp: 'Un pago único de capital en el periodo indicado', oneOffPeriodLabel: 'Periodo del pago puntual', oneOffPeriodHelp: '1 significa el primer periodo de pago', startDateLabel: 'Fecha del primer pago', startDateHelp: 'Se usa para estimar la fecha de liquidación', extraSectionTitle: 'Plan de pagos extra', outputTitle: 'Evolución del saldo', regularPaymentLabel: 'Cuota normal antes de extras', interestSavedLabel: 'Intereses ahorrados', periodsSavedLabel: 'periodos ahorrados', payoffDateLabel: 'Liquidación estimada', totalInterestLabel: 'Intereses pagados con este plan', totalExtraLabel: 'Capital extra pagado', baselineLabel: 'Calendario original', planLabel: 'Con tus pagos extra', balanceSceneLabel: 'Saldo hipotecario original frente al saldo después de los pagos extra', balanceSceneHelp: 'La línea discontinua es el calendario original. La línea cobre es tu plan. Las marcas verdes señalan periodos con capital extra.', annualScheduleTitle: 'Calendario anual de pagos', yearLabel: 'Año', paymentLabel: 'Total pagado', interestLabel: 'Intereses', principalPaidLabel: 'Capital programado', extraPaidLabel: 'Capital extra', endingBalanceLabel: 'Saldo final', formulaTitle: 'Modelo y límites', formulaText: 'La calculadora usa un modelo de amortización a tipo fijo. En cada periodo calcula los intereses sobre el saldo inicial, aplica la cuota normal a intereses y capital, y después aplica los pagos extra periódicos y puntuales. El interés anual se divide entre el número de periodos de pago. La última cuota se reduce si el saldo restante es menor que la cuota prevista. Al cambiar de moneda, convierte internamente los importes con una proporción de planificación y vuelve a calcular el mismo escenario.', riskNote: 'Es una estimación, no un extracto del banco. El selector usa proporciones internas de planificación, no tipos de cambio en tiempo real. No incluye tipos variables, comisiones, seguros, impuestos, carencias, interés diario, penalizaciones ni las reglas contractuales del banco para aplicar una amortización anticipada.', emptyMessage: 'Introduce un capital, tipo, plazo y fecha válidos para ver el plan.', invalidInputMessage: 'Revisa los datos para ver el plan', currencyOptions: { AUD: 'A$ AUD · dólar australiano', BRL: 'R$ BRL · real brasileño', CAD: 'C$ CAD · dólar canadiense', CHF: 'CHF · franco suizo', CNY: '¥ CNY · yuan chino', CZK: 'Kč CZK · corona checa', DKK: 'kr DKK · corona danesa', EUR: '€ EUR · euro', GBP: '£ GBP · libra esterlina', IDR: 'Rp IDR · rupia indonesia', INR: '₹ INR · rupia india', JPY: '¥ JPY · yen japonés', KRW: '₩ KRW · won surcoreano', MXN: 'MX$ MXN · peso mexicano', NOK: 'kr NOK · corona noruega', PLN: 'zł PLN · zloty polaco', RUB: '₽ RUB · rublo ruso', SEK: 'kr SEK · corona sueca', TRY: '₺ TRY · lira turca', USD: '$ USD · dólar estadounidense' }, currencySymbols: { AUD: 'A$', BRL: 'R$', CAD: 'C$', CHF: 'CHF', CNY: '¥', CZK: 'Kč', DKK: 'kr', EUR: '€', GBP: '£', IDR: 'Rp', INR: '₹', JPY: '¥', KRW: '₩', MXN: 'MX$', NOK: 'kr', PLN: 'zł', RUB: '₽', SEK: 'kr', TRY: '₺', USD: '$' }, frequencyOptions: { monthly: 'Mensual', biweekly: 'Cada dos semanas', weekly: 'Semanal' },
11
+ };
12
+ const faq = [
13
+ { question: '¿Cómo cambian el calendario los pagos extra?', answer: 'La calculadora mantiene la cuota normal y aplica el capital extra después de cada pago previsto. El saldo puede llegar a cero antes y los intereses totales pueden bajar. El banco puede aplicar la amortización de otra forma, así que compara el resultado con tu contrato.' },
14
+ { question: '¿Qué ocurre al cambiar de moneda?', answer: 'La calculadora convierte internamente los importes a la nueva moneda con una proporción de planificación y recalcula el mismo escenario. No es una cotización en tiempo real: sirve para planificar, no para afirmar un cambio actual.' },
15
+ { question: '¿Por qué solo hay un selector de moneda?', answer: 'La moneda seleccionada se aplica al capital, pagos extra, cuotas, intereses, saldos y tabla anual. Una unidad compartida mantiene el formulario claro y evita mezclar monedas dentro del cálculo.' },
16
+ { question: '¿Calcula la cuota real de mi banco?', answer: 'Estima un calendario de amortización a tipo fijo. No conoce las reglas de tu contrato, días de cálculo, comisiones, seguros, impuestos, revisiones, penalizaciones ni el tratamiento exacto de una amortización anticipada. Para el importe contractual usa el extracto y el contrato.' },
17
+ ];
18
+ const howTo = [
19
+ { name: 'Elige la moneda', text: 'Selecciona la única moneda que quieres utilizar. Se aplicará a cada importe y resultado.' },
20
+ { name: 'Describe la hipoteca', text: 'Introduce capital, tipo nominal anual, plazo restante, fecha del primer pago y frecuencia.' },
21
+ { name: 'Añade pagos extra', text: 'Indica un importe extra por periodo y, si quieres, un pago puntual y el periodo en que sucede.' },
22
+ { name: 'Lee la comparación', text: 'Compara el saldo original con tu plan y revisa intereses, periodos, fecha estimada y calendario anual.' },
23
+ ];
24
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
25
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
26
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' }, inLanguage: 'es' };
27
+ const seo: ToolLocaleContent['seo'] = [
28
+ { type: 'title', text: 'Planifica qué pueden cambiar tus pagos extra', level: 2 },
29
+ { type: 'paragraph', html: '<p>Un calendario de amortización separa cada cuota entre intereses y capital. Si pagas capital adicional y mantienes la cuota normal, el saldo puede llegar a cero antes. Esta calculadora compara el recorrido original con el que crean tus pagos extra periódicos y puntuales.</p>' },
30
+ { type: 'paragraph', html: '<p>El resultado es una estimación para un préstamo a tipo fijo. Usa capital, tipo nominal anual, número de periodos y un saldo que cambia tras cada pago. Comisiones, redondeos, días de cálculo y reglas de amortización pueden ser distintos en tu contrato.</p>' },
31
+ { type: 'title', text: 'Cómo funciona el cálculo', level: 3 },
32
+ { type: 'paragraph', html: '<p>En cada periodo se calculan intereses sobre el saldo inicial. El tipo anual se divide entre los periodos del año. La cuota normal se reparte entre intereses y capital; después los pagos extra reducen más el saldo.</p>' },
33
+ { type: 'table', headers: ['Dato', 'Cálculo', 'Interpretación'], rows: [['Tipo periódico', 'Tipo anual / periodos al año', 'Tipo aplicado en cada pago'], ['Cuota normal', 'Fórmula de cuota fija', 'Pago antes del capital extra'], ['Interés del periodo', 'Saldo inicial x tipo periódico', 'Interés que supone el modelo'], ['Saldo posterior', 'Saldo inicial - capital - extras', 'Importe que aún queda por pagar']] },
34
+ { type: 'title', text: 'Qué cambian realmente los pagos extra', level: 3 },
35
+ { type: 'paragraph', html: '<p>En este modelo, un pago extra se aplica al capital, por lo que los intereses futuros se calculan sobre un saldo menor. Mira tanto los intereses ahorrados como los periodos ahorrados: uno muestra el coste financiero evitado y el otro cuánto se adelanta la liquidación.</p>' },
36
+ { type: 'paragraph', html: '<p>El banco puede reducir la cuota, mantener el plazo o pedir una solicitud formal. Algunos contratos fijan límites o compensaciones. Usa la salida para preparar preguntas, no para sustituir el documento bancario.</p>' },
37
+ { type: 'title', text: 'Usa monedas sin mezclar el cálculo', level: 3 },
38
+ { type: 'paragraph', html: '<p>Elige una moneda antes de introducir importes. El selector se aplica al capital, extras, cuotas, intereses y saldos. Al cambiarla, los importes se convierten internamente y la estructura del escenario permanece.</p>' },
39
+ { type: 'list', items: ['Elige la moneda de tu presupuesto o extracto.', 'Mantén capital y pagos extra en la moneda seleccionada.', 'Interpreta el cambio como una unidad de planificación, no como un cambio de contrato.', 'Comprueba la frecuencia admitida y las reglas de amortización anticipada.', 'Revisa la tabla anual para localizar el efecto del pago puntual.'] },
40
+ { type: 'title', text: 'Ejemplo sencillo para interpretar la salida', level: 3 },
41
+ { type: 'paragraph', html: '<p>Con 250.000 EUR, un tipo fijo del 3,5% y 25 años, añadir 150 EUR por periodo y 5.000 EUR en el periodo 12 no modifica la cuota normal original de este modelo. Sí reduce el saldo posterior, los intereses futuros y la fecha estimada de liquidación.</p>' },
42
+ { type: 'paragraph', html: '<p>Si cambias a USD, la herramienta convierte los importes con su proporción interna y recalcula el mismo escenario. Es útil para presupuestos internacionales, pero no es una valoración de mercado ni una cotización actual.</p>' },
43
+ { type: 'title', text: 'Qué comprobar antes de actuar', level: 3 },
44
+ { type: 'list', items: ['Pregunta si el pago extra reduce plazo o cuota.', 'Comprueba límites anuales, mínimos y posibles compensaciones.', 'Confirma si el tipo es nominal, efectivo, fijo o variable.', 'Compara el saldo calculado con un extracto reciente.', 'Anota el tipo de cambio y la fecha si forma parte de tu presupuesto internacional.'] },
45
+ { type: 'tip', title: 'El gráfico compara; no promete', html: '<p>La línea discontinua representa el calendario fijo original sin extras. La línea cobre sigue tus datos. Ninguna incluye comisiones, seguros, impuestos, interés diario, movimientos del mercado de divisas o la garantía de que el banco aplique el pago de la misma manera.</p>' },
46
+ { type: 'title', text: 'Límites de esta calculadora hipotecaria', level: 3 },
47
+ { type: 'paragraph', html: '<p>La herramienta modela un préstamo totalmente amortizable a tipo fijo con pagos regulares y capital extra opcional. Sirve para explorar escenarios y preparar preguntas. No determina solvencia, no da asesoramiento fiscal o legal, no predice divisas y no sustituye al banco.</p>' },
48
+ ];
49
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema], seo };
@@ -0,0 +1,25 @@
1
+ import { bibliography } from "../bibliography";
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from "schema-dts";
3
+ import type { ToolLocaleContent } from "../../../types";
4
+ import type { MortgageExtraPaymentPlannerUI } from "../ui";
5
+
6
+ const slug = "calculateur-amortissement-hypotheque-remboursements-anticipes";
7
+ const title = "Calculateur d'amortissement hypothécaire avec remboursements anticipés";
8
+ const description = "Planifiez un prêt immobilier à taux fixe avec des remboursements anticipés réguliers ou ponctuels, comparez les intérêts économisés et affichez tous les montants dans une seule devise.";
9
+ const ui: MortgageExtraPaymentPlannerUI = {
10
+ currencyLabel: "Devise", currencyHelp: "Choisissez une fois. Tous les montants du plan utiliseront cette devise.", principalLabel: "Capital initial restant", principalHelp: "Montant encore dû au début de ce plan", annualRateLabel: "Taux d'intérêt annuel", annualRateHelp: "Taux nominal fixe appliqué à chaque période", termLabel: "Durée restante en années", termHelp: "Durée prévue avant les remboursements anticipés", frequencyLabel: "Fréquence des paiements", recurringExtraLabel: "Remboursement anticipé régulier", recurringExtraHelp: "Capital supplémentaire payé à chaque période", oneOffExtraLabel: "Remboursement anticipé ponctuel", oneOffExtraHelp: "Un paiement unique de capital pendant la période indiquée", oneOffPeriodLabel: "Période du paiement ponctuel", oneOffPeriodHelp: "1 correspond à la première période", startDateLabel: "Date du premier paiement", startDateHelp: "Sert à estimer la date de remboursement", extraSectionTitle: "Plan de remboursements anticipés", outputTitle: "Évolution du solde", regularPaymentLabel: "Paiement normal avant les extras", interestSavedLabel: "Intérêts économisés", periodsSavedLabel: "périodes gagnées", payoffDateLabel: "Remboursement estimé", totalInterestLabel: "Intérêts payés avec ce plan", totalExtraLabel: "Capital supplémentaire payé", baselineLabel: "Échéancier initial", planLabel: "Avec vos remboursements anticipés", balanceSceneLabel: "Solde initial comparé au solde après les remboursements anticipés", balanceSceneHelp: "La ligne en pointillés montre l'échéancier initial. La ligne cuivrée montre votre plan. Les repères verts indiquent du capital supplémentaire.", annualScheduleTitle: "Échéancier annuel", yearLabel: "Année", paymentLabel: "Total payé", interestLabel: "Intérêts", principalPaidLabel: "Capital prévu", extraPaidLabel: "Capital supplémentaire", endingBalanceLabel: "Solde final", formulaTitle: "Modèle et limites", formulaText: "Le calculateur utilise un modèle d'amortissement à taux fixe. Chaque période calcule les intérêts sur le solde d'ouverture, applique le paiement normal aux intérêts et au capital, puis applique les remboursements anticipés réguliers et ponctuels. Le taux annuel est divisé par le nombre de périodes. Le dernier paiement est réduit si le solde est inférieur au paiement prévu. Un changement de devise convertit les montants avec un ratio interne de planification avant de recalculer le même scénario.", riskNote: "Ceci est une estimation, pas un relevé du prêteur. Le sélecteur utilise des ratios internes de planification, pas des cours de marché en direct. Les taux variables, frais, assurances, impôts, intérêts journaliers, pénalités et règles contractuelles ne sont pas inclus.", emptyMessage: "Saisissez un capital, un taux, une durée et une date valides pour voir le plan.", invalidInputMessage: "Vérifiez les données pour voir le plan", currencyOptions: { AUD: "A$ AUD · dollar australien", BRL: "R$ BRL · réal brésilien", CAD: "C$ CAD · dollar canadien", CHF: "CHF · franc suisse", CNY: "¥ CNY · yuan chinois", CZK: "Kč CZK · couronne tchèque", DKK: "kr DKK · couronne danoise", EUR: "€ EUR · euro", GBP: "£ GBP · livre sterling", IDR: "Rp IDR · roupie indonésienne", INR: "₹ INR · roupie indienne", JPY: "¥ JPY · yen japonais", KRW: "₩ KRW · won sud-coréen", MXN: "MX$ MXN · peso mexicain", NOK: "kr NOK · couronne norvégienne", PLN: "zł PLN · zloty polonais", RUB: "₽ RUB · rouble russe", SEK: "kr SEK · couronne suédoise", TRY: "₺ TRY · livre turque", USD: "$ USD · dollar américain" }, currencySymbols: { AUD: "A$", BRL: "R$", CAD: "C$", CHF: "CHF", CNY: "¥", CZK: "Kč", DKK: "kr", EUR: "€", GBP: "£", IDR: "Rp", INR: "₹", JPY: "¥", KRW: "₩", MXN: "MX$", NOK: "kr", PLN: "zł", RUB: "₽", SEK: "kr", TRY: "₺", USD: "$" }, frequencyOptions: { monthly: "Mensuelle", biweekly: "Toutes les deux semaines", weekly: "Hebdomadaire" },
11
+ };
12
+ const faq = [
13
+ { question: "Comment les paiements supplémentaires changent-ils l'échéancier ?", answer: "Le calculateur garde le paiement normal et applique le capital supplémentaire après chaque paiement prévu. Le solde peut atteindre zéro plus tôt et les intérêts totaux peuvent diminuer. Le prêteur peut traiter un remboursement anticipé autrement: comparez le résultat au contrat." },
14
+ { question: "Que se passe-t-il si je change de devise ?", answer: "Les montants sont convertis dans la nouvelle devise avec un ratio interne de planification, puis le même scénario est recalculé. Ce ratio n'est pas un cours en direct: utilisez le résultat pour planifier, pas comme cotation actuelle." },
15
+ { question: "Pourquoi n'y a-t-il qu'un seul sélecteur de devise ?", answer: "La devise choisie s'applique au capital, aux remboursements anticipés, aux paiements, aux intérêts, aux soldes et à l'échéancier annuel. Une unité commune évite de mélanger les devises." },
16
+ { question: "Le calculateur donne-t-il mon paiement réel ?", answer: "Il estime un échéancier à taux fixe. Il ne connaît pas les jours de calcul, frais, assurances, impôts, révisions, pénalités ou règles contractuelles de votre prêteur. Utilisez votre relevé et votre contrat pour le montant contractuel." },
17
+ ];
18
+ const howTo = [{ name: "Choisir la devise", text: "Sélectionnez la devise unique à appliquer à tous les montants et résultats." }, { name: "Décrire le prêt", text: "Saisissez le capital, le taux nominal annuel, la durée restante, la date du premier paiement et la fréquence." }, { name: "Ajouter les remboursements", text: "Saisissez un montant régulier, puis ajoutez si besoin un paiement ponctuel et sa période." }, { name: "Lire la comparaison", text: "Comparez le solde initial et votre plan, puis consultez les intérêts, périodes, date estimée et échéancier annuel." }];
19
+ const faqSchema: WithContext<FAQPage> = { "@context": "https://schema.org", "@type": "FAQPage", mainEntity: faq.map((item) => ({ "@type": "Question", name: item.question, acceptedAnswer: { "@type": "Answer", text: item.answer } })) };
20
+ const howToSchema: WithContext<HowTo> = { "@context": "https://schema.org", "@type": "HowTo", name: title, description, step: howTo.map((step, index) => ({ "@type": "HowToStep", position: index + 1, name: step.name, text: step.text })) };
21
+ const appSchema: WithContext<SoftwareApplication> = { "@context": "https://schema.org", "@type": "SoftwareApplication", name: title, description, applicationCategory: "FinanceApplication", operatingSystem: "All", offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" }, inLanguage: "fr" };
22
+ const seo: ToolLocaleContent["seo"] = [
23
+ { type: "title", text: "Planifier l'effet des remboursements anticipés", level: 2 }, { type: "paragraph", html: "<p>Un échéancier d'amortissement sépare chaque paiement entre intérêts et capital. En payant du capital supplémentaire tout en conservant le paiement normal, vous pouvez atteindre zéro plus tôt. Cet outil compare le solde initial au parcours créé par vos remboursements réguliers et ponctuels.</p>" }, { type: "paragraph", html: "<p>Le résultat est une estimation pour un prêt à taux fixe. Il utilise le capital, le taux nominal annuel, le nombre de périodes et un solde qui évolue après chaque paiement. Les contrats peuvent appliquer d'autres conventions de jours, arrondis, frais ou règles d'anticipation.</p>" }, { type: "title", text: "Comment fonctionne le calcul d'amortissement", level: 3 }, { type: "paragraph", html: "<p>À chaque période, les intérêts sont calculés sur le solde d'ouverture. Le taux annuel est divisé par le nombre de périodes de paiement. Le paiement normal est ensuite réparti entre intérêts et capital, puis les remboursements supplémentaires réduisent encore le solde.</p>" }, { type: "table", headers: ["Élément", "Calcul", "Interprétation"], rows: [["Taux périodique", "Taux annuel / périodes par an", "Taux appliqué à chaque période"], ["Paiement normal", "Formule de paiement fixe", "Paiement avant le capital supplémentaire"], ["Intérêts", "Solde d'ouverture x taux périodique", "Intérêts supposés par le modèle"], ["Solde après paiement", "Solde - capital - extras", "Montant restant dû"]] }, { type: "title", text: "Ce que changent les paiements supplémentaires", level: 3 }, { type: "paragraph", html: "<p>Dans ce modèle, un remboursement supplémentaire réduit directement le capital. Les intérêts futurs portent donc sur un solde plus faible. Consultez à la fois les intérêts économisés et les périodes gagnées: l'un mesure le coût financier évité, l'autre l'avance de la date de remboursement.</p>" }, { type: "paragraph", html: "<p>Le prêteur peut réduire le paiement, conserver la durée ou demander une démarche formelle. Vérifiez les plafonds annuels, les montants minimums et les indemnités éventuelles.</p>" }, { type: "title", text: "Utiliser les devises sans mélanger les montants", level: 3 }, { type: "paragraph", html: "<p>Choisissez une devise avant de saisir les montants. Elle s'applique au capital, aux extras, aux paiements, aux intérêts et aux soldes. Lors d'un changement, les montants sont convertis en interne et la structure du scénario reste identique.</p>" }, { type: "list", items: ["Choisissez la devise de votre budget ou relevé.", "Saisissez le capital et les extras dans cette unité.", "Considérez le changement comme une unité de planification, pas comme une modification du contrat.", "Vérifiez la fréquence autorisée et les règles de remboursement anticipé.", "Consultez l'échéancier annuel pour voir l'effet du paiement ponctuel."] }, { type: "title", text: "Un exemple simple pour lire le résultat", level: 3 }, { type: "paragraph", html: "<p>Avec 250 000 EUR, un taux fixe de 3,5 % et 25 ans, un extra de 150 EUR par période et 5 000 EUR à la période 12 ne changent pas le paiement normal de départ dans ce modèle. Ils réduisent le solde et les intérêts futurs.</p>" }, { type: "paragraph", html: "<p>En passant en USD, l'outil convertit les montants avec son ratio interne et recalcule le même scénario. C'est une aide de budget international, pas une valeur de marché ni un cours actuel.</p>" }, { type: "title", text: "Vérifications avant d'agir", level: 3 }, { type: "list", items: ["Demandez si l'extra réduit la durée ou le paiement.", "Vérifiez plafonds, minimums et indemnités.", "Confirmez si le taux est nominal, effectif, fixe ou variable.", "Comparez le solde calculé à un relevé récent.", "Notez le cours et la date pour un budget international."] }, { type: "tip", title: "Le graphique compare, il ne garantit rien", html: "<p>La ligne en pointillés représente le plan fixe sans extras et la ligne cuivrée suit vos données. Ni l'une ni l'autre n'inclut frais, assurance, impôts, intérêts journaliers, mouvements de change ou règles particulières du prêteur.</p>" }, { type: "title", text: "Limites de ce calculateur hypothécaire", level: 3 }, { type: "paragraph", html: "<p>L'outil modélise un prêt amortissable à taux fixe avec paiements réguliers et capital supplémentaire facultatif. Il aide à explorer des scénarios et préparer des questions, mais ne mesure pas la capacité d'emprunt, ne donne pas de conseil fiscal ou juridique et ne remplace pas le relevé du prêteur.</p>" },
24
+ ];
25
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema], seo };
@@ -0,0 +1,18 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { MortgageExtraPaymentPlannerUI } from '../ui';
5
+
6
+ const slug = 'kalkulator-amortisasi-hipotek-pembayaran-ekstra';
7
+ const title = 'Kalkulator amortisasi hipotek dengan pembayaran ekstra';
8
+ const description = 'Rencanakan hipotek berbunga tetap dengan pembayaran pokok ekstra berkala atau sekali bayar, bandingkan bunga yang dihemat, dan tampilkan semua jumlah dalam satu mata uang.';
9
+ const ui: MortgageExtraPaymentPlannerUI = {
10
+ currencyLabel: 'Mata uang', currencyHelp: 'Pilih sekali. Semua jumlah dalam rencana akan memakai mata uang ini.', principalLabel: 'Pokok awal tersisa', principalHelp: 'Jumlah yang masih harus dibayar saat rencana dimulai', annualRateLabel: 'Suku bunga tahunan', annualRateHelp: 'Suku bunga nominal tetap untuk setiap periode pembayaran', termLabel: 'Sisa tenor dalam tahun', termHelp: 'Durasi rencana sebelum pembayaran ekstra', frequencyLabel: 'Frekuensi pembayaran', recurringExtraLabel: 'Pembayaran pokok ekstra berkala', recurringExtraHelp: 'Pokok tambahan yang dibayar setiap periode', oneOffExtraLabel: 'Pembayaran pokok ekstra sekali', oneOffExtraHelp: 'Satu pembayaran pokok pada periode di bawah', oneOffPeriodLabel: 'Periode pembayaran sekali', oneOffPeriodHelp: '1 berarti periode pembayaran pertama', startDateLabel: 'Tanggal pembayaran pertama', startDateHelp: 'Digunakan untuk memperkirakan tanggal lunas', extraSectionTitle: 'Rencana pembayaran ekstra', outputTitle: 'Perjalanan saldo', regularPaymentLabel: 'Pembayaran biasa sebelum ekstra', interestSavedLabel: 'Bunga yang dihemat', periodsSavedLabel: 'periode lebih cepat', payoffDateLabel: 'Perkiraan pelunasan', totalInterestLabel: 'Bunga yang dibayar dengan rencana ini', totalExtraLabel: 'Pokok ekstra yang dibayar', baselineLabel: 'Jadwal awal', planLabel: 'Dengan pembayaran ekstra Anda', balanceSceneLabel: 'Saldo hipotek awal dibandingkan dengan saldo setelah pembayaran ekstra', balanceSceneHelp: 'Garis putus-putus menunjukkan jadwal awal. Garis tembaga menunjukkan rencana Anda. Tanda hijau menunjukkan pokok ekstra.', annualScheduleTitle: 'Jadwal pembayaran tahunan', yearLabel: 'Tahun', paymentLabel: 'Total dibayar', interestLabel: 'Bunga', principalPaidLabel: 'Pokok terjadwal', extraPaidLabel: 'Pokok ekstra', endingBalanceLabel: 'Saldo akhir', formulaTitle: 'Model dan batasan', formulaText: 'Kalkulator memakai model amortisasi berbunga tetap. Setiap periode menghitung bunga dari saldo awal, menerapkan pembayaran biasa ke bunga dan pokok, lalu menerapkan pokok ekstra berkala dan sekali bayar. Suku bunga tahunan dibagi dengan jumlah periode. Pembayaran terakhir dikurangi jika saldo tersisa lebih kecil dari pembayaran yang direncanakan. Saat mata uang diganti, jumlah uang dikonversi secara internal dengan rasio perencanaan lalu skenario yang sama dihitung ulang.', riskNote: 'Ini adalah perkiraan, bukan laporan pemberi pinjaman. Pemilih mata uang memakai rasio perencanaan internal, bukan kurs pasar langsung. Model tidak mencakup bunga variabel, biaya, asuransi, pajak, bunga harian, penalti, atau aturan kontrak.', emptyMessage: 'Masukkan pokok, suku bunga, tenor, dan tanggal yang valid untuk melihat rencana.', invalidInputMessage: 'Periksa input untuk melihat rencana', currencyOptions: { AUD: 'A$ AUD · dolar Australia', BRL: 'R$ BRL · real Brasil', CAD: 'C$ CAD · dolar Kanada', CHF: 'CHF · franc Swiss', CNY: '¥ CNY · yuan Tiongkok', CZK: 'Kč CZK · koruna Ceko', DKK: 'kr DKK · krone Denmark', EUR: '€ EUR · euro', GBP: '£ GBP · pound sterling', IDR: 'Rp IDR · rupiah Indonesia', INR: '₹ INR · rupee India', JPY: '¥ JPY · yen Jepang', KRW: '₩ KRW · won Korea Selatan', MXN: 'MX$ MXN · peso Meksiko', NOK: 'kr NOK · krone Norwegia', PLN: 'zł PLN · zloty Polandia', RUB: '₽ RUB · rubel Rusia', SEK: 'kr SEK · krona Swedia', TRY: '₺ TRY · lira Turki', USD: '$ USD · dolar Amerika Serikat' }, currencySymbols: { AUD: 'A$', BRL: 'R$', CAD: 'C$', CHF: 'CHF', CNY: '¥', CZK: 'Kč', DKK: 'kr', EUR: '€', GBP: '£', IDR: 'Rp', INR: '₹', JPY: '¥', KRW: '₩', MXN: 'MX$', NOK: 'kr', PLN: 'zł', RUB: '₽', SEK: 'kr', TRY: '₺', USD: '$' }, frequencyOptions: { monthly: 'Bulanan', biweekly: 'Setiap dua minggu', weekly: 'Mingguan' },
11
+ };
12
+ const faq = [{ question: 'Bagaimana pembayaran ekstra mengubah jadwal hipotek?', answer: 'Kalkulator mempertahankan pembayaran biasa dan menerapkan pokok ekstra setelah setiap pembayaran terjadwal. Saldo dapat menjadi nol lebih cepat dan total bunga dapat turun. Pemberi pinjaman mungkin menerapkan pelunasan berbeda, jadi bandingkan hasilnya dengan kontrak.' }, { question: 'Apa yang terjadi saat mata uang diganti?', answer: 'Jumlah uang dikonversi ke mata uang baru memakai rasio perencanaan internal, lalu skenario yang sama dihitung ulang. Ini bukan kuotasi pasar langsung, jadi gunakan untuk perencanaan.' }, { question: 'Mengapa hanya ada satu pemilih mata uang?', answer: 'Mata uang yang dipilih berlaku untuk pokok, pembayaran ekstra, pembayaran biasa, bunga, saldo, dan tabel tahunan. Satu satuan bersama membuat formulir jelas dan mencegah pencampuran mata uang.' }, { question: 'Apakah kalkulator menghitung pembayaran nyata dari bank?', answer: 'Kalkulator memperkirakan jadwal berbunga tetap. Ia tidak mengetahui aturan kontrak, perhitungan hari, biaya, asuransi, pajak, perubahan suku bunga, penalti, atau perlakuan pelunasan dipercepat. Gunakan laporan dan kontrak untuk angka resmi.' }];
13
+ const howTo = [{ name: 'Atur mata uang', text: 'Pilih satu mata uang yang akan digunakan pada semua jumlah dan hasil.' }, { name: 'Jelaskan pinjaman', text: 'Masukkan pokok, suku bunga nominal tahunan, tenor tersisa, tanggal pembayaran pertama, dan frekuensi.' }, { name: 'Tambahkan pembayaran ekstra', text: 'Masukkan jumlah berkala, lalu tambahkan pembayaran sekali dan periodenya jika perlu.' }, { name: 'Baca perbandingan', text: 'Bandingkan saldo awal dengan rencana Anda, lalu lihat bunga, periode, tanggal lunas, dan tabel tahunan.' }];
14
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
15
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
16
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'IDR' }, inLanguage: 'id' };
17
+ const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: 'Rencanakan dampak pembayaran hipotek ekstra', level: 2 }, { type: 'paragraph', html: '<p>Jadwal amortisasi memisahkan setiap pembayaran menjadi bunga dan pokok. Jika Anda membayar pokok tambahan dan mempertahankan pembayaran biasa, saldo dapat lunas lebih cepat. Alat ini membandingkan jalur saldo awal dengan pembayaran ekstra berkala dan sekali bayar.</p>' }, { type: 'paragraph', html: '<p>Hasilnya adalah perkiraan untuk pinjaman berbunga tetap. Model menggunakan pokok, suku bunga nominal tahunan, jumlah periode, dan saldo yang berubah setelah setiap pembayaran. Kontrak dapat memakai perhitungan hari, pembulatan, biaya, atau aturan pembayaran ekstra yang berbeda.</p>' }, { type: 'title', text: 'Cara kerja perhitungan amortisasi', level: 3 }, { type: 'paragraph', html: '<p>Setiap periode menghitung bunga dari saldo awal. Suku bunga tahunan dibagi dengan jumlah periode per tahun. Pembayaran biasa kemudian dibagi antara bunga dan pokok, lalu pembayaran ekstra mengurangi saldo lebih jauh.</p>' }, { type: 'table', headers: ['Angka', 'Perhitungan', 'Makna'], rows: [['Suku bunga periode', 'Bunga tahunan / periode per tahun', 'Bunga yang diterapkan tiap periode'], ['Pembayaran biasa', 'Rumus pembayaran tetap', 'Pembayaran sebelum pokok ekstra'], ['Bunga periode', 'Saldo awal x suku bunga periode', 'Bunga menurut model'], ['Saldo setelah bayar', 'Saldo - pokok - ekstra', 'Jumlah yang masih terutang']] }, { type: 'title', text: 'Apa yang benar-benar berubah', level: 3 }, { type: 'paragraph', html: '<p>Pembayaran ekstra mengurangi pokok secara langsung dalam model ini, sehingga bunga berikutnya dihitung dari saldo yang lebih kecil. Perhatikan bunga yang dihemat dan periode yang dihemat: satu menunjukkan biaya pembiayaan yang berkurang, yang lain menunjukkan pelunasan lebih awal.</p>' }, { type: 'paragraph', html: '<p>Pemberi pinjaman dapat menurunkan pembayaran, mempertahankan tenor, atau meminta permohonan resmi. Periksa batas tahunan, jumlah minimum, dan kompensasi sebelum membayar.</p>' }, { type: 'title', text: 'Gunakan mata uang tanpa mencampur perhitungan', level: 3 }, { type: 'paragraph', html: '<p>Pilih satu mata uang sebelum memasukkan nilai. Pemilih berlaku untuk pokok, ekstra, pembayaran, bunga, dan saldo. Saat diganti, nilai dikonversi secara internal dan struktur skenario tetap sama.</p>' }, { type: 'list', items: ['Pilih mata uang anggaran atau laporan pinjaman.', 'Masukkan pokok dan pembayaran ekstra dalam satuan tersebut.', 'Anggap pergantian sebagai perubahan satuan perencanaan, bukan perubahan kontrak.', 'Periksa frekuensi pembayaran dan aturan pelunasan dipercepat.', 'Gunakan tabel tahunan untuk melihat dampak pembayaran sekali.'] }, { type: 'title', text: 'Contoh sederhana membaca hasil', level: 3 }, { type: 'paragraph', html: '<p>Dengan pokok 250.000 EUR, bunga tetap 3,5%, dan tenor 25 tahun, tambahan 150 EUR tiap periode serta 5.000 EUR pada periode 12 tidak mengubah pembayaran biasa awal dalam model. Keduanya menurunkan saldo dan bunga berikutnya.</p>' }, { type: 'paragraph', html: '<p>Jika berpindah ke USD, alat ini mengonversi nilai dengan rasio internal dan menghitung ulang skenario yang sama. Ini berguna untuk anggaran internasional, bukan nilai pasar atau kurs terkini.</p>' }, { type: 'title', text: 'Periksa sebelum mengambil tindakan', level: 3 }, { type: 'list', items: ['Tanyakan apakah ekstra mengurangi tenor atau pembayaran.', 'Periksa batas, minimum, dan kompensasi.', 'Pastikan suku bunga nominal, efektif, tetap, atau variabel.', 'Bandingkan saldo dengan laporan terbaru.', 'Catat kurs dan tanggal untuk anggaran internasional.'] }, { type: 'tip', title: 'Grafik adalah perbandingan, bukan janji', html: '<p>Garis putus-putus menunjukkan jadwal awal tanpa ekstra; garis tembaga mengikuti input Anda. Keduanya tidak mencakup biaya, asuransi, pajak, bunga harian, perubahan kurs, atau aturan khusus pemberi pinjaman.</p>' }, { type: 'title', text: 'Batasan kalkulator hipotek ini', level: 3 }, { type: 'paragraph', html: '<p>Alat ini memodelkan pinjaman berbunga tetap dengan pembayaran teratur dan pokok ekstra opsional. Gunakan untuk mengeksplorasi skenario dan menyiapkan pertanyaan; alat ini bukan penilaian kemampuan bayar, nasihat pajak atau hukum, prakiraan kurs, atau pengganti laporan bank.</p>' }];
18
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema], seo };
@@ -0,0 +1,20 @@
1
+ import { bibliography } from "../bibliography";
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from "schema-dts";
3
+ import type { ToolLocaleContent } from "../../../types";
4
+ import type { MortgageExtraPaymentPlannerUI } from "../ui";
5
+
6
+ const slug = "calcolatore-ammortamento-mutuo-pagamenti-extra";
7
+ const title = "Calcolatore di ammortamento del mutuo con pagamenti extra";
8
+ const description = "Pianifica un mutuo a tasso fisso con pagamenti extra ricorrenti o una tantum, confronta gli interessi risparmiati e visualizza ogni importo in un'unica valuta.";
9
+ const ui: MortgageExtraPaymentPlannerUI = {
10
+ currencyLabel: "Valuta", currencyHelp: "Scegline una. Tutti gli importi del piano useranno questa valuta.", principalLabel: "Capitale iniziale residuo", principalHelp: "Importo ancora dovuto all'inizio del piano", annualRateLabel: "Tasso annuo", annualRateHelp: "Tasso nominale fisso applicato a ogni periodo", termLabel: "Durata residua in anni", termHelp: "Durata prevista prima dei pagamenti extra", frequencyLabel: "Frequenza dei pagamenti", recurringExtraLabel: "Pagamento extra ricorrente", recurringExtraHelp: "Capitale aggiuntivo pagato in ogni periodo", oneOffExtraLabel: "Pagamento extra una tantum", oneOffExtraHelp: "Un solo pagamento di capitale nel periodo indicato", oneOffPeriodLabel: "Periodo del pagamento una tantum", oneOffPeriodHelp: "1 indica il primo periodo", startDateLabel: "Data del primo pagamento", startDateHelp: "Serve a stimare la data di estinzione", extraSectionTitle: "Piano dei pagamenti extra", outputTitle: "Andamento del saldo", regularPaymentLabel: "Rata normale prima degli extra", interestSavedLabel: "Interessi risparmiati", periodsSavedLabel: "periodi risparmiati", payoffDateLabel: "Estinzione stimata", totalInterestLabel: "Interessi pagati con questo piano", totalExtraLabel: "Capitale extra pagato", baselineLabel: "Piano originale", planLabel: "Con i tuoi pagamenti extra", balanceSceneLabel: "Saldo originale del mutuo rispetto al saldo dopo i pagamenti extra", balanceSceneHelp: "La linea tratteggiata mostra il piano originale. La linea color rame mostra il tuo piano. I segni verdi indicano capitale extra.", annualScheduleTitle: "Piano annuale dei pagamenti", yearLabel: "Anno", paymentLabel: "Totale pagato", interestLabel: "Interessi", principalPaidLabel: "Capitale previsto", extraPaidLabel: "Capitale extra", endingBalanceLabel: "Saldo finale", formulaTitle: "Modello e limiti", formulaText: "Il calcolatore usa un modello di ammortamento a tasso fisso. Ogni periodo calcola gli interessi sul saldo iniziale, applica la rata normale a interessi e capitale, poi applica gli extra ricorrenti e una tantum. Il tasso annuo viene diviso per il numero di periodi. Se il saldo è inferiore alla rata prevista, l'ultima rata viene ridotta. Cambiando valuta, gli importi vengono convertiti con un rapporto interno di pianificazione e lo stesso scenario viene ricalcolato.", riskNote: "È una stima, non un estratto del finanziatore. Il selettore usa rapporti interni di pianificazione, non cambi di mercato in tempo reale. Non include tassi variabili, spese, assicurazioni, imposte, interessi giornalieri, penali o regole contrattuali.", emptyMessage: "Inserisci capitale, tasso, durata e data validi per vedere il piano.", invalidInputMessage: "Controlla i dati per vedere il piano", currencyOptions: { AUD: "A$ AUD · dollaro australiano", BRL: "R$ BRL · real brasiliano", CAD: "C$ CAD · dollaro canadese", CHF: "CHF · franco svizzero", CNY: "¥ CNY · yuan cinese", CZK: "Kč CZK · corona ceca", DKK: "kr DKK · corona danese", EUR: "€ EUR · euro", GBP: "£ GBP · sterlina britannica", IDR: "Rp IDR · rupia indonesiana", INR: "₹ INR · rupia indiana", JPY: "¥ JPY · yen giapponese", KRW: "₩ KRW · won sudcoreano", MXN: "MX$ MXN · peso messicano", NOK: "kr NOK · corona norvegese", PLN: "zł PLN · zloty polacco", RUB: "₽ RUB · rublo russo", SEK: "kr SEK · corona svedese", TRY: "₺ TRY · lira turca", USD: "$ USD · dollaro statunitense" }, currencySymbols: { AUD: "A$", BRL: "R$", CAD: "C$", CHF: "CHF", CNY: "¥", CZK: "Kč", DKK: "kr", EUR: "€", GBP: "£", IDR: "Rp", INR: "₹", JPY: "¥", KRW: "₩", MXN: "MX$", NOK: "kr", PLN: "zł", RUB: "₽", SEK: "kr", TRY: "₺", USD: "$" }, frequencyOptions: { monthly: "Mensile", biweekly: "Ogni due settimane", weekly: "Settimanale" },
11
+ };
12
+ const faq = [{ question: "Come cambiano il piano i pagamenti extra?", answer: "Il calcolatore mantiene la rata normale e applica il capitale extra dopo ogni pagamento previsto. Il saldo può arrivare a zero prima e gli interessi totali possono diminuire. Il finanziatore può applicare un rimborso anticipato in modo diverso: confronta il risultato con il contratto." }, { question: "Cosa succede cambiando valuta?", answer: "Gli importi vengono convertiti nella nuova valuta con un rapporto interno di pianificazione, poi lo stesso scenario viene ricalcolato. Non è un cambio in tempo reale: usa il risultato per pianificare, non come quotazione corrente." }, { question: "Perché c'è un solo selettore di valuta?", answer: "La valuta scelta vale per capitale, extra, rate, interessi, saldi e tabella annuale. Un'unica unità mantiene il modulo leggibile e impedisce di mescolare valute." }, { question: "Calcola la rata reale del mio finanziatore?", answer: "Stima un piano a tasso fisso. Non conosce convenzioni sui giorni, spese, assicurazioni, imposte, revisioni, penali o regole per il rimborso anticipato. Per il dato contrattuale usa estratto e contratto." }];
13
+ const howTo = [{ name: "Imposta la valuta", text: "Scegli la valuta unica da applicare a ogni importo e risultato." }, { name: "Descrivi il mutuo", text: "Inserisci capitale, tasso nominale annuo, durata residua, prima data e frequenza." }, { name: "Aggiungi pagamenti extra", text: "Inserisci un extra ricorrente e, se vuoi, una somma una tantum con il relativo periodo." }, { name: "Leggi il confronto", text: "Confronta il saldo originale con il tuo piano e controlla interessi, periodi, data stimata e tabella annuale." }];
14
+ const faqSchema: WithContext<FAQPage> = { "@context": "https://schema.org", "@type": "FAQPage", mainEntity: faq.map((item) => ({ "@type": "Question", name: item.question, acceptedAnswer: { "@type": "Answer", text: item.answer } })) };
15
+ const howToSchema: WithContext<HowTo> = { "@context": "https://schema.org", "@type": "HowTo", name: title, description, step: howTo.map((step, index) => ({ "@type": "HowToStep", position: index + 1, name: step.name, text: step.text })) };
16
+ const appSchema: WithContext<SoftwareApplication> = { "@context": "https://schema.org", "@type": "SoftwareApplication", name: title, description, applicationCategory: "FinanceApplication", operatingSystem: "All", offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" }, inLanguage: "it" };
17
+ const seo: ToolLocaleContent["seo"] = [
18
+ { type: "title", text: "Pianifica cosa cambiano i pagamenti extra", level: 2 }, { type: "paragraph", html: "<p>Un piano di ammortamento separa ogni rata tra interessi e capitale. Pagando capitale aggiuntivo e lasciando invariata la rata normale, il saldo può arrivare a zero prima. Questo strumento confronta il percorso originale con quello creato dai tuoi pagamenti extra ricorrenti e una tantum.</p>" }, { type: "paragraph", html: "<p>Il risultato è una stima per un mutuo a tasso fisso. Usa capitale, tasso nominale annuo, numero di periodi e un saldo che cambia dopo ogni rata. Giorni di calcolo, arrotondamenti, spese e istruzioni del contratto possono essere diversi.</p>" }, { type: "title", text: "Come funziona il calcolo di ammortamento", level: 3 }, { type: "paragraph", html: "<p>Ogni periodo calcola gli interessi sul saldo iniziale. Il tasso annuo viene diviso per i periodi dell'anno. La rata normale viene ripartita tra interessi e capitale, quindi gli extra riducono ulteriormente il saldo.</p>" }, { type: "table", headers: ["Voce", "Calcolo", "Interpretazione"], rows: [["Tasso periodico", "Tasso annuo / periodi annui", "Tasso di ogni periodo"], ["Rata normale", "Formula della rata fissa", "Pagamento prima degli extra"], ["Interessi", "Saldo iniziale x tasso periodico", "Interessi previsti dal modello"], ["Saldo dopo il pagamento", "Saldo - capitale - extra", "Importo ancora dovuto"]] }, { type: "title", text: "Cosa cambiano davvero i pagamenti extra", level: 3 }, { type: "paragraph", html: "<p>Nel modello, un pagamento extra riduce direttamente il capitale, quindi gli interessi futuri si calcolano su un saldo minore. Guarda sia gli interessi risparmiati sia i periodi risparmiati: il primo misura il costo evitato, il secondo l'anticipo dell'estinzione.</p>" }, { type: "paragraph", html: "<p>Il finanziatore può ridurre la rata, mantenere la durata o richiedere una domanda formale. Controlla limiti annuali, importi minimi e possibili indennizzi prima di pagare.</p>" }, { type: "title", text: "Usare le valute senza confondere la matematica", level: 3 }, { type: "paragraph", html: "<p>Scegli una valuta prima di inserire gli importi. Il selettore si applica a capitale, extra, rate, interessi e saldi. Cambiandola, gli importi vengono convertiti internamente e la struttura dello scenario rimane uguale.</p>" }, { type: "list", items: ["Scegli la valuta del budget o dell'estratto.", "Inserisci capitale ed extra nella valuta selezionata.", "Considera il cambio come una nuova unità di pianificazione, non come una modifica del contratto.", "Verifica la frequenza ammessa e le regole del rimborso anticipato.", "Controlla la tabella annuale per capire l'effetto della somma una tantum."] }, { type: "title", text: "Un esempio semplice per leggere l'uscita", level: 3 }, { type: "paragraph", html: "<p>Con 250.000 EUR, tasso fisso del 3,5% e 25 anni, un extra di 150 EUR per periodo e 5.000 EUR al periodo 12 non cambiano la rata normale iniziale del modello. Riducono però saldo e interessi futuri.</p>" }, { type: "paragraph", html: "<p>Passando a USD, lo strumento converte gli importi con il rapporto interno e ricalcola lo stesso scenario. È utile per il budget internazionale, non è una valutazione di mercato o una quotazione attuale.</p>" }, { type: "title", text: "Controlli prima di agire", level: 3 }, { type: "list", items: ["Chiedi se l'extra riduce durata o rata.", "Controlla limiti, minimi e indennizzi.", "Conferma se il tasso è nominale, effettivo, fisso o variabile.", "Confronta il saldo con un estratto recente.", "Annota cambio e data per un budget internazionale."] }, { type: "tip", title: "Il grafico confronta, non garantisce", html: "<p>La linea tratteggiata rappresenta il piano originale senza extra; quella color rame segue i dati inseriti. Nessuna include spese, assicurazioni, imposte, interessi giornalieri, movimenti valutari o regole specifiche del finanziatore.</p>" }, { type: "title", text: "Limiti del calcolatore di mutuo", level: 3 }, { type: "paragraph", html: "<p>Lo strumento modella un mutuo ammortizzabile a tasso fisso con pagamenti regolari e capitale extra opzionale. Aiuta a esplorare scenari e preparare domande, ma non valuta la solvibilità, non offre consulenza fiscale o legale e non sostituisce il prospetto del finanziatore.</p>" },
19
+ ];
20
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema], seo };
@@ -0,0 +1,18 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { MortgageExtraPaymentPlannerUI } from '../ui';
5
+
6
+ const slug = 'mortgage-amortization-extra-payment-planner';
7
+ const title = '繰り上げ返済対応の住宅ローン返済計画';
8
+ const description = '固定金利の住宅ローンに定期的または一度きりの繰り上げ返済を追加し、節約できる利息を比較して、すべての金額を1つの通貨で確認します。';
9
+ const ui: MortgageExtraPaymentPlannerUI = {
10
+ currencyLabel: '通貨', currencyHelp: '1つだけ選択します。計画内のすべての金額にこの通貨を使います。', principalLabel: '開始時の元金残高', principalHelp: '計画開始時点で残っている借入額', annualRateLabel: '年利', annualRateHelp: '各支払期間に使う名目固定金利', termLabel: '残りの期間(年)', termHelp: '繰り上げ返済を行わない場合の予定期間', frequencyLabel: '支払頻度', recurringExtraLabel: '定期的な繰り上げ返済', recurringExtraHelp: '毎回の支払期間に追加する元金', oneOffExtraLabel: '一度きりの繰り上げ返済', oneOffExtraHelp: '指定した期間に行う1回の元金返済', oneOffPeriodLabel: '一度きりの返済期間', oneOffPeriodHelp: '1は最初の支払期間を表します', startDateLabel: '初回支払日', startDateHelp: '完済予定日の推定に使います', extraSectionTitle: '繰り上げ返済プラン', outputTitle: '残高の推移', regularPaymentLabel: '繰り上げ前の通常返済額', interestSavedLabel: '節約できる利息', periodsSavedLabel: '短縮される期間', payoffDateLabel: '完済予定日', totalInterestLabel: 'このプランで支払う利息', totalExtraLabel: '追加返済する元金', baselineLabel: '元の返済計画', planLabel: '繰り上げ返済あり', balanceSceneLabel: '元の住宅ローン残高と繰り上げ返済後の残高', balanceSceneHelp: '破線は元の計画、銅色の線は入力した計画です。緑の印は追加元金のある期間を示します。', annualScheduleTitle: '年別支払予定表', yearLabel: '年', paymentLabel: '支払総額', interestLabel: '利息', principalPaidLabel: '予定元金', extraPaidLabel: '追加元金', endingBalanceLabel: '年末残高', formulaTitle: 'モデルと制限', formulaText: '固定金利の返済モデルを使います。各期間の開始残高から利息を計算し、通常返済を利息と元金に配分した後、定期および一度きりの繰り上げ返済を適用します。年利は年間の支払回数で割ります。残高が予定返済額より小さい場合、最後の返済額は減額されます。通貨を変更すると内部の計画比率で金額を換算し、同じシナリオを再計算します。', riskNote: 'これは目安であり、金融機関の明細ではありません。通貨選択ではリアルタイムの市場レートではなく内部の計画比率を使います。変動金利、手数料、保険、税金、日割り利息、違約金、契約上の繰り上げ返済規則は含みません。', emptyMessage: '有効な元金、金利、期間、日付を入力すると計画を表示できます。', invalidInputMessage: '計画を表示するには入力を確認してください', currencyOptions: { AUD: 'A$ AUD · オーストラリアドル', BRL: 'R$ BRL · ブラジルレアル', CAD: 'C$ CAD · カナダドル', CHF: 'CHF · スイスフラン', CNY: '¥ CNY · 中国人民元', CZK: 'Kč CZK · チェココルナ', DKK: 'kr DKK · デンマーククローネ', EUR: '€ EUR · ユーロ', GBP: '£ GBP · 英ポンド', IDR: 'Rp IDR · インドネシアルピア', INR: '₹ INR · インドルピー', JPY: '¥ JPY · 日本円', KRW: '₩ KRW · 韓国ウォン', MXN: 'MX$ MXN · メキシコペソ', NOK: 'kr NOK · ノルウェークローネ', PLN: 'zł PLN · ポーランドズロチ', RUB: '₽ RUB · ロシアルーブル', SEK: 'kr SEK · スウェーデンクローナ', TRY: '₺ TRY · トルコリラ', USD: '$ USD · 米ドル' }, currencySymbols: { AUD: 'A$', BRL: 'R$', CAD: 'C$', CHF: 'CHF', CNY: '¥', CZK: 'Kč', DKK: 'kr', EUR: '€', GBP: '£', IDR: 'Rp', INR: '₹', JPY: '¥', KRW: '₩', MXN: 'MX$', NOK: 'kr', PLN: 'zł', RUB: '₽', SEK: 'kr', TRY: '₺', USD: '$' }, frequencyOptions: { monthly: '毎月', biweekly: '2週間ごと', weekly: '毎週' },
11
+ };
12
+ const faq = [{ question: '繰り上げ返済で返済計画はどう変わりますか?', answer: '通常の返済額を変えず、予定返済の後に追加元金を適用します。そのため残高が早くゼロになり、利息総額が減る場合があります。金融機関の扱いは契約によって異なるため、結果を契約と照合してください。' }, { question: '通貨を変更するとどうなりますか?', answer: '内部の計画比率で金額を新しい通貨に換算し、同じシナリオを再計算します。リアルタイムの為替レートではないため、計画用の目安として使ってください。' }, { question: 'なぜ通貨セレクターは1つだけですか?', answer: '選択した通貨を元金、繰り上げ返済、通常返済、利息、残高、年別表のすべてに適用します。単一の単位にすることで入力を読みやすくし、通貨の混在を防ぎます。' }, { question: '実際の金融機関の返済額を計算できますか?', answer: '固定金利の返済計画を推定しますが、日数計算、手数料、保険、税金、金利変更、違約金、繰り上げ返済の契約条件は把握できません。契約上の金額は明細と契約書で確認してください。' }];
13
+ const howTo = [{ name: '通貨を設定', text: 'すべての金額と結果に使う1つの通貨を選びます。' }, { name: 'ローンを入力', text: '元金、年利、残りの期間、初回支払日、支払頻度を入力します。' }, { name: '繰り上げ返済を追加', text: '定期額を入力し、必要なら一度きりの金額と期間を追加します。' }, { name: '比較を読む', text: '元の残高と計画を比較し、利息、短縮期間、完済日、年別表を確認します。' }];
14
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
15
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
16
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'JPY' }, inLanguage: 'ja' };
17
+ const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: '繰り上げ返済の効果を計画する', level: 2 }, { type: 'paragraph', html: '<p>返済予定表は各回の支払いを利息と元金に分けます。追加の元金を払い、通常返済額を変えない場合、残高を早くゼロにできます。このツールは元の残高と、定期・一時的な繰り上げ返済を入れた残高を比較します。</p>' }, { type: 'paragraph', html: '<p>結果は固定金利ローンの計画用推定です。元金、名目年利、支払回数、各回の後に変わる残高を使います。契約の手数料、丸め、日数計算、繰り上げ返済の扱いは異なることがあります。</p>' }, { type: 'title', text: '返済計算の仕組み', level: 3 }, { type: 'paragraph', html: '<p>各期間の開始残高に対して利息を計算します。年利を年間の支払回数で割り、通常返済を利息と元金に分け、さらに追加元金を残高から差し引きます。</p>' }, { type: 'table', headers: ['項目', '計算', '意味'], rows: [['期間利率', '年利 / 年間支払回数', '各期間に適用する利率'], ['通常返済', '固定返済の式', '追加返済前の支払額'], ['期間利息', '開始残高 x 期間利率', 'モデルが想定する利息'], ['支払後残高', '開始残高 - 元金 - 追加分', 'まだ残っている金額']] }, { type: 'title', text: '繰り上げ返済で変わるもの', level: 3 }, { type: 'paragraph', html: '<p>このモデルでは追加支払いが元金を直接減らすため、後の利息は小さくなった残高にかかります。節約できる利息と短縮される期間の両方を見ると、費用と完済時期を分けて理解できます。</p>' }, { type: 'paragraph', html: '<p>金融機関は返済額を下げたり期間を維持したり、正式な申請を求めたりすることがあります。年ごとの上限、最低額、手数料を確認してください。</p>' }, { type: 'title', text: '通貨を混ぜずに計画する', level: 3 }, { type: 'paragraph', html: '<p>金額を入力する前に1つの通貨を選びます。元金、追加返済、通常返済、利息、残高に同じ単位を使い、変更時は内部で換算して同じシナリオを計算します。</p>' }, { type: 'list', items: ['家計や金融機関の明細に合わせた通貨を選ぶ。', '元金と追加返済を選択した通貨で入力する。', '通貨変更は計画単位の変更であり、契約変更ではないと考える。', '支払頻度と繰り上げ返済の規則を確認する。', '年別表で一時的な返済の影響を確認する。'] }, { type: 'title', text: '結果を読む簡単な例', level: 3 }, { type: 'paragraph', html: '<p>250,000 EUR、固定年利3.5%、25年の場合、各期間150 EURと12期間目の5,000 EURを追加しても、このモデルの通常返済額は変わりません。ただし残高と後の利息は減ります。</p>' }, { type: 'paragraph', html: '<p>USDに切り替えると、内部の計画比率で金額を換算し、同じシナリオを再計算します。国際的な予算には便利ですが、現在の市場価格や為替の提示ではありません。</p>' }, { type: 'title', text: '実行前に確認すること', level: 3 }, { type: 'list', items: ['追加返済で期間が短くなるか、返済額が下がるかを聞く。', '上限、最低額、手数料を確認する。', '金利が名目・実効・固定・変動のどれかを確認する。', '計算した残高を最新の明細と比べる。', '国際予算では使った為替と日付を記録する。'] }, { type: 'tip', title: 'グラフは比較であり、約束ではありません', html: '<p>破線は追加返済なしの元の計画、銅色の線は入力した計画です。手数料、保険、税金、日割り利息、為替変動、金融機関の契約規則は含まれません。</p>' }, { type: 'title', text: 'この住宅ローン計画の制限', level: 3 }, { type: 'paragraph', html: '<p>固定金利で定期返済し、任意の追加元金を払うローンをモデル化します。シナリオ検討や金融機関への質問には役立ちますが、返済能力の判定、税務・法律助言、為替予測、公式明細の代替にはなりません。</p>' }];
18
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema], seo };
@@ -0,0 +1,18 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
3
+ import type { ToolLocaleContent } from '../../../types';
4
+ import type { MortgageExtraPaymentPlannerUI } from '../ui';
5
+
6
+ const slug = 'mortgage-amortization-extra-payment-planner';
7
+ const title = '추가 상환을 포함한 주택담보대출 상환 계획';
8
+ const description = '고정금리 주택담보대출에 정기 또는 일회성 추가 상환을 적용하고, 절약되는 이자와 상환 기간을 비교하며 모든 금액을 하나의 통화로 확인하세요.';
9
+ const ui: MortgageExtraPaymentPlannerUI = {
10
+ currencyLabel: '통화', currencyHelp: '하나만 선택하세요. 계획의 모든 금액에 이 통화를 사용합니다.', principalLabel: '시작 원금', principalHelp: '계획 시작 시 아직 갚지 않은 금액', annualRateLabel: '연 이자율', annualRateHelp: '각 납부 기간에 적용하는 명목 고정금리', termLabel: '남은 기간(년)', termHelp: '추가 상환 전의 계획 기간', frequencyLabel: '납부 주기', recurringExtraLabel: '정기 추가 상환', recurringExtraHelp: '매 기간 추가로 갚는 원금', oneOffExtraLabel: '일회성 추가 상환', oneOffExtraHelp: '아래 기간에 한 번 납부하는 원금', oneOffPeriodLabel: '일회성 상환 기간', oneOffPeriodHelp: '1은 첫 번째 납부 기간입니다', startDateLabel: '첫 납부일', startDateHelp: '예상 완납일을 계산하는 데 사용합니다', extraSectionTitle: '추가 상환 계획', outputTitle: '잔액 변화', regularPaymentLabel: '추가 상환 전 정기 납부액', interestSavedLabel: '절약되는 이자', periodsSavedLabel: '단축되는 기간', payoffDateLabel: '예상 완납일', totalInterestLabel: '이 계획에서 납부하는 이자', totalExtraLabel: '추가 상환 원금', baselineLabel: '기존 일정', planLabel: '추가 상환 적용', balanceSceneLabel: '기존 대출 잔액과 추가 상환 후 잔액 비교', balanceSceneHelp: '점선은 기존 일정을, 구리색 선은 입력한 계획을 보여줍니다. 녹색 표시는 추가 원금이 납부되는 기간입니다.', annualScheduleTitle: '연간 납부 일정', yearLabel: '연도', paymentLabel: '총 납부액', interestLabel: '이자', principalPaidLabel: '예정 원금', extraPaidLabel: '추가 원금', endingBalanceLabel: '기말 잔액', formulaTitle: '모델과 한계', formulaText: '고정금리 상환 모델을 사용합니다. 각 기간의 시작 잔액에서 이자를 계산하고, 정기 납부액을 이자와 원금으로 나눈 뒤 정기 및 일회성 추가 원금을 적용합니다. 연 이자율은 연간 기간 수로 나눕니다. 남은 잔액이 계획 납부액보다 작으면 마지막 납부액을 줄입니다. 통화를 바꾸면 내부 계획 비율로 금액을 환산한 뒤 같은 시나리오를 다시 계산합니다.', riskNote: '이 결과는 금융기관 명세서가 아닌 추정치입니다. 통화 선택은 실시간 시장 환율이 아니라 내부 계획 비율을 사용합니다. 변동금리, 수수료, 보험, 세금, 일할 이자, 위약금 및 계약상 추가 상환 규칙은 포함하지 않습니다.', emptyMessage: '유효한 원금, 금리, 기간, 날짜를 입력하면 계획을 볼 수 있습니다.', invalidInputMessage: '계획을 보려면 입력값을 확인하세요', currencyOptions: { AUD: 'A$ AUD · 호주 달러', BRL: 'R$ BRL · 브라질 헤알', CAD: 'C$ CAD · 캐나다 달러', CHF: 'CHF · 스위스 프랑', CNY: '¥ CNY · 중국 위안', CZK: 'Kč CZK · 체코 코루나', DKK: 'kr DKK · 덴마크 크로네', EUR: '€ EUR · 유로', GBP: '£ GBP · 영국 파운드', IDR: 'Rp IDR · 인도네시아 루피아', INR: '₹ INR · 인도 루피', JPY: '¥ JPY · 일본 엔', KRW: '₩ KRW · 대한민국 원', MXN: 'MX$ MXN · 멕시코 페소', NOK: 'kr NOK · 노르웨이 크로네', PLN: 'zł PLN · 폴란드 즈워티', RUB: '₽ RUB · 러시아 루블', SEK: 'kr SEK · 스웨덴 크로나', TRY: '₺ TRY · 튀르키예 리라', USD: '$ USD · 미국 달러' }, currencySymbols: { AUD: 'A$', BRL: 'R$', CAD: 'C$', CHF: 'CHF', CNY: '¥', CZK: 'Kč', DKK: 'kr', EUR: '€', GBP: '£', IDR: 'Rp', INR: '₹', JPY: '¥', KRW: '₩', MXN: 'MX$', NOK: 'kr', PLN: 'zł', RUB: '₽', SEK: 'kr', TRY: '₺', USD: '$' }, frequencyOptions: { monthly: '매월', biweekly: '2주마다', weekly: '매주' },
11
+ };
12
+ const faq = [{ question: '추가 상환은 상환 일정을 어떻게 바꾸나요?', answer: '계산기는 정기 납부액을 그대로 두고 예정 납부 후 추가 원금을 적용합니다. 잔액이 더 빨리 0이 되고 총 이자가 줄어들 수 있습니다. 금융기관의 처리 방식은 계약에 따라 다르므로 계약서와 비교하세요.' }, { question: '통화를 바꾸면 어떻게 되나요?', answer: '금액을 내부 계획 비율로 새 통화에 환산한 다음 같은 시나리오를 다시 계산합니다. 실시간 환율이 아니므로 계획용 결과로 사용하세요.' }, { question: '통화 선택기가 하나뿐인 이유는 무엇인가요?', answer: '선택한 통화를 원금, 추가 상환, 정기 납부, 이자, 잔액, 연간 표 전체에 적용합니다. 하나의 단위를 사용하면 입력이 명확하고 통화가 섞이지 않습니다.' }, { question: '실제 금융기관 납부액을 계산하나요?', answer: '고정금리 상환 일정을 추정하지만 일수 계산, 비용, 보험, 세금, 금리 변경, 위약금, 조기 상환 조건은 알 수 없습니다. 공식 금액은 명세서와 계약서를 확인하세요.' }];
13
+ const howTo = [{ name: '통화 설정', text: '모든 금액과 결과에 사용할 하나의 통화를 선택합니다.' }, { name: '대출 입력', text: '원금, 명목 연이율, 남은 기간, 첫 납부일과 납부 주기를 입력합니다.' }, { name: '추가 상환 입력', text: '정기 추가 금액을 입력하고 필요하면 일회성 금액과 기간도 추가합니다.' }, { name: '비교 확인', text: '기존 잔액과 계획을 비교하고 이자, 기간, 완납일, 연간 일정을 확인합니다.' }];
14
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
15
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
16
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'KRW' }, inLanguage: 'ko' };
17
+ const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: '추가 상환이 바꾸는 것을 계획하세요', level: 2 }, { type: 'paragraph', html: '<p>상환 일정은 각 납부액을 이자와 원금으로 나눕니다. 추가 원금을 납부하고 정기 납부액을 유지하면 잔액을 더 일찍 0으로 만들 수 있습니다. 이 도구는 기존 잔액과 정기·일회성 추가 상환을 적용한 잔액을 비교합니다.</p>' }, { type: 'paragraph', html: '<p>결과는 고정금리 대출에 대한 계획용 추정치입니다. 원금, 명목 연이율, 납부 기간 수와 매 납부 후 변하는 잔액을 사용합니다. 계약의 일수 계산, 반올림, 비용 및 추가 상환 방식은 다를 수 있습니다.</p>' }, { type: 'title', text: '상환 계산 방식', level: 3 }, { type: 'paragraph', html: '<p>각 기간의 시작 잔액을 기준으로 이자를 계산합니다. 연 이자율을 연간 납부 횟수로 나누고, 정기 납부액을 이자와 원금으로 분리한 뒤 추가 원금을 잔액에서 차감합니다.</p>' }, { type: 'table', headers: ['항목', '계산', '의미'], rows: [['기간 이율', '연 이율 / 연간 기간 수', '각 기간에 적용하는 이율'], ['정기 납부액', '고정 납부 공식', '추가 원금 전 납부액'], ['기간 이자', '시작 잔액 x 기간 이율', '모델이 가정한 이자'], ['납부 후 잔액', '잔액 - 원금 - 추가분', '남은 채무']] }, { type: 'title', text: '추가 상환이 실제로 바꾸는 것', level: 3 }, { type: 'paragraph', html: '<p>이 모델에서 추가 상환은 원금을 직접 줄이므로 이후 이자는 더 작은 잔액에 적용됩니다. 절약되는 이자와 단축되는 기간을 함께 확인하면 비용 절감과 완납 시점을 나누어 이해할 수 있습니다.</p>' }, { type: 'paragraph', html: '<p>금융기관은 납부액을 낮추거나 기간을 유지하거나 공식 신청을 요구할 수 있습니다. 연간 한도, 최소 금액, 수수료를 확인하세요.</p>' }, { type: 'title', text: '통화를 섞지 않고 사용하기', level: 3 }, { type: 'paragraph', html: '<p>금액을 입력하기 전에 하나의 통화를 선택합니다. 원금, 추가 상환, 납부액, 이자, 잔액에 같은 단위를 사용하며, 통화를 바꾸면 내부에서 환산해 같은 시나리오를 계산합니다.</p>' }, { type: 'list', items: ['가계 예산이나 금융기관 명세서의 통화를 선택하세요.', '원금과 추가 상환을 선택한 통화로 입력하세요.', '통화 변경은 계획 단위 변경이지 계약 변경이 아닙니다.', '납부 주기와 조기 상환 조건을 확인하세요.', '연간 표에서 일회성 상환의 효과를 확인하세요.'] }, { type: 'title', text: '결과를 읽는 간단한 예', level: 3 }, { type: 'paragraph', html: '<p>250,000 EUR, 고정금리 3.5%, 25년의 경우 매 기간 150 EUR와 12번째 기간 5,000 EUR를 추가해도 모델의 기존 정기 납부액은 바뀌지 않습니다. 하지만 잔액과 이후 이자는 줄어듭니다.</p>' }, { type: 'paragraph', html: '<p>USD로 바꾸면 내부 계획 비율로 금액을 환산하고 같은 시나리오를 다시 계산합니다. 국제 예산에는 유용하지만 현재 시장 가치나 실시간 환율은 아닙니다.</p>' }, { type: 'title', text: '실행 전에 확인할 사항', level: 3 }, { type: 'list', items: ['추가 상환이 기간을 줄이는지 납부액을 줄이는지 물어보세요.', '한도, 최소 금액, 수수료를 확인하세요.', '금리가 명목·실효·고정·변동 중 무엇인지 확인하세요.', '계산 잔액을 최신 명세서와 비교하세요.', '국제 예산이라면 사용한 환율과 날짜를 기록하세요.'] }, { type: 'tip', title: '그래프는 비교이지 약속이 아닙니다', html: '<p>점선은 추가 상환이 없는 기존 고정 계획을, 구리색 선은 입력한 계획을 보여줍니다. 비용, 보험, 세금, 일할 이자, 환율 변동과 금융기관의 계약 규칙은 포함하지 않습니다.</p>' }, { type: 'title', text: '이 주택담보대출 계획의 한계', level: 3 }, { type: 'paragraph', html: '<p>고정금리와 정기 납부, 선택적 추가 원금이 있는 대출을 모델링합니다. 시나리오를 살펴보고 금융기관에 질문을 준비하는 데 유용하지만 상환 가능성, 세무·법률 조언, 환율 예측 또는 공식 명세서를 대신하지 않습니다.</p>' }];
18
+ export const content: ToolLocaleContent<MortgageExtraPaymentPlannerUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [appSchema, faqSchema, howToSchema], seo };