Example #1
0
    def OnGetDepot(self,event):
        # lancement de la recherche d'un dépot
        self.ctrlOlv.cellEditMode = self.ctrlOlv.CELLEDIT_NONE
        dicDepot = nur.GetDepot(self.db)
        IDdepot = None
        self.ctrlOlv.cellEditMode = self.ctrlOlv.CELLEDIT_DOUBLECLICK        # gestion du retour du choix dépot
        if 'numero' in dicDepot.keys():
            IDdepot = dicDepot['numero']
        self.pnlParams.ctrlSsDepot.Enable(True)
        if isinstance(IDdepot,int):
            lstDonnees = nur.GetReglements(self,IDdepot)
            nbcol = len(self.ctrlOlv.lstCodesColonnes)
            ixpc = nbcol + self.ctrlOlv.lstCodesSup.index('prestcpta')
            ixrc = nbcol + self.ctrlOlv.lstCodesSup.index('reglcompta')
            ixdiff = self.ctrlOlv.lstCodesColonnes.index('differe')
            lstEnCompta = [1 for rec in  lstDonnees if (rec[ixpc] or rec[ixrc])]
            lstDifferes = [1 for rec in  lstDonnees if rec[ixdiff] != None and len(rec[ixdiff]) >1 ]
            # présence de lignes déjà transférées compta
            if len(lstEnCompta) >0:
                self.ctrlOlv.cellEditMode = self.ctrlOlv.CELLEDIT_NONE
                self.pnlPied.SetItemsInfos("NON MODIFIABLE: règlement ou prestation transféré en compta ",
                                           wx.ArtProvider.GetBitmap(wx.ART_ERROR, wx.ART_OTHER, (16, 16)))
            # présence de lignes déjà transférées compta
            elif len(lstDifferes) >0:
                self.ctrlOlv.cellEditMode = self.ctrlOlv.CELLEDIT_NONE
                self.pnlPied.SetItemsInfos("NON MODIFIABLE dans Noelite: présence de chèques différés dans un dépot saisi dans Noethys",
                                           wx.ArtProvider.GetBitmap(wx.ART_ERROR, wx.ART_OTHER, (16, 16)))


            if len(lstDonnees)>0:
                # marque dépot non différé car déjà déposé
                self.pnlParams.ctrlSsDepot.Enable(False)
                # set date du dépot
                self.pnlParams.ctrlDate.SetValue(xformat.FmtDate(dicDepot['date']))
                # set IDdepot en référence
                self.pnlParams.ctrlRef.SetValue(str(IDdepot))
                # set le nom de la banque
                self.pnlParams.ctrlBanque.SetSelection(self.pnlParams.ctrlBanque.FindString(dicDepot['banque']))

                # place les règlements du dépôt dans la grille après compléments
                self.ctrlOlv.lstDonnees = lstDonnees
                self.InitOlv(withDiffere=False)

                # les écritures reprises sont censées être valides
                for item in self.ctrlOlv.modelObjects[:-1]:
                    item.valide = True
                self.ctrlOlv._FormatAllRows()
                self.ctrlOlv.MAJ()
                # stockage pour test de saisie
                self.depotOrigine = self.ctrlOlv.innerList
                self.IDdepot = IDdepot
                self.withDepot = True
            else:
                wx.MessageBox("Aucune écriture:\n\nle dépôt %s est vide ou pb d'accès"%IDdepot)
                self.IDdepot = None
Example #2
0
 def OnDelete(self,track,parent=None):
     nur.DeleteLigne(self.parent.db,track)
     # suppression du dépôt vidé
     if len(self.ctrlOlv.modelObjects) <= 2:
         lstNonNul = [x for x in self.ctrlOlv.modelObjects if x != track and x.IDfamille != 0]
         if len(lstNonNul) == 0:
             IDdepot = self.parent.pnlParams.ctrlRef.GetValue()
             if IDdepot and int(IDdepot) >0:
                 nur.DeleteDepot(int(IDdepot),self.parent.db)
                 self.parent.IDdepot = None
                 self.parent.pnlParams.ctrlRef.SetValue('')
