Пример #1
0
 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()
Пример #2
0
    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)
Пример #3
0
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:
Пример #4
0
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)
Пример #5
0
 def __init__(self, *args, **kwargs):
     SelEsercizioExChoice.__init__(self, *args, **kwargs)
     ese = ProgrEsercizio()
     e = ese.GetEsercizioInCorso()
     self.SetValue(e)