@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.
- package/package.json +1 -1
- package/src/entries.ts +2 -1
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +1 -1
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/mortgageExtraPaymentPlanner/bibliography.astro +14 -0
- package/src/tool/mortgageExtraPaymentPlanner/bibliography.ts +12 -0
- package/src/tool/mortgageExtraPaymentPlanner/component.astro +138 -0
- package/src/tool/mortgageExtraPaymentPlanner/controller.ts +150 -0
- package/src/tool/mortgageExtraPaymentPlanner/currency-defaults.ts +25 -0
- package/src/tool/mortgageExtraPaymentPlanner/dom-views.ts +161 -0
- package/src/tool/mortgageExtraPaymentPlanner/entry.ts +31 -0
- package/src/tool/mortgageExtraPaymentPlanner/evaluator.ts +24 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/de.ts +74 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/en.ts +185 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/es.ts +49 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/fr.ts +25 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/id.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/it.ts +20 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/ja.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/ko.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/nl.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/pl.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/pt.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/ru.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/sv.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/tr.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/i18n/zh.ts +18 -0
- package/src/tool/mortgageExtraPaymentPlanner/index.ts +11 -0
- package/src/tool/mortgageExtraPaymentPlanner/logic.test.ts +67 -0
- package/src/tool/mortgageExtraPaymentPlanner/logic.ts +263 -0
- package/src/tool/mortgageExtraPaymentPlanner/mortgage-amortization-extra-payment-planner.css +551 -0
- package/src/tool/mortgageExtraPaymentPlanner/seo.astro +14 -0
- package/src/tool/mortgageExtraPaymentPlanner/storage.ts +65 -0
- package/src/tool/mortgageExtraPaymentPlanner/ui.ts +48 -0
- package/src/tools.ts +2 -1
|
@@ -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 = "hypotheek-aflossingscalculator-extra-betalingen";
|
|
7
|
+
const title = "Hypotheekaflossingscalculator met extra betalingen";
|
|
8
|
+
const description = "Plan een hypotheek met vaste rente en terugkerende of eenmalige extra aflossingen, vergelijk bespaarde rente en toon elk bedrag in één valuta.";
|
|
9
|
+
const ui: MortgageExtraPaymentPlannerUI = {
|
|
10
|
+
currencyLabel: "Valuta", currencyHelp: "Kies één keer. Elk bedrag in het plan gebruikt deze valuta.", principalLabel: "Openstaande hoofdsom", principalHelp: "Bedrag dat aan het begin van dit plan nog verschuldigd is", annualRateLabel: "Jaarlijkse rente", annualRateHelp: "Nominale vaste rente per betaalperiode", termLabel: "Resterende looptijd in jaren", termHelp: "Geplande duur vóór extra aflossingen", frequencyLabel: "Betaalfrequentie", recurringExtraLabel: "Terugkerende extra aflossing", recurringExtraHelp: "Extra hoofdsom die elke periode wordt betaald", oneOffExtraLabel: "Eenmalige extra aflossing", oneOffExtraHelp: "Een enkele aflossing in de gekozen periode", oneOffPeriodLabel: "Periode van eenmalige betaling", oneOffPeriodHelp: "1 betekent de eerste betaalperiode", startDateLabel: "Datum eerste betaling", startDateHelp: "Wordt gebruikt om de aflossingsdatum te schatten", extraSectionTitle: "Plan voor extra aflossingen", outputTitle: "Verloop van het saldo", regularPaymentLabel: "Normale betaling vóór extra's", interestSavedLabel: "Bespaarde rente", periodsSavedLabel: "perioden bespaard", payoffDateLabel: "Geschatte aflossing", totalInterestLabel: "Betaalde rente met dit plan", totalExtraLabel: "Extra afgeloste hoofdsom", baselineLabel: "Oorspronkelijk schema", planLabel: "Met jouw extra betalingen", balanceSceneLabel: "Oorspronkelijk hypotheeksaldo tegenover het saldo na extra aflossingen", balanceSceneHelp: "De stippellijn is het oorspronkelijke schema. De koperkleurige lijn is jouw plan. Groene markeringen tonen extra hoofdsom.", annualScheduleTitle: "Jaarlijks betalingssysteem", yearLabel: "Jaar", paymentLabel: "Totaal betaald", interestLabel: "Rente", principalPaidLabel: "Geplande hoofdsom", extraPaidLabel: "Extra hoofdsom", endingBalanceLabel: "Eindsaldo", formulaTitle: "Model en grenzen", formulaText: "De calculator gebruikt een aflossingsmodel met vaste rente. Elke periode wordt rente over het beginsaldo berekend, de normale betaling wordt verdeeld over rente en hoofdsom en daarna worden terugkerende en eenmalige extra aflossingen toegepast. De jaarlijkse rente wordt gedeeld door het aantal perioden. De laatste betaling wordt kleiner wanneer het resterende saldo kleiner is dan de geplande betaling. Bij een valutawissel worden bedragen intern omgerekend met een planningsratio en wordt hetzelfde scenario opnieuw berekend.", riskNote: "Dit is een schatting, geen overzicht van de geldverstrekker. De valutakeuze gebruikt interne planningsratio's, geen actuele marktkoersen. Variabele rente, kosten, verzekering, belastingen, dagrente, boetes en contractregels zijn niet inbegrepen.", emptyMessage: "Vul een geldig bedrag, rente, looptijd en datum in om het plan te zien.", invalidInputMessage: "Controleer de invoer om het plan te zien", currencyOptions: { AUD: "A$ AUD · Australische dollar", BRL: "R$ BRL · Braziliaanse real", CAD: "C$ CAD · Canadese dollar", CHF: "CHF · Zwitserse frank", CNY: "¥ CNY · Chinese yuan", CZK: "Kč CZK · Tsjechische kroon", DKK: "kr DKK · Deense kroon", EUR: "€ EUR · euro", GBP: "£ GBP · pond sterling", IDR: "Rp IDR · Indonesische roepia", INR: "₹ INR · Indiase roepie", JPY: "¥ JPY · Japanse yen", KRW: "₩ KRW · Zuid-Koreaanse won", MXN: "MX$ MXN · Mexicaanse peso", NOK: "kr NOK · Noorse kroon", PLN: "zł PLN · Poolse zloty", RUB: "₽ RUB · Russische roebel", SEK: "kr SEK · Zweedse kroon", TRY: "₺ TRY · Turkse lira", USD: "$ USD · Amerikaanse dollar" }, 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: "Maandelijks", biweekly: "Elke twee weken", weekly: "Wekelijks" },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: "Hoe veranderen extra hypotheekbetalingen het schema?", answer: "De calculator houdt de normale betaling gelijk en past extra hoofdsom toe na elke geplande betaling. Het saldo kan eerder nul worden en de totale rente kan dalen. De geldverstrekker kan extra aflossingen anders verwerken; vergelijk de uitkomst met je contract." }, { question: "Wat gebeurt er als ik van valuta wissel?", answer: "De bedragen worden met een interne planningsratio naar de nieuwe valuta omgerekend en hetzelfde scenario wordt opnieuw berekend. Het is geen actuele marktkoers, dus gebruik het resultaat om te plannen." }, { question: "Waarom is er maar één valutakeuze?", answer: "De gekozen valuta geldt voor hoofdsom, extra aflossingen, betalingen, rente, saldi en het jaarschema. Eén gedeelde eenheid houdt het formulier duidelijk en voorkomt gemengde valuta." }, { question: "Berekent de calculator mijn echte betaling?", answer: "Hij schat een schema met vaste rente. Contractuele dagtelling, kosten, verzekering, belastingen, renteherzieningen, boetes en de behandeling van vervroegd aflossen zijn niet bekend. Gebruik je overzicht en contract voor het echte bedrag." }];
|
|
13
|
+
const howTo = [{ name: "Kies de valuta", text: "Selecteer de ene valuta die voor alle bedragen en resultaten moet gelden." }, { name: "Beschrijf de hypotheek", text: "Voer hoofdsom, nominale jaarrente, resterende looptijd, eerste betaaldatum en frequentie in." }, { name: "Voeg extra betalingen toe", text: "Voer een terugkerend bedrag in en voeg eventueel een eenmalig bedrag met periode toe." }, { name: "Lees de vergelijking", text: "Vergelijk het oorspronkelijke saldo met je plan en bekijk rente, perioden, datum en jaarschema." }];
|
|
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: "nl" };
|
|
17
|
+
const seo: ToolLocaleContent["seo"] = [{ type: "title", text: "Plan wat extra hypotheekbetalingen veranderen", level: 2 }, { type: "paragraph", html: "<p>Een aflossingsschema splitst elke betaling in rente en hoofdsom. Wanneer je extra hoofdsom betaalt en de normale betaling gelijk blijft, kan het saldo eerder nul worden. Deze calculator vergelijkt het oorspronkelijke verloop met je terugkerende en eenmalige extra betalingen.</p>" }, { type: "paragraph", html: "<p>De uitkomst is een planningsschatting voor een lening met vaste rente. Het model gebruikt hoofdsom, nominale jaarrente, betaalperioden en een saldo dat na elke betaling verandert. Contracten kunnen andere dagtelling, afronding, kosten of voorwaarden gebruiken.</p>" }, { type: "title", text: "Zo werkt de aflossingsberekening", level: 3 }, { type: "paragraph", html: "<p>Elke periode wordt rente berekend over het beginsaldo. De jaarlijkse rente wordt gedeeld door het aantal betaalperioden. Daarna wordt de normale betaling verdeeld over rente en hoofdsom; extra betalingen verlagen het saldo verder.</p>" }, { type: "table", headers: ["Gegeven", "Berekening", "Betekenis"], rows: [["Perioderente", "Jaarrente / perioden per jaar", "Rente in elke betaalperiode"], ["Normale betaling", "Vaste betalingsformule", "Betaling vóór extra hoofdsom"], ["Rente per periode", "Beginsaldo x perioderente", "Rente volgens het model"], ["Saldo na betaling", "Saldo - hoofdsom - extra", "Bedrag dat nog openstaat"]] }, { type: "title", text: "Wat extra betalingen werkelijk veranderen", level: 3 }, { type: "paragraph", html: "<p>In dit model verlaagt een extra betaling rechtstreeks de hoofdsom. Toekomstige rente wordt dan over een kleiner saldo berekend. Bekijk zowel bespaarde rente als bespaarde perioden: de eerste toont vermeden financieringskosten, de tweede de eerdere aflossingsdatum.</p>" }, { type: "paragraph", html: "<p>De geldverstrekker kan de betaling verlagen, de looptijd behouden of een formeel verzoek vragen. Controleer jaarlijkse grenzen, minimumbedragen en eventuele vergoedingen.</p>" }, { type: "title", text: "Valuta gebruiken zonder de berekening te mengen", level: 3 }, { type: "paragraph", html: "<p>Kies één valuta voordat je bedragen invoert. De keuze geldt voor hoofdsom, extra's, betalingen, rente en saldi. Bij wisselen worden de bedragen intern omgerekend en blijft de scenario-opzet gelijk.</p>" }, { type: "list", items: ["Kies de valuta van je budget of overzicht.", "Gebruik die valuta voor hoofdsom en extra betalingen.", "Zie een wissel als andere planningseenheid, niet als contractwijziging.", "Controleer de toegestane frequentie en regels voor vervroegd aflossen.", "Bekijk het jaarschema om het effect van een eenmalige betaling te zien."] }, { type: "title", text: "Een eenvoudig voorbeeld", level: 3 }, { type: "paragraph", html: "<p>Bij 250.000 EUR, 3,5% vaste rente en 25 jaar veranderen 150 EUR extra per periode en 5.000 EUR in periode 12 de oorspronkelijke normale betaling niet. Ze verlagen wel het saldo en de latere rente.</p>" }, { type: "paragraph", html: "<p>Wanneer je naar USD wisselt, rekent de tool de bedragen om met de interne ratio en berekent hetzelfde scenario opnieuw. Dat helpt bij internationale budgetten, maar is geen actuele marktwaarde.</p>" }, { type: "title", text: "Controleer dit vóór je handelt", level: 3 }, { type: "list", items: ["Vraag of extra aflossen de looptijd of betaling verlaagt.", "Controleer limieten, minimums en vergoedingen.", "Bevestig of de rente nominaal, effectief, vast of variabel is.", "Vergelijk het berekende saldo met een recent overzicht.", "Noteer koers en datum voor een internationaal budget."] }, { type: "tip", title: "De grafiek vergelijkt, maar belooft niets", html: "<p>De stippellijn toont het oorspronkelijke vaste schema zonder extra's; de koperkleurige lijn volgt je invoer. Kosten, verzekering, belastingen, dagrente, valutabewegingen en contractregels ontbreken.</p>" }, { type: "title", text: "Grenzen van deze hypotheekcalculator", level: 3 }, { type: "paragraph", html: "<p>De tool modelleert een volledig aflossende lening met vaste rente, normale betalingen en optionele extra hoofdsom. Hij helpt scenario's verkennen en vragen voorbereiden, maar bepaalt geen betaalbaarheid, geeft geen fiscaal of juridisch advies en vervangt geen overzicht van de geldverstrekker.</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 = 'kalkulator-amortyzacji-hipoteki-nadplaty';
|
|
7
|
+
const title = 'Kalkulator amortyzacji kredytu hipotecznego z nadpłatami';
|
|
8
|
+
const description = 'Zaplanuj kredyt hipoteczny ze stałym oprocentowaniem i regularnymi lub jednorazowymi nadpłatami, porównaj zaoszczędzone odsetki i pokazuj kwoty w jednej walucie.';
|
|
9
|
+
const ui: MortgageExtraPaymentPlannerUI = {
|
|
10
|
+
currencyLabel: 'Waluta', currencyHelp: 'Wybierz raz. Wszystkie kwoty w planie będą używać tej waluty.', principalLabel: 'Początkowy kapitał', principalHelp: 'Kwota pozostała do spłaty na początku planu', annualRateLabel: 'Roczne oprocentowanie', annualRateHelp: 'Nominalna stała stopa dla każdego okresu płatności', termLabel: 'Pozostały okres w latach', termHelp: 'Planowany czas przed nadpłatami', frequencyLabel: 'Częstotliwość płatności', recurringExtraLabel: 'Regularna nadpłata', recurringExtraHelp: 'Dodatkowy kapitał spłacany w każdym okresie', oneOffExtraLabel: 'Jednorazowa nadpłata', oneOffExtraHelp: 'Pojedyncza spłata kapitału w podanym okresie', oneOffPeriodLabel: 'Okres jednorazowej wpłaty', oneOffPeriodHelp: '1 oznacza pierwszy okres płatności', startDateLabel: 'Data pierwszej płatności', startDateHelp: 'Służy do oszacowania daty spłaty', extraSectionTitle: 'Plan nadpłat', outputTitle: 'Przebieg salda', regularPaymentLabel: 'Rata regularna przed nadpłatami', interestSavedLabel: 'Zaoszczędzone odsetki', periodsSavedLabel: 'zaoszczędzonych okresów', payoffDateLabel: 'Szacowana spłata', totalInterestLabel: 'Odsetki zapłacone w tym planie', totalExtraLabel: 'Dodatkowo spłacony kapitał', baselineLabel: 'Pierwotny harmonogram', planLabel: 'Z Twoimi nadpłatami', balanceSceneLabel: 'Pierwotne saldo kredytu a saldo po nadpłatach', balanceSceneHelp: 'Linia przerywana pokazuje pierwotny harmonogram. Miedziana linia pokazuje Twój plan. Zielone znaczniki oznaczają dodatkowy kapitał.', annualScheduleTitle: 'Roczny harmonogram płatności', yearLabel: 'Rok', paymentLabel: 'Suma zapłacona', interestLabel: 'Odsetki', principalPaidLabel: 'Planowany kapitał', extraPaidLabel: 'Dodatkowy kapitał', endingBalanceLabel: 'Saldo końcowe', formulaTitle: 'Model i ograniczenia', formulaText: 'Kalkulator korzysta ze stałoprocentowego modelu amortyzacji. W każdym okresie oblicza odsetki od salda początkowego, rozdziela ratę na odsetki i kapitał, a następnie stosuje regularne i jednorazowe nadpłaty. Roczna stopa jest dzielona przez liczbę okresów. Ostatnia rata jest zmniejszana, gdy pozostałe saldo jest niższe od planowanej raty. Zmiana waluty wewnętrznie przelicza kwoty według współczynnika planistycznego i ponownie oblicza ten sam scenariusz.', riskNote: 'To szacunek, a nie zestawienie kredytodawcy. Selektor waluty używa wewnętrznych współczynników planistycznych, nie bieżących kursów rynkowych. Model nie obejmuje zmiennego oprocentowania, opłat, ubezpieczenia, podatków, odsetek dziennych, kar ani zasad umowy.', emptyMessage: 'Wpisz prawidłowy kapitał, stopę, okres i datę, aby zobaczyć plan.', invalidInputMessage: 'Sprawdź dane, aby zobaczyć plan', currencyOptions: { AUD: 'A$ AUD · dolar australijski', BRL: 'R$ BRL · real brazylijski', CAD: 'C$ CAD · dolar kanadyjski', CHF: 'CHF · frank szwajcarski', CNY: '¥ CNY · juan chiński', CZK: 'Kč CZK · korona czeska', DKK: 'kr DKK · korona duńska', EUR: '€ EUR · euro', GBP: '£ GBP · funt szterling', IDR: 'Rp IDR · rupia indonezyjska', INR: '₹ INR · rupia indyjska', JPY: '¥ JPY · jen japoński', KRW: '₩ KRW · won południowokoreański', MXN: 'MX$ MXN · peso meksykańskie', NOK: 'kr NOK · korona norweska', PLN: 'zł PLN · złoty polski', RUB: '₽ RUB · rubel rosyjski', SEK: 'kr SEK · korona szwedzka', TRY: '₺ TRY · lira turecka', USD: '$ USD · dolar amerykański' }, 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: 'Miesięcznie', biweekly: 'Co dwa tygodnie', weekly: 'Tygodniowo' },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: 'Jak nadpłaty zmieniają harmonogram kredytu?', answer: 'Kalkulator pozostawia zwykłą ratę bez zmian i stosuje dodatkowy kapitał po każdej planowej płatności. Saldo może spaść do zera wcześniej, a suma odsetek może się zmniejszyć. Bank może rozliczać nadpłatę inaczej, dlatego porównaj wynik z umową.' }, { question: 'Co dzieje się po zmianie waluty?', answer: 'Kwoty są wewnętrznie przeliczane na nową walutę według współczynnika planistycznego, a ten sam scenariusz jest obliczany ponownie. To nie jest bieżący kurs rynkowy, lecz pomoc do planowania.' }, { question: 'Dlaczego jest tylko jeden selektor waluty?', answer: 'Wybrana waluta dotyczy kapitału, nadpłat, rat, odsetek, sald i tabeli rocznej. Jedna wspólna jednostka ułatwia czytanie i zapobiega mieszaniu walut.' }, { question: 'Czy kalkulator podaje moją rzeczywistą ratę?', answer: 'Szacuje harmonogram przy stałym oprocentowaniu. Nie zna zasad umowy, sposobu liczenia dni, opłat, ubezpieczenia, podatków, zmian stopy, kar ani dokładnego rozliczenia wcześniejszej spłaty. Rzeczywistą kwotę sprawdź w umowie i zestawieniu.' }];
|
|
13
|
+
const howTo = [{ name: 'Ustaw walutę', text: 'Wybierz jedną walutę dla wszystkich kwot i wyników.' }, { name: 'Opisz kredyt', text: 'Wpisz kapitał, nominalną stopę roczną, pozostały okres, pierwszą datę płatności i częstotliwość.' }, { name: 'Dodaj nadpłaty', text: 'Wpisz kwotę regularną i opcjonalnie jednorazową wraz z okresem jej wykonania.' }, { name: 'Odczytaj porównanie', text: 'Porównaj pierwotne saldo z planem i sprawdź odsetki, okresy, datę spłaty oraz tabelę roczną.' }];
|
|
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: 'PLN' }, inLanguage: 'pl' };
|
|
17
|
+
const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: 'Zaplanuj wpływ nadpłat kredytu', level: 2 }, { type: 'paragraph', html: '<p>Harmonogram amortyzacji rozdziela każdą ratę na odsetki i kapitał. Gdy spłacasz dodatkowy kapitał i pozostawiasz ratę bez zmian, saldo może osiągnąć zero wcześniej. Narzędzie porównuje pierwotny przebieg z planem regularnych i jednorazowych nadpłat.</p>' }, { type: 'paragraph', html: '<p>Wynik jest szacunkiem dla kredytu ze stałą stopą. Uwzględnia kapitał, nominalne oprocentowanie roczne, liczbę okresów i saldo zmieniające się po każdej racie. Umowa może mieć inne zasady dni, zaokrągleń, opłat i nadpłat.</p>' }, { type: 'title', text: 'Jak działa obliczanie amortyzacji', level: 3 }, { type: 'paragraph', html: '<p>W każdym okresie odsetki są liczone od salda początkowego. Roczna stopa jest dzielona przez liczbę okresów w roku. Zwykła rata jest dzielona na odsetki i kapitał, a następnie nadpłaty dodatkowo zmniejszają saldo.</p>' }, { type: 'table', headers: ['Wartość', 'Obliczenie', 'Znaczenie'], rows: [['Stopa okresowa', 'Stopa roczna / okresy w roku', 'Stopa w jednym okresie'], ['Zwykła rata', 'Wzór stałej raty', 'Płatność przed nadpłatą'], ['Odsetki okresu', 'Saldo początkowe x stopa okresowa', 'Odsetki według modelu'], ['Saldo po racie', 'Saldo - kapitał - nadpłata', 'Kwota pozostała do spłaty']] }, { type: 'title', text: 'Co naprawdę zmieniają nadpłaty', level: 3 }, { type: 'paragraph', html: '<p>Nadpłata w tym modelu bezpośrednio zmniejsza kapitał, więc przyszłe odsetki są liczone od mniejszego salda. Sprawdź zarówno oszczędność odsetek, jak i liczbę zaoszczędzonych okresów: pierwsza pokazuje koszt finansowania, druga wcześniejszą spłatę.</p>' }, { type: 'paragraph', html: '<p>Bank może zamiast tego obniżyć ratę, pozostawić okres albo wymagać formalnego wniosku. Przed płatnością sprawdź limity roczne, kwoty minimalne i ewentualne rekompensaty.</p>' }, { type: 'title', text: 'Waluty bez mieszania obliczeń', level: 3 }, { type: 'paragraph', html: '<p>Wybierz walutę przed wpisaniem kwot. Dotyczy ona kapitału, nadpłat, rat, odsetek i sald. Po zmianie wartości są przeliczane wewnętrznie, a struktura scenariusza pozostaje taka sama.</p>' }, { type: 'list', items: ['Wybierz walutę budżetu lub zestawienia.', 'Wpisuj kapitał i nadpłaty w wybranej jednostce.', 'Traktuj zmianę jako zmianę jednostki planowania, nie umowy.', 'Sprawdź dozwoloną częstotliwość i zasady wcześniejszej spłaty.', 'Przejrzyj tabelę roczną, aby znaleźć wpływ jednorazowej nadpłaty.'] }, { type: 'title', text: 'Prosty przykład interpretacji wyniku', level: 3 }, { type: 'paragraph', html: '<p>Dla 250 000 EUR, stałej stopy 3,5% i 25 lat, dodatkowe 150 EUR w każdym okresie oraz 5 000 EUR w okresie 12 nie zmieniają zwykłej raty początkowej modelu. Zmniejszają jednak saldo i późniejsze odsetki.</p>' }, { type: 'paragraph', html: '<p>Po przełączeniu na USD narzędzie przelicza kwoty wewnętrznym współczynnikiem i ponownie oblicza ten sam scenariusz. To pomoc dla międzynarodowego budżetu, nie bieżąca wycena rynkowa.</p>' }, { type: 'title', text: 'Sprawdź przed podjęciem decyzji', level: 3 }, { type: 'list', items: ['Zapytaj, czy nadpłata skraca okres, czy obniża ratę.', 'Sprawdź limity, minima i rekompensaty.', 'Potwierdź, czy stopa jest nominalna, efektywna, stała czy zmienna.', 'Porównaj saldo z aktualnym zestawieniem banku.', 'Zapisz kurs i datę przy międzynarodowym budżecie.'] }, { type: 'tip', title: 'Wykres porównuje, ale niczego nie obiecuje', html: '<p>Linia przerywana przedstawia pierwotny plan bez nadpłat, a miedziana podąża za wpisanymi danymi. Żadna nie uwzględnia opłat, ubezpieczenia, podatków, odsetek dziennych, zmian walut ani zasad konkretnego banku.</p>' }, { type: 'title', text: 'Ograniczenia kalkulatora hipotecznego', level: 3 }, { type: 'paragraph', html: '<p>Narzędzie modeluje w pełni amortyzowany kredyt ze stałą stopą, regularnymi ratami i opcjonalnym dodatkowym kapitałem. Pomaga badać scenariusze i przygotować pytania, ale nie ocenia zdolności kredytowej, nie udziela porad podatkowych ani prawnych i nie zastępuje zestawienia banku.</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 = 'calculadora-amortizacao-hipoteca-pagamentos-extra';
|
|
7
|
+
const title = 'Calculadora de amortização de hipoteca com pagamentos extra';
|
|
8
|
+
const description = 'Planeie uma hipoteca de taxa fixa com pagamentos extra recorrentes ou pontuais, compare os juros poupados e veja todos os valores numa única moeda.';
|
|
9
|
+
const ui: MortgageExtraPaymentPlannerUI = {
|
|
10
|
+
currencyLabel: 'Moeda', currencyHelp: 'Escolha uma vez. Todos os valores do plano usarão esta moeda.', principalLabel: 'Capital inicial em dívida', principalHelp: 'Valor ainda em dívida no início deste plano', annualRateLabel: 'Taxa de juro anual', annualRateHelp: 'Taxa nominal fixa usada em cada período de pagamento', termLabel: 'Prazo restante em anos', termHelp: 'Duração prevista antes dos pagamentos extra', frequencyLabel: 'Frequência de pagamento', recurringExtraLabel: 'Pagamento extra recorrente', recurringExtraHelp: 'Capital adicional pago em cada período', oneOffExtraLabel: 'Pagamento extra pontual', oneOffExtraHelp: 'Um pagamento único de capital no período indicado', oneOffPeriodLabel: 'Período do pagamento pontual', oneOffPeriodHelp: '1 corresponde ao primeiro período', startDateLabel: 'Data do primeiro pagamento', startDateHelp: 'Usada para estimar a data de liquidação', extraSectionTitle: 'Plano de pagamentos extra', outputTitle: 'Evolução do saldo', regularPaymentLabel: 'Prestação normal antes dos extras', interestSavedLabel: 'Juros poupados', periodsSavedLabel: 'períodos poupados', payoffDateLabel: 'Liquidação estimada', totalInterestLabel: 'Juros pagos com este plano', totalExtraLabel: 'Capital extra pago', baselineLabel: 'Plano original', planLabel: 'Com os seus pagamentos extra', balanceSceneLabel: 'Saldo original da hipoteca comparado com o saldo após pagamentos extra', balanceSceneHelp: 'A linha tracejada mostra o plano original. A linha cobre mostra o seu plano. As marcas verdes indicam capital extra.', annualScheduleTitle: 'Plano anual de pagamentos', yearLabel: 'Ano', paymentLabel: 'Total pago', interestLabel: 'Juros', principalPaidLabel: 'Capital programado', extraPaidLabel: 'Capital extra', endingBalanceLabel: 'Saldo final', formulaTitle: 'Modelo e limites', formulaText: 'A calculadora usa um modelo de amortização a taxa fixa. Em cada período calcula juros sobre o saldo inicial, aplica a prestação normal a juros e capital e depois aplica pagamentos extra recorrentes e pontuais. A taxa anual é dividida pelo número de períodos. A última prestação é reduzida quando o saldo restante é menor do que o pagamento previsto. Ao mudar de moeda, converte internamente os valores com um rácio de planeamento e recalcula o mesmo cenário.', riskNote: 'É uma estimativa, não um extrato do credor. O seletor usa rácios internos de planeamento, não taxas de mercado em tempo real. Não inclui taxas variáveis, comissões, seguros, impostos, juros diários, penalizações nem regras contratuais.', emptyMessage: 'Introduza capital, taxa, prazo e data válidos para ver o plano.', invalidInputMessage: 'Verifique os dados para ver o plano', currencyOptions: { AUD: 'A$ AUD · dólar australiano', BRL: 'R$ BRL · real brasileiro', CAD: 'C$ CAD · dólar canadiano', CHF: 'CHF · franco suíço', CNY: '¥ CNY · yuan chinês', CZK: 'Kč CZK · coroa checa', DKK: 'kr DKK · coroa dinamarquesa', EUR: '€ EUR · euro', GBP: '£ GBP · libra esterlina', IDR: 'Rp IDR · rupia indonésia', INR: '₹ INR · rupia indiana', JPY: '¥ JPY · iene japonês', KRW: '₩ KRW · won sul-coreano', MXN: 'MX$ MXN · peso mexicano', NOK: 'kr NOK · coroa norueguesa', PLN: 'zł PLN · zloty polaco', RUB: '₽ RUB · rublo russo', SEK: 'kr SEK · coroa sueca', TRY: '₺ TRY · lira turca', USD: '$ USD · dólar americano' }, 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: 'Mensal', biweekly: 'A cada duas semanas', weekly: 'Semanal' },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: 'Como é que os pagamentos extra alteram o plano?', answer: 'A calculadora mantém a prestação normal e aplica o capital extra depois de cada pagamento previsto. O saldo pode chegar a zero mais cedo e os juros totais podem diminuir. O credor pode aplicar um pagamento antecipado de outra forma, por isso compare o resultado com o contrato.' }, { question: 'O que acontece quando mudo de moeda?', answer: 'Os valores monetários são convertidos internamente para a nova moeda com um rácio de planeamento e o mesmo cenário é recalculado. Não é uma cotação em tempo real: use-o para planear, não como taxa atual.' }, { question: 'Por que existe apenas um seletor de moeda?', answer: 'A moeda escolhida aplica-se ao capital, pagamentos extra, prestações, juros, saldos e plano anual. Uma unidade única mantém o formulário legível e evita misturas.' }, { question: 'A calculadora dá a prestação real do banco?', answer: 'Estima um plano de taxa fixa. Não conhece a convenção de dias, comissões, seguros, impostos, revisões, penalizações ou as regras do credor. Para o valor contratual, consulte o extrato e o contrato.' }];
|
|
13
|
+
const howTo = [{ name: 'Definir a moeda', text: 'Escolha a moeda única para todos os valores e resultados.' }, { name: 'Descrever o empréstimo', text: 'Indique capital, taxa nominal anual, prazo restante, primeira data de pagamento e frequência.' }, { name: 'Adicionar pagamentos extra', text: 'Indique um valor recorrente e, opcionalmente, um pagamento pontual e o seu período.' }, { name: 'Ler a comparação', text: 'Compare o saldo original com o seu plano e reveja juros, períodos, data estimada e plano anual.' }];
|
|
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: 'pt' };
|
|
17
|
+
const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: 'Planeie o efeito dos pagamentos extra', level: 2 }, { type: 'paragraph', html: '<p>Um plano de amortização separa cada prestação entre juros e capital. Ao pagar capital adicional e manter a prestação normal, o saldo pode chegar a zero mais cedo. Esta ferramenta compara o percurso original com o criado pelos seus pagamentos extra recorrentes e pontuais.</p>' }, { type: 'paragraph', html: '<p>O resultado é uma estimativa para um empréstimo de taxa fixa. Usa capital, taxa nominal anual, número de períodos e um saldo que muda após cada pagamento. Convenções de dias, arredondamentos, comissões e regras do contrato podem ser diferentes.</p>' }, { type: 'title', text: 'Como funciona o cálculo de amortização', level: 3 }, { type: 'paragraph', html: '<p>Em cada período, os juros são calculados sobre o saldo inicial. A taxa anual é dividida pelo número de períodos do ano. A prestação normal é repartida entre juros e capital e, depois, os pagamentos extra reduzem ainda mais o saldo.</p>' }, { type: 'table', headers: ['Valor', 'Cálculo', 'Interpretação'], rows: [['Taxa periódica', 'Taxa anual / períodos por ano', 'Taxa aplicada em cada período'], ['Prestação normal', 'Fórmula de prestação fixa', 'Pagamento antes do capital extra'], ['Juros do período', 'Saldo inicial x taxa periódica', 'Juros indicados pelo modelo'], ['Saldo após pagamento', 'Saldo - capital - extras', 'Valor ainda em dívida']] }, { type: 'title', text: 'O que os pagamentos extra mudam', level: 3 }, { type: 'paragraph', html: '<p>Neste modelo, o pagamento extra reduz diretamente o capital, pelo que os juros seguintes incidem sobre um saldo menor. Veja juros poupados e períodos poupados: um mede o custo evitado e o outro antecipa a data de liquidação.</p>' }, { type: 'paragraph', html: '<p>O credor pode reduzir a prestação, manter o prazo ou exigir um pedido formal. Confirme limites anuais, valores mínimos e eventuais compensações antes de pagar.</p>' }, { type: 'title', text: 'Usar moedas sem misturar a conta', level: 3 }, { type: 'paragraph', html: '<p>Escolha uma moeda antes de inserir os valores. O seletor aplica-se ao capital, extras, prestações, juros e saldos. Ao mudar, os valores são convertidos internamente e a estrutura do cenário mantém-se.</p>' }, { type: 'list', items: ['Escolha a moeda do seu orçamento ou extrato.', 'Mantenha capital e pagamentos extra na moeda escolhida.', 'Veja a mudança como uma unidade de planeamento, não como alteração do contrato.', 'Confirme a frequência permitida e as regras de amortização antecipada.', 'Consulte o plano anual para perceber o efeito do pagamento pontual.'] }, { type: 'title', text: 'Exemplo simples para interpretar o resultado', level: 3 }, { type: 'paragraph', html: '<p>Com 250.000 EUR, taxa fixa de 3,5% e 25 anos, um extra de 150 EUR por período e 5.000 EUR no período 12 não alteram a prestação normal inicial deste modelo. Reduzem o saldo e os juros seguintes.</p>' }, { type: 'paragraph', html: '<p>Ao mudar para USD, a ferramenta converte os valores com o rácio interno e recalcula o mesmo cenário. É uma ajuda para orçamentos internacionais, não uma avaliação de mercado nem uma cotação atual.</p>' }, { type: 'title', text: 'Verificações antes de agir', level: 3 }, { type: 'list', items: ['Pergunte se o extra reduz o prazo ou a prestação.', 'Confirme limites, mínimos e compensações.', 'Verifique se a taxa é nominal, efetiva, fixa ou variável.', 'Compare o saldo calculado com um extrato recente.', 'Registe a taxa e a data em qualquer orçamento internacional.'] }, { type: 'tip', title: 'O gráfico compara, não garante', html: '<p>A linha tracejada mostra o plano original sem extras e a linha cobre segue os seus dados. Nenhuma inclui comissões, seguros, impostos, juros diários, movimentos cambiais ou regras específicas do credor.</p>' }, { type: 'title', text: 'Limites desta calculadora hipotecária', level: 3 }, { type: 'paragraph', html: '<p>A ferramenta modela um empréstimo amortizável de taxa fixa com pagamentos regulares e capital extra opcional. Ajuda a explorar cenários e preparar perguntas, mas não avalia capacidade financeira, não dá aconselhamento fiscal ou jurídico e não substitui o extrato do credor.</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 = 'kalkulyator-amortizatsii-ipoteki-dopolnitelnye-platezhi';
|
|
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: 'Раз в две недели', weekly: 'Еженедельно' },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: 'Как досрочные платежи меняют график ипотеки?', answer: 'Калькулятор оставляет обычный платёж без изменений и применяет дополнительный долг после каждого планового платежа. Остаток может обнулиться раньше, а общая сумма процентов уменьшиться. Кредитор может учитывать досрочную выплату иначе, поэтому сравните результат с договором.' }, { 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: 'RUB' }, inLanguage: 'ru' };
|
|
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>Выберите одну валюту до ввода сумм. Она применяется к долгу, дополнительным платежам, обычным платежам, процентам и остаткам. При смене суммы переводятся внутри инструмента, а сценарий остаётся тем же.</p>' }, { type: 'list', items: ['Выберите валюту бюджета или выписки.', 'Вводите долг и досрочные суммы в выбранной валюте.', 'Считайте смену единицей планирования, а не изменением договора.', 'Проверьте разрешённую периодичность и правила досрочного погашения.', 'Посмотрите годовую таблицу, чтобы понять эффект разовой суммы.'] }, { type: 'title', text: 'Простой пример чтения результата', level: 3 }, { type: 'paragraph', html: '<p>При долге 250 000 EUR, фиксированной ставке 3,5% и сроке 25 лет дополнительные 150 EUR за период и 5 000 EUR в периоде 12 не меняют обычный первоначальный платёж модели. Они уменьшают остаток и будущие проценты.</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 = 'bolanekalkylator-amortering-extra-inbetalningar';
|
|
7
|
+
const title = 'Amorteringskalkylator för bolån med extra inbetalningar';
|
|
8
|
+
const description = 'Planera ett bolån med fast ränta och återkommande eller engångsvisa extra amorteringar, jämför sparad ränta och visa alla belopp i en valuta.';
|
|
9
|
+
const ui: MortgageExtraPaymentPlannerUI = {
|
|
10
|
+
currencyLabel: 'Valuta', currencyHelp: 'Välj en gång. Alla belopp i planen använder denna valuta.', principalLabel: 'Ursprunglig kvarvarande skuld', principalHelp: 'Beloppet som återstår när planen börjar', annualRateLabel: 'Årlig ränta', annualRateHelp: 'Nominell fast ränta för varje betalningsperiod', termLabel: 'Återstående löptid i år', termHelp: 'Planerad löptid före extra amorteringar', frequencyLabel: 'Betalningsintervall', recurringExtraLabel: 'Återkommande extra amortering', recurringExtraHelp: 'Extra kapital som betalas varje period', oneOffExtraLabel: 'Engångsbetalning', oneOffExtraHelp: 'En extra amortering under perioden nedan', oneOffPeriodLabel: 'Period för engångsbetalning', oneOffPeriodHelp: '1 betyder den första betalningsperioden', startDateLabel: 'Första betalningsdatum', startDateHelp: 'Används för att uppskatta slutdatumet', extraSectionTitle: 'Plan för extra amorteringar', outputTitle: 'Skuldens utveckling', regularPaymentLabel: 'Ordinarie betalning före extra', interestSavedLabel: 'Sparad ränta', periodsSavedLabel: 'sparade perioder', payoffDateLabel: 'Beräknat slutdatum', totalInterestLabel: 'Ränta som betalas med planen', totalExtraLabel: 'Extra amorterat kapital', baselineLabel: 'Ursprunglig plan', planLabel: 'Med dina extra betalningar', balanceSceneLabel: 'Ursprunglig bolåneskuld jämfört med skulden efter extra amorteringar', balanceSceneHelp: 'Den streckade linjen visar den ursprungliga planen. Den kopparfärgade linjen visar din plan. Gröna markeringar visar perioder med extra kapital.', annualScheduleTitle: 'Årlig betalningsplan', yearLabel: 'År', paymentLabel: 'Totalt betalt', interestLabel: 'Ränta', principalPaidLabel: 'Planerad amortering', extraPaidLabel: 'Extra amortering', endingBalanceLabel: 'Slutskuld', formulaTitle: 'Modell och begränsningar', formulaText: 'Kalkylatorn använder en amorteringsmodell med fast ränta. Varje period beräknas ränta på ingående skuld, den ordinarie betalningen fördelas på ränta och kapital och därefter tillämpas återkommande och engångsvisa extra amorteringar. Årsräntan delas med antalet perioder per år. Den sista betalningen minskas när den kvarvarande skulden är mindre än den planerade betalningen. Vid valutabyte omvandlas beloppen internt med en planeringskvot och samma scenario räknas om.', riskNote: 'Detta är en uppskattning, inte långivarens besked. Valväljaren använder interna planeringskvoter, inte aktuella marknadskurser. Modellen omfattar inte rörlig ränta, avgifter, försäkring, skatt, daglig ränta, straffavgifter eller avtalsregler.', emptyMessage: 'Ange en giltig skuld, ränta, löptid och datum för att se planen.', invalidInputMessage: 'Kontrollera uppgifterna för att se planen', currencyOptions: { AUD: 'A$ AUD · australisk dollar', BRL: 'R$ BRL · brasiliansk real', CAD: 'C$ CAD · kanadensisk dollar', CHF: 'CHF · schweizisk franc', CNY: '¥ CNY · kinesisk yuan', CZK: 'Kč CZK · tjeckisk koruna', DKK: 'kr DKK · dansk krona', EUR: '€ EUR · euro', GBP: '£ GBP · brittiskt pund', IDR: 'Rp IDR · indonesisk rupiah', INR: '₹ INR · indisk rupie', JPY: '¥ JPY · japansk yen', KRW: '₩ KRW · sydkoreansk won', MXN: 'MX$ MXN · mexikansk peso', NOK: 'kr NOK · norsk krona', PLN: 'zł PLN · polsk zloty', RUB: '₽ RUB · rysk rubel', SEK: 'kr SEK · svensk krona', TRY: '₺ TRY · turkisk lira', USD: '$ USD · amerikansk dollar' }, 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: 'Månadsvis', biweekly: 'Varannan vecka', weekly: 'Veckovis' },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: 'Hur ändrar extra bolånebetalningar planen?', answer: 'Kalkylatorn behåller den ordinarie betalningen och lägger till extra kapital efter varje planerad betalning. Skulden kan nå noll tidigare och den totala räntan kan minska. Långivaren kan hantera extra amortering annorlunda, så jämför med avtalet.' }, { question: 'Vad händer när jag byter valuta?', answer: 'Beloppen omvandlas internt till den nya valutan med en planeringskvot och samma scenario beräknas igen. Det är inte en aktuell marknadskurs, utan ett planeringsunderlag.' }, { question: 'Varför finns bara en valutaväljare?', answer: 'Den valda valutan gäller kapital, extra betalningar, ordinarie betalningar, ränta, saldon och årstabellen. En gemensam enhet gör formuläret tydligt och förhindrar blandade valutor.' }, { question: 'Beräknar kalkylatorn min verkliga betalning?', answer: 'Den uppskattar en amorteringsplan med fast ränta. Den känner inte till avtalets dagberäkning, avgifter, försäkring, skatt, ränteändringar, straffavgifter eller regler för förtida återbetalning. Använd besked och avtal för det faktiska beloppet.' }];
|
|
13
|
+
const howTo = [{ name: 'Välj valuta', text: 'Välj den enda valuta som ska användas för alla belopp och resultat.' }, { name: 'Beskriv lånet', text: 'Ange skuld, nominell årsränta, återstående löptid, första betalningsdatum och intervall.' }, { name: 'Lägg till extra', text: 'Ange ett återkommande belopp och lägg vid behov till en engångsbetalning med period.' }, { name: 'Läs jämförelsen', text: 'Jämför ursprungligt saldo med planen och kontrollera ränta, perioder, datum och årsplan.' }];
|
|
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: 'SEK' }, inLanguage: 'sv' };
|
|
17
|
+
const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: 'Planera vad extra amorteringar kan förändra', level: 2 }, { type: 'paragraph', html: '<p>En amorteringsplan delar varje betalning i ränta och kapital. När du betalar extra kapital och låter den ordinarie betalningen vara oförändrad kan skulden bli noll tidigare. Verktyget jämför den ursprungliga skuldens utveckling med dina återkommande och engångsvisa extra betalningar.</p>' }, { type: 'paragraph', html: '<p>Resultatet är en uppskattning för ett lån med fast ränta. Det använder skuld, nominell årsränta, antal betalningsperioder och ett saldo som förändras efter varje betalning. Avtalet kan ha andra regler för dagar, avrundning, avgifter och extra amortering.</p>' }, { type: 'title', text: 'Så fungerar amorteringsberäkningen', level: 3 }, { type: 'paragraph', html: '<p>Varje period beräknas ränta på ingående saldo. Årsräntan delas med antalet perioder per år. Den ordinarie betalningen fördelas sedan på ränta och kapital, varefter extra betalningar minskar saldot ytterligare.</p>' }, { type: 'table', headers: ['Värde', 'Beräkning', 'Tolkning'], rows: [['Periodränta', 'Årsränta / perioder per år', 'Räntan i varje period'], ['Ordinarie betalning', 'Formel för fast betalning', 'Betalning före extra kapital'], ['Periodens ränta', 'Ingående saldo x periodränta', 'Ränta enligt modellen'], ['Saldo efter betalning', 'Saldo - kapital - extra', 'Belopp som återstår']] }, { type: 'title', text: 'Vad extra betalningar faktiskt ändrar', level: 3 }, { type: 'paragraph', html: '<p>I modellen minskar en extra betalning kapitalet direkt, så framtida ränta beräknas på ett mindre saldo. Titta på både sparad ränta och sparade perioder: den ena visar minskad finansieringskostnad och den andra ett tidigare slutdatum.</p>' }, { type: 'paragraph', html: '<p>Långivaren kan sänka betalningen, behålla löptiden eller kräva en formell begäran. Kontrollera årsgränser, minimibelopp och eventuell ersättning.</p>' }, { type: 'title', text: 'Använd valuta utan att blanda beräkningen', level: 3 }, { type: 'paragraph', html: '<p>Välj en valuta innan du anger belopp. Den gäller kapital, extra betalningar, ordinarie betalningar, ränta och saldon. Vid byte omvandlas beloppen internt och scenariots struktur är oförändrad.</p>' }, { type: 'list', items: ['Välj valutan i din budget eller ditt besked.', 'Ange skuld och extra betalningar i den valda valutan.', 'Se bytet som en planeringsenhet, inte som en avtalsändring.', 'Kontrollera tillåtet betalningsintervall och regler för förtida betalning.', 'Använd årstabellen för att se effekten av engångsbetalningen.'] }, { type: 'title', text: 'Ett enkelt exempel', level: 3 }, { type: 'paragraph', html: '<p>Med 250 000 EUR, fast ränta på 3,5% och 25 år ändrar 150 EUR extra per period samt 5 000 EUR i period 12 inte den ursprungliga ordinarie betalningen i modellen. De minskar däremot saldot och den framtida räntan.</p>' }, { type: 'paragraph', html: '<p>Om du byter till USD omvandlar verktyget beloppen med sin interna kvot och räknar om samma scenario. Det hjälper vid internationell budgetering men är inte ett aktuellt marknadsvärde.</p>' }, { type: 'title', text: 'Kontrollera före beslut', level: 3 }, { type: 'list', items: ['Fråga om extra betalning minskar löptid eller betalning.', 'Kontrollera gränser, minimum och ersättningar.', 'Bekräfta om räntan är nominell, effektiv, fast eller rörlig.', 'Jämför det beräknade saldot med ett nytt besked.', 'Skriv ned kurs och datum för en internationell budget.'] }, { type: 'tip', title: 'Diagrammet jämför, men lovar inget', html: '<p>Den streckade linjen visar den ursprungliga planen utan extra, medan den kopparfärgade följer dina uppgifter. Avgifter, försäkring, skatt, daglig ränta, valutaförändringar och långivarens avtalsregler ingår inte.</p>' }, { type: 'title', text: 'Begränsningar för denna bolånekalkylator', level: 3 }, { type: 'paragraph', html: '<p>Verktyget modellerar ett lån med fast ränta, regelbundna betalningar och valfri extra amortering. Det hjälper dig att utforska scenarier och förbereda frågor, men bedömer inte betalningsförmåga, ger inte skatte- eller juridisk rådgivning och ersätter inte långivarens besked.</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 = 'konut-kredisi-amortisman-ekstra-odemeler-hesaplama';
|
|
7
|
+
const title = 'Ek ödemeli konut kredisi amortisman hesaplayıcısı';
|
|
8
|
+
const description = 'Sabit faizli konut kredisini düzenli veya tek seferlik ekstra ödemelerle planlayın, tasarruf edilen faizi karşılaştırın ve tüm tutarları tek bir para biriminde görün.';
|
|
9
|
+
const ui: MortgageExtraPaymentPlannerUI = {
|
|
10
|
+
currencyLabel: 'Para birimi', currencyHelp: 'Bir kez seçin. Plandaki tüm tutarlar bu para birimini kullanır.', principalLabel: 'Başlangıç anapara bakiyesi', principalHelp: 'Planın başında hâlâ ödenmesi gereken tutar', annualRateLabel: 'Yıllık faiz oranı', annualRateHelp: 'Her ödeme döneminde kullanılan nominal sabit oran', termLabel: 'Kalan vade (yıl)', termHelp: 'Ek ödemelerden önceki planlanan süre', frequencyLabel: 'Ödeme sıklığı', recurringExtraLabel: 'Düzenli ekstra ödeme', recurringExtraHelp: 'Her dönemde ödenen ek anapara', oneOffExtraLabel: 'Tek seferlik ekstra ödeme', oneOffExtraHelp: 'Aşağıdaki dönemde yapılan tek anapara ödemesi', oneOffPeriodLabel: 'Tek seferlik ödeme dönemi', oneOffPeriodHelp: '1, ilk ödeme dönemini belirtir', startDateLabel: 'İlk ödeme tarihi', startDateHelp: 'Tahmini kapanış tarihini hesaplamak için kullanılır', extraSectionTitle: 'Ek ödeme planı', outputTitle: 'Bakiye değişimi', regularPaymentLabel: 'Ek ödemelerden önceki normal ödeme', interestSavedLabel: 'Tasarruf edilen faiz', periodsSavedLabel: 'kısalan dönem', payoffDateLabel: 'Tahmini kapanış', totalInterestLabel: 'Bu planla ödenen faiz', totalExtraLabel: 'Ek ödenen anapara', baselineLabel: 'İlk ödeme planı', planLabel: 'Ek ödemelerinizle', balanceSceneLabel: 'İlk konut kredisi bakiyesi ile ek ödemeler sonrası bakiyenin karşılaştırması', balanceSceneHelp: 'Kesikli çizgi ilk planı, bakır çizgi sizin planınızı gösterir. Yeşil işaretler ek anapara ödenen dönemleri belirtir.', annualScheduleTitle: 'Yıllık ödeme planı', yearLabel: 'Yıl', paymentLabel: 'Toplam ödeme', interestLabel: 'Faiz', principalPaidLabel: 'Planlanan anapara', extraPaidLabel: 'Ek anapara', endingBalanceLabel: 'Dönem sonu bakiyesi', formulaTitle: 'Model ve sınırlar', formulaText: 'Hesaplayıcı sabit faizli bir amortisman modeli kullanır. Her dönem açılış bakiyesi üzerinden faizi hesaplar, normal ödemeyi faiz ve anaparaya ayırır, ardından düzenli ve tek seferlik ek anaparayı uygular. Yıllık oran dönem sayısına bölünür. Kalan bakiye planlanan ödemeden küçükse son ödeme azaltılır. Para birimi değiştiğinde tutarlar dahili planlama oranıyla çevrilir ve aynı senaryo yeniden hesaplanır.', riskNote: 'Bu bir tahmindir, kredi verenin ekstresi değildir. Para birimi seçici canlı piyasa kurları yerine dahili planlama oranları kullanır. Değişken faiz, ücretler, sigorta, vergiler, günlük faiz, cezalar ve sözleşme kuralları dahil değildir.', emptyMessage: 'Planı görmek için geçerli anapara, oran, vade ve tarih girin.', invalidInputMessage: 'Planı görmek için girişleri kontrol edin', currencyOptions: { AUD: 'A$ AUD · Avustralya doları', BRL: 'R$ BRL · Brezilya reali', CAD: 'C$ CAD · Kanada doları', CHF: 'CHF · İsviçre frangı', CNY: '¥ CNY · Çin yuanı', CZK: 'Kč CZK · Çek korunası', DKK: 'kr DKK · Danimarka kronu', EUR: '€ EUR · euro', GBP: '£ GBP · İngiliz sterlini', IDR: 'Rp IDR · Endonezya rupisi', INR: '₹ INR · Hindistan rupisi', JPY: '¥ JPY · Japon yeni', KRW: '₩ KRW · Güney Kore wonu', MXN: 'MX$ MXN · Meksika pesosu', NOK: 'kr NOK · Norveç kronu', PLN: 'zł PLN · Polonya zlotisi', RUB: '₽ RUB · Rus rublesi', SEK: 'kr SEK · İsveç kronu', TRY: '₺ TRY · Türk lirası', USD: '$ USD · ABD doları' }, 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: 'Aylık', biweekly: 'İki haftada bir', weekly: 'Haftalık' },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: 'Ek konut kredisi ödemeleri planı nasıl değiştirir?', answer: 'Hesaplayıcı normal ödemeyi sabit tutar ve her planlı ödemeden sonra ek anaparayı uygular. Bakiye daha erken sıfırlanabilir ve toplam faiz azalabilir. Kredi veren ek ödemeyi farklı uygulayabileceğinden sonucu sözleşmenizle karşılaştırın.' }, { question: 'Para birimini değiştirince ne olur?', answer: 'Parasal tutarlar dahili planlama oranıyla yeni para birimine çevrilir ve aynı senaryo yeniden hesaplanır. Bu canlı piyasa kuru değildir; sonucu planlama amacıyla kullanın.' }, { question: 'Neden yalnızca bir para birimi seçici var?', answer: 'Seçilen para birimi anapara, ek ödemeler, normal ödemeler, faiz, bakiyeler ve yıllık tabloya uygulanır. Tek birim kullanmak formu anlaşılır tutar ve para birimlerini karıştırmayı önler.' }, { question: 'Hesaplayıcı bankadaki gerçek ödememi hesaplar mı?', answer: 'Sabit faizli bir planı tahmin eder. Sözleşmedeki gün hesabını, ücretleri, sigortayı, vergileri, oran değişikliklerini, cezaları veya erken ödeme uygulamasını bilemez. Resmî tutar için ekstre ve sözleşmeyi kullanın.' }];
|
|
13
|
+
const howTo = [{ name: 'Para birimini ayarlayın', text: 'Tüm tutar ve sonuçlarda kullanılacak tek para birimini seçin.' }, { name: 'Krediyi tanımlayın', text: 'Anapara, nominal yıllık oran, kalan vade, ilk ödeme tarihi ve sıklığı girin.' }, { name: 'Ek ödemeleri ekleyin', text: 'Düzenli tutarı girin; isterseniz tek seferlik tutar ve dönemini ekleyin.' }, { name: 'Karşılaştırmayı okuyun', text: 'İlk bakiye ile planınızı karşılaştırın; faiz, dönem, tarih ve yıllık tabloyu inceleyin.' }];
|
|
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: 'TRY' }, inLanguage: 'tr' };
|
|
17
|
+
const seo: ToolLocaleContent['seo'] = [{ type: 'title', text: 'Ek ödemelerin değiştirebileceği şeyleri planlayın', level: 2 }, { type: 'paragraph', html: '<p>Amortisman planı her ödemeyi faiz ve anaparaya ayırır. Ek anapara ödeyip normal ödemeyi koruduğunuzda bakiye daha erken sıfırlanabilir. Bu araç ilk bakiye yolunu düzenli ve tek seferlik ek ödemelerinizle oluşan yol ile karşılaştırır.</p>' }, { type: 'paragraph', html: '<p>Sonuç sabit faizli bir kredi için planlama tahminidir. Anapara, nominal yıllık faiz, ödeme dönemleri ve her ödeme sonrası değişen bakiyeyi kullanır. Sözleşmenizde gün hesabı, yuvarlama, ücret ve erken ödeme kuralları farklı olabilir.</p>' }, { type: 'title', text: 'Amortisman hesabı nasıl çalışır?', level: 3 }, { type: 'paragraph', html: '<p>Her dönemde faiz başlangıç bakiyesi üzerinden hesaplanır. Yıllık oran yıl içindeki dönem sayısına bölünür. Normal ödeme faiz ve anaparaya ayrılır, ardından ek ödemeler bakiyeyi daha da azaltır.</p>' }, { type: 'table', headers: ['Değer', 'Hesaplama', 'Yorum'], rows: [['Dönem oranı', 'Yıllık oran / yıllık dönem sayısı', 'Her dönemde uygulanan oran'], ['Normal ödeme', 'Sabit ödeme formülü', 'Ek anapara öncesi ödeme'], ['Dönem faizi', 'Başlangıç bakiyesi x dönem oranı', 'Modelin öngördüğü faiz'], ['Ödeme sonrası bakiye', 'Bakiye - anapara - ek', 'Kalan borç']] }, { type: 'title', text: 'Ek ödemeler gerçekte neyi değiştirir?', level: 3 }, { type: 'paragraph', html: '<p>Bu modelde ek ödeme doğrudan anaparayı azaltır; sonraki faiz daha küçük bakiye üzerinden hesaplanır. Hem tasarruf edilen faize hem kısalan döneme bakın: biri finansman maliyetini, diğeri daha erken kapanışı gösterir.</p>' }, { type: 'paragraph', html: '<p>Kredi veren ödemeyi azaltabilir, vadeyi koruyabilir veya resmî başvuru isteyebilir. Ödeme öncesi yıllık limitleri, minimum tutarı ve olası tazminatı kontrol edin.</p>' }, { type: 'title', text: 'Hesabı karıştırmadan para birimi kullanın', level: 3 }, { type: 'paragraph', html: '<p>Tutarları girmeden önce tek bir para birimi seçin. Anapara, ek ödemeler, taksitler, faiz ve bakiyeler aynı birimi kullanır. Değiştirdiğinizde tutarlar dahili olarak çevrilir ve senaryo yapısı korunur.</p>' }, { type: 'list', items: ['Bütçenizin veya kredi ekstrenizin para birimini seçin.', 'Anaparayı ve tüm ek ödemeleri seçilen birimde girin.', 'Değişimi sözleşme değişikliği değil, planlama birimi değişimi olarak görün.', 'İzin verilen ödeme sıklığını ve erken ödeme kurallarını kontrol edin.', 'Tek seferlik ödemenin etkisini görmek için yıllık tabloya bakın.'] }, { type: 'title', text: 'Sonucu okumak için basit örnek', level: 3 }, { type: 'paragraph', html: '<p>250.000 EUR, %3,5 sabit faiz ve 25 yıl için her dönemde 150 EUR ve 12. dönemde 5.000 EUR eklemek, bu modelde ilk normal ödemeyi değiştirmez. Ancak bakiye ve sonraki faiz azalır.</p>' }, { type: 'paragraph', html: "<p>USD'ye geçtiğinizde araç tutarları dahili oranla çevirir ve aynı senaryoyu yeniden hesaplar. Uluslararası bütçe için yararlıdır, ancak güncel piyasa değeri değildir.</p>" }, { type: 'title', text: 'Karar vermeden önce kontrol edin', level: 3 }, { type: 'list', items: ['Ek ödemenin vadeyi mi taksiti mi azalttığını sorun.', 'Limitleri, minimumları ve tazminatları kontrol edin.', 'Oranın nominal, efektif, sabit veya değişken olduğunu doğrulayın.', 'Hesaplanan bakiyeyi güncel ekstreyle karşılaştırın.', 'Uluslararası bütçede kuru ve tarihi not edin.'] }, { type: 'tip', title: 'Grafik karşılaştırır, garanti vermez', html: '<p>Kesikli çizgi ek ödeme olmayan ilk sabit planı, bakır çizgi girdiğiniz planı gösterir. Ücretler, sigorta, vergiler, günlük faiz, kur hareketleri ve kredi verenin sözleşme kuralları dahil değildir.</p>' }, { type: 'title', text: 'Bu konut kredisi hesaplayıcısının sınırları', level: 3 }, { type: 'paragraph', html: '<p>Araç sabit faizli, düzenli ödemeli ve isteğe bağlı ek anaparalı bir krediyi modeller. Senaryo incelemeye ve soru hazırlamaya yardımcı olur; ödeme gücünü değerlendirmez, vergi veya hukuk danışmanlığı vermez ve banka ekstresinin yerini tutmaz.</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: '每两周', weekly: '每周' },
|
|
11
|
+
};
|
|
12
|
+
const faq = [{ question: '额外还款会如何改变房贷计划?', answer: '计算器保持常规还款不变,并在每次计划还款后应用额外本金。余额可能更早归零,总利息也可能减少。贷款机构的处理方式可能不同,请将结果与合同核对。' }, { 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: 'CNY' }, inLanguage: 'zh' };
|
|
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>输入金额前先选择一种货币。本金、额外还款、常规还款、利息和余额都使用同一单位。切换货币时金额在内部换算,场景结构保持不变。</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,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { mortgageExtraPaymentPlanner } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const MORTGAGE_EXTRA_PAYMENT_PLANNER_TOOL: ToolDefinition = {
|
|
7
|
+
entry: mortgageExtraPaymentPlanner,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { calculateMortgage, convertCurrencyAmount, getDefaultCurrency, type MortgageInputs } from './logic';
|
|
3
|
+
|
|
4
|
+
const baseInputs: MortgageInputs = {
|
|
5
|
+
principal: 100000,
|
|
6
|
+
annualRate: 6,
|
|
7
|
+
termYears: 10,
|
|
8
|
+
frequency: 'monthly',
|
|
9
|
+
recurringExtra: 0,
|
|
10
|
+
oneOffExtra: 0,
|
|
11
|
+
oneOffPeriod: 12,
|
|
12
|
+
startDate: '2026-09-01',
|
|
13
|
+
currency: 'EUR',
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
describe('calculateMortgage', () => {
|
|
17
|
+
it('calculates a fixed monthly payment and a complete baseline schedule', () => {
|
|
18
|
+
const result = calculateMortgage(baseInputs);
|
|
19
|
+
expect(result).not.toBeNull();
|
|
20
|
+
expect(result?.regularPayment).toBeCloseTo(1110.21, 2);
|
|
21
|
+
expect(result?.schedule).toHaveLength(120);
|
|
22
|
+
expect(result?.schedule.at(-1)?.balance).toBe(0);
|
|
23
|
+
expect(result?.totalExtra).toBe(0);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('supports a zero interest loan without dividing by zero', () => {
|
|
27
|
+
const result = calculateMortgage({ ...baseInputs, annualRate: 0, termYears: 1 });
|
|
28
|
+
expect(result?.regularPayment).toBeCloseTo(8333.33, 2);
|
|
29
|
+
expect(result?.totalInterest).toBe(0);
|
|
30
|
+
expect(result?.periods).toBe(12);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('reduces interest and duration when extras are paid', () => {
|
|
34
|
+
const result = calculateMortgage({ ...baseInputs, recurringExtra: 300, oneOffExtra: 5000, oneOffPeriod: 12 });
|
|
35
|
+
expect(result?.interestSaved).toBeGreaterThan(0);
|
|
36
|
+
expect(result?.periodsSaved).toBeGreaterThan(0);
|
|
37
|
+
expect(result?.totalExtra).toBeGreaterThan(5000);
|
|
38
|
+
expect(result?.schedule.at(-1)?.balance).toBe(0);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('uses the requested frequency for period counts and dates', () => {
|
|
42
|
+
const result = calculateMortgage({ ...baseInputs, frequency: 'biweekly', termYears: 1 });
|
|
43
|
+
expect(result?.periods).toBe(26);
|
|
44
|
+
expect(result?.schedule[1]?.date).toBe('2026-09-15');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('uses internal currency ratios for a global currency switch', () => {
|
|
48
|
+
expect(convertCurrencyAmount(100, 'EUR', 'EUR')).toBe(100);
|
|
49
|
+
expect(convertCurrencyAmount(100, 'EUR', 'USD')).toBe(117);
|
|
50
|
+
expect(convertCurrencyAmount(117, 'USD', 'EUR')).toBeCloseTo(100, 8);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe('currency preferences', () => {
|
|
55
|
+
it('selects a regional default from the locale', () => {
|
|
56
|
+
expect(getDefaultCurrency('es')).toBe('EUR');
|
|
57
|
+
expect(getDefaultCurrency('en')).toBe('USD');
|
|
58
|
+
expect(getDefaultCurrency('en-GB')).toBe('GBP');
|
|
59
|
+
expect(getDefaultCurrency('ja-JP')).toBe('JPY');
|
|
60
|
+
expect(getDefaultCurrency('pt')).toBe('EUR');
|
|
61
|
+
expect(getDefaultCurrency('tr')).toBe('TRY');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('falls back to EUR for an unknown locale', () => {
|
|
65
|
+
expect(getDefaultCurrency('xx')).toBe('EUR');
|
|
66
|
+
});
|
|
67
|
+
});
|