1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
|