def transdel(request, idx=0): LOGGER.debug( 'Transaction delete page accessed using method {}, id={}'.format(request.method, idx), request, request.POST) idx = int(idx) - 1 debt = getdebt(request) if not debt: # pragma: no cover return error(request) if idx >= len(debt.transactions): raise Http404 if request.method == 'GET': return render( request, 'hjp_transdel.xhtml', {'app': APP, 'page_title': 'Smazání transakce', 'date': debt.transactions[idx].date}) else: button = getbutton(request) if button == 'yes': del debt.transactions[idx] if not setdebt(request, debt): # pragma: no cover return error(request) return redirect('hjp:transdeleted') return redirect('hjp:mainpage')
def procform(request, idx=0): LOGGER.debug( 'Proceedings form accessed using method {}, id={}'.format( request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava řízení' if idx else 'Nové řízení' button = getbutton(request) if request.method == 'GET': form = ProcForm(initial=model_to_dict( get_object_or_404(Proceedings, pk=idx, uid=uid))) if idx else ProcForm() elif button == 'back': return redirect('szr:mainpage') else: form = ProcForm(request.POST) if form.is_valid(): cld = form.cleaned_data if not cld['senate']: cld['senate'] = 0 if idx: proc = get_object_or_404(Proceedings, pk=idx, uid=uid) cld['pk'] = idx cld['timestamp_add'] = proc.timestamp_add cld['court_id'] = cld['court'] del cld['court'] onlydesc = (idx and proc.court.id == cld['court_id'] and proc.senate == cld['senate'] and proc.register == cld['register'] and proc.number == cld['number'] and proc.year == cld['year']) if onlydesc: cld['changed'] = proc.changed cld['updated'] = proc.updated cld['hash'] = proc.hash cld['auxid'] = proc.auxid cld['notify'] = proc.notify proc = Proceedings(uid_id=uid, **cld) if not onlydesc: updateproc(proc) proc.save() LOGGER.info( 'User "{}" ({:d}) {} proceedings "{}" ({})'.format( uname, uid, 'updated' if idx else 'added', proc.desc, p2s(proc)), request) return redirect('szr:mainpage') else: # pragma: no cover LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'szr_procform.xhtml', { 'app': APP, 'form': form, 'page_title': page_title, 'err_message': err_message })
def debtorform(request, idx=0): LOGGER.debug( 'Debtor form accessed using method {}, id={}'.format(request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava dlužníka' if idx else 'Nový dlužník' button = getbutton(request) if request.method == 'GET': if idx: debtor = model_to_dict(get_object_or_404(Debtor, pk=idx, uid=uid)) for opt in OPTS: debtor[opt] = TEXT_OPTS_KEYS[debtor[opt]] if debtor['birthid']: debtor['birthid'] = '{}/{}'.format(debtor['birthid'][:6], debtor['birthid'][6:]) form = DebtorForm(initial=debtor) else: form = DebtorForm() elif button == 'back': return redirect('dir:mainpage') else: form = DebtorForm(request.POST) if form.is_valid(): cld = form.cleaned_data if idx: debtor = get_object_or_404(Debtor, pk=idx, uid=uid) cld['pk'] = idx cld['notify'] = debtor.notify cld['timestamp_add'] = debtor.timestamp_add cld['birthid'] = cld['birthid'].replace('/', '') for key in cld: if cld[key] == '': cld[key] = None debtor = Debtor(uid_id=uid, **cld) for opt in OPTS: debtor.__setattr__(opt, TEXT_OPTS_KEYS.index(cld[opt])) debtor.save() LOGGER.info( 'User "{}" ({:d}) {} debtor {}'.format(uname, uid, 'updated' if idx else 'added', debtor.desc), request) return redirect('dir:mainpage') else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'dir_debtorform.xhtml', {'app': APP, 'form': form, 'page_title': page_title, 'err_message': err_message})
def procform(request, idx=0): LOGGER.debug('Proceedings form accessed using method {}, id={}'.format(request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava řízení' if idx else 'Nové řízení' button = getbutton(request) if request.method == 'GET': form = ProcForm(initial=model_to_dict(get_object_or_404(Proceedings, pk=idx, uid=uid))) if idx else ProcForm() elif button == 'back': return redirect('szr:mainpage') else: form = ProcForm(request.POST) if form.is_valid(): cld = form.cleaned_data if not cld['senate']: cld['senate'] = 0 if idx: proc = get_object_or_404(Proceedings, pk=idx, uid=uid) cld['pk'] = idx cld['timestamp_add'] = proc.timestamp_add cld['court_id'] = cld['court'] del cld['court'] onlydesc = ( idx and proc.court.id == cld['court_id'] and proc.senate == cld['senate'] and proc.register == cld['register'] and proc.number == cld['number'] and proc.year == cld['year']) if onlydesc: cld['changed'] = proc.changed cld['updated'] = proc.updated cld['hash'] = proc.hash cld['auxid'] = proc.auxid cld['notify'] = proc.notify proc = Proceedings(uid_id=uid, **cld) if not onlydesc: updateproc(proc) proc.save() LOGGER.info( 'User "{}" ({:d}) {} proceedings "{}" ({})' .format(uname, uid, 'updated' if idx else 'added', proc.desc, p2s(proc)), request) return redirect('szr:mainpage') else: # pragma: no cover LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'szr_procform.xhtml', {'app': APP, 'form': form, 'page_title': page_title, 'err_message': err_message})
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) today = date.today() messages = [] if request.method == 'GET': form = MainForm() else: form = MainForm(request.POST) button = getbutton(request) if button == 'set_beg_date': form.data = form.data.copy() form.data['beg_date'] = today elif form.is_valid(): cld = form.cleaned_data beg = cld['beg_date'] preset = cld['preset'] if preset == 'none': dur = cld['dur'] unit = cld['unit'] else: dur = int(preset[1:]) unit = preset[0] per = Period(beg, dur, unit) if per.error: messages = [(per.msg, None)] else: if per.res != per.bus: messages.append(('{} není pracovní den'.format(fdt(per.res)), None)) messages.append(('{} {}'.format(WD_NAMES[per.bus.weekday()], fdt(per.bus)), 'res')) if per.unc: messages.append(('(evidence pracovních dnů v tomto období není úplná)', 'note')) else: LOGGER.debug('Invalid form', request) messages = [(INERR_SHORT, None)] return render(request, 'lht_mainpage.xhtml', {'app': APP, 'page_title': 'Konec lhůty', 'messages': messages, 'form': form})
def partyform(request, idx=0): LOGGER.debug( 'Party form accessed using method {}, id={}'.format( request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava účastníka' if idx else 'Nový účastník' button = getbutton(request) if request.method == 'GET': if idx: dct = model_to_dict(get_object_or_404(Party, pk=idx, uid=uid)) dct['party_opt'] = TEXT_OPTS_KEYS[dct['party_opt']] form = PartyForm(initial=dct) else: form = PartyForm() elif button == 'back': return redirect('sur:mainpage') else: form = PartyForm(request.POST) if form.is_valid(): cld = form.cleaned_data if idx: res = get_object_or_404(Party, pk=idx, uid=uid) cld['pk'] = idx cld['notify'] = res.notify cld['timestamp_add'] = res.timestamp_add res = Party(uid_id=uid, **cld) res.party_opt = TEXT_OPTS_KEYS.index(cld['party_opt']) res.save() LOGGER.info( 'User "{}" ({:d}) {} party {}'.format( uname, uid, 'updated' if idx else 'added', res.party), request) return redirect('sur:mainpage') else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'sur_partyform.xhtml', { 'app': APP, 'form': form, 'min_chars': grammar(MIN_LENGTH, GR_CHAR), 'page_title': page_title, 'err_message': err_message })
def partydelall(request): LOGGER.debug('Delete all parties page accessed using method {}'.format(request.method), request) uid = request.user.id uname = request.user.username if request.method == 'GET': return render( request, 'sur_partydelall.xhtml', {'app': APP, 'page_title': 'Smazání všech účastníků'}) else: if getbutton(request) == 'yes' and 'conf' in request.POST and request.POST['conf'] == 'Ano': Party.objects.filter(uid=uid).delete() LOGGER.info('User "{}" ({:d}) deleted all parties'.format(uname, uid), request) return redirect('sur:mainpage')
def debtordelall(request): LOGGER.debug('Delete all debtors page accessed using method {}'.format(request.method), request) uid = request.user.id uname = request.user.username if request.method == 'GET': return render( request, 'dir_debtordelall.xhtml', {'app': APP, 'page_title': 'Smazání všech dlužníků'}) else: if getbutton(request) == 'yes' and 'conf' in request.POST and request.POST['conf'] == 'Ano': Debtor.objects.filter(uid=uid).delete() LOGGER.info('User "{}" ({:d}) deleted all debtors'.format(uname, uid), request) return redirect('dir:mainpage')
def partyform(request, idx=0): LOGGER.debug('Party form accessed using method {}, id={}'.format(request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava účastníka' if idx else 'Nový účastník' button = getbutton(request) if request.method == 'GET': if idx: dct = model_to_dict(get_object_or_404(Party, pk=idx, uid=uid)) dct['party_opt'] = TEXT_OPTS_KEYS[dct['party_opt']] form = PartyForm(initial=dct) else: form = PartyForm() elif button == 'back': return redirect('sur:mainpage') else: form = PartyForm(request.POST) if form.is_valid(): cld = form.cleaned_data if idx: res = get_object_or_404(Party, pk=idx, uid=uid) cld['pk'] = idx cld['notify'] = res.notify cld['timestamp_add'] = res.timestamp_add res = Party(uid_id=uid, **cld) res.party_opt = TEXT_OPTS_KEYS.index(cld['party_opt']) res.save() LOGGER.info( 'User "{}" ({:d}) {} party {}'.format(uname, uid, 'updated' if idx else 'added', res.party), request) return redirect('sur:mainpage') else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'sur_partyform.xhtml', {'app': APP, 'form': form, 'min_chars': grammar(MIN_LENGTH, GR_CHAR), 'page_title': page_title, 'err_message': err_message})
def insform(request, idx=0): LOGGER.debug( 'Proceedings form accessed using method {}, id={}'.format( request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava řízení' if idx else 'Nové řízení' button = getbutton(request) if request.method == 'GET': form = InsForm(initial=model_to_dict( get_object_or_404(Insolvency, pk=idx, uid=uid))) if idx else InsForm() elif button == 'back': return redirect('sir:mainpage') else: form = InsForm(request.POST) if form.is_valid(): cld = form.cleaned_data if idx: res = get_object_or_404(Insolvency, pk=idx, uid=uid) cld['pk'] = idx cld['notify'] = res.notify cld['timestamp_add'] = res.timestamp_add res = Insolvency(uid_id=uid, **cld) res.save() LOGGER.info( 'User "{}" ({:d}) {} proceedings "{}" ({})'.format( uname, uid, 'updated' if idx else 'added', res.desc, p2s(res)), request) return redirect('sir:mainpage') else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'sir_insform.xhtml', { 'app': APP, 'form': form, 'page_title': page_title, 'err_message': err_message })
def insform(request, idx=0): LOGGER.debug( 'Proceedings form accessed using method {}, id={}'.format(request.method, idx), request, request.POST) err_message = '' uid = request.user.id uname = request.user.username page_title = 'Úprava řízení' if idx else 'Nové řízení' button = getbutton(request) if request.method == 'GET': form = InsForm(initial=model_to_dict(get_object_or_404(Insolvency, pk=idx, uid=uid))) if idx else InsForm() elif button == 'back': return redirect('sir:mainpage') else: form = InsForm(request.POST) if form.is_valid(): cld = form.cleaned_data if idx: res = get_object_or_404(Insolvency, pk=idx, uid=uid) cld['pk'] = idx cld['notify'] = res.notify cld['timestamp_add'] = res.timestamp_add res = Insolvency(uid_id=uid, **cld) res.save() LOGGER.info( 'User "{}" ({:d}) {} proceedings "{}" ({})' .format(uname, uid, 'updated' if idx else 'added', res.desc, p2s(res)), request) return redirect('sir:mainpage') else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'sir_insform.xhtml', {'app': APP, 'form': form, 'page_title': page_title, 'err_message': err_message})
def procdel(request, idx=0): LOGGER.debug( 'Proceedings delete page accessed using method {}, id={}'.format( request.method, idx), request, request.POST) uid = request.user.id uname = request.user.username proc = get_object_or_404(Proceedings, pk=idx, uid=uid) if request.method == 'GET': return render(request, 'szr_procdel.xhtml', { 'app': APP, 'page_title': 'Smazání řízení', 'desc': proc.desc }) else: if getbutton(request) == 'yes': LOGGER.info( 'User "{}" ({:d}) deleted proceedings "{}" ({})'.format( uname, uid, proc.desc, p2s(proc)), request) proc.delete() return redirect('szr:procdeleted') return redirect('szr:mainpage')
def partydel(request, idx=0): LOGGER.debug( 'Party delete page accessed using method {}, id={}'.format( request.method, idx), request, request.POST) uid = request.user.id uname = request.user.username party = get_object_or_404(Party, pk=idx, uid=uid) if request.method == 'GET': return render(request, 'sur_partydel.xhtml', { 'app': APP, 'page_title': 'Smazání účastníka', 'desc': party.party }) else: if getbutton(request) == 'yes': LOGGER.info( 'User "{}" ({:d}) deleted party "{}"'.format( uname, uid, party.party), request) party.delete() return redirect('sur:partydeleted') return redirect('sur:mainpage')
def debtordel(request, idx=0): LOGGER.debug( 'Debtor delete page accessed using method {}, id={}'.format(request.method, idx), request, request.POST) uid = request.user.id uname = request.user.username debtor = get_object_or_404(Debtor, pk=idx, uid=uid) if request.method == 'GET': return render( request, 'dir_debtordel.xhtml', {'app': APP, 'page_title': 'Smazání dlužníka', 'desc': debtor.desc}) else: if getbutton(request) == 'yes': LOGGER.info('User "{}" ({:d}) deleted debtor "{}"'.format(uname, uid, debtor.desc), request) debtor.delete() return redirect('dir:debtordeleted') return redirect('dir:mainpage')
def partydel(request, idx=0): LOGGER.debug( 'Party delete page accessed using method {}, id={}'.format(request.method, idx), request, request.POST) uid = request.user.id uname = request.user.username party = get_object_or_404(Party, pk=idx, uid=uid) if request.method == 'GET': return render( request, 'sur_partydel.xhtml', {'app': APP, 'page_title': 'Smazání účastníka', 'desc': party.party}) else: if getbutton(request) == 'yes': LOGGER.info('User "{}" ({:d}) deleted party "{}"'.format(uname, uid, party.party), request) party.delete() return redirect('sur:partydeleted') return redirect('sur:mainpage')
def insdel(request, idx=0): LOGGER.debug( 'Proceedings delete page accessed using method {}, id={}'.format(request.method, idx), request, request.POST) uid = request.user.id uname = request.user.username ins = get_object_or_404(Insolvency, pk=idx, uid=uid) if request.method == 'GET': return render( request, 'sir_insdel.xhtml', {'app': APP, 'page_title': 'Smazání řízení', 'desc': ins.desc}) else: if getbutton(request) == 'yes': LOGGER.info( 'User "{}" ({:d}) deleted proceedings "{}" ({})'.format(uname, uid, ins.desc, p2s(ins)), request) ins.delete() return redirect('sir:insdeleted') return redirect('sir:mainpage')
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) messages = [] if request.method == 'GET': form = MainForm() else: dual = getbutton(request) == 'dual' form = MainForm(request.POST) if form.is_valid(): cld = form.cleaned_data netincome = cld['netincome'] deps = cld['deps'] if cld['partner'] or dual: deps += 1 subs = cld['subs'] apt = cld['apt'] vat = cld['vat'] if vat: vatrate = float(cld['vatrate']) if dual: netincome2 = cld['netincome2'] deps2 = cld['deps2'] + 1 fee = cld['fee2'] exp = cld['exp2'] messages.append( ('Kalkulace pro společný návrh manželů', 'header')) else: fee = cld['fee'] exp = cld['exp'] messages.append( ('Kalkulace pro samostatného dlužníka', 'header')) lim = subs + apt prot = lim * 2 / 3 messages.append( ('Nezabavitelná částka: {} Kč'.format(famt(round(prot))), None)) basis1 = ceil(prot * (1 + (deps / 4))) rem = max(netincome - basis1, 0) if rem > lim: rep = rem - lim rem = lim else: rep = 0 rem = (rem // 3) * 3 rep += (rem * 2) // 3 if dual: totnetincome = netincome + netincome2 basis2 = ceil(prot * (1 + (deps2 / 4))) messages.append( ('Celková základní částka pro 1. manžela: {} Kč'.format( famt(round(basis1))), None)) messages.append( ('Celková základní částka pro 2. manžela: {} Kč'.format( famt(round(basis2))), None)) rem2 = max(netincome2 - basis2, 0) if rem2 > lim: rep2 = rem2 - lim rem2 = lim else: rep2 = 0 rem2 = (rem2 // 3) * 3 rep2 += (rem2 * 2) // 3 rep += rep2 else: totnetincome = netincome messages.append(('Celková základní částka: {} Kč'.format( famt(round(basis1))), None)) messages.append( ('Výše měsíční splátky: {} Kč'.format(famt(round(rep))), 'gap')) messages.append(('Zůstatek ze mzdy: {} Kč'.format( famt(round(totnetincome - rep))), None)) tru = fee + exp if vat: tru *= 1 + (vatrate / 100) messages.append( ('Měsíční poplatky insolvenčnímu správci: {} Kč'.format( famt(round(tru))), None)) rep = max(rep - tru, 0) messages.append( ('Měsíční splátka věřitelům: {} Kč'.format(famt(round(rep))), None)) tot = 5 * 12 * rep messages.append( ('Celková výše splátek věřitelům za 5 let: {} Kč'.format( famt(round(tot))), None)) messages.append(('Pohledávky uspokojené do výše 30 %:', 'gap')) messages.append(('{} Kč'.format(famt(round(tot / .3))), 'total')) else: LOGGER.debug('Invalid form', request) messages = [(INERR_SHORT, None)] return render( request, 'kos_mainpage.xhtml', { 'app': APP, 'page_title': 'Kalkulace splátek při oddlužení', 'messages': messages, 'form': form })
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) today = date.today() messages = [] if request.method == 'GET': form = MainForm() else: form = MainForm(request.POST) button = getbutton(request) if button in {'set_beg_date', 'set_end_date'}: unrequire(form, ('beg_date', 'end_date')) form.data = form.data.copy() form.data['{}_date'.format(button[4:7])] = today elif form.is_valid(): cld = form.cleaned_data beg_date = cld['beg_date'] end_date = cld['end_date'] if beg_date >= end_date: messages.append(('Počátek musí předcházet konci', None)) else: messages.append(('{} → {}'.format(fdt(beg_date), fdt(end_date)), 'header')) messages.append((grammar((end_date - beg_date).days, GR_DAY), None)) if beg_date >= UNC_DATE: temp = beg_date + ODP num = 0 while temp <= end_date: if not holiday(temp): num += 1 temp += ODP messages.append((grammar(num, GR_BUSDAY), None)) nyear = nmonth = nday = 0 while True: temp = ply(beg_date, nyear + 1) if temp > end_date: break nyear += 1 res = ply(beg_date, nyear) while True: temp = plm(res, nmonth + 1) if temp > end_date: break nmonth += 1 res = plm(res, nmonth) while res < end_date: res += ODP nday += 1 messages.append( ('{} {} {}'.format(grammar(nyear, GR_YEAR), grammar(nmonth, GR_MONTH), grammar(nday, GR_DAY)), 'ymd')) for dconv in YDCONVS: messages.append( ('{:.6f} let ({})'.format(LocalFloat(yfactor(beg_date, end_date, dconv)), dconv), 'year')) for dconv in MDCONVS: if dconv == MDCONVS[0]: messages.append( ('{:.6f} měsíců ({})'.format(LocalFloat(mfactor(beg_date, end_date, dconv)), dconv), 'month1')) else: messages.append( ('{:.6f} měsíců ({})'.format(LocalFloat(mfactor(beg_date, end_date, dconv)), dconv), 'month2')) else: LOGGER.debug('Invalid form', request) messages = [(INERR_SHORT, None)] return render( request, 'cin_mainpage.xhtml', {'app': APP, 'form': form, 'messages': messages, 'page_title': 'Délka časového intervalu'})
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) rate_desc = { 'DISC': 'Diskontní sazba', 'LOMB': 'Lombardní sazba', 'REPO': 'Repo sazba pro dvoutýdenní operace', } messages = [] today = date.today() AmountField.rounding = 2 if request.method == 'GET': form = MainForm() else: form = MainForm(request.POST) button = getbutton(request) if button in {'set_fx_date', 'set_mpi_date'}: unrequire(form, ('fx_date', 'basis', 'mpi_date')) form.data = form.data.copy() if button == 'set_fx_date': form.data['fx_date'] = today else: form.data['mpi_date'] = today else: fxr = button in {'show_fx', 'conv_from', 'conv_to'} if button == 'show_fx': unrequire(form, ('basis', 'mpi_date')) elif fxr: unrequire(form, ('mpi_date',)) else: unrequire(form, ('fx_date', 'basis')) if form.is_valid(): cld = form.cleaned_data if fxr: curr = cld['curr'] fx_date = cld['fx_date'] rate, qty, dreq, msg = get_fx_rate(curr, fx_date) if msg: messages = [(msg, None)] elif button == 'show_fx': messages.append( ('{:d} {} = {:.3f} CZK'.format(qty, curr, LocalFloat(rate)), 'res1')) messages.append( ('(Kurs vyhlášený ke dni: {})'.format(fdt(dreq)), 'note')) else: basis = cld['basis'] if button == 'conv_from': messages.append( ('{} {} = {} CZK'.format(famt(basis), curr, famt(basis * rate / qty)), 'res2')) else: messages.append( ('{} CZK = {} {}'.format(famt(basis), famt(basis * qty / rate), curr), 'res2')) messages.append( ('{:d} {} = {:.3f} CZK'.format(qty, curr, LocalFloat(rate)), None)) messages.append( ('(Kurs vyhlášený ke dni: {})'.format(fdt(dreq)), 'note')) else: mpi_date = cld['mpi_date'] rate, msg = get_mpi_rate(button, mpi_date) if msg: messages = [(msg, None)] else: messages.append( ('{} platná ke dni {}:'.format(rate_desc[button], fdt(mpi_date)), None)) messages.append( ('{:.2f} %'.format(LocalFloat(rate)), 'res0')) else: LOGGER.debug('Invalid form', request) messages = [(INERR_SHORT, None)] return render( request, 'cnb_mainpage.xhtml', {'app': APP, 'form': form, 'messages': messages, 'page_title': 'Kursy a sazby ČNB'})
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) today = date.today() messages = [] if request.method == 'GET': form = MainForm() else: form = MainForm(request.POST) button = getbutton(request) if button in {'set_beg_date', 'set_end_date'}: unrequire(form, ('beg_date', 'end_date')) form.data = form.data.copy() form.data['{}_date'.format(button[4:7])] = today elif form.is_valid(): cld = form.cleaned_data beg_date = cld['beg_date'] end_date = cld['end_date'] if beg_date >= end_date: messages.append(('Počátek musí předcházet konci', None)) else: messages.append(('{} → {}'.format(fdt(beg_date), fdt(end_date)), 'header')) messages.append((grammar((end_date - beg_date).days, GR_DAY), None)) if beg_date >= UNC_DATE: temp = beg_date + ODP num = 0 while temp <= end_date: if not holiday(temp): num += 1 temp += ODP messages.append((grammar(num, GR_BUSDAY), None)) nyear = nmonth = nday = 0 while True: temp = ply(beg_date, nyear + 1) if temp > end_date: break nyear += 1 res = ply(beg_date, nyear) while True: temp = plm(res, nmonth + 1) if temp > end_date: break nmonth += 1 res = plm(res, nmonth) while res < end_date: res += ODP nday += 1 messages.append(('{} {} {}'.format(grammar(nyear, GR_YEAR), grammar(nmonth, GR_MONTH), grammar(nday, GR_DAY)), 'ymd')) for dconv in YDCONVS: messages.append(('{:.6f} let ({})'.format( LocalFloat(yfactor(beg_date, end_date, dconv)), dconv), 'year')) for dconv in MDCONVS: if dconv == MDCONVS[0]: messages.append(('{:.6f} měsíců ({})'.format( LocalFloat(mfactor(beg_date, end_date, dconv)), dconv), 'month1')) else: messages.append(('{:.6f} měsíců ({})'.format( LocalFloat(mfactor(beg_date, end_date, dconv)), dconv), 'month2')) else: LOGGER.debug('Invalid form', request) messages = [(INERR_SHORT, None)] return render( request, 'cin_mainpage.xhtml', { 'app': APP, 'form': form, 'messages': messages, 'page_title': 'Délka časového intervalu' })
def debtorbatchform(request): LOGGER.debug('Debtor import page accessed using method {}'.format(request.method), request) err_message = '' uid = request.user.id uname = request.user.username if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO(infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue desc = line[0].strip() court = name = first_name = genid = taxid = birthid = date_birth = year_birth_from \ = year_birth_to = None name_opt = first_name_opt = 0 if not desc: errors.append((idx, 'Prázdný popis')) continue if len(desc) > 255: errors.append((idx, 'Příliš dlouhý popis')) continue for term in line[1:]: if '=' not in term: errors.append((idx, 'Chybný formát')) continue key, val = map( lambda x: x.strip(), term.split('=', 1)) if not val: continue if key == 'soud': court = val elif key == 'název': if ':' in val: name, name_opt = val.split(':', 1) if name_opt not in TEXT_OPTS_ABBR: errors.append((idx, 'Chybná zkratka pro posici v poli <q>název</q>')) continue name_opt = TEXT_OPTS_AI[name_opt] else: name = val name_opt = 0 if len(name) > MAX_LENGTH: errors.append((idx, 'Příliš dlouhé pole <q>název</q>')) continue elif key == 'jméno': if ':' in val: first_name, first_name_opt = val.split(':', 1) if first_name_opt not in TEXT_OPTS_ABBR: errors.append((idx, 'Chybná zkratka pro posici v poli <q>jméno</q>')) continue first_name_opt = TEXT_OPTS_AI[first_name_opt] else: first_name = val first_name_opt = 0 if len(first_name) > MAX_LENGTH: errors.append((idx, 'Příliš dlouhé pole <q>jméno</q>')) continue elif key == 'IČO': if not compile(IC_RE_STR).match(val): errors.append((idx, 'Chybná hodnota pro IČO')) continue genid = val elif key == 'DIČ': if len(val) > 14: errors.append((idx, 'Chybná hodnota pro DIČ')) continue taxid = val elif key == 'RČ': if not compile(RC_FULL_RE_STR).match(val): errors.append((idx, 'Chybná hodnota pro rodné číslo')) continue birthid = val.replace('/', '') elif key == 'datumNarození': try: date_birth = date(*map(int, val.split('.')[2::-1])) assert date_birth.year >= 1900 except: errors.append((idx, 'Chybná hodnota pro datum narození')) continue elif key == 'rokNarozeníOd': try: year_birth_from = int(val) assert year_birth_from >= 1900 except: errors.append((idx, 'Chybná hodnota pro pole <q>rokNarozeníOd</q>')) continue elif key == 'rokNarozeníDo': try: year_birth_to = int(val) assert year_birth_to >= 1900 except: errors.append((idx, 'Chybná hodnota pro pole <q>rokNarozeníDo</q>')) continue else: errors.append((idx, 'Chybný parametr: "{}"'.format(key))) continue if year_birth_from and year_birth_to and year_birth_from > year_birth_to: errors.append((idx, 'Chybný interval pro rok narození')) continue if len(errors) == errlen: try: Debtor.objects.update_or_create( uid_id=uid, desc=desc, defaults={ 'court': court, 'name': name, 'name_opt': name_opt, 'first_name': first_name, 'first_name_opt': first_name_opt, 'genid': genid, 'taxid': taxid, 'birthid': birthid, 'date_birth': date_birth, 'year_birth_from': year_birth_from, 'year_birth_to': year_birth_to} ) except: errors.append((idx, 'Popisu "{}" odpovídá více než jeden dlužník'.format(desc))) continue count += 1 LOGGER.info('User "{}" ({:d}) imported {:d} debtor(s)'.format(uname, uid, count), request) return render( request, 'dir_debtorbatchresult.xhtml', {'app': APP, 'page_title': 'Import dlužníků ze souboru', 'count': count, 'errors': errors}) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'dir_debtorbatchform.xhtml', {'app': APP, 'page_title': 'Import dlužníků ze souboru', 'err_message': err_message})
def partybatchform(request): LOGGER.debug( 'Party import page accessed using method {}'.format(request.method), request) err_message = '' uid = request.user.id uname = request.user.username if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO( infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue line = line[0].strip() if ':' in line: line, party_opt = line.split(':', 1) else: party_opt = '*' if not between(MIN_LENGTH, len(line), MAX_LENGTH): errors.append((idx, 'Chybná délka řetězce')) continue if party_opt not in TEXT_OPTS_ABBR: errors.append( (idx, 'Chybná zkratka pro posici')) continue if len(errors) == errlen: try: Party.objects.update_or_create( uid_id=uid, party=line, defaults={ 'party_opt': TEXT_OPTS_AI[party_opt] }) except: errors.append(( idx, 'Řetězci "{}" odpovídá více než jeden účastník' .format(line))) continue count += 1 LOGGER.info( 'User "{}" ({:d}) imported {} party/ies'.format( uname, uid, count), request) return render( request, 'sur_partybatchresult.xhtml', { 'app': APP, 'page_title': 'Import účastníků řízení ze souboru', 'count': count, 'errors': errors }) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'sur_partybatchform.xhtml', { 'app': APP, 'page_title': 'Import účastníků řízení ze souboru', 'err_message': err_message, 'min_length': MIN_LENGTH, 'max_length': MAX_LENGTH })
def insbatchform(request): LOGGER.debug( 'Proceedings import page accessed using method {}'.format( request.method), request) err_message = '' uid = request.user.id uname = request.user.username if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO( infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue desc = line[0].strip() if not desc: errors.append((idx, 'Prázdný popis')) continue if len(desc) > 255: errors.append((idx, 'Příliš dlouhý popis')) continue try: number = int(line[1]) assert number > 0 except: errors.append((idx, 'Chybné běžné číslo')) continue try: year = int(line[2]) assert year >= 2008 except: errors.append((idx, 'Chybný ročník')) continue detailed = line[3].strip() if detailed == 'ano': detailed = True elif detailed == 'ne': detailed = False else: errors.append( (idx, 'Chybný údaj pro pole Vše')) continue if len(errors) == errlen: try: Insolvency.objects.update_or_create( uid_id=uid, desc=desc, defaults={ 'number': number, 'year': year, 'detailed': detailed }) except: errors.append(( idx, 'Popisu "{}" odpovídá více než jedno řízení' .format(desc))) continue count += 1 LOGGER.info( 'User "{}" ({:d}) imported {:d} proceedings'.format( uname, uid, count), request) return render( request, 'sir_insbatchresult.xhtml', { 'app': APP, 'page_title': 'Import řízení ze souboru', 'count': count, 'errors': errors }) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' return render( request, 'sir_insbatchform.xhtml', { 'app': APP, 'page_title': 'Import řízení ze souboru', 'err_message': err_message })
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) def cellam(amt, slb=False): amt = (float(amt) if debt.rounding else int(round(amt))) suf = 's' if slb else '' if abs(amt) < LIM: return '<td class="cr{}"></td>'.format(suf) if amt > 0: return '<td class="cr{}">{}</td>'.format(suf, famt(amt)) return '<td class="dr{}">{}</td>'.format(suf, famt(-amt)) def lfamt(amt): return '{} {}'.format( famt(round(amt, debt.rounding) if debt.rounding else int(round(amt))).replace('-', '−'), dispcurr(debt.currency)) err_message = '' rows_err = False if request.method == 'GET': debt = getdebt(request) if not debt: # pragma: no cover return error(request) debt.rates = {} rows = getrows(debt) for row in rows: if row['err']: rows_err = True break var = {'title': debt.title, 'note': debt.note, 'internal_note': debt.internal_note, 'currency': debt.currency, 'rounding': str(debt.rounding)} interest = debt.interest var['model'] = model = interest.model if model == 'fixed': var['fixed_amount'] = '{:.2f}'.format(LocalFloat( interest.fixed_amount)) if debt.rounding else int(round(interest.fixed_amount)) elif model == 'per_annum': var['pa_rate'] = interest.rate var['ydconv'] = interest.day_count_convention elif model == 'per_mensem': var['pm_rate'] = interest.rate var['mdconv'] = interest.day_count_convention elif model == 'per_diem': var['pd_rate'] = interest.rate form = MainForm(initial=var) else: button = getbutton(request) if button == 'empty': debt = Debt() if not setdebt(request, debt): # pragma: no cover return error(request) return redirect('hjp:mainpage') if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: try: dat = infile.read() infile.close() debt, msg = from_xml(dat) if msg: raise Exception('Error reading file') setdebt(request, debt) return redirect('hjp:mainpage') except: err_message = 'Chyba při načtení souboru' debt = getdebt(request) if not debt: # pragma: no cover return error(request) debt.rates = {} rows = getrows(debt) for row in rows: if row['err']: rows_err = True break form = MainForm(request.POST) if form.is_valid(): cld = form.cleaned_data debt.title = cld['title'].strip() debt.note = cld['note'].strip() debt.internal_note = cld['internal_note'].strip() debt.currency = cld['currency'] debt.rounding = int(cld['rounding']) interest = Interest() debt.interest = interest interest.model = model = cld['model'] if model == 'fixed': interest.fixed_amount = float(cld['fixed_amount']) elif model == 'per_annum': interest.rate = float(cld['pa_rate']) interest.day_count_convention = cld['ydconv'] elif model == 'per_mensem': interest.rate = float(cld['pm_rate']) interest.day_count_convention = cld['mdconv'] elif model == 'per_diem': interest.rate = float(cld['pd_rate']) setdebt(request, debt) if not button and cld['next']: return redirect(cld['next']) if button == 'xml': response = HttpResponse( to_xml(debt), content_type='text/xml; charset=utf-8') response['Content-Disposition'] = 'attachment; filename=Pohledavka.xml' return response if button == 'csv' and not rows_err: response = HttpResponse(content_type='text/csv; charset=utf-8') response['Content-Disposition'] = 'attachment; filename=Pohledavka.csv' writer = csv.writer(response) writer.writerow( ('Datum', 'Popis', 'Přednost', 'Pohyb', 'Předchozí zůstatek/jistina', 'Předchozí zůstatek/úrok', 'Předchozí zůstatek/celkem', 'Započteno/jistina', 'Započteno/úrok', 'Nový zůstatek/jistina', 'Nový zůstatek/úrok', 'Nový zůstatek/celkem')) for row in rows: writer.writerow( (row['date'].isoformat(), row['description'], row.get('rep', ''), '{:.2f}'.format(normfl(row['change'])), '{:.2f}'.format(normfl(row['pre_principal'])), '{:.2f}'.format(normfl(row['pre_interest'])), '{:.2f}'.format(normfl(row['pre_total'])), '{:.2f}'.format(normfl(row['change_principal'])), '{:.2f}'.format(normfl(row['change_interest'])), '{:.2f}'.format(normfl(row['post_principal'])), '{:.2f}'.format(normfl(row['post_interest'])), '{:.2f}'.format(normfl(row['post_total'])))) return response if button == 'pdf': register_fonts() style1 = ParagraphStyle( name='STYLE1', fontName='Bookman', fontSize=8, leading=9, alignment=TA_RIGHT, allowWidows=False, allowOrphans=False) style2 = ParagraphStyle( name='STYLE2', fontName='BookmanB', fontSize=10, leading=11, alignment=TA_RIGHT, allowWidows=False, allowOrphans=False) style4 = ParagraphStyle( name='STYLE4', fontName='BookmanB', fontSize=8, leading=10, allowWidows=False, allowOrphans=False) style12 = ParagraphStyle( name='STYLE12', fontName='BookmanI', fontSize=8, leading=9, spaceBefore=4, spaceAfter=5, leftIndent=8, allowWidows=False, allowOrphans=False) style13 = ParagraphStyle( name='STYLE13', fontName='Bookman', fontSize=8, leading=12, alignment=TA_CENTER, allowWidows=False, allowOrphans=False) style14 = ParagraphStyle( name='STYLE14', fontName='BookmanB', fontSize=8, leading=12, allowWidows=False, allowOrphans=False) style15 = ParagraphStyle( name='STYLE15', fontName='BookmanB', fontSize=8, leading=10, alignment=TA_CENTER, allowWidows=False, allowOrphans=False) style16 = ParagraphStyle( name='STYLE16', fontName='Bookman', fontSize=8, leading=10, alignment=TA_CENTER, allowWidows=False, allowOrphans=False) style17 = ParagraphStyle( name='STYLE17', fontName='BookmanB', fontSize=8, leading=10, alignment=TA_RIGHT, allowWidows=False, allowOrphans=False) style18 = ParagraphStyle( name='STYLE18', fontName='Bookman', fontSize=8, leading=10, allowWidows=False, allowOrphans=False) style19 = ParagraphStyle( name='STYLE19', fontName='Bookman', fontSize=8, leading=10, allowWidows=False, allowOrphans=False) style20 = ParagraphStyle( name='STYLE20', fontName='Bookman', fontSize=8, leading=10, leftIndent=8, allowWidows=False, allowOrphans=False) style21 = ParagraphStyle( name='STYLE21', fontName='Bookman', fontSize=8, leading=10, leftIndent=16, allowWidows=False, allowOrphans=False) style22 = ParagraphStyle( name='STYLE22', fontName='BookmanI', fontSize=8, leading=10, alignment=TA_CENTER, allowWidows=False, allowOrphans=False) doc1 = (([Paragraph('Historie peněžité pohledávky'.upper(), style1)],),) if debt.title: doc1[0][0].append(Paragraph(escape(debt.title), style2)) table1 = Table(doc1, colWidths=(483.3,)) table1.setStyle( TableStyle(( ('LINEABOVE', (0, 0), (0, -1), 1.0, black), ('TOPPADDING', (0, 0), (0, -1), 2), ('LINEBELOW', (-1, 0), (-1, -1), 1.0, black), ('BOTTOMPADDING', (-1, 0), (-1, -1), 3), ('LEFTPADDING', (0, 0), (-1, -1), 2), ('RIGHTPADDING', (0, 0), (-1, -1), 2), ))) flow = [table1, Spacer(0, 36)] wid = 483.3 widl = 8 widr = 8 widg = 12 widf = widc = (wid - widl - widr - (widg * 2)) / 6 cwid = ( (widl,) + ((widc / 5,) * 5) + ((widf / 5,) * 5) + (widg,) + ((widc / 5,) * 5) + ((widf / 5,) * 5) + (widg,) + ((widc / 5,) * 5) + ((widf / 5,) * 5) + (widr,)) thickness = .5 res = [Paragraph(('<b>Měna:</b> {}'.format(debt.currency)), style19)] if hasattr(debt, 'default_date') and debt.default_date: res.append(Paragraph('<b>První den prodlení:</b> {:%d.%m.%Y}'.format(debt.default_date), style19)) interest2 = None interest3 = [] if debt.interest.model == 'none': interest1 = 'bez úroku' elif debt.interest.model == 'fixed': interest1 = 'pevnou částkou {}'.format(lfamt(debt.interest.fixed_amount)) elif debt.interest.model == 'per_annum': interest1 = ( 'pevnou sazbou {0.rate:n} % <i>p. a.</i>, konvence pro počítání dnů: {0.day_count_convention}' .format(debt.interest)) elif debt.interest.model == 'per_mensem': interest1 = ( 'pevnou sazbou {0.rate:n} % <i>p. m.</i>, konvence pro počítání dnů: {0.day_count_convention}' .format(debt.interest)) elif debt.interest.model == 'per_diem': interest1 = 'pevnou sazbou {:n} ‰ <i>p. d.</i>'.format(debt.interest.rate) elif debt.interest.model == 'cust1': interest1 = 'úrok z prodlení podle nařízení č. 142/1994 Sb. (účinnost do 27.04.2005)' if debt.rates: rate = debt.rates.popitem() interest2 = ( 'Diskontní sazba ČNB ke dni {:%d.%m.%Y}: {:.2f} % <i>p. a.</i>' .format(rate[0], LocalFloat(rate[1]))) elif debt.interest.model == 'cust2': interest1 = 'úrok z prodlení podle nařízení č. 142/1994 Sb. (účinnost od 28.04.2005 do 30.06.2010)' if len(debt.rates) == 1: rate = debt.rates.popitem() interest2 = ( 'Použita 2T repo sazba ČNB ke dni {:%d.%m.%Y}: {:.2f} % <i>p. a.</i>' .format(rate[0], LocalFloat(rate[1]))) elif len(debt.rates) > 1: interest2 = 'Použity následující 2T repo sazby ČNB:' for dat in sorted(debt.rates.keys()): interest3.append( '– ke dni {:%d.%m.%Y}: {:.2f} % <i>p. a.</i>'.format(dat, LocalFloat(debt.rates[dat]))) elif debt.interest.model == 'cust3': interest1 = 'úrok z prodlení podle nařízení č. 142/1994 Sb. (účinnost od 01.07.2010 do 30.06.2013)' if debt.rates: rate = debt.rates.popitem() interest2 = ( '2T repo sazba ČNB ke dni {:%d.%m.%Y}: {:.2f} % <i>p. a.</i>' .format(rate[0], LocalFloat(rate[1]))) elif debt.interest.model == 'cust5': interest1 = 'úrok z prodlení podle nařízení č. 142/1994 Sb. (účinnost od 01.07.2013 do 31.12.2013)' if debt.rates: rate = debt.rates.popitem() interest2 = ( '2T repo sazba ČNB ke dni {:%d.%m.%Y}: {:.2f} % <i>p. a.</i>' .format(rate[0], LocalFloat(rate[1]))) elif debt.interest.model == 'cust6': interest1 = 'úrok z prodlení podle nařízení č. 351/2013 Sb.' if debt.rates: rate = debt.rates.popitem() interest2 = ( '2T repo sazba ČNB ke dni {:%d.%m.%Y}: {:.2f} % <i>p. a.</i>' .format(rate[0], LocalFloat(rate[1]))) else: interest1 = 'poplatek z prodlení podle nařízení č. 142/1994 Sb.' if debt.currency != 'CZK': interest2 = ( '<i>(minimální sazba 25 Kč za každý započatý měsíc prodlení není pro jinou měnu než CZK ' 'podporována)</i>') res.append(Paragraph('<b>Úročení:</b> {}'.format(interest1), style19)) if interest2: res.append(Paragraph(interest2, style20)) for key in interest3: res.append(Paragraph(key, style21)) res.append(Spacer(0, 50)) flow.extend(res) bst = ( ('SPAN', (0, 0), (4, 0)), ('SPAN', (5, 0), (33, 0)), ('SPAN', (1, 1), (10, 1)), ('SPAN', (12, 1), (21, 1)), ('SPAN', (23, 1), (32, 1)), ('SPAN', (1, 2), (3, 2)), ('SPAN', (4, 2), (10, 2)), ('SPAN', (12, 2), (14, 2)), ('SPAN', (15, 2), (21, 2)), ('SPAN', (23, 2), (25, 2)), ('SPAN', (26, 2), (32, 2)), ('SPAN', (1, 3), (3, 3)), ('SPAN', (4, 3), (10, 3)), ('SPAN', (12, 3), (14, 3)), ('SPAN', (15, 3), (21, 3)), ('SPAN', (23, 3), (25, 3)), ('SPAN', (26, 3), (32, 3)), ('SPAN', (1, 4), (3, 4)), ('SPAN', (4, 4), (10, 4)), ('SPAN', (12, 4), (14, 4)), ('SPAN', (15, 4), (21, 4)), ('SPAN', (23, 4), (25, 4)), ('SPAN', (26, 4), (32, 4)), ('LINEABOVE', (0, 0), (-1, 0), 1, black), ('LINEBELOW', (0, 0), (-1, 0), 1, black), ('LINEBEFORE', (0, 0), (0, -1), 1, black), ('LINEAFTER', (-1, 0), (-1, -1), 1, black), ('LINEBELOW', (0, -1), (-1, -1), 1, black), ('BACKGROUND', (0, 0), (-1, 0), '#e8e8e8'), ('VALIGN', (0, 0), (-1, 0), 'TOP'), ('LEFTPADDING', (0, 0), (-1, 0), 0), ('LEFTPADDING', (0, 1), (-1, -1), 3), ('RIGHTPADDING', (0, 0), (-1, -1), 3), ('RIGHTPADDING', (4, 2), (10, 4), 0), ('RIGHTPADDING', (15, 2), (21, 4), 0), ('RIGHTPADDING', (26, 2), (32, 4), 0), ('TOPPADDING', (0, 0), (-1, 0), 2.5), ('TOPPADDING', (0, 1), (-1, 1), 10), ('TOPPADDING', (0, 2), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, 0), .5), ('BOTTOMPADDING', (0, 1), (-1, 1), 1.5), ('BOTTOMPADDING', (0, 2), (-1, 4), 0), ('BOTTOMPADDING', (0, -1), (-1, -1), 18), ) ast = { 'debit': ( ('LINEBELOW', (1, 1), (10, 1), thickness, black), ('LINEAFTER', (3, 2), (3, 2), thickness, black), ('LINEBELOW', (12, 1), (21, 1), thickness, black), ('LINEAFTER', (14, 2), (14, 4), thickness, black), ('LINEBELOW', (23, 1), (32, 1), thickness, black), ('LINEAFTER', (25, 2), (25, 4), thickness, black)), 'credit': ( ('LINEBELOW', (1, 1), (10, 1), thickness, black), ('LINEAFTER', (3, 2), (3, 4), thickness, black), ('LINEBELOW', (12, 1), (21, 1), thickness, black), ('LINEAFTER', (14, 2), (14, 4), thickness, black), ('LINEBELOW', (23, 1), (32, 1), thickness, black), ('LINEAFTER', (25, 2), (25, 4), thickness, black)), 'balance': ( ('LINEBELOW', (23, 1), (32, 1), thickness, black), ('LINEAFTER', (25, 2), (25, 4), thickness, black)) } for row in rows: if row['err']: flow.extend( [Spacer(0, 20), Paragraph( '(pro další transakce nejsou k disposici' ' data, při výpočtu došlo k chybě)', style22)]) break trt = row['trt'] doc3 = [] temp1 = [Paragraph('{:%d.%m.%Y}'.format(row['date']), style13)] + (EL * 4) temp2 = [Paragraph(escape(row['description']).upper(), style14)] + (EL * 28) doc3.extend([temp1 + temp2]) if trt == 'debit': temp = ( EL + [Paragraph('Závazek', style15)] + (EL * 10) + [Paragraph('Předchozí zůstatek', style15)] + (EL * 10) + [Paragraph('Nový zůstatek', style15), '']) elif trt == 'credit': temp = ( EL + [Paragraph('<b>Splátka</b> (přednost {}'.format(row['rep']), style16)] + (EL * 10) + [Paragraph('Předchozí zůstatek', style15)] + (EL * 10) + [Paragraph('Nový zůstatek', style15), '']) else: temp = (EL * 23) + [Paragraph('Zůstatek', style15), ''] doc3.extend([temp]) if trt != 'balance': temp = ( EL + [Paragraph('Částka', style17)] + (EL * 2) + [Paragraph(lfamt((row['change'] if (trt == 'debit') else (-row['change']))), style18)] + (EL * 7) + [Paragraph('Jistina', style17)] + (EL * 2) + [Paragraph(lfamt(row['pre_principal']), style18)] + (EL * 7) + [Paragraph('Jistina', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_principal']), style18)] + (EL * 7)) else: temp = ( (EL * 23) + [Paragraph('Jistina', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_principal']), style18)] + (EL * 7)) doc3.extend([temp]) if trt == 'debit': temp = ( (EL * 12) + [Paragraph('Úrok', style17)] + (EL * 2) + [Paragraph(lfamt(row['pre_interest']), style18)] + (EL * 7) + [Paragraph('Úrok', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_interest']), style18)] + (EL * 7)) elif trt == 'credit': temp = ( EL + [Paragraph('Jistina', style17)] + (EL * 2) + [Paragraph(lfamt(-row['change_principal']), style18)] + (EL * 7) + [Paragraph('Úrok', style17)] + (EL * 2) + [Paragraph(lfamt(row['pre_interest']), style18)] + (EL * 7) + [Paragraph('Úrok', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_interest']), style18)] + (EL * 7)) else: temp = ( (EL * 23) + [Paragraph('Úrok', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_interest']), style18)] + (EL * 7)) doc3.extend([temp]) if trt == 'debit': temp = ( (EL * 12) + [Paragraph('Celkem', style17)] + (EL * 2) + [Paragraph(lfamt(row['pre_total']), style18)] + (EL * 7) + [Paragraph('Celkem', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_total']), style18)] + (EL * 7)) elif trt == 'credit': temp = ( EL + [Paragraph('Úrok', style17)] + (EL * 2) + [Paragraph(lfamt(-row['change_interest']), style18)] + (EL * 7) + [Paragraph('Celkem', style17)] + (EL * 2) + [Paragraph(lfamt(row['pre_total']), style18)] + (EL * 7) + [Paragraph('Celkem', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_total']), style18)] + (EL * 7)) else: temp = ( (EL * 23) + [Paragraph('Celkem', style17)] + (EL * 2) + [Paragraph(lfamt(row['post_total']), style18)] + (EL * 7)) doc3.extend([temp]) temp = EL * 34 doc3.extend([temp]) table3 = Table(doc3, colWidths=cwid) table3.setStyle(TableStyle(bst + ast[trt])) flow.append(KeepTogether(table3)) if debt.note: flow.append(Spacer(0, 24)) temp = [Paragraph('Poznámka:'.upper(), style4)] for line in filter(bool, debt.note.strip().split('\n')): temp.append(Paragraph(escape(line), style12)) flow.append(KeepTogether(temp[:2])) if len(temp) > 2: flow.extend(temp[2:]) temp = BytesIO() response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename=Pohledavka.pdf' auth = '{} V{}'.format(APP.upper(), APPVERSION) doc = SimpleDocTemplate( temp, pagesize=A4, title='Historie peněžité pohledávky', author=auth, leftMargin=64, rightMargin=48, topMargin=48, bottomMargin=96, ) make_pdf( doc, flow, string=auth, xml=to_xml(debt)) response.write(temp.getvalue()) return response else: LOGGER.debug('Invalid form', request) err_message = INERR for row in rows: row['change'] = cellam(row['change']) if not row['err']: row['pre_principal'] = cellam(row['pre_principal']) row['pre_interest'] = cellam(row['pre_interest'], True) row['change_principal'] = cellam(row['change_principal']) row['change_interest'] = cellam(row['change_interest'], True) row['post_principal'] = cellam(row['post_principal']) row['post_interest'] = cellam(row['post_interest'], True) row['post_total'] = cellam(row['post_total'], True) return render( request, 'hjp_mainpage.xhtml', {'app': APP, 'page_title': 'Historie jednoduché peněžité pohledávky', 'form': form, 'rows': rows, 'currency': dispcurr(debt.currency), 'ydconvs': YDCONVS, 'mdconvs': MDCONVS, 'err_message': err_message, 'rows_err': rows_err})
def procbatchform(request): LOGGER.debug( 'Proceedings import page accessed using method {}'.format( request.method), request) err_message = '' uid = request.user.id uname = request.user.username today = date.today() if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO( infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue if len(line) != 3: errors.append((idx, 'Chybný formát')) continue desc = line[0].strip() if not desc: errors.append((idx, 'Prázdný popis')) continue if len(desc) > 255: errors.append((idx, 'Příliš dlouhý popis')) continue try: court = line[1] assert Court.objects.get(id=court) except: errors.append((idx, 'Chybná zkratka soudu')) continue try: senate, register, number, year = decomposeref( line[2]) assert senate >= 0 assert register in REGISTERS assert number > 0 assert year >= 1990 and year <= today.year except: errors.append((idx, 'Chybná spisová značka')) continue if len(errors) == errlen: proc = Proceedings.objects.filter( uid_id=uid, desc=desc, court=court, senate=senate, register=register, number=number, year=year) if not proc.exists(): try: proc = Proceedings.objects.update_or_create( uid_id=uid, desc=desc, defaults={ 'court_id': court, 'senate': senate, 'register': register, 'number': number, 'year': year, 'changed': None, 'updated': None, 'hash': '', 'auxid': 0, 'notify': False })[0] updateproc(proc) proc.save() except: errors.append(( idx, 'Popisu "{}" odpovídá více než jedno řízení' .format(desc))) continue count += 1 LOGGER.info( 'User "{}" ({:d}) imported {:d} proceedings'.format( uname, uid, count), request) return render( request, 'szr_procbatchresult.xhtml', { 'app': APP, 'page_title': 'Import řízení ze souboru', 'count': count, 'errors': errors }) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' return render( request, 'szr_procbatchform.xhtml', { 'app': APP, 'page_title': 'Import řízení ze souboru', 'err_message': err_message })
def transform(request, idx=0): LOGGER.debug( 'Transaction form accessed using method {}, id={}'.format(request.method, idx), request, request.POST) page_title = 'Úprava transakce' if idx else 'Nová transakce' err_message = '' debt = getdebt(request) if not debt: # pragma: no cover return error(request) idx = int(idx) if request.method == 'GET': if idx: if idx > len(debt.transactions): raise Http404 transaction = debt.transactions[idx - 1] var = { 'description': transaction.description, 'transaction_type': transaction.transaction_type, 'date': transaction.date} if hasattr(transaction, 'amount'): var['amount'] = ( '{:.2f}'.format(LocalFloat(transaction.amount)) if debt.rounding else int(round(transaction.amount))) if hasattr(transaction, 'repayment_preference'): var['repayment_preference'] = transaction.repayment_preference form = TransForm(initial=var) else: form = TransForm() else: form = TransForm(request.POST) button = getbutton(request) if button == 'back': return redirect('hjp:mainpage') if button == 'set_date': form.data = form.data.copy() form.data['date'] = date.today() elif form.is_valid(): cld = form.cleaned_data transaction = Transaction() transaction.description = cld['description'].strip() transaction.transaction_type = cld['transaction_type'] transaction.date = cld['date'] if transaction.transaction_type != 'balance': transaction.amount = float(cld['amount']) if transaction.transaction_type == 'credit': transaction.repayment_preference = cld['repayment_preference'] if idx: if idx > len(debt.transactions): raise Http404 debt.transactions[idx - 1] = transaction else: debt.transactions.append(transaction) if not setdebt(request, debt): # pragma: no cover return error(request) return redirect('hjp:mainpage') else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'hjp_transform.xhtml', {'app': APP, 'form': form, 'page_title': page_title, 'currency': dispcurr(debt.currency), 'err_message': err_message})
def mainpage(request): LOGGER.debug('Main page accessed using method {}'.format(request.method), request, request.POST) messages = [] if request.method == 'GET': form = MainForm() else: dual = getbutton(request) == 'dual' form = MainForm(request.POST) if form.is_valid(): cld = form.cleaned_data netincome = cld['netincome'] deps = cld['deps'] if cld['partner'] or dual: deps += 1 subs = cld['subs'] apt = cld['apt'] vat = cld['vat'] if vat: vatrate = float(cld['vatrate']) if dual: netincome2 = cld['netincome2'] deps2 = cld['deps2'] + 1 fee = cld['fee2'] exp = cld['exp2'] messages.append(('Kalkulace pro společný návrh manželů', 'header')) else: fee = cld['fee'] exp = cld['exp'] messages.append(('Kalkulace pro samostatného dlužníka', 'header')) lim = subs + apt prot = lim * 2 / 3 messages.append(('Nezabavitelná částka: {} Kč'.format(famt(round(prot))), None)) basis1 = ceil(prot * (1 + (deps / 4))) rem = max(netincome - basis1, 0) if rem > lim: rep = rem - lim rem = lim else: rep = 0 rem = (rem // 3) * 3 rep += (rem * 2) // 3 if dual: totnetincome = netincome + netincome2 basis2 = ceil(prot * (1 + (deps2 / 4))) messages.append(('Celková základní částka pro 1. manžela: {} Kč'.format(famt(round(basis1))), None)) messages.append(('Celková základní částka pro 2. manžela: {} Kč'.format(famt(round(basis2))), None)) rem2 = max(netincome2 - basis2, 0) if rem2 > lim: rep2 = rem2 - lim rem2 = lim else: rep2 = 0 rem2 = (rem2 // 3) * 3 rep2 += (rem2 * 2) // 3 rep += rep2 else: totnetincome = netincome messages.append(('Celková základní částka: {} Kč'.format(famt(round(basis1))), None)) messages.append(('Výše měsíční splátky: {} Kč'.format(famt(round(rep))), 'gap')) messages.append(('Zůstatek ze mzdy: {} Kč'.format(famt(round(totnetincome - rep))), None)) tru = fee + exp if vat: tru *= 1 + (vatrate / 100) messages.append(('Měsíční poplatky insolvenčnímu správci: {} Kč'.format(famt(round(tru))), None)) rep = max(rep - tru, 0) messages.append(('Měsíční splátka věřitelům: {} Kč'.format(famt(round(rep))), None)) tot = 5 * 12 * rep messages.append(('Celková výše splátek věřitelům za 5 let: {} Kč'.format(famt(round(tot))), None)) messages.append(('Pohledávky uspokojené do výše 30 %:', 'gap')) messages.append(('{} Kč'.format(famt(round(tot / .3))), 'total')) else: LOGGER.debug('Invalid form', request) messages = [(INERR_SHORT, None)] return render( request, 'kos_mainpage.xhtml', {'app': APP, 'page_title': 'Kalkulace splátek při oddlužení', 'messages': messages, 'form': form})
def insbatchform(request): LOGGER.debug('Proceedings import page accessed using method {}'.format(request.method), request) err_message = '' uid = request.user.id uname = request.user.username if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO(infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue desc = line[0].strip() if not desc: errors.append((idx, 'Prázdný popis')) continue if len(desc) > 255: errors.append((idx, 'Příliš dlouhý popis')) continue try: number = int(line[1]) assert number > 0 except: errors.append((idx, 'Chybné běžné číslo')) continue try: year = int(line[2]) assert year >= 2008 except: errors.append((idx, 'Chybný ročník')) continue detailed = line[3].strip() if detailed == 'ano': detailed = True elif detailed == 'ne': detailed = False else: errors.append((idx, 'Chybný údaj pro pole Vše')) continue if len(errors) == errlen: try: Insolvency.objects.update_or_create( uid_id=uid, desc=desc, defaults={ 'number': number, 'year': year, 'detailed': detailed} ) except: errors.append((idx, 'Popisu "{}" odpovídá více než jedno řízení'.format(desc))) continue count += 1 LOGGER.info('User "{}" ({:d}) imported {:d} proceedings'.format(uname, uid, count), request) return render( request, 'sir_insbatchresult.xhtml', {'app': APP, 'page_title': 'Import řízení ze souboru', 'count': count, 'errors': errors}) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' return render( request, 'sir_insbatchform.xhtml', {'app': APP, 'page_title': 'Import řízení ze souboru', 'err_message': err_message})
def partybatchform(request): LOGGER.debug('Party import page accessed using method {}'.format(request.method), request) err_message = '' uid = request.user.id uname = request.user.username if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO(infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue line = line[0].strip() if ':' in line: line, party_opt = line.split(':', 1) else: party_opt = '*' if not between(MIN_LENGTH, len(line), MAX_LENGTH): errors.append((idx, 'Chybná délka řetězce')) continue if party_opt not in TEXT_OPTS_ABBR: errors.append((idx, 'Chybná zkratka pro posici')) continue if len(errors) == errlen: try: Party.objects.update_or_create( uid_id=uid, party=line, defaults={'party_opt': TEXT_OPTS_AI[party_opt]} ) except: errors.append((idx, 'Řetězci "{}" odpovídá více než jeden účastník'.format(line))) continue count += 1 LOGGER.info('User "{}" ({:d}) imported {} party/ies'.format(uname, uid, count), request) return render( request, 'sur_partybatchresult.xhtml', {'app': APP, 'page_title': 'Import účastníků řízení ze souboru', 'count': count, 'errors': errors}) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' else: LOGGER.debug('Invalid form', request) err_message = INERR return render( request, 'sur_partybatchform.xhtml', {'app': APP, 'page_title': 'Import účastníků řízení ze souboru', 'err_message': err_message, 'min_length': MIN_LENGTH, 'max_length': MAX_LENGTH})
def procbatchform(request): LOGGER.debug('Proceedings import page accessed using method {}'.format(request.method), request) err_message = '' uid = request.user.id uname = request.user.username today = date.today() if request.method == 'POST': button = getbutton(request) if button == 'load': infile = request.FILES.get('load') if not infile: err_message = 'Nejprve zvolte soubor k načtení' else: errors = [] try: count = 0 with infile: idx = 0 for line in csvreader(StringIO(infile.read().decode())): idx += 1 errlen = len(errors) if not line: continue if len(line) != 3: errors.append((idx, 'Chybný formát')) continue desc = line[0].strip() if not desc: errors.append((idx, 'Prázdný popis')) continue if len(desc) > 255: errors.append((idx, 'Příliš dlouhý popis')) continue try: court = line[1] assert Court.objects.get(id=court) except: errors.append((idx, 'Chybná zkratka soudu')) continue try: senate, register, number, year = decomposeref(line[2]) assert senate >= 0 assert register in REGISTERS assert number > 0 assert year >= 1990 and year <= today.year except: errors.append((idx, 'Chybná spisová značka')) continue if len(errors) == errlen: proc = Proceedings.objects.filter( uid_id=uid, desc=desc, court=court, senate=senate, register=register, number=number, year=year) if not proc.exists(): try: proc = Proceedings.objects.update_or_create( uid_id=uid, desc=desc, defaults={ 'court_id': court, 'senate': senate, 'register': register, 'number': number, 'year': year, 'changed': None, 'updated': None, 'hash': '', 'auxid': 0, 'notify': False})[0] updateproc(proc) proc.save() except: errors.append((idx, 'Popisu "{}" odpovídá více než jedno řízení'.format(desc))) continue count += 1 LOGGER.info('User "{}" ({:d}) imported {:d} proceedings'.format(uname, uid, count), request) return render( request, 'szr_procbatchresult.xhtml', {'app': APP, 'page_title': 'Import řízení ze souboru', 'count': count, 'errors': errors}) except: # pragma: no cover LOGGER.error('Error reading file', request) err_message = 'Chyba při načtení souboru' return render( request, 'szr_procbatchform.xhtml', {'app': APP, 'page_title': 'Import řízení ze souboru', 'err_message': err_message})