Example #3
0
 def OnEditFunctionKeys(self,event):
     row, col = self.ctrlOlv.cellBeingEdited
     code = self.ctrlOlv.lstCodesColonnes[col]
     if event.GetKeyCode() == wx.WXK_F4 and code == 'IDfamille':
         # Choix famille
         IDfamille = nur.GetFamille(self.parent.db)
         self.OnEditFinishing('IDfamille',IDfamille)
         self.ctrlOlv.GetObjectAt(row).IDfamille = IDfamille
Example #4
0
    def SetPayeurs(self,track,editor):
        if track.IDfamille and track.IDfamille >0:
            # alimente le choix des payeurs et selectionne l'existant éventuel
            oldpay = track.payeur

            self.ldPayeurs = nur.GetPayeurs(self.parent.db,track.IDfamille)
            payeurs = [x['nom'] for x in self.ldPayeurs]
            if len(payeurs) == 0: payeurs.append(track.designation)
            editor.Set(payeurs)

            # place une valeur choisie
            if oldpay:
                editor.SetStringSelection(oldpay)
            else: editor.SetStringSelection(payeurs[-1])
Example #5
0
    def InitTrackVierge(self,track,modelObject):
        # Le premier accès sur la ligne va attribuer un ID, la sauvegarde se fera après la saisie du montant != 0.0
        if track.IDreglement in (None, 0):
            track.IDreglement = nur.GetNewIDreglement(self.parent.db,self.lstNewReglements)
            self.lstNewReglements.append(track.IDreglement)
            track.ventilation = []

        # reprise de la valeur 'mode' et date de la ligne précédente
        if len(modelObject)>0:
            trackN1 = modelObject[-1]
            track.mode = trackN1.mode
            track.date = trackN1.date
        if track.nature.lower() in ('don','donsscerfa', 'debour'):
            # Seuls les dons et débours vont générer la prestation selon l'compte
            track.creer = True
        else: track.creer = False
Example #6
0
    def OnEditStarted(self,code,track=None,editor=None):
        # affichage de l'aide
        if code in DIC_INFOS.keys():
            self.parent.pnlPied.SetItemsInfos( DIC_INFOS[code],
                                               wx.ArtProvider.GetBitmap(wx.ART_FIND, wx.ART_OTHER, (16, 16)))
        else:
            self.parent.pnlPied.SetItemsInfos( INFO_OLV,wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16)))

        if track.IDreglement in (None, 0, ''):
            track.IDreglement = nur.GetNewIDreglement(self.parent.db,self.lstNewReglements)
            self.lstNewReglements.append(track.IDreglement)
            track.ventilation = []

        if code == 'payeur':
            self.SetPayeurs(track,editor)

        if code == 'emetteur':
            self.SetEmetteurs(track,editor)
Example #7
0
    def __init__(self, parent, **kwds):
        self.parent = parent
        wx.Panel.__init__(self, parent, **kwds)

        self.ldBanques = nur.GetBanquesNne(self.parent.db)
        lstBanques = [x['nom'] for x in self.ldBanques if x['code_nne'][:2]!='47']
        self.lstIDbanques = [x['IDcompte'] for x in self.ldBanques if x['code_nne'][:2]!='47']
        self.lblBanque = wx.StaticText(self,-1, label="Banque Noethys:  ",size=(130,20),style=wx.ALIGN_RIGHT)

        self.ctrlBanque = wx.Choice(self,size=(220,20),choices=lstBanques)
        if len(lstBanques)>0:
            # selection de la deuxième ligne (choix opportuniste pour matthania: banque principale)
            self.ctrlBanque.Select(1)
        self.ctrlBanque.Bind(wx.EVT_KILL_FOCUS,self.OnKillFocusBanque)

        self.btnBanque = wx.Button(self, label="...",size=(40,22))
        self.btnBanque.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FIND,size=(16,16)))

        self.ctrlSsDepot = wx.CheckBox(self,-1," _Sans dépôt immédiat, (saisie d'encaissements futurs)")

        self.btnDepot = wx.Button(self, label="Rappeler \nun dépôt antérieur")
        self.btnDepot.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FIND,size=(22,22)))
        self.btnDepot.Bind(wx.EVT_BUTTON,self.parent.OnGetDepot)

        self.btnRaz = wx.Button(self, label="Réinit",size=(90,20))
        self.btnRaz.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_ERROR,size=(15,15)))
        self.btnRaz.Bind(wx.EVT_BUTTON,self.parent.OnRaz)

        self.lblDate = wx.StaticText(self,-1, label="Date de saisie:  ",size=(85,20),style=wx.ALIGN_RIGHT)
        self.ctrlDate = wx.TextCtrl(self,-1,size=(90,20),style=wx.ALIGN_LEFT|wx.TE_PROCESS_ENTER)
        value = datetime.date.today()
        self.ctrlDate.SetValue(xformat.FmtDate(value))
        self.ctrlDate.Bind(wx.EVT_KILL_FOCUS,self.OnDateDepot)
        self.ctrlDate.Bind(wx.EVT_TEXT_ENTER,self.OnDateDepot)
        self.lblRef = wx.StaticText(self,-1, label="No Bordereau:  ",size=(90,20),style=wx.ALIGN_RIGHT)
        self.ctrlRef = wx.TextCtrl(self,-1,size=(70,20))

        self.ToolTip()
        self.Sizer()
        self.ctrlBanque.SetFocus()
