#!/usr/bin/env python #-*- coding: cp1250 -*- ###################################### #Program: Davkovac 0.9.5 #Autor: Jiri Vit #Kontakt: jirivit@jirivit.com #Posledni Uprava: 11.1.2006 #Licence: GPL, vice info na http://www.gnu.cz/article.php?id_art=31 # from Tkinter import * from tkFileDialog import * from tkMessageBox import * from tkSimpleDialog import * import time, calendar, re, os, locale, string, webbrowser if os.name == 'nt': pismo="arial 9" else: pismo="fixed" #locale.setlocale(locale.LC_ALL,'czech') kdyz to nastavim tak ve win nefunguje bspace def evAbout(): showinfo(title= 'O Aplikaci', message=u'Dávkovač 0.9.5 Beta \n Jiří Vít \n www.jirivit.com \n' ' Build 20060111 \n') class Nahled(Toplevel): def __init__(self, parent,title=None): Toplevel.__init__(self,parent) self.transient(parent) if title: self.title(title) self.parent = parent self.result = None body = Frame(self) self.initial_focus = self.body(body) body.pack(padx=5,pady=5) self.buttonbox() self.grab_set() body.bind_all("",self.ok) if not self.initial_focus: self.initial_focus = self self.protocol("WM_DELETE_WINDOW",self.ok) self.geometry("+%d+%d" % (parent.winfo_rootx()+20, parent.winfo_rooty()+20)) self.initial_focus.focus_set() self.wait_window(self) def buttonbox(self): box = Frame(self) b = Button(box, text="OK", command=self.ok) b.pack(side=LEFT,padx=5,pady=5) box.pack() def body(self,master,popisek=None,text=None): global pismo # zde se bude dedit nasledujicimi tridami FormatNahled a RawNahled self.yscrollbar = Scrollbar(master) self.xscrollbar = Scrollbar(master,orient=HORIZONTAL) self.editor = Text(master,font="Courier 9",relief=SUNKEN,wrap=NONE, xscrollcommand=self.xscrollbar.set, yscrollcommand=self.yscrollbar.set) self.popis = popisek #self.popisek = Label(master,font="Courier 9",text=self.text,justify=LEFT) self.popisek = Label(master,text=self.popis,font=pismo,justify=LEFT) self.popisek.grid(column = 0, row = 0) self.editor.grid(column = 0, row = 1, sticky = W) self.text = text self.editor.insert(END,self.text) self.editor.config(state=DISABLED) self.yscrollbar.grid(column = 1, row = 1, sticky = N+S) self.yscrollbar.config(command=self.editor.yview) self.xscrollbar.grid(column = 0, row = 2, sticky = E+W) self.xscrollbar.config(command=self.editor.xview) def ok(self,event=None): self.parent.focus_set() self.destroy() class Help(Nahled): def body(self,master): self.text = self.getHelp() self.popisek = u"Nápověda" Nahled.body(self,master,self.popisek,self.getHelp()) def getHelp(self): help = u"""Stručná nápověda: Dávkovač je program pro rychlé vytváření dávek a spolupracuje s Internetovým Bankovnictvím Netbanka od Živnostenské banky. Práce s programem je velmi jednoduchá a neměl by být problém program pochopit. Po jakékoliv větší změně v dávce doporučuji průběžně ukládat výsledek do souboru, než přidám do programu funkci automatického ukládání. =============================================================== V poslední verzi byla upravena ergonomie prace přes klávesnici: F1 - Zobrazeni této mininápovědy F2 - Zobrazení náhledu ve formátu csv F3 - Zobrazení textového formátovaného náhledu Enter - přidá příkaz do dávky a smaže formulář Ctrl+s - uložit změny ve formuláři Ctrl+n - nová dávka šipka nahoru/dolu - posun v dávce o +/- jeden příkaz Page Up/Down - posun v dávce o +/- deset příkazů Delete - smaže příkaz z dávky Jakékoliv připomínky pište na jirivit@jirivit.com ============================================================== Seznam změn: FIX - oprava OPT - optimalizace NEW - nova funkcnost zmeny 0.9.2: FIX - oprava seznamu bank - snad uz definitivni :( FIX - kontrola castky - nelze jiz zadat .1 .11 atd. FIX - kontrola carek v textovych polich zmeny 0.9.3: FIX - doplnena kontrola vnitrobankovnich kodu NEW - moznost otevreni jiz ulozene davky FIX - plna podpora diakritiky [vyzkouseno jen v linuxu] FIX - kontrola delky adresy a ucelu FIX - vynechani carky na konci radku s platbou FIX - oprava kontroly casu ve funkci NajdiPracovniDen OPT - uprava nahledu davky do srozumitelnejsi podoby OPT - kontrola meny prikazu OPT - pouziti UPX - mensi velikost exe pro win zmeny 0.9.4: NEW - validace oteviraneho souboru s davkou OPT - stare splatnosti v otevirane davce se automaticky precislovavaji. Platby s doprednou splatnosti zustavaji tak jak jsou, pokud je zjisteno nebankovni datum, je zobrazena chyba OPT - Modalni okno s nahledem (uz neni mozne otevrit vice instanci jednoho okna NEW - Roletkove menu, formatovany a raw nahled, moznost zacit novou davku. Nove tlacitko "pridat prikaz do davky a zresetovat formular" OPT - pridany scrollbary pro lepsi prohlizeni dat v davce NEW - moznost prime editace zdrojoveho csv FIX - tlacitko pro pridani a mazani mazalo formular, i kdyz v nem byla chyba OPT - do editoru pridano tlacitko na nucene ulozeni davky zmeny 0.9.5: Verze s nejvetsimy zmenamy v kodu od vytvoreni davkovace NEW - Umoznene plna navigace v davce - nyni je mozno prochazet, editovat a mazat prikazy NEW - html nahled, vylepseny textovy nahled FIX - pridana kontrola velikonocniho pondeli NEW - klavesove zkratky (konecne :-) FIX - provedena vetsi optimalizace na Windows - zmena fontu na Arial a osetreni diakritiky FIX - Aktualizace kodu bank """ return help #class Zmeny(Nahled): class TextNahled(Nahled): """zobrazi lehce upravena textova data""" global pismo def body(self,master,): self.text = davka.getText() self.popisek = u'Orientační textový náhled příkazů:\n' Nahled.body(self,master,self.popisek,self.text) class RawNahled(Nahled): """zobrazi data, ktera budou zapsana do souboru""" global pismo def body(self,master): self.text = davka.getcsv() self.popisek = u'Náhled příkazů v dávce tak jak budou vypadat v souboru:\n' Nahled.body(self,master,self.popisek,self.text) ######################################################### #GUI class Gui: global pismo def __init__(self,rodic=0): self.MainFrame=Frame(rodic) self.CreateWidgets() self.vytvorForm() self.eReference.focus_set() def CreateWidgets(self): # Vytvori frame pro hlavni menu: MenuFrame=Frame(self.MainFrame,relief=RAISED,borderwidth=1) MenuFrame.pack(side=TOP,fill=X) # menu Davka FileMenuButton=Menubutton(MenuFrame,font=pismo, text=u"Dávka",underline=0) FileMenuButton.pack(side=LEFT,anchor=W) FileMenu=Menu(FileMenuButton,tearoff=0) FileMenu.add_command(label=u"Nová dávka",font=pismo,underline=0,command=self.evNovaDavka) FileMenu.add_command(label=u"Otevřít...",font=pismo,underline=0,command=self.evOtevriSoubor) FileMenu.add_command(label=u"Uložit jako...",font=pismo,underline=0,command=self.evUlozDoSouboru) #FileMenu.add_command(label="Save as...",underline=5,) #FileMenu.add_separator() #self.FixedWidthFlag=BooleanVar() FileMenu.add_separator() FileMenu.add_command(label="Konec",font=pismo,underline=1,command=sys.exit) FileMenuButton["menu"]=FileMenu # menu formular: FormMenuButton=Menubutton(MenuFrame,font=pismo,text=u"Formulář",underline=0) FormMenu=Menu(FormMenuButton,tearoff=0) FormMenu.add_command(label=u"Reset vše",font=pismo,underline=0,command=self.evVymazForm) FormMenu.add_command(label=u"Nastav aktuální datum",font=pismo,underline=0,command=self.evNastavDatum) FormMenuButton["menu"]=FormMenu FormMenuButton.pack(side=LEFT,anchor=W) # menu zobrazit: ViewMenuButton=Menubutton(MenuFrame,text=u"Náhled",font=pismo,underline=0) ViewMenu=Menu(ViewMenuButton,tearoff=0) ViewMenu.add_command(label=u"Html náhled (Otevře prohlížeč)...",font=pismo,underline=0,command=self.evNahledHtml) ViewMenu.add_command(label=u"Textový náhled...",font=pismo,underline=0,command=self.evTextNahled) ViewMenu.add_command(label=u"Náhled dat csv...",font=pismo,underline=0,command=self.evRawNahled) #ViewMenu.add_command(label=u"PĹřímá editace dávky",underline=0,command=self.evRawNahled) ViewMenuButton["menu"]=ViewMenu ViewMenuButton.pack(side=LEFT,anchor=W) # menu napoveda: HelpMenuButton=Menubutton(MenuFrame,text=u"Nápověda",font=pismo,underline=0) HelpMenu=Menu(HelpMenuButton,tearoff=0) HelpMenu.add_command(label=u"Nápověda...",font=pismo,underline=0,command=self.evHelpNahled) HelpMenu.add_command(label="O aplikaci...",font=pismo,underline=0,command=evAbout) HelpMenuButton["menu"]=HelpMenu HelpMenuButton.pack(side=RIGHT,anchor=W) # Vytvori formular: self.FormBox=Frame(self.MainFrame) self.FormBox.pack(fill=BOTH,expand=YES) self.okno = Frame(self.FormBox) self.soubor_sekce = Frame(self.FormBox) self.navigace = Frame(self.FormBox) # Pack the top-level widget: self.MainFrame.pack(fill=BOTH,expand=YES) #Udalosti a klavesove zkratky: #self.FormBox.bind_class("Entry","",self.evPridejASmaz) #self.FormBox.bind_class("Entry","",self.evPridejASmaz) self.FormBox.bind_all("",self.evHelpNahled) self.FormBox.bind_all("",self.evRawNahled) self.FormBox.bind_all("",self.evTextNahled) self.FormBox.bind_class("Entry","",lambda e: self.evPosun(-10)) self.FormBox.bind_class("Entry","",lambda e: self.evPosun(10)) #self.FormBox.bind_class("Entry","",lambda e: self.evPosun(-1)) #self.FormBox.bind_class("Entry","",lambda e: self.evPosun(1)) self.FormBox.bind_class("Entry","",lambda e: self.evPosun(1)) self.FormBox.bind_class("Entry","",lambda e: self.evPosun(-1)) self.FormBox.bind_all("",self.evUlozZmeny) self.FormBox.bind_all("",self.evSmazPrikaz) self.FormBox.bind_all("",self.evNovaDavka) def vytvorForm(self): ########Definice Spodni sekce self.lCounter = Label(self.soubor_sekce,font=pismo, text=u"Příkazů v dávce: 0") self.bPridat = Button(self.soubor_sekce,font=pismo, text=u"Přidej do dávky",command=self.evSeznamPrikazu) self.bPridat.bind("",self.evSeznamPrikazu) self.bPridatANovy = Button(self.soubor_sekce,font=pismo, text=u"Přidej a vymaž form.",command=self.evPridejASmaz) self.bUlozitZmeny = Button(self.soubor_sekce,font=pismo, text=u"Uložit změny",command= self.evUlozZmeny) self.bVymazPrikaz = Button(self.soubor_sekce,text=u"Odstraň z dávky",font=pismo, command = self.evSmazPrikaz) ########Definice formulare self.lReference = Label(self.okno, font=pismo, text=u"Reference [max. 16 znaků]:") self.lPriorita = Label(self.okno, font=pismo,text=u"Neurgentní (do 18:00)") self.lSplatnost = Label(self.okno,font=pismo, text="Datum splatnosti [max.8; RRRRMMDD]:",bg='white') self.lUcet = Label(self.okno,font=pismo, text=u"Číslo účtu příjemce [max. 17, včetně pomlčky]:",bg='white') self.lBanka = Label(self.okno,font=pismo,text=u"Kód banky příjemce [max. 4]:",bg='white') self.lCastka = Label(self.okno,font=pismo, text=u'Částka [max 15; oddělovač je tečka]:',bg='white') self.lKonst = Label(self.okno,font=pismo, text=u"Konstantní symbol [max. 10; jen čísla]:") self.lVar = Label(self.okno, font=pismo,text=u"Variabilní symbol [max. 10; jen čísla]:") self.lSpec = Label(self.okno,font=pismo, text=u"Specifický symbol [max. 10; jen čísla]:") self.lAdresa1 = Label(self.okno,font=pismo, text=u"Adresa příjemce 1 [max. 35]:") self.lAdresa2 = Label(self.okno,font=pismo, text=u"Adresa příjemce 2 [max. 35]:") self.lAdresa3 = Label(self.okno,font=pismo, text=u"Adresa příjemce 3 [max. 35]:") self.lAdresa4 = Label(self.okno,font=pismo, text=u"Adresa příjemce 4 [max. 35]:") self.lUcel1 = Label(self.okno,font=pismo, text=u"Účel platby 1 [max. 35]:") self.lUcel2 = Label(self.okno,font=pismo, text=u"Účel platby 2 [max. 35]:") self.lUcel3 = Label(self.okno,font=pismo, text=u"Účel platby 3 [max. 35]:") self.lUcel4 = Label(self.okno,font=pismo, text=u"Účel platby 4 [max. 35]:") self.lMena = Label(self.okno,font=pismo,text=u"Měna příkazu [např. CZK,USD,EUR]:") self.eReference = Entry(self.okno, width = 16,) self.STATUS_PRIORITA = IntVar() self.rbPriorita = Checkbutton(self.okno,variable=self.STATUS_PRIORITA, command = self.evZmena) self.eSplatnost = Entry(self.okno, width = 8,bg = 'white') self.eSplatnost.insert(0,davka.getSplatnost(0)) self.eUcet = Entry(self.okno, width = 17, bg = 'white') self.eBanka = Entry(self.okno, width = 4, bg = 'white') self.eCastka = Entry(self.okno, width = 15,bg = 'white') self.eKonst = Entry(self.okno, width = 10,) self.eVar = Entry(self.okno, width = 10,) self.eSpec = Entry(self.okno, width = 10,) self.eAdresa1 = Entry(self.okno, width = 35,) self.eAdresa2 = Entry(self.okno, width = 35,) self.eAdresa3 = Entry(self.okno, width = 35,) self.eAdresa4 = Entry(self.okno, width = 35,) self.eUcel1 = Entry(self.okno, width = 35,) self.eUcel2 = Entry(self.okno, width = 35,) self.eUcel3 = Entry(self.okno, width = 35,) self.eUcel4 = Entry(self.okno, width = 35,) self.eMena = Entry(self.okno, width = 4,) ########## sekce navigace v davce #self.lRozdelovac = Label(self.navigace, text=u"------------------------------------") self.ePrikazCislo = Entry(self.navigace,highlightthickness=2,insertborderwidth=4, width = 5,) self.ePrikazCislo.insert(0,'0') self.ePrikazCislo.bind("",lambda e: self.evPosun(0)) #self.ePrikazCislo.bind("",lambda: self.evPosun(int(self.ePrikazCislo.get()))) self.b10Zpet = Button(self.navigace, text=u"<< -5",command = lambda: self.evPosun(-5)) self.b1Zpet = Button(self.navigace, text=u"< -1",command = lambda: self.evPosun(-1)) self.b1Vpred = Button(self.navigace, text=u"+1 >",command = lambda: self.evPosun(1)) self.b10Vpred = Button(self.navigace, text=u"+5 >>",command = lambda: self.evPosun(5)) self.bJdiNaPrikaz = Button(self.navigace,font=pismo,text=u"Jít na příkaz", command = lambda: self.evPosun(0)) ## Hlavni sekce - Zobrazeni ############################## self.okno.grid(column = 0, row = 0) self.soubor_sekce.grid(column = 0, row = 1) self.navigace.grid(column = 0, row = 2) ################### # Hlavni ^ self.lReference.grid(column = 0, row = 1, sticky = W) self.lSplatnost.grid(column = 0, row = 3, sticky = W) self.lUcet.grid(column = 0, row = 4, sticky = W) self.lBanka.grid(column = 0, row = 5, sticky = W) self.lCastka.grid(column = 0, row = 6, sticky = W) self.lKonst.grid(column = 0, row = 7, sticky = W) self.lVar.grid(column = 0, row = 8, sticky = W) self.lSpec.grid(column = 0, row = 9, sticky = W) self.lAdresa1.grid(column = 0, row = 10, sticky = W) self.lAdresa2.grid(column = 0, row = 11, sticky = W) self.lAdresa3.grid(column = 0, row = 12, sticky = W) self.lAdresa4.grid(column = 0, row = 13, sticky = W) self.lUcel1.grid(column = 0, row = 14, sticky = W) self.lUcel2.grid(column = 0, row = 15, sticky = W) self.lUcel3.grid(column = 0, row = 16, sticky = W) self.lUcel4.grid(column = 0, row = 17, sticky = W) self.lMena.grid(column = 0, row = 18, sticky = W) self.eReference.grid(column = 1, row = 1, sticky = W) self.eReference.bind("",self.evPridejASmaz) self.rbPriorita.grid(column = 1, row = 2,padx = 2, pady =2,sticky = W ) self.lPriorita.grid(column = 1, row = 2) self.eSplatnost.grid(column = 1, row = 3, sticky = W) self.eSplatnost.bind("",self.evPridejASmaz) self.eUcet.grid(column = 1, row = 4, sticky = W) self.eUcet.bind("",self.evPridejASmaz) self.eBanka.grid(column = 1, row = 5, sticky = W) self.eBanka.bind("",self.evPridejASmaz) self.eCastka.grid(column = 1, row = 6, sticky = W) self.eCastka.bind("",self.evPridejASmaz) self.eKonst.grid(column = 1, row = 7, sticky = W) self.eKonst.bind("",self.evPridejASmaz) self.eVar.grid(column = 1, row = 8, sticky = W) self.eVar.bind("",self.evPridejASmaz) self.eSpec.grid(column = 1, row = 9, sticky = W) self.eSpec.bind("",self.evPridejASmaz) self.eAdresa1.grid(column = 1, row = 10, sticky = W) self.eAdresa1.bind("",self.evPridejASmaz) self.eAdresa2.grid(column = 1, row = 11, sticky = W) self.eAdresa2.bind("",self.evPridejASmaz) self.eAdresa3.grid(column = 1, row = 12, sticky = W) self.eAdresa3.bind("",self.evPridejASmaz) self.eAdresa4.grid(column = 1, row = 13, sticky = W) self.eAdresa4.bind("",self.evPridejASmaz) self.eUcel1.grid(column = 1, row = 14, sticky = W) self.eUcel1.bind("",self.evPridejASmaz) self.eUcel2.grid(column = 1, row = 15, sticky = W) self.eUcel2.bind("",self.evPridejASmaz) self.eUcel3.grid(column = 1, row = 16, sticky = W) self.eUcel3.bind("",self.evPridejASmaz) self.eUcel4.grid(column = 1, row = 17, sticky = W) self.eUcel4.bind("",self.evPridejASmaz) self.eMena.grid(column = 1, row = 18, sticky = W) self.eMena.bind("",self.evPridejASmaz) ##################################################### # Sekce soubor self.lCounter.grid(column = 3, row = 0) ############# #self.bOtevrit.grid(column = 0, row = 1,pady = 6,sticky = E) self.bPridat.grid(column = 0, row = 1,pady = 6,)#sticky = E) self.bPridatANovy.grid(column = 1, row = 1,pady = 6,)# sticky = W) self.bUlozitZmeny.grid(column = 2, row = 1,pady = 6,) self.bVymazPrikaz.grid(column = 3, row = 1, pady = 6) ############# # Sekce navigace self.b10Zpet.grid(column = 1, row = 0,pady = 2,)#sticky = W) self.b1Zpet.grid(column = 2, row = 0,pady = 2,)#sticky = W) self.ePrikazCislo.grid(column = 3, row = 0,pady = 2) self.b1Vpred.grid(column = 4, row = 0,pady = 2,)#sticky = E) self.b10Vpred.grid(column = 5, row = 0,pady = 2,)#sticky = E) self.bJdiNaPrikaz.grid(column = 3,row = 1, pady = 2) def evUlozZmeny(self,event=None): VyzvaUlozPrikaz(root,'Pozor!') def evSmazPrikaz(self,event=None): VyzvaSmazatPrikaz(root,'Pozor!') #showwarning('Upozornění',message=u'Takový příkaz neexistuje') #self.ePrikazCislo.insert(0,cislo + 1) def evZmena(self): if self.STATUS_PRIORITA.get() == 1: self.lPriorita.configure(text = u'Urgentní (do 13:20)') elif self.STATUS_PRIORITA.get() == 0: self.lPriorita.configure(text = u'Neurgentní (do 18:00)') def evVymazForm(self): """Reset formulare""" self.eBanka.delete(0,END) self.eMena.delete(0,END) self.eReference.delete(0,END) self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.getSplatnost(0)) self.eUcet.delete(0,END) self.eCastka.delete(0,END) self.eKonst.delete(0,END) self.eVar.delete(0,END) self.eSpec.delete(0,END) self.eAdresa1.delete(0,END) self.eAdresa2.delete(0,END) self.eAdresa3.delete(0,END) self.eAdresa4.delete(0,END) self.eUcel1.delete(0,END) self.eUcel2.delete(0,END) self.eUcel3.delete(0,END) self.eUcel4.delete(0,END) def evPridejASmaz(self,event=None): """prida formular do davky a vymaze data""" pom = davka.pocet #potrebuji overit, zda se pricte platba do davky #podle toho se vymaze formular self.evSeznamPrikazu() if pom < davka.pocet: self.evVymazForm() self.ePrikazCislo.delete(0,END) self.ePrikazCislo.insert(0,davka.pocet) #return self.eReference def evPosun(self,kolik=1,event=None): try: pom = self.ePrikazCislo.get() pozadovany = int(pom) + kolik if davka.prikazy.has_key(pozadovany) == 1: self.evVymazForm() self.eReference.insert(0,davka.getPrikaz(pozadovany)[4]) self.eUcet.insert(0,davka.getPrikaz(pozadovany)[5]) self.eBanka.insert(0,davka.getPrikaz(pozadovany)[6]) self.eCastka.insert(0,davka.getPrikaz(pozadovany)[1]) self.eKonst.insert(0,davka.getPrikaz(pozadovany)[11]) self.eVar.insert(0,davka.getPrikaz(pozadovany)[12]) self.eSpec.insert(0,davka.getPrikaz(pozadovany)[13]) self.eAdresa1.insert(0,davka.getPrikaz(pozadovany)[7]) self.eAdresa2.insert(0,davka.getPrikaz(pozadovany)[8]) self.eAdresa3.insert(0,davka.getPrikaz(pozadovany)[9]) self.eAdresa4.insert(0,davka.getPrikaz(pozadovany)[10]) self.eUcel1.insert(0,davka.getPrikaz(pozadovany)[14]) self.eUcel2.insert(0,davka.getPrikaz(pozadovany)[15]) self.eUcel3.insert(0,davka.getPrikaz(pozadovany)[16]) self.eUcel4.insert(0,davka.getPrikaz(pozadovany)[17]) self.eMena.insert(0,davka.getPrikaz(pozadovany)[2]) self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.getPrikaz(pozadovany)[0]) self.ePrikazCislo.delete(0,END) self.ePrikazCislo.insert(0,pozadovany) #print davka.getPrikaz(pozadovany) if davka.getPrikaz(pozadovany)[3] == '1': self.STATUS_PRIORITA.set(1) else: self.STATUS_PRIORITA.set(0) self.evZmena() else: showwarning(u'Upozornění',message=u'Takový příkaz neexistuje') self.evVymazForm() self.eReference.insert(0,davka.getPrikaz(davka.posledni)[4]) self.eUcet.insert(0,davka.getPrikaz(davka.posledni)[5]) self.eBanka.insert(0,davka.getPrikaz(davka.posledni)[6]) self.eCastka.insert(0,davka.getPrikaz(davka.posledni)[1]) self.eKonst.insert(0,davka.getPrikaz(davka.posledni)[11]) self.eVar.insert(0,davka.getPrikaz(davka.posledni)[12]) self.eSpec.insert(0,davka.getPrikaz(davka.posledni)[13]) self.eAdresa1.insert(0,davka.getPrikaz(davka.posledni)[7]) self.eAdresa2.insert(0,davka.getPrikaz(davka.posledni)[8]) self.eAdresa3.insert(0,davka.getPrikaz(davka.posledni)[9]) self.eAdresa4.insert(0,davka.getPrikaz(davka.posledni)[10]) self.eUcel1.insert(0,davka.getPrikaz(davka.posledni)[14]) self.eUcel2.insert(0,davka.getPrikaz(davka.posledni)[15]) self.eUcel3.insert(0,davka.getPrikaz(davka.posledni)[16]) self.eUcel4.insert(0,davka.getPrikaz(davka.posledni)[17]) self.eMena.insert(0,davka.getPrikaz(davka.posledni)[2]) self.eSplatnost.delete(0,END) if davka.getPrikaz(davka.posledni)[3] == '1': self.STATUS_PRIORITA.set(1) else: self.STATUS_PRIORITA.set(0) self.eSplatnost.insert(0,davka.getPrikaz(davka.posledni)[0]) self.ePrikazCislo.delete(0,END) self.ePrikazCislo.insert(0,davka.posledni) except TypeError: pass except ValueError: showerror(u"Chyba", u"Chybná hodnota v poli") self.ePrikazCislo.delete(0,END) self.ePrikazCislo.insert(0,davka.posledni) return def evNastavDatum(self): """Nastavi aktualni bankovni datum do formulare""" self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.getSplatnost(0)) def evSeznamPrikazu(self,event=None): if self.STATUS_PRIORITA.get() == 1: priorita = '1' else: priorita = '0' prikaz = [self.eSplatnost.get(), self.eCastka.get(),self.eMena.get(),priorita, self.eReference.get(),self.eUcet.get(),self.eBanka.get(), self.eAdresa1.get(),self.eAdresa2.get(),self.eAdresa3.get(), self.eAdresa4.get(),self.eKonst.get(),self.eVar.get(), self.eSpec.get(),self.eUcel1.get(),self.eUcel2.get(),self.eUcel3.get(),self.eUcel4.get()] try: davka.pridej(prikaz) self.lCounter.configure(text=u"Příkazů v dávce: %s" % davka.pocet) self.ePrikazCislo.delete(0,END) self.ePrikazCislo.insert(0,davka.pocet) return self.eReference.focus_set() except 'stara_splatnost': showwarning('Chyba',message=u'Staré datum splatnosti. \n Do formuláře bude nastaveno nejbližąí možné datum') self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.getSplatnost(priorita)) except 'nepracovni_den': showwarning('Chyba',message=u'Splatnost připadá na nepracovní den. \n Do formuláře bude nastaveno nejbližąí možné datum') self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.najdiPracovniDen(1,int(prikaz[0][:4]), int(prikaz[0][4:6]),int(prikaz[0][6:]))) except 'urgent_pozde': showwarning('Varovani',message=u'Urgentní platbu s aktualním datumem lze provést jen do 13:20!') self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.getSplatnost(priorita)) except 'neurgentni_pozde': showwarning('Varovani',message=u'Platbu s aktualním datumem lze provést jen do 18:00!') self.eSplatnost.delete(0,END) self.eSplatnost.insert(0,davka.getSplatnost(priorita)) except MojeChyby,chyba: showwarning('Chyba',message=chyba[0]) if chyba[1] == 1: self.eReference.focus_set() self.eReference.selection_range(0,END) if chyba[1] == 3: self.eUcet.focus_set() self.eUcet.selection_range(0,END) if chyba[1] == 4: self.eBanka.focus_set() self.eBanka.selection_range(0,END) if chyba[1] == 5: self.eCastka.focus_set() self.eCastka.selection_range(0,END) if chyba[1] in (6,7): self.eKonst.focus_set() self.eKonst.selection_range(0,END) if chyba[1] == 8: self.eVar.focus_set() self.eVar.selection_range(0,END) if chyba[1] == 9: self.eSpec.focus_set() self.eSpec.selection_range(0,END) if chyba[1] == 10: self.eAdresa1.focus_set() self.eAdresa1.selection_range(0,END) if chyba[1] == 11: self.eUcel1.focus_set() self.eUcel1.selection_range(0,END) if chyba[1] == 12: self.eMena.focus_set() self.eMena.selection_range(0,END) except ValueError: showwarning('Chyba',message=u'Některá z hodnot formuláře je chybná') def evOtevriSoubor(self): try: soubor_davka = askopenfile(mode = 'r',filetypes = [('Davky','.csv')],title = \ u'Otevřít Dávku') except IOError: showerror(u"Chyba při otevření", u"Lituji, ale soubor nelze momentálně otevřít") return if soubor_davka: lines = [] soubor = soubor_davka.readlines() for i in range(len(soubor)): lines.append(string.split(soubor[i],',')) ##print lines else: return i = 0 prepinac = 0 #kontrolni promenna pro registraci vyskytu stare splatnosti uniIndex = (4,7,8,9,10,14,15,16,17) #indexy textovych poli, ktere budu prevadet na utf for j in lines: #validace otevirane davky i += 1 if j in (['\n'],['\r\n']): continue try: for k in uniIndex: j[k] = unicode(j[k],'iso-8859-2') if j[-1][-1] == '\n': j[-1] = j[-1][:-1] davka.overPrikaz(j) except IndexError: showwarning('Varovani',message=u'Problém na řádku %s. \nDávka nemá správný formát' % (i)) soubor_davka.close() return except MojeChyby,chyba: showwarning('Varovani',message=u'řádek %s: %s' % (i,chyba[0])) soubor_davka.close() return except 'neurgentni_pozde': if j[3] == '': j[3] = '0' j[0] = davka.getSplatnost(int(j[3])) try: davka.overPrikaz(j) except MojeChyby,chyba: showwarning('Varovani',message=u'řádek %s: %s' % (i,chyba[0])) soubor_davka.close() return except 'urgent_pozde': j[0] = davka.getSplatnost(int(j[3])) try: davka.overPrikaz(j) except MojeChyby,chyba: showwarning('Varovani',message=u'řádek %s: %s' % (i,chyba[0])) soubor_davka.close() return except 'stara_splatnost': #stare datumy automaticky precisluji if j[3] == '': j[3] = '0' j[0] = davka.getSplatnost(int(j[3])) if prepinac == 0: prepinac = 1 showinfo(title= 'Informace', message=u'Příkazy se starou splatností budou nastaveny na nejbližší možnou splatnost') try: davka.overPrikaz(j) except MojeChyby,chyba: showwarning('Varovani',message=u'řádek %s: %s' % (i,chyba[0])) soubor_davka.close() return for j in lines: if j in (['\n'],['\r\n']): continue davka.pridej(j,kontrola=0) soubor_davka.close() self.lCounter.configure(text=u"Příkazů v dávce: %s" % davka.pocet) self.ePrikazCislo.delete(0,END) self.ePrikazCislo.insert(0,davka.pocet) self.evPosun(0) def evUlozDoSouboru(self): try: if davka.pocet == 0: showwarning('Chyba',message=u'žádný příkaz k uložení') return else: soubor = asksaveasfile(mode='w',defaultextension='.csv', filetypes = [('Davky','.csv')],title = u"Ulož Dávku") if soubor: data = davka.getcsv() #+ '\n' soubor.write(data.encode('iso-8859-2')) soubor.close() davka.__init__() app.lCounter.configure(text=u"Příkazů v dávce: %s" % davka.pocet) app.evVymazForm() app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.pocet) else: return 0 except IOError: showerror(u"Chyba při ukládání", u"Lituji, ale soubor nelze momentálně uložit") return def evNovaDavka(self,event=None): if davka.pocet != 0: vyzva = VyzvaNovaDavka(root,title="Pozor!") #vyzva.bind("",vyzva.ok()) else: pass def evTextNahled(self,event=None): nahled = TextNahled(root,title=u"Náhled") def evNahledHtml(self): stranka = davka.getHtml().encode('iso-8859-2') try: #if os.name == "nt": # cesta = "\\".join((os.getcwd(),"nahled.htm")) # print cesta # f = file(cesta,'w') #else: f = file('nahled.htm','w') f.write(stranka) f.close() webbrowser.open('nahled.htm') time.sleep(2)#to je kvuli firefoxu, ktery nestaci otevrit #html nahled vcas pred os remove. Na pomalych PC #bude asi prodleva vyssi... os.remove('nahled.htm') except IOError: showwarning(u"Chyba při generování náhledu") return def evHelpNahled(self,event=None): help = Help(root,title=u"Nápověda") def evRawNahled(self,event=None): raw = RawNahled(root,title=u"Náhled data") class VyzvaNovaDavka(Dialog): global pismo def body(self,rodic): Label(rodic,font=pismo, text=u"Data v dávce budou ztracena! \n\nChcete pokračovat?").grid(row=0) def ok(self,event=None): #urcite neni vhodne davat handlery primo do dialogu, ale az budou upozorneni #vypinatelna, bude treba je dal primo do gui tridy davka.__init__() app.lCounter.configure(text=u"Příkazů v dávce: %s" % davka.pocet) app.evVymazForm() app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.pocet) self.parent.focus_set() self.destroy() class VyzvaUlozPrikaz(Dialog): global pismo def __init__(self,rodic,title=None): app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) Dialog.__init__(self,rodic,title=None) def body(self,rodic): Label(rodic,font=pismo, text=u"Údaje v příkazu budou změněny. \n\nChcete pokračovat?").pack() def ok(self,event=None): self.parent.focus_set() self.destroy() cislo = davka.posledni #int(app.ePrikazCislo.get()) if app.STATUS_PRIORITA.get() == 1: priorita = '1' else: priorita = '0' prikaz = [app.eSplatnost.get(), app.eCastka.get(),app.eMena.get(),priorita, app.eReference.get(),app.eUcet.get(),app.eBanka.get(), app.eAdresa1.get(),app.eAdresa2.get(),app.eAdresa3.get(), app.eAdresa4.get(),app.eKonst.get(),app.eVar.get(), app.eSpec.get(),app.eUcel1.get(),app.eUcel2.get(),app.eUcel3.get(),app.eUcel4.get()] if prikaz == davka.getPrikaz(cislo): showinfo(title= 'Informace',message=u'Nedošlo k žádné změně') elif davka.pocet == 0: showinfo(title= 'Informace',message=u'Není co opravovat, příkaz zatím neexistuje...') else: try: davka.oprav(prikaz,davka.posledni) showinfo(title= 'Informace',message=u'Změny v platbě byly uloženy') app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) except 'stara_splatnost': showwarning('Chyba',message=u'Staré datum splatnosti. \n Do formuláře bude nastaveno nejbližąí možné datum') app.eSplatnost.delete(0,END) app.eSplatnost.insert(0,davka.getSplatnost(priorita)) except 'nepracovni_den': showwarning('Chyba',message=u'Splatnost připadá na nepracovní den. \n Do formuláře bude nastaveno nejbližąí možné datum') app.eSplatnost.delete(0,END) app.eSplatnost.insert(0,davka.najdiPracovniDen(1,int(prikaz[0][:4]), int(prikaz[0][4:6]),int(prikaz[0][6:]))) except 'urgent_pozde': showwarning('Varovani',message=u'Urgentní platbu s aktualním datumem lze provést jen do 13:20!') app.eSplatnost.delete(0,END) app.eSplatnost.insert(0,davka.getSplatnost(priorita)) except 'neurgentni_pozde': showwarning('Varovani',message=u'Platbu s aktualním datumem lze provést jen do 18:00!') app.eSplatnost.delete(0,END) app.eSplatnost.insert(0,davka.getSplatnost(priorita)) except MojeChyby,chyba: showwarning('Chyba',message=chyba[0]) if chyba[1] == 1: app.eReference.focus_set() app.eReference.selection_range(0,END) if chyba[1] == 3: app.eUcet.focus_set() app.eUcet.selection_range(0,END) if chyba[1] == 4: app.eBanka.focus_set() app.eBanka.selection_range(0,END) if chyba[1] == 5: app.eCastka.focus_set() app.eCastka.selection_range(0,END) if chyba[1] in (6,7): app.eKonst.focus_set() app.eKonst.selection_range(0,END) if chyba[1] == 8: app.eVar.focus_set() app.eVar.selection_range(0,END) if chyba[1] == 9: app.eSpec.focus_set() app.eSpec.selection_range(0,END) if chyba[1] == 10: app.eAdresa1.focus_set() app.eAdresa1.selection_range(0,END) if chyba[1] == 11: app.eUcel1.focus_set() app.eUcel1.selection_range(0,END) if chyba[1] == 12: app.eMena.focus_set() app.eMena.selection_range(0,END) return except ValueError: showwarning('Chyba',message=u'Některá z hodnot formuláře je chybná') return app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) app.eReference.focus_set() class VyzvaSmazatPrikaz(Dialog): global pismo def __init__(self,rodic,title=None): app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) Dialog.__init__(self,rodic,title=None) def body(self,rodic): Label(rodic,font=pismo, text=u"Příkaz bude odstraněn! \n\nChcete pokračovat?").pack() def ok(self,event=None): self.parent.focus_set() self.destroy() app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) try: cislo = davka.posledni #int(app.ePrikazCislo.get()) except ValueError: showerror(u"Chyba", u'Chybná hodnota v poli "číslo příkazu"') app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) return if cislo <= 0: showerror(u"Chyba", u'Číslo v poli "číslo příkazu" musí být větší než 0') app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) return if cislo > davka.pocet: showerror(u"Chyba", u"Číslo příkazu není v rozsahu počtu příkazů") app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,davka.posledni) return pom = davka.pocet davka.smazPrikaz(cislo) app.evVymazForm() app.eSplatnost.delete(0,END) app.lCounter.configure(text=u"Příkazů v dávce: %s" % davka.pocet) if pom == cislo: #posledni polozka showinfo(title= 'Informace', message=u'Platba č. %s byla smazána' % (cislo)) cislo -= 1 else: showinfo(title= 'Informace', message=u'Platba č. %s byla smazána a její místo v pořadí nahradila platba č. %s' % (cislo,cislo + 1)) app.ePrikazCislo.delete(0,END) app.ePrikazCislo.insert(0,cislo) app.eReference.focus_set() try: app.eSplatnost.insert(0,davka.getPrikaz(cislo)[0]) app.eReference.insert(0,davka.getPrikaz(cislo)[4]) app.eUcet.insert(0,davka.getPrikaz(cislo)[5]) app.eBanka.insert(0,davka.getPrikaz(cislo)[6]) app.eCastka.insert(0,davka.getPrikaz(cislo)[1]) app.eKonst.insert(0,davka.getPrikaz(cislo)[11]) app.eVar.insert(0,davka.getPrikaz(cislo)[12]) app.eSpec.insert(0,davka.getPrikaz(cislo)[13]) app.eAdresa1.insert(0,davka.getPrikaz(cislo)[7]) app.eAdresa2.insert(0,davka.getPrikaz(cislo)[8]) app.eAdresa3.insert(0,davka.getPrikaz(cislo) [9]) app.eAdresa4.insert(0,davka.getPrikaz(cislo)[10]) app.eUcel1.insert(0,davka.getPrikaz(cislo)[14]) app.eUcel2.insert(0,davka.getPrikaz(cislo)[15]) app.eUcel3.insert(0,davka.getPrikaz(cislo)[16]) app.eUcel4.insert(0,davka.getPrikaz(cislo)[17]) app.eMena.insert(0,davka.getPrikaz(cislo)[2]) except TypeError: pass class Ziba: """ Cely prikaz vypada takto: [Splatnost[0],Castka[1],Mena[2],Priorita[3],Reference[4],Ucet prijemce[5],Banka prijemce[6], Jmeno a adresa prijemce 1[7],Jmeno a adresa prijemce 2[8],Jmeno a adresa prijemce 3[9], Jmeno a adresa prijemce 4[10],ks[11],vs[12],ss[13],ucel platby 1[14],ucel platby 2[15],ucel platby 3[16], ucel platby 4[17]""" def __init__(self): self.prikaz = [None]*18 self.prikazy = {} self.pocet = 0 self.posledni = 0 #nastavuje se v getPrikaz() def pridej(self,prikaz,kontrola=1): #for i in prikaz: # i.encode('iso8859-2') if self.pocet == 0: self.posledni = 1 #To vyplynulo ze situace, protoze v evUlozZmeny nastavuji do #ePrikazCislo prave tuto hodnotu posledniho vyzadaneho prikazu if len(prikaz) > 18: del prikaz[18:] if kontrola == 0: #aby se pri importu nedelala kontrola znovu self.pocet += 1 self.prikazy[self.pocet] = prikaz self.posledni = self.pocet return if self.__kontrola(prikaz) == 1: self.pocet += 1 self.prikazy[self.pocet] = prikaz self.posledni = self.pocet else: #print 'nekde je chyba' return 0 def overPrikaz(self,prikaz): """Overi, zda je prikaz validni, ale nezaradiho do davky. Toto pouzivam pri otevirani souboru s davkou""" if self.__kontrola(prikaz) == 1: return True def smazPrikaz(self,cislo = None): if cislo: kopie = self.prikazy.copy() #nejprve zkopiruji slovnik del self.prikazy[cislo] #vymazeme zaznam self.pocet -= 1 klice = kopie.keys() klice.sort() for x in klice: if x > cislo: self.prikazy[x-1] = kopie[x] del self.prikazy[x] #print self.prikazy def oprav(self,prikaz,prikaz_cislo=None): if prikaz_cislo: if self.__kontrola(prikaz) != 0: self.prikazy[prikaz_cislo] = prikaz def getPrikaz(self,cislo=1): """vypise prikaz(list) dle poradi v davce""" self.posledni = cislo #stavova promenna, abych vedel, ktery prikaz byl naposledy vyzadan try: return self.prikazy[cislo] except KeyError: print 'hodnota neexistuje' def getcsv(self): """vrati prikazy v davce formou csv radku, oddelovac je carka""" davka = '' for x in self.prikazy.values(): davka += string.join(x,',') #if os.name == 'posix' and '\n' != davka[-1]: davka += '\n' #elif (os.name == 'nt') and ('\r\n' != davka[-2:]): # davka += '\r\n' return davka def getHtml(self): hlavicka = u""" Přehled příkazů v dávce """ paticka = "
PořadíReferenceUrgentUčet příjemceČástka KSVSSSSplatnost
" tabulka = '' for x in self.prikazy.items(): if x[1][3] == '1': urgent = 'ano' else: urgent = 'ne' tabulka += u""" %s. %s %s %s %s %s %s %s %s.%s.%s\n """ % (x[0],x[1][4],urgent, x[1][5],x[1][1],x[1][11],x[1][12],x[1][13],x[1][0][6:],x[1][0][4:6],x[1][0][:4]) return hlavicka + tabulka + paticka def getText(self): suma = 0.0 text = '' for x in self.prikazy.items(): suma += float(x[1][1]) if x[1][3] == '1': urgent = 'ano' else: urgent = 'ne' text += u"%3s.|%16s| %3s |%17s|%15s|%10s|%10s|%10s| %s.%s.%s\n" % (x[0],x[1][4],urgent, x[1][5],x[1][1],x[1][11],x[1][12],x[1][13],x[1][0][6:],x[1][0][4:6],x[1][0][:4]) hlavicka = u"""Počet příkazů: %s Celková suma: %s Poř.| Reference | Urg.| Učet příjemce | Částka | KS | VS | SS | Splatnost ========================================================================================================= """ % (davka.pocet,suma) return hlavicka + text def najdiPracovniDen(self,stav,rrrr,mm,dd,den=86400): """stav: 0 - pro pracovni den; 1 - pro svatek. """ #test dne na pracovni klid, pokud vyhovuje, zkousi dalsi den #hledame dopredu,dokud nenalezneme prvni mozny pracovni den sec = time.mktime((rrrr,mm,dd,) + time.localtime()[3:]) while stav == 1: sec += den rrrr,mm,dd = time.localtime(sec)[:3] stav = self.nepracovniDen(rrrr,mm,dd) return time.strftime('%Y%m%d',time.localtime(sec)) def nepracovniDen(self,rrrr,mm,dd): """Vrati 1 kdyz je statni svatek nebo vikend.""" datum = (mm,dd) svatky = [(1,1),(5,1),(5,8),(7,5),(7,6), (9,28),(10,28),(11,17),(12,24),(12,25),(12,26)] svatky.append(self.velikonoce(rrrr)) vikend = (5,6) if datum in svatky or calendar.weekday(rrrr,mm,dd) in vikend: return 1 else: return 0 def velikonoce(self,year): u"""Oudinův algoritmus pro výpočet velikonoční neděle. Platí pro celé období Gregoriánského kalendáře, tj. od roku 1582. Zdroj: http://www.smart.net/~mmontes/oudin.html""" century = year/100 G = year % 19 K = (century - 17)/25 I = (century - century/4 - (century - K)/3 + 19*G + 15) % 30 I = I - (I/28)*(1 - (I/28)*(29/(I + 1))*((21 - G)/11)) J = (year + year/4 + I + 2 - century + century/4) % 7 L = I - J EasterMonth = 3 + (L + 40)/44 EasterDay = L + 28 - 31*(EasterMonth/4) pondeli = time.mktime((year,EasterMonth,EasterDay,) + time.localtime()[3:]) + 86400 return time.localtime(pondeli)[1:3] def getSplatnost(self,priorita,den=86400): """Vraci string se spravnym datumem splatnosti""" mezni_hodina = (17,55) mezni_hodina_urgent = (13,15) aktualni_cas = time.localtime()[3:5] sec = 0 #prave ted rrrr,mm,dd = time.localtime(time.time())[0:3] stav = self.nepracovniDen(rrrr,mm,dd) if priorita == '': priorita = '0' if int(priorita) == 0:#Neurgentni if aktualni_cas > mezni_hodina:#uz je jakoby dalsi den sec += den rrrr,mm,dd = time.localtime(time.time() + sec)[0:3] stav = self.nepracovniDen(rrrr,mm,dd) return self.najdiPracovniDen(stav,rrrr,mm,dd) else: return self.najdiPracovniDen(stav,rrrr,mm,dd) elif int(priorita) == 1: #urgentni if aktualni_cas > mezni_hodina_urgent:#uz je jakoby dalsi den sec += den rrrr,mm,dd = time.localtime(time.time() + sec)[0:3] stav = self.nepracovniDen(rrrr,mm,dd) return self.najdiPracovniDen(stav,rrrr,mm,dd) else: return self.najdiPracovniDen(stav,rrrr,mm,dd) def __kontrola(self,prikaz): """zkontroluje jednotlive polozky v poli prikaz""" def mod11(ucet): """Overi cislo uctu (string) na formalni spravnost dle algorimu modulo11.""" vahy = (6,3,7,9,10,5,8,4,2,1) mod = 0 vzor = re.compile(r"((?P^\d{2,6})[- ])?(?P\d{2,10}$)") vysledek = vzor.match(ucet) if vysledek: predcisli = vysledek.group('predcisli') cislo = vysledek.group('cislo') if predcisli: for i in xrange(-1,-len(predcisli)+(-1),-1): mod += int(predcisli[i]) * vahy[i] for i in xrange(-1,-len(cislo)+(-1),-1): mod += int(cislo[i]) * vahy[i] if mod % 11 != 0: return 0 elif mod == 0: return 0 else: return 1 else: return 0 def kontrolaKoduBanky(kod_banky): """Overeni platneho kodu banky""" bank_code = ('0100','0300','0400','0600','0710','0800', '2010','2100','2400','2600','2700', '3300','3500', '4000','4300', '5000','5400','5500','5800', '6000','6100','6200','6300','6700','6800', '7910','7940','7950','7960','7970','7980','7990', '8030','8040','8060','8070','8090','8150' ) if kod_banky not in bank_code: #print 'neplatny kod banky' return 0 def kontrolaCastky(castka): if re.match(r"^\d{1,12}(\.\d)?\d?$|^\d{1,15}$",castka): return 1 else: #print 'chybna castka' return 0 def kontrolaDatumu(datum): """kontroluje datum na format rrrrddmm""" if re.match(r"^\d{8}$",datum): return 1 else: #print 'chybne datum' return 0 def kontrolaSplatnosti(datum): "overuje spravnost datumu" if (int(datum[:4]),int(datum[4:6]),int(datum[6:])) < time.localtime(time.time())[0:3]: #print 'stara splatnost' return 4 if self.nepracovniDen(int(datum[:4]),int(datum[4:6]),int(datum[6:])) == 1: #print 'nepracovni den' return 5 if (int(datum[:4]),int(datum[4:6]),int(datum[6:])) == time.localtime(time.time())[0:3]: #testuje jestli je dnes splatnost = self.getSplatnost(int(prikaz[3])) if splatnost != prikaz[0] and prikaz[3] == '1': return 2 elif splatnost != prikaz[0] and prikaz[3] == '0': return 3 def kontrolaMeny(mena): bank_meny = ('','AUD','CAD','CHF','CZK','DKK','EUR', 'GBP','HRK','HUF','JPY','NOK','NZD', 'PLN','SEK','SKK','USD','XDR') if mena not in bank_meny: #print 'chybna mena' return 0 def konstantniSymbol(ks): x = ('5','6','51','1178','2178','3178') if ks in x: #print 'chybny ks' return 0 def kontrolaSymbolu(*symbol): for x in symbol: if re.match(r"^\d{0,10}$",x): continue else: #print 'chybny symbol' return 0 return 1 def kontrolaCarky(pole): if re.match(r"^[^,]{0,35}$",pole): return 1 else: #print 'chybny popis' return 0 def kontrolaRef(pole): if re.match(r"^[^,]{0,16}$",pole): return 1 else: #print 'chybna reference' return 0 #nasleduje kontrola jednotlivych polozek v seznamu prikaz: #if '\n' in prikaz[17]: # prikaz[17] = prikaz[17][:-1] if kontrolaRef(prikaz[4]) == 0: raise MojeChyby("Chyba v poli reference \n(max.16pozic, nesmi obsahovat carku)",1) if kontrolaDatumu(prikaz[0]) == 0: raise MojeChyby('Chybny format datumu',2) if kontrolaSplatnosti(prikaz[0]) == 2: raise 'urgent_pozde' if kontrolaSplatnosti(prikaz[0]) == 3: raise 'neurgentni_pozde' if kontrolaSplatnosti(prikaz[0]) == 4: raise 'stara_splatnost' if kontrolaSplatnosti(prikaz[0]) == 5: raise 'nepracovni_den' if mod11(prikaz[5]) == 0: raise MojeChyby("Chybny format uctu",3) if kontrolaKoduBanky(prikaz[6]) == 0: raise MojeChyby('Chybny kod banky',4) if kontrolaCastky(prikaz[1]) == 0: raise MojeChyby('Chybna castka',5) if kontrolaSymbolu(prikaz[11]) == 0: raise MojeChyby('Chybny Konstantni sym.',6) if konstantniSymbol(prikaz[11]) == 0: raise MojeChyby('Nepovoleny Konstantni sym.',7) if kontrolaSymbolu(prikaz[12]) == 0: raise MojeChyby('Chybny Variabilni sym.',8) if kontrolaSymbolu(prikaz[13]) == 0: raise MojeChyby('Chybny Specificky sym.',9) for x in prikaz[7:11]: #kontrola adresy if kontrolaCarky(x) == 0: raise MojeChyby('Carka v poli Adresa nebo prilis mnoho znaku (max. 35)',10) for x in prikaz[14:]: #kontrola ucelu if kontrolaCarky(x) == 0: raise MojeChyby('Carka v poli Ucel nebo prilis mnoho znaku (max. 35)',11) if kontrolaMeny(prikaz[2]) == 0: raise MojeChyby('Chybna mena prikazu',12) return 1 #navratova hodnota pozitivni kontroly class MojeChyby(Exception): pass davka = Ziba() root = Tk() root.title(u"Dávkovač 0.9.5 Beta") app = Gui(root) root.mainloop()