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
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('')
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
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])
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
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)
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()
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()
def SauveLigne(self,track): nur.SauveLigne(self.Parent.db,self.Parent,track)
def ValideLigne(self,code,track): nur.ValideLigne(self.Parent.db,track)
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
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()