Example #8
0
    def Init(self):
        self.db = xdb.DB()
        # définition de l'OLV
        self.dicOlv = {'lstColonnes': GetOlvColonnes()}
        self.dicOlv.update({'lstCodesSup': GetOlvCodesSup()})
        self.dicOlv.update(GetOlvOptions())
        size = self.dicOlv.pop('size',None)
        self.choicesDiffere = self.dicOlv.pop('choicesDiffere',[])
        self.SetSize(size)
        self.depotOrigine = []
        self.ctrlOlv = None
        self.withDepot = True
        # récup des modesReglements nécessaires pour passer du texte à un ID d'un mode ayant un mot en commun
        choicesMode = []
        self.libelleDefaut = ''
        for colonne in self.dicOlv['lstColonnes']:
            if 'mode' in colonne.valueGetter:
                choicesMode = colonne.choices
            if 'libelle' in colonne.valueGetter:
                self.libelleDefaut = colonne.valueSetter

                
        # appel de modes de règlements
        self.ddModesRegl = nur.GetModesReglements(self.db)
        if self.ddModesRegl == wx.ID_ABORT:
            return wx.ID_ABORT

        # constitution d'un dictionnaire de modes de règlements possibles par choices de mode (vrt chq esp)
        self.dicModesChoices = {}
        for item in choicesMode + self.choicesDiffere:
            # les descriptifs de modes de règlements ne doivent pas avoir des mots en commun
            lstMots = item.split(' ')
            self.dicModesChoices[item]={'lstMots':lstMots}
            ok = False
            for IDmode, dicMode in self.ddModesRegl.items():
                # pour un mot dans les choices
                for mot in lstMots:
                    # présent dans le label d'un mode de règlement
                    if mot.lower() in dicMode['label'].lower():
                        self.dicModesChoices[item].update(dicMode)
                        dicMode['choice'] = item
                        ok = True
                        break
                if ok: break
            if not ok:
                wx.MessageBox("Problème mode de règlement\n\n'%s' n'a aucun mot commun avec un mode de règlement paramétré!"%item)

        # appel d'émetteurs selon les modes de règlement
        lstModes = [self.dicModesChoices[x]['IDmode'] for x in self.dicModesChoices.keys()]
        self.dlEmetteurs, self.dlIDemetteurs = nur.GetEmetteurs(self.db,lstModes)
        if self.dlEmetteurs == wx.ID_ABORT:
            return wx.ID_ABORT

        # boutons de bas d'écran - infos: texte ou objet window.  Les infos sont  placées en bas à gauche
        self.txtInfo =  "Ici de l'info apparaîtra selon le contexte de la grille de saisie"
        lstInfos = [ wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16)),self.txtInfo]
        dicPied = {'lstBtns': GetBoutons(self), "lstInfos": lstInfos}

        # lancement de l'écran en blocs principaux
        self.pnlBandeau = xbandeau.Bandeau(self,TITRE,INTRO,nomImage="xpy/Images/32x32/Matth.png")
        self.pnlParams = PNL_params(self)
        self.pnlOlv = PNL_corpsReglements(self, self.dicOlv)
        self.pnlPied = PNL_pied(self, dicPied)
        self.ctrlOlv = self.pnlOlv.ctrlOlv

        # la grille est modifiée selon la coche sans dépôt
        self.pnlParams.ctrlSsDepot.Bind(wx.EVT_KILL_FOCUS,self.OnSsDepot)
        self.choicesNonDiffere = self.ctrlOlv.lstColonnes[self.ctrlOlv.lstCodesColonnes.index('mode')].choices
        self.OnSsDepot(None)
        self.Bind(wx.EVT_CLOSE,self.OnClose)
        self.Sizer()
