Skip to content

Commit

Permalink
[+] prijem z dohody v1
Browse files Browse the repository at this point in the history
  • Loading branch information
Ormi committed Apr 27, 2024
1 parent eb923da commit 1346517
Show file tree
Hide file tree
Showing 10 changed files with 222 additions and 12 deletions.
28 changes: 25 additions & 3 deletions src/lib/calculation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
Expand All @@ -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() {
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions src/lib/initialValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
PartnerUserInput,
IncomeAndExpenseUserInput,
EmployedUserInput,
DohodaUserInput,
ChildrenUserInput,
PensionUserInput,
UrokyUserInput,
Expand Down Expand Up @@ -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: '',
Expand Down
5 changes: 4 additions & 1 deletion src/lib/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export type Route =
| HomeRoute
| '/prijmy-a-vydavky'
| '/zamestnanie'
| '/dohoda'
| '/partner'
| '/deti'
| '/dochodok'
Expand All @@ -39,6 +40,7 @@ export const getOrderedRoutes = (taxForm: TaxForm): ReadonlyArray<Route> => {
homeRoute,
'/prijmy-a-vydavky',
'/zamestnanie',
'/dohoda',
'/partner',
'/deti',
'/dochodok',
Expand Down Expand Up @@ -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',
Expand Down
8 changes: 8 additions & 0 deletions src/lib/xml/xmlConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
147 changes: 147 additions & 0 deletions src/pages/dohoda.tsx
Original file line number Diff line number Diff line change
@@ -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<DohodaUserInput> = ({
setTaxFormUserInput,
taxFormUserInput,
router,
previousRoute,
nextRoute,
}) => {
return (
<>
<BackLink href={previousRoute} />
<FormWrapper<DohodaUserInput>
initialValues={taxFormUserInput}
validate={validate}
onSubmit={(values) => {
const userInput = values.dohoda
? values
: {
...employmentUserInputInitialValues,
dohoda: false,
}
setTaxFormUserInput(userInput)
router.push(nextRoute)
}}
>
{({ values, errors }) => (
<Form className="form" noValidate>
<ErrorSummary<DohodaUserInput> errors={errors} />
<BooleanRadio
title={`Mali ste v roku ${TAX_YEAR} príjmy z dohôd v SR?`}
name="dohoda"
/>
{values.dohoda && (
<>
<h3 className="govuk-heading-m">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é.</h3>
<Input
name="uhrnPrijmovZoVsetkychDohod"
type="number"
label="Úhrn príjmov plynúcich na základe dohôd o prácach vykonávaných mimo pracovného pomeru"
hint={`Napríklad na základe Dohody o vykonaní práce. Na tlačive "Potvrdenie o zdaniteľných príjmoch fyzickej osoby zo závislej činnosti" nájdete tento údaj v riadku 01a.`}
/>
<Input
name="uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody"
type="number"
label="Úhrn sociálneho poistného"
hint={`Tento údaj nájdete v riadok 02a.`}
/>
<Input
name="uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody"
type="number"
label="Úhrn zdravotného poistného"
hint={`Tento údaj nájdete v riadok 02b.`}
/>
<Input
name="uhrnPreddavkovNaDanDohody"
type="number"
label="Úhrn preddavkov na daň"
hint={`Tento údaj nájdete v riadku 04.`}
/>
<Input
name="udajeODanovomBonuseNaDietaDohody"
type="number"
label="Údaje o daňovom bonuse na dieťa"
hint={`Tento údaj nájdete v riadku 13 v časti "Úhrnná suma priznaného a vyplateného daňového bonusu".`}
/>
</>
)}
<button data-test="next" className="govuk-button" type="submit">
Pokračovať
</button>
</Form>
)}
</FormWrapper>
</>
)
}

export const validate = (values: DohodaUserInput) => {
const errors: Partial<FormErrors<DohodaUserInput>> = {}

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
6 changes: 6 additions & 0 deletions src/pages/suhrn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,12 @@ const Suhrn: Page<TaxFormUserInput> = ({
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:
Expand Down
8 changes: 0 additions & 8 deletions src/pages/zamestnanie.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,6 @@ const Zamestnanie: Page<EmployedUserInput> = ({
label="Úhrn vyplatených zdaniteľných príjmov"
hint={`Tento údaj nájdete v riadku 01.`}
/>
{/* TODO: Pridat input
<Input
name="r038"
type="number"
label="Úhrn príjmov plynúcich na základe dohôd o prácach vykonávaných mimo pracovného pomeru"
hint={`Napríklad na základe Dohody o vykonaní práce. Na tlačive "Potvrdenie o zdaniteľných príjmoch fyzickej osoby zo závislej činnosti" nájdete tento údaj v riadku 01a. Ak ste nemali takýto príjem, vyplňte 0.`}
/>
*/}
<Input
name="uhrnPovinnehoPoistnehoNaSocialnePoistenie"
type="number"
Expand Down
10 changes: 10 additions & 0 deletions src/types/PageUserInputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@ export type EmployedUserInput = Pick<
| 'uhrnPreddavkovNaDan'
>

export type DohodaUserInput = Pick<
TaxFormUserInput,
| 'dohoda'
| 'uhrnPrijmovZoVsetkychDohod'
| 'uhrnPovinnehoPoistnehoNaSocialnePoistenieDohody'
| 'uhrnPovinnehoPoistnehoNaZdravotnePoistenieDohody'
| 'udajeODanovomBonuseNaDietaDohody'
| 'uhrnPreddavkovNaDanDohody'
>

export type RentUserInput = Pick<
TaxFormUserInput,
| 'rent'
Expand Down
4 changes: 4 additions & 0 deletions src/types/TaxForm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions src/types/TaxFormUserInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 1346517

Please sign in to comment.