def __init__(self, *args, **kwargs): k = 'allow_empty_esercizio' if k in kwargs: self.allow_empty_esercizio = kwargs.pop(k) awch.Choice.__init__(self, *args, **kwargs) reg = adb.DbTable(bt.TABNAME_CONTAB_H, 'reg', fields=None) reg.Synthetize() reg.AddGroupOn('esercizio') reg.AddOrder('esercizio') #, adb.ORDER_DESCENDING) reg.Retrieve() self.dbreg = reg self.dbprg = adb.DbTable(bt.TABNAME_CFGPROGR, 'progr') self.dbese = ProgrEsercizio() self.esercizi = list() self.ReadEsercizi()
def __init__(self, *args, **kwargs): aw.Panel.__init__(self, *args, **kwargs) self.caudisp = [("codice", "Cod."), ("descriz", "Causale")] self.caurs = [] self.cauid = None self.caudes = None self.cauconfig = None self.oneregonly_id = None self.canins = True self.canedit = True self.candelete = True self.editing = False self.totdare = 0 self.totavere = 0 self.id_pdcpa = None self.modified = False self.newreg = False self.reg_id = None self.reg_esercizio = None self.reg_cau_id = None self.reg_cau_tipo = None self.reg_datreg = None self.reg_datdoc = None self.reg_numdoc = None self.reg_regiva_id = None self.reg_numiva = None self.reg_modpag_id = None self.reg_regiva_cod = None self.reg_regiva_des = None self.reg_st_regiva = None self.reg_st_giobol = None self.reg_nocalciva = None self._grid_dav = None # grid dare-avere self.dbprog = ProgrStampaGiornale() self.dbprom = ProgrStampaMastri() self._auto_cod_tippdc_pdciva = "I" # DA AUTOMATIZZARE!!! self._auto_cod_tippdc_pdcric = "R" # DA AUTOMATIZZARE!!! self._auto_cod_tippdc_pdcspe = "S" # DA AUTOMATIZZARE!!! cfg.CfgCausale.__init__(self) auto.CfgAutomat.__init__(self) progr.CfgProgr.__init__(self) self._Auto_AddKeysContab() self._Progr_AddKeysContab(Env.Azienda.Esercizio.year) # self.cfgctb = cfg.CfgContab() self.dbese = ProgrEsercizio() self.regrsb = [] # recordset dettaglio self.status = None self.cautipo = None self.caufilt = None self.pancaus = None self.panhead = None self.panbody = None self.InitPanelCaus() self.InitPanelHead() self.InitPanelBody() wdr.DialogFunc(self, True) self.controls = awc.util.DictNamedChildrens(self) c = self.controls["butattach"] c.SetScope("contab_h") c.SetAutoText(self.controls["autonotes"]) c.SetSpyPanel(self.FindWindowByName("attachspy")) butnew = self.controls["button_new"] butsrc = self.controls["button_search"] butend = self.controls["button_end"] butmod = self.controls["button_modify"] butquit = self.controls["button_quit"] butdel = self.controls["button_delete"] self.InitCausale() self.__postInit() self.Bind(wx.EVT_BUTTON, self.OnRegNew, butnew) self.Bind(wx.EVT_BUTTON, self.OnRegSearch, butsrc) self.Bind(wx.EVT_BUTTON, self.OnRegEnd, butend) self.Bind(wx.EVT_BUTTON, self.OnRegModify, butmod) self.Bind(wx.EVT_BUTTON, self.OnRegQuit, butquit) self.Bind(wx.EVT_BUTTON, self.OnRegDelete, butdel) self.Bind(wx.EVT_SIZE, self.OnResize)
class ContabPanel(aw.Panel, cfg.CfgCausale, auto.CfgAutomat, progr.CfgProgr): """ Data entry di contabilità. """ def __init__(self, *args, **kwargs): aw.Panel.__init__(self, *args, **kwargs) self.caudisp = [("codice", "Cod."), ("descriz", "Causale")] self.caurs = [] self.cauid = None self.caudes = None self.cauconfig = None self.oneregonly_id = None self.canins = True self.canedit = True self.candelete = True self.editing = False self.totdare = 0 self.totavere = 0 self.id_pdcpa = None self.modified = False self.newreg = False self.reg_id = None self.reg_esercizio = None self.reg_cau_id = None self.reg_cau_tipo = None self.reg_datreg = None self.reg_datdoc = None self.reg_numdoc = None self.reg_regiva_id = None self.reg_numiva = None self.reg_modpag_id = None self.reg_regiva_cod = None self.reg_regiva_des = None self.reg_st_regiva = None self.reg_st_giobol = None self.reg_nocalciva = None self._grid_dav = None # grid dare-avere self.dbprog = ProgrStampaGiornale() self.dbprom = ProgrStampaMastri() self._auto_cod_tippdc_pdciva = "I" # DA AUTOMATIZZARE!!! self._auto_cod_tippdc_pdcric = "R" # DA AUTOMATIZZARE!!! self._auto_cod_tippdc_pdcspe = "S" # DA AUTOMATIZZARE!!! cfg.CfgCausale.__init__(self) auto.CfgAutomat.__init__(self) progr.CfgProgr.__init__(self) self._Auto_AddKeysContab() self._Progr_AddKeysContab(Env.Azienda.Esercizio.year) # self.cfgctb = cfg.CfgContab() self.dbese = ProgrEsercizio() self.regrsb = [] # recordset dettaglio self.status = None self.cautipo = None self.caufilt = None self.pancaus = None self.panhead = None self.panbody = None self.InitPanelCaus() self.InitPanelHead() self.InitPanelBody() wdr.DialogFunc(self, True) self.controls = awc.util.DictNamedChildrens(self) c = self.controls["butattach"] c.SetScope("contab_h") c.SetAutoText(self.controls["autonotes"]) c.SetSpyPanel(self.FindWindowByName("attachspy")) butnew = self.controls["button_new"] butsrc = self.controls["button_search"] butend = self.controls["button_end"] butmod = self.controls["button_modify"] butquit = self.controls["button_quit"] butdel = self.controls["button_delete"] self.InitCausale() self.__postInit() self.Bind(wx.EVT_BUTTON, self.OnRegNew, butnew) self.Bind(wx.EVT_BUTTON, self.OnRegSearch, butsrc) self.Bind(wx.EVT_BUTTON, self.OnRegEnd, butend) self.Bind(wx.EVT_BUTTON, self.OnRegModify, butmod) self.Bind(wx.EVT_BUTTON, self.OnRegQuit, butquit) self.Bind(wx.EVT_BUTTON, self.OnRegDelete, butdel) self.Bind(wx.EVT_SIZE, self.OnResize) def OptimizeSize(self, min_width=1000, min_height=640): mw, mh = min_width, min_height pw, ph = self.GetSize() sw, sh = wx.DisplaySize() if pw < mw and mw < sw: pw = mw if ph < mh and mh < sh: ph = mh self.SetSize((pw, ph)) self.SetMinSize((pw, ph)) def GetSegnoInvertito(self, segno): if segno == "D": return "A" elif segno == "A": return "D" return None def __postInit(self): self.OptimizeSize() self.SetAcceleratorKey("I", wdr.ID_BTN_NEW, "Inserisci", "Inserisce una nuova registrazione") self.SetAcceleratorKey("C", wdr.ID_BTN_SEARCH, "Cerca", "Cerca registrazioni con la stessa causale") self.SetAcceleratorKey("S", wdr.ID_BTN_END, "Salva e Chiudi", "Salva e chiude la presente registrazione") self.SetAcceleratorKey("M", wdr.ID_BTN_MODIFY, "Modifica", "Modifica la presente registrazione") self.SetAcceleratorKey("X", wdr.ID_BTN_DELETE, "Elimina", "Elimina la presente registrazione") self.SetAcceleratorKey("Q", wdr.ID_BTN_QUIT, "Abbandona modifiche", "Abbandona la registrazione senza salvare") self.UpdatePanelHead() self.UpdatePanelBody() self.SetRegStatus(STATUS_SELCAUS) def OnParity(self, event): # sq = round(self.totdare-self.totavere, bt.VALINT_DECIMALS) row = self._grid_dav.GetGridCursorRow() if len(self.regrsb) == 0 or row >= len(self.regrsb): return td, ta = self.GetTotaliDA() sq = round(td - ta, 6) if ( len(self.regrsb) <= 1 or self.regrsb[row][RSDET_TIPRIGA] == "A" or self.regrsb[row][RSDET_IMPDARE] or self.regrsb[row][RSDET_IMPAVERE] ): aw.awu.MsgDialog( self, """E' possibile pareggiare solo una riga sprovvista di importo.""", style=wx.ICON_INFORMATION ) return if sq > 0: self.regrsb[row][RSDET_IMPAVERE] = sq self.regrsb[row][RSDET_IMPDARE] = None else: self.regrsb[row][RSDET_IMPAVERE] = None self.regrsb[row][RSDET_IMPDARE] = -sq self._grid_dav.ResetView() self.UpdateTotDav() event.Skip() def OnRegNew(self, event): if not is_pushable(event.GetEventObject()): return if self.status == STATUS_SELCAUS: if self.controls["causale"].GetValue() is None: aw.awu.MsgDialog(self, "Seleziona la causale", style=wx.ICON_ERROR) else: self.RegNew() def OnRegSearch(self, event): if not is_pushable(event.GetEventObject()): return if self.status == STATUS_SELCAUS: self.RegSearch() elif self.status == STATUS_DISPLAY: self.SetRegStatus(STATUS_SELCAUS) def OnRegEnd(self, event): if not is_pushable(event.GetEventObject()): return if round(self.totdare, 6) == round(self.totavere, 6): if self.RegSave(): if self.oneregonly_id: try: if self.GetParent().IsModal(): self.GetParent().EndModal(REG_MODIFIED) except: self.Destroy() else: self.SetRegStatus(STATUS_SELCAUS) else: MsgDialog( self, """Non è possibile confermare la registrazione in quanto risulta """ """squadrata. Eliminare la squadratura e riprovare.""", ) def OnRegModify(self, event): if not is_pushable(event.GetEventObject()): return self.SetRegStatus(STATUS_EDITING) event.Skip() def OnRegQuit(self, event): if not is_pushable(event.GetEventObject()): return quit = True if self.editing: action = MsgDialog( self, """La registrazione risulta essere modificata. confermandone """ """l'abbandono, andranno persi i dati fin qui inseriti. """ """Confermi l'abbandono ?""", style=wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT, ) quit = action == wx.YES if quit: if self.oneregonly_id: try: if self.GetParent().IsModal(): self.GetParent().EndModal(REG_UNMODIFIED) except: self.Destroy() else: self.SetRegStatus(STATUS_SELCAUS) def OnRegDelete(self, event): if not is_pushable(event.GetEventObject()): return action = MsgDialog( self, """Sei sicuro di voler cancellare la registrazione ? Confermando, la """ """registrazione non sarà più recuperabile in alcun modo. """ """Confermi l'operazione di eliminazione ?""", style=wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT, ) if action == wx.ID_YES: if self.RegDelete(): self.SetRegStatus(STATUS_SELCAUS) event.Skip() def OnResize(self, event): self.UpdatePanelBody() event.Skip() def RegSearch(self): out = False if self.cauid is not None: srccls = self.RegSearchClass() if srccls is not None: dlg = srccls(self) dlg.SetCausale(self.cauid, self.caudes) dlg.UpdateSearch() idreg = dlg.ShowModal() dlg.Destroy() if idreg >= 0: if self.RegRead(idreg): if self.canedit: self.SetRegStatus(STATUS_EDITING) else: self.SetRegStatus(STATUS_DISPLAY) return out def SetOneRegOnly(self, idreg): self.oneregonly_id = idreg if self.RegRead(idreg): for name in "button_new button_search".split(): self.FindWindowByName(name).Hide() p = self.GetParent() s = p.GetSize() p.SetSize((s[0] + 1, s[0] + 1)) p.SetSize(s) self.UpdateCausale() self.SetRegStatus(STATUS_DISPLAY) self.UpdateButtons() def UpdateAllControls(self): if self.status == STATUS_SELCAUS: lbl = "Seleziona causale" elif self.status == STATUS_DISPLAY: lbl = "Visualizzazione" elif self.status == STATUS_EDITING: if self.reg_id is None: lbl = "Inserimento" else: lbl = "Modifica" self.controls["statusdes"].SetLabel(lbl) self.UpdatePanelHead() self.UpdatePanelBody() def UpdateCausale(self): # aggiorna combo causale in base a self.cauid caus = self.controls["causale"] # n = caus.GetCount() # for x in range(n): # cauid, caucod = caus.GetClientData(x) # if cauid == self.cauid: # caus.SetSelection(x) # break caus.SetValue(self.cauid) def RegSearchClass(self): return RegSearchDialog def InitCausale(self): """ Inizializza il combobox della selezione causale. @return: Vero o falso a seconda che sia riuscito a caricare le causali. @rtype: bool """ out = False ctrcau = self.controls["causale"] if self.caufilt: f = self.caufilt if not self.dbese.GetSovrapposizione(): if f: f = "(%s) AND " % f f += "esercizio<>'1'" ctrcau.SetFilter(f) self.Bind(linktab.EVT_LINKTABCHANGED, self.OnCauChanged, ctrcau) return out def OnCauChanged(self, event): """ Callback per causale selezionata Vengono aggiornati i dati relativi alla causale: :: id codice descrizione configurazione """ cauchanged = False ctrcau = event.GetEventObject() oldcau = self.cauid cauid = ctrcau.GetValue() self.cauid = cauid if cauid is None: self.caudes = None self.UpdateButtons() else: self.caudes = ctrcau.GetValueDes() self.CfgCausale_Read(self.cauid) self.EnableAllControls() self.SetDefaultItem(self.controls["button_new"]) cauchanged = self.cauid != oldcau return cauchanged def InitPanelCaus(self): """ Inizializza il pannello della selezione causale. """ self.pancaus = aw.Panel(self, wdr.ID_PANEL_CAUS) self.pancaus.SetName("panelcausale") self.pancaus.HelpBuilder_SetDir("contab.dataentry.Causale") wdr.CauRegFunc(self.pancaus, True) def InitPanelHead(self): """ Inizializzazione del pannello di testata. In questa classe il metodo non ha effetto, in quanto il data entry del dettaglio Dare/Avere dipende dal tipo di registrazione. @see: sottoclassi di ContabPanel:: ContabPanelTipo_I - reg.iva ContabPanelTipo_E - reg. sola iva ContabPanelTipo_C - reg. composta ContabPanelTipo_S - reg. semplice ContabPanelTipo_SC - reg. semplice in saldaconto """ self.panhead = aw.Panel(self, wdr.ID_PANEL_HEAD) self.panhead.SetName("panelhead") self.panhead.HelpBuilder_SetDir("contab.dataentry.Testata") wdr.HeadFunc(self.panhead, True) h = bt.tabelle[bt.TABSETUP_TABLE_CONTAB_H][bt.TABSETUP_TABLESTRUCTURE] n = aw.awu.ListSearch(h, lambda x: x[0] == "numdoc") self.FindWindowByName("numdoc").SetMaxLength(h[n][2]) return self def InitPanelBody(self): """ Inizializzazione del pannello del corpo. In questa classe il metodo non ha effetto, in quanto il data entry del dettaglio Dare/Avere dipende dal tipo di registrazione. """ self.panbody = wx.Panel(self, wdr.ID_PANEL_BODY) return self def SetRegStatus(self, status=None): """ Imposta lo status della registrazione:: STATUS_SELCAUS - Selezione causale STATUS_DISPLAY - Visualizza registrazione STATUS_MODIFY - Editing registrazione """ oldstatus = self.status self.status = status btnatt = self.controls["butattach"] if status == STATUS_SELCAUS: self.RegReset() btnatt.SetKey(None) def SetFocus(): self.controls["causale"].SetFocus() wx.CallAfter(SetFocus) elif status == STATUS_EDITING: def SetFocus(): self.controls["datreg"].SetFocus() wx.CallAfter(SetFocus) self.UpdateAllControls() self.EnableAllControls() if status == STATUS_EDITING: btnatt.SetPermissions(True, True) else: btnatt.SetPermissions(False, False) return oldstatus def EnableAllControls(self, enable=True): self.UpdateButtons(enable) self.controls["causale"].Enable(enable and self.status == STATUS_SELCAUS) self.EnableHeadControls(enable) self.EnableBodyControls(enable) def UpdateButtons(self, enable=True): status = self.status self.controls["button_new"].Enable( enable and self.canedit and self.canins and self.cauid is not None and status == STATUS_SELCAUS ) self.controls["button_search"].Enable(enable and self.cauid is not None and status == STATUS_SELCAUS) c = self.controls["button_end"] ena = True if enable and status == STATUS_EDITING: if self.dbese.samefloat(self.totdare, self.totavere): if self._cfg_datdoc and not self.controls["datdoc"].GetValue(): tip = "Definire la data del documento" ena = False elif self._cfg_numdoc and not self.controls["numdoc"].GetValue(): tip = "Definire il numero del documento" ena = False else: tip = "Conferma la registrazione" else: tip = "Squadratura Dare/Avere" ena = False else: tip = "" ena = False c.Enable(ena) c.SetToolTipString(tip) canreg = getattr(Env.Azienda.Login.userdata, "can_contabins", None) == 1 self.controls["button_modify"].Enable( enable and self.canedit and canreg and not (self.reg_st_regiva) and not (self.reg_st_giobol) and status == STATUS_DISPLAY ) self.controls["button_quit"].Enable(enable and status in (STATUS_DISPLAY, STATUS_EDITING)) self.controls["button_delete"].Enable( enable and self.candelete and status == STATUS_EDITING and not self.newreg ) self.controls["butattach"].Enable(enable and status in (STATUS_DISPLAY, STATUS_EDITING)) def RegRead(self, idreg): self.newreg = False out = self.RegReadHead(idreg) if out: self.CfgCausale_Read(self.cauid) # cauid settato in RegRead self.RegReadBody(idreg) if len(self.regrsb) > 0: self.id_pdcpa = self.regrsb[0][RSDET_PDCPA_ID] self.controls["butattach"].SetKey(idreg) return out def RegReadHead(self, idreg): """ Caricamento dati testata registrazione. """ out = False rsh = [] try: cmd = ( """SELECT reg.id, reg.esercizio, reg.id_caus, reg.tipreg, """ """reg.datreg, reg.datdoc, reg.numdoc, """ """reg.id_regiva, reg.numiva, """ """reg.st_regiva, reg.st_giobol, """ """reg.id_modpag, reg.nocalciva, """ """riv.codice, riv.descriz """ """FROM %s AS reg """ """LEFT JOIN %s AS riv ON reg.id_regiva=riv.id """ """WHERE reg.id=%%s;""" % (bt.TABNAME_CONTAB_H, bt.TABNAME_REGIVA) ) cur = adb.db.get_cursor() cur.execute(cmd, idreg) rsh = cur.fetchone() cur.close() except MySQLdb.Error, e: MsgDialogDbError(self, e) else:
class SelEsercizioChoice(awch.Choice): esercizi = None allow_empty_esercizio = True def __init__(self, *args, **kwargs): k = 'allow_empty_esercizio' if k in kwargs: self.allow_empty_esercizio = kwargs.pop(k) awch.Choice.__init__(self, *args, **kwargs) reg = adb.DbTable(bt.TABNAME_CONTAB_H, 'reg', fields=None) reg.Synthetize() reg.AddGroupOn('esercizio') reg.AddOrder('esercizio') #, adb.ORDER_DESCENDING) reg.Retrieve() self.dbreg = reg self.dbprg = adb.DbTable(bt.TABNAME_CFGPROGR, 'progr') self.dbese = ProgrEsercizio() self.esercizi = list() self.ReadEsercizi() def ReadEsercizi(self, regfilter=None, force_esercizio=None): prg = self.dbprg if prg.Retrieve('codice=%s', 'ccg_esercizio') and prg.OneRow(): ec = prg.progrnum else: ec = 0 sov = self.dbese.GetSovrapposizione() self.Clear() reg = self.dbreg reg.Retrieve(regfilter) e = self.esercizi del e[:] if self.allow_empty_esercizio and regfilter is None: self.Append('Tutti') e.append(None) for reg in reg: d = str(reg.esercizio).zfill(4) if reg.esercizio == ec - 1 and sov: d += ' (da chiud.)' elif reg.esercizio < ec: d += ' (chiuso)' elif reg.esercizio == ec: d += ' (in corso)' self.Append(d) e.append(int(reg.esercizio)) if force_esercizio is not None and not force_esercizio in e: d = str(force_esercizio).zfill(4) if force_esercizio == ec: d += ' (in corso)' self.Append(d) e.append(force_esercizio) if self.GetCount(): self.SetSelection(0) def ReadEserciziNoStampaGiornale(self): ec = self.dbese.GetEsercizioInCorso() self.ReadEsercizi( "(reg.st_giobol IS NULL or reg.st_giobol<>1) AND reg.tipreg<>'E'", force_esercizio=ec) if self.GetCount(): self.SetValue(ec) def ReadEserciziSiStampaGiornale(self): self.ReadEsercizi("(reg.st_giobol=1) AND reg.tipreg<>'E'") if self.GetCount(): self.SetSelection(self.GetCount() - 1) def SetValue(self, val): if val is None and not self.allow_empty_esercizio: raise Exception, "Esercizio nullo non consentito" if val is None: n = 0 else: try: n = self.esercizi.index(int(val)) except ValueError, e: n = len(self.esercizi) - 1 self.SetSelection(n)
def __init__(self, *args, **kwargs): SelEsercizioExChoice.__init__(self, *args, **kwargs) ese = ProgrEsercizio() e = ese.GetEsercizioInCorso() self.SetValue(e)