Example #9
0
 def SauveLigne(self,track):
     nur.SauveLigne(self.Parent.db,self.Parent,track)
Example #10
0
 def ValideLigne(self,code,track):
     nur.ValideLigne(self.Parent.db,track)
Example #11
0
    def OnEditFinishing(self,code=None,value=None,editor=None):
        self.parent.pnlPied.SetItemsInfos( INFO_OLV,wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16)))
        # flagSkipEdit permet d'occulter les évènements redondants. True durant la durée du traitement
        if self.flagSkipEdit : return
        self.flagSkipEdit = True

        (row, col) = self.ctrlOlv.cellBeingEdited
        track = self.ctrlOlv.GetObjectAt(row)

        # Traitement des spécificités selon les zones
        if code == 'IDfamille':
            try:
                value = int(value)
            except:
                self.flagSkipEdit = False
                return
            designation = nur.GetDesignationFamille(self.parent.db,value)
            track.designation = designation
            track.IDfamille = value

        if code == 'mode':
            # rend non éditable les champs suivants si pas d'option possible
            IDmode = self.parent.dicModesChoices[value]['IDmode']
            emetteurs = sorted(self.parent.dlEmetteurs[IDmode])
            if len(emetteurs) == 0:
                isedit = False
                track.emetteur = None
                track.numero = None
            else: isedit = True
            self.ctrlOlv.columns[self.ctrlOlv.lstCodesColonnes.index('emetteur')].isEditable = isedit
            self.ctrlOlv.columns[self.ctrlOlv.lstCodesColonnes.index('numero')].isEditable = isedit

        if code == 'nature':
            # actualisation du flag créer
            if value.lower() in ('don','donsscerfa','debour') :
                # Seuls les dons et débours vont générer la prestation selon l'compte
                track.creer = True
                # Choix compte - code comptable appellé en sortie de nature le code compte n'est pas éditable
                obj = nur.Compte(self.parent.db,value)
                compte, libelle = obj.GetCompte()
                del obj
                track.compte = compte
                track.libelle = libelle
            else:
                track.compte = ""
                track.creer = False

        if code == 'montant':
            if track.nature in ('Règlement','Libre') and value != 0.0:
                # cas du règlement d'une prestation antérieure: appel de l'écran ventilations
                dlg = ndrv.Dialog(self,-1,None,track.IDfamille,track.IDreglement,track.montant)
                if dlg.ok:
                    ret = dlg.ShowModal()
                    if ret == wx.OK:
                        # --- Sauvegarde de la ventilation ---
                        dlg.panel.Sauvegarde(track.IDreglement)
                else:
                    # forcer acompte
                    track.nature = 'Acompte'
                dlg.Destroy()

        # enlève l'info de bas d'écran
        self.parent.pnlPied.SetItemsInfos( INFO_OLV,wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16)))
        self.flagSkipEdit = False
Example #12
0
 def OnDateDepot(self,evt):
     value = evt.EventObject.GetValue()
     evt.EventObject.SetValue(xformat.FmtDate(value))
     if hasattr(self.parent,'IDdepot') and self.parent.IDdepot:
         nur.SetDateDepot(self.parent.db,self.parent.IDdepot,xformat.DateFrToSql(value))
     evt.Skip()