# -*- 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