From 134651721982cc53f3020358cdb416a3132a5c90 Mon Sep 17 00:00:00 2001 From: Ormi Date: Sat, 27 Apr 2024 14:51:45 +0200 Subject: [PATCH] [+] prijem z dohody v1 --- src/lib/calculation.ts | 28 ++++++- src/lib/initialValues.ts | 10 +++ src/lib/routes.ts | 5 +- src/lib/xml/xmlConverter.ts | 8 ++ src/pages/dohoda.tsx | 147 ++++++++++++++++++++++++++++++++++ src/pages/suhrn.tsx | 6 ++ src/pages/zamestnanie.tsx | 8 -- src/types/PageUserInputs.ts | 10 +++ src/types/TaxForm.ts | 4 + src/types/TaxFormUserInput.ts | 8 ++ 10 files changed, 222 insertions(+), 12 deletions(-) create mode 100644 src/pages/dohoda.tsx diff --git a/src/lib/calculation.ts b/src/lib/calculation.ts index 5bfe2192..243bfeac 100644 --- a/src/lib/calculation.ts +++ b/src/lib/calculation.ts @@ -272,9 +272,18 @@ export function calculate(input: TaxFormUserInput): TaxForm { return this.t1r11s2 }, - /** SECTION Employment */ + /** SECTION Employment a Dohody */ r036: round(new Decimal( parseInputNumber(input?.uhrnPrijmovOdVsetkychZamestnavatelov ?? '0'), + ).plus( + new Decimal( + parseInputNumber( + input?.uhrnPrijmovZoVsetkychDohod ?? '0' + ), + ), + )), + r036a: round(new Decimal( + parseInputNumber(input?.uhrnPrijmovZoVsetkychDohod ?? '0'), )), r037: round(new Decimal( parseInputNumber(input?.uhrnPovinnehoPoistnehoNaSocialnePoistenie ?? '0'), @@ -284,6 +293,18 @@ export function calculate(input: TaxFormUserInput): TaxForm { input?.uhrnPovinnehoPoistnehoNaZdravotnePoistenie ?? '0', ), ), + ).plus( + new Decimal( + parseInputNumber( + input?.uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody ?? '0', + ), + ), + ).plus( + new Decimal( + parseInputNumber( + input?.uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody ?? '0', + ), + ), )), get vydavkyPoistPar6ods11_ods1a2() { @@ -586,7 +607,7 @@ export function calculate(input: TaxFormUserInput): TaxForm { get r119() { return round(new Decimal( parseInputNumber(input?.udajeODanovomBonuseNaDieta ?? '0'), - )) + ).plus(parseInputNumber(input?.udajeODanovomBonuseNaDietaDohody ?? '0'))) }, get r120() { return round(Decimal.max(new Decimal(this.r117).minus(this.r119), 0)) @@ -637,7 +658,7 @@ export function calculate(input: TaxFormUserInput): TaxForm { r129: new Decimal(0), r130: new Decimal(0), get r131() { - return round(new Decimal(parseInputNumber(input?.uhrnPreddavkovNaDan ?? '0'))) + return round(new Decimal(parseInputNumber(input?.uhrnPreddavkovNaDan ?? '0')).plus(parseInputNumber(input?.uhrnPreddavkovNaDanDohody ?? '0'))) }, get r132() { return new Decimal(0) @@ -726,6 +747,7 @@ export function calculate(input: TaxFormUserInput): TaxForm { }, children: input?.hasChildren ?? false, employed: input?.employed ?? false, + dohoda: input?.dohoda ?? false, get XIIoddiel_uplatnujem2percenta() { return this.canDonateTwoPercentOfTax diff --git a/src/lib/initialValues.ts b/src/lib/initialValues.ts index a20a8301..45fc6312 100644 --- a/src/lib/initialValues.ts +++ b/src/lib/initialValues.ts @@ -3,6 +3,7 @@ import { PartnerUserInput, IncomeAndExpenseUserInput, EmployedUserInput, + DohodaUserInput, ChildrenUserInput, PensionUserInput, UrokyUserInput, @@ -54,6 +55,15 @@ export const employmentUserInputInitialValues: EmployedUserInput = { uhrnPreddavkovNaDan: '', } +export const dohodaUserInputInitialValues: DohodaUserInput = { + dohoda: undefined, + uhrnPrijmovZoVsetkychDohod: '', + uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody: '', + uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody: '', + udajeODanovomBonuseNaDietaDohody: '', + uhrnPreddavkovNaDanDohody: '', +} + export const rentUserInputInitialValues: RentUserInput = { rent: undefined, vyskaPrijmovZPrenajmu: '', diff --git a/src/lib/routes.ts b/src/lib/routes.ts index 5f4c1318..bedbedfd 100644 --- a/src/lib/routes.ts +++ b/src/lib/routes.ts @@ -14,6 +14,7 @@ export type Route = | HomeRoute | '/prijmy-a-vydavky' | '/zamestnanie' + | '/dohoda' | '/partner' | '/deti' | '/dochodok' @@ -39,6 +40,7 @@ export const getOrderedRoutes = (taxForm: TaxForm): ReadonlyArray => { homeRoute, '/prijmy-a-vydavky', '/zamestnanie', + '/dohoda', '/partner', '/deti', '/dochodok', @@ -130,7 +132,8 @@ export const validateRoute = ( } else { const requirements = { '/zamestnanie': 't1r10_prijmy', - '/partner': 'employed', + '/dohoda': 'employed', + '/partner': 'dohoda', '/deti': 'r032_uplatnujem_na_partnera', '/dochodok': 'hasChildren', '/prenajom': 'platil_prispevky_na_dochodok', diff --git a/src/lib/xml/xmlConverter.ts b/src/lib/xml/xmlConverter.ts index c0a4101e..a4a2de3e 100644 --- a/src/lib/xml/xmlConverter.ts +++ b/src/lib/xml/xmlConverter.ts @@ -134,6 +134,13 @@ export function convertToJson(taxForm: TaxForm): OutputJson { form.dokument.telo.socZdravPoistenie.pr8 = decimalToString(taxForm.r039) } + if (taxForm.dohoda) { + form.dokument.telo.r36a = decimalToString(taxForm.r036a) + form.dokument.telo.r37 = decimalToString(taxForm.r037) + form.dokument.telo.r38 = decimalToString(taxForm.r038) + form.dokument.telo.socZdravPoistenie.pr8 = decimalToString(taxForm.r039) + } + form.dokument.telo.r39 = decimalToString(taxForm.r039) form.dokument.telo.r40 = decimalToString(taxForm.r040) form.dokument.telo.r41 = decimalToString(taxForm.r041) @@ -196,6 +203,7 @@ export function convertToJson(taxForm: TaxForm): OutputJson { } form.dokument.telo.r153 = taxForm.employed ? '5' : '4' + form.dokument.telo.r153 = taxForm.dohoda ? '5' : '4' const maDanovyBonus = taxForm.mozeZiadatVyplatitDanovyBonus && taxForm.ziadamVyplatitDanovyBonus diff --git a/src/pages/dohoda.tsx b/src/pages/dohoda.tsx new file mode 100644 index 00000000..65e23e6d --- /dev/null +++ b/src/pages/dohoda.tsx @@ -0,0 +1,147 @@ +import React from 'react' +import { Form } from 'formik' +import { BooleanRadio, FormWrapper, Input } from '../components/FormComponents' +import { DohodaUserInput, FormErrors } from '../types/PageUserInputs' +import { numberInputRegexp } from '../lib/utils' +import { ErrorSummary } from '../components/ErrorSummary' +import { Page } from '../components/Page' +import { employmentUserInputInitialValues } from '../lib/initialValues' +import { BackLink } from '../components/BackLink' +import { TAX_YEAR } from '../lib/calculation' + +const Dohoda: Page = ({ + setTaxFormUserInput, + taxFormUserInput, + router, + previousRoute, + nextRoute, +}) => { + return ( + <> + + + initialValues={taxFormUserInput} + validate={validate} + onSubmit={(values) => { + const userInput = values.dohoda + ? values + : { + ...employmentUserInputInitialValues, + dohoda: false, + } + setTaxFormUserInput(userInput) + router.push(nextRoute) + }} + > + {({ values, errors }) => ( +
+ errors={errors} /> + + {values.dohoda && ( + <> +

Nasledujúce hodnoty nájdete na tlačive "Potvrdenie o zdaniteľných príjmoch fyzickej osoby". Ak ste mali viac dohôd, tak tieto sumy spočítajte a uveďte výsledné.

+ + + + + + + )} + + + )} + + + ) +} + +export const validate = (values: DohodaUserInput) => { + const errors: Partial> = {} + + if (typeof values.dohoda === 'undefined') { + errors.dohoda = 'Vyznačte odpoveď' + } + + if (values.dohoda) { + if (!values.uhrnPrijmovZoVsetkychDohod) { + errors.uhrnPrijmovZoVsetkychDohod = + 'Zadajte úhrn príjmov zo všetkých dohôd' + } else if ( + !values.uhrnPrijmovZoVsetkychDohod.match(numberInputRegexp) + ) { + errors.uhrnPrijmovZoVsetkychDohod = + 'Zadajte sumu príjmov vo formáte 123,45' + } + + if (!values.uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody) { + errors.uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody = + 'Zadajte úhrn sociálneho poistného' + } else if ( + !values.uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody.match(numberInputRegexp) + ) { + errors.uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody = + 'Zadajte sumu sociálneho poistného vo formáte 123,45' + } + + if (!values.uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody) { + errors.uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody = + 'Zadajte úhrn zdravotného poistného' + } else if ( + !values.uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody.match( + numberInputRegexp, + ) + ) { + errors.uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody = + 'Zadajte sumu zdravotného poistného vo formáte 123,45' + } + + if (!values.uhrnPreddavkovNaDanDohody) { + errors.uhrnPreddavkovNaDanDohody = 'Zadajte úhrn preddavkov na daň' + } else if (!values.uhrnPreddavkovNaDanDohody.match(numberInputRegexp)) { + errors.uhrnPreddavkovNaDanDohody = + 'Zadajte sumu povinného poistného vo formáte 123,45' + } + + if (!values.udajeODanovomBonuseNaDietaDohody) { + errors.udajeODanovomBonuseNaDietaDohody = + 'Zadajte údaje o daňovom bonuse na dieťa' + } else if (!values.udajeODanovomBonuseNaDietaDohody.match(numberInputRegexp)) { + errors.udajeODanovomBonuseNaDietaDohody = + 'Zadajte sumu povinného poistného vo formáte 123,45' + } + } + + return errors +} + +export default Dohoda diff --git a/src/pages/suhrn.tsx b/src/pages/suhrn.tsx index 539e9846..ca88af76 100644 --- a/src/pages/suhrn.tsx +++ b/src/pages/suhrn.tsx @@ -128,6 +128,12 @@ const Suhrn: Page = ({ currency: true, allignRight: true, }, + { + title: 'Úhrn príjmov zo všetkých dohôd', + value: taxFormUserInput.uhrnPrijmovZoVsetkychDohod, + currency: true, + allignRight: true, + }, { title: 'Úhrn sociálneho poistného', value: diff --git a/src/pages/zamestnanie.tsx b/src/pages/zamestnanie.tsx index 3c732162..60dbaa2c 100644 --- a/src/pages/zamestnanie.tsx +++ b/src/pages/zamestnanie.tsx @@ -49,14 +49,6 @@ const Zamestnanie: Page = ({ label="Úhrn vyplatených zdaniteľných príjmov" hint={`Tento údaj nájdete v riadku 01.`} /> - {/* TODO: Pridat input - - */} +export type DohodaUserInput = Pick< + TaxFormUserInput, + | 'dohoda' + | 'uhrnPrijmovZoVsetkychDohod' + | 'uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody' + | 'uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody' + | 'udajeODanovomBonuseNaDietaDohody' + | 'uhrnPreddavkovNaDanDohody' +> + export type RentUserInput = Pick< TaxFormUserInput, | 'rent' diff --git a/src/types/TaxForm.ts b/src/types/TaxForm.ts index cb6d6046..6b5d60ee 100644 --- a/src/types/TaxForm.ts +++ b/src/types/TaxForm.ts @@ -111,6 +111,9 @@ export interface TaxForm { priloha3_r09_socialne: Decimal priloha3_r10_zdravotne: Decimal + /** SECTION Dohoda */ + r036a: Decimal + /** SECTION Prenajom */ rent?: boolean prenajom_oslobodenie: Decimal @@ -249,6 +252,7 @@ export interface TaxForm { /** Helper properties from input, that are not part of taxForm */ children: boolean employed: boolean + dohoda: boolean XIIoddiel_uplatnujem2percenta: boolean danovyBonusNaDieta: { danovyBonus: Decimal diff --git a/src/types/TaxFormUserInput.ts b/src/types/TaxFormUserInput.ts index 8d16089e..cdf337cb 100644 --- a/src/types/TaxFormUserInput.ts +++ b/src/types/TaxFormUserInput.ts @@ -92,6 +92,14 @@ export interface TaxFormUserInput { uhrnPreddavkovNaDan?: string udajeODanovomBonuseNaDieta?: string + /** SECTION Dohoda */ + dohoda?: boolean + uhrnPrijmovZoVsetkychDohod?: string + uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody?: string + uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody?: string + uhrnPreddavkovNaDanDohody?: string + udajeODanovomBonuseNaDietaDohody?: string + /** SECTION Prenajom */ rent?: boolean vyskaPrijmovZPrenajmu?: string