summaryrefslogtreecommitdiff
path: root/exekutor.py
blob: 699269237e294ae920264b3569d1f9f04df6b2f4 (plain)
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