diff options
author | Ctibor Brančík <ctibor@brancik.cz> | 2019-01-19 11:03:45 +0100 |
---|---|---|
committer | Ctibor Brančík <ctibor@brancik.cz> | 2019-01-19 11:03:45 +0100 |
commit | dacce487466eb601bed626c28736e3f5362b17c8 (patch) | |
tree | 0d05b3cc68c8d8acb33f804b0815eba16e72c39e | |
parent | a0a5fc1a7d3053d82f0d627d8460809f8e010425 (diff) | |
download | tarif-dev.tar.gz tarif-dev.tar.bz2 |
Základy pro výpočty dle exekutorského tarifu.dev
-rw-r--r-- | data/exekutor_dph.json | 9 | ||||
-rw-r--r-- | data/exekutor_tarif.json | 10 | ||||
-rw-r--r-- | dph.py | 5 | ||||
-rw-r--r-- | exekutor.py | 111 | ||||
-rw-r--r-- | test.py | 6 |
5 files changed, 141 insertions, 0 deletions
diff --git a/data/exekutor_dph.json b/data/exekutor_dph.json new file mode 100644 index 0000000..19ea4eb --- /dev/null +++ b/data/exekutor_dph.json @@ -0,0 +1,9 @@ +{ + "2003-12-31": 0.05, + "2004-04-30": 0.22, + "2009-12-31": 0.19, + "2012-12-31": 0.20, + "9999-12-31": 0.21 + + } + diff --git a/data/exekutor_tarif.json b/data/exekutor_tarif.json new file mode 100644 index 0000000..34134d4 --- /dev/null +++ b/data/exekutor_tarif.json @@ -0,0 +1,10 @@ +{ + "2001-09-21": { + "tarif": [ 20000, 3000000, 40000000, 50000000, 250000000 ], + "sazby": [ 0.15, 0.15, 0.10, 0.05, 0.01 ] + }, + "2017-04-01": { + "tarif": [ 13333.33, 3000000, 40000000, 50000000, 250000000 ], + "sazby": [ 0.15, 0.15, 0.10, 0.05, 0.01 ] + } +} @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +class Dph: + def __init__(self, duzp): + diff --git a/exekutor.py b/exekutor.py new file mode 100644 index 0000000..6992692 --- /dev/null +++ b/exekutor.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +import math +from datetime import * +#import dph +import json + +class Exekutor: + def __init__(self, napad, rozvrh, duzp, naklEx, naklOp): + self.rozvrh = float(rozvrh) + self.nhv = float(naklEx) + self.nop = float(naklOp) + self.datum = datetime.strptime(napad, "%Y-%m-%d") + self.duzp = datetime.strptime(duzp, "%Y-%m-%d") + with open("exekutor_tarif.json") as t: + self.tarif_tab = json.loads(t.read()) + with open("exekutor_dph.json") as d: + self.dph_tab = json.loads(d.read()) + +# Určí koeficient pro výpočet DPH dle sazby odpovídající zvolenému datu DUZP + + def kDph(self): + zmeny_dph = sorted(self.dph_tab) + print(zmeny_dph) + pocet_zmen = len(zmeny_dph) + for i in range(pocet_zmen): + if self.duzp >= datetime.strptime(zmeny_dph[i], "%Y-%m-%d") and self.duzp <= datetime.strptime(zmeny_dph[i+1], "%Y-%m-%d"): + sazba = self.dph_tab[zmeny_dph[i+1] + k = 1 + sazba + return k + +# Tato funkce vybere správné hodnoty tarifu pro datum zahájení řízení +# zadané při inicializaci třídy Exekutor. + + def vyberTarif(self): + zmeny_tarifu = self.tarif_tab.keys() + pocet_zmen = len(zmeny_tarifu) + zero = datetime.min + inf = datetime.max + prvni_zmena = datetime.strptime(zmeny_tarifu[0], "%Y-%m-%d")-timedelta(1) + posledni_zmena = datetime.strptime(zmeny_tarifu[pocet_zmen-1], "%Y-%m-%d") + obdobi = [ [zero, prvni_zmena] ] + for i in range(pocet_zmen-1): + stop = datetime.strptime(zmeny_tarifu[i-1], "%Y-%m-%d")-timedelta(1) + start = datetime.strptime(zmeny_tarifu[i], "%Y-%m-%d") + obdobi.append([start, stop]) + obdobi.append([posledni_zmena,inf]) + pocet_obdobi = len(obdobi) + for o in range(pocet_obdobi): + if self.datum <= obdobi[0][1]: + break + elif self.datum >= obdobi[o][0] and self.datum <= obdobi[o][1]: + tar = datetime.strftime(obdobi[o][0], "%Y-%m-%d") + tarif = self.tarif_tab[tar] + return tarif + + +# Pomocná funkce, která vypočítá maximální odměnu pro jednotlivá pásma tarifu a +# maximální rozdělovanou částku pro dané pásmo tarifu a vstupní hodnoty náhrady +# hotových výdajů a nákladů exekuce oprávněného. Dále se vypočítá pomocná konstanta +# rozdil, která se používá pro finální výpočet. Tato konstanta odečítá z +# z rozdělované částky součet odměn za předešlá pásma vynásobený rozdílem tarifní sazby. + + def tarif(self): + idx = 0 + dph = self.kDph() + max_odmena = [] + max_pasmo = [] + rozdil = [] + while idx <= len(self.vyberTarif()["tarif"]) - 1: + cur = self.vyberTarif()["tarif"][idx] + if idx == 0: + prev = 0 + soucet = 0 + p = self.vyberTarif()["tarif"][idx]+dph*(self.vyberTarif()["tarif"][idx]*self.vyberTarif()["sazby"][idx]+self.nhv)+self.nop + r = 0 + else: + prev = self.vyberTarif()["tarif"][idx-1] + soucet = max_odmena[idx-1] + p = self.vyberTarif()["tarif"][idx]+dph*(max_odmena[idx-1]+(self.vyberTarif()["tarif"][idx]-self.vyberTarif()["tarif"][idx-1])*self.vyberTarif()["sazby"][idx]+self.nhv)+self.nop + r = (max_odmena[idx-1] - self.vyberTarif()["sazby"][idx] * self.vyberTarif()["tarif"][idx-1]) * 1.05 + m = soucet + math.ceil((cur - prev) * self.vyberTarif()["sazby"][idx] / 10) * 10 + max_odmena.append(m) + max_pasmo.append(p) + rozdil.append(r) + idx += 1 + tarif = self.vyberTarif()["tarif"], self.vyberTarif()["sazby"], tuple(max_odmena[:]), tuple(max_pasmo[:]), tuple(rozdil[:]) + return tarif + + def rozdeleni(self): + suma = self.rozvrh + dph = self.kDph() + if suma <= self.tarif()[3][0]: + r_opravneny = (suma - dph * self.nhv - self.nop - self.tarif()[4][0])/(1 + dph * self.vyberTarif()["sazby"][0]) + r_odmena = r_opravneny * self.tarif()[1][0] + elif suma <= self.tarif()[3][1]: + r_opravneny = (suma - dph * self.nhv - self.nop - self.tarif()[4][1])/(1 + dph * self.vyberTarif()["sazby"][1]) + r_odmena = r_opravneny * self.tarif()[1][1] + elif suma <= self.tarif()[3][2]: + r_opravneny = (suma - dph * self.nhv - self.nop - self.tarif()[4][2])/(1 + dph * self.vyberTarif()["sazby"][2]) + r_odmena = r_opravneny * self.tarif()[1][2] + elif suma <= self.tarif()[3][3]: + r_opravneny = (suma - dph * self.nhv - self.nop - self.tarif()[4][3])/(1 + dph * self.vyberTarif()["sazby"][3]) + r_odmena = r_opravneny * self.tarif()[1][3] + elif suma <= self.tarif()[3][4]: + r_opravneny = (suma - dph * self.nhv - self.nop - self.tarif()[4][4])/(1 + dph * self.vyberTarif()["sazby"][4]) + r_odmena = r_opravneny * self.tarif()[1][4] + else: + r_opravneny = (suma - dph * self.nhv - self.nop - self.tarif()[2][4] * dph) + r_odmena = self.tarif()[2][4] + rozdel = [round(r_opravneny,2), round(r_odmena,-1), round(round(r_odmena,-1) * dph - round(r_odmena,-1),2), round(self.nhv,2), round(self.nhv * dph - self.nhv,2), round(self.nop,2)] + return rozdel @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +import exekutor + +x = exekutor.Exekutor("2018-01-19", 20600, "2005-04-30", 3500, 605) + +print(x.rozdeleni()) |