class SaisieDeplacement(wx.Dialog): """ Saisie d'un déplacement pour les frais de déplacement """ def __init__(self, parent, id=-1, title=_(u"Saisie d'un déplacement"), IDdeplacement=None, IDpersonne=None): wx.Dialog.__init__(self, parent, id, title) self.IDdeplacement = IDdeplacement self.IDpersonne = IDpersonne # Création d'une liste des villes et codes postaux con = sqlite3.connect(Chemins.GetStaticPath("Databases/Villes.db3")) cur = con.cursor() cur.execute("SELECT ville, cp FROM villes") self.listeVillesTmp = cur.fetchall() con.close() # Création d'une liste de noms de villes self.listeNomsVilles = [] self.listeVilles = [] for nom, cp in self.listeVillesTmp: self.listeVilles.append((nom, "%05d" % cp)) self.listeNomsVilles.append(nom) # Importation de la table des distances self.ImportationDistances() # Généralités self.staticbox_generalites = wx.StaticBox(self, -1, _(u"Généralités")) self.label_date = wx.StaticText(self, -1, _(u"Date :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_date = DatePickerCtrl(self, -1, style=DP_DROPDOWN) self.label_utilisateur = wx.StaticText(self, -1, _(u"Utilisateur :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ImportationPersonnes() self.ctrl_utilisateur = AdvancedComboBox(self, "", size=(100, -1), choices=self.listePersonnes) self.label_objet = wx.StaticText(self, -1, _(u"Objet :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_objet = wx.TextCtrl(self, -1, "", size=(-1, -1), style=wx.TE_MULTILINE) # Trajet self.staticbox_trajet = wx.StaticBox(self, -1, _(u"Trajet")) self.label_depart = wx.StaticText(self, -1, _(u"Ville de départ :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_cp_depart = TextCtrlCp(self, value="", listeVilles=self.listeVilles, size=(55, -1), style=wx.TE_CENTRE, mask="#####") self.ctrl_ville_depart = TextCtrlVille( self, value="", ctrlCp=self.ctrl_cp_depart, listeVilles=self.listeVilles, listeNomsVilles=self.listeNomsVilles) self.ctrl_cp_depart.ctrlVille = self.ctrl_ville_depart self.bouton_options_depart = wx.Button(self, -1, "...", size=(20, 20)) self.label_arrivee = wx.StaticText(self, -1, _(u"Ville d'arrivée :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_cp_arrivee = TextCtrlCp(self, value="", listeVilles=self.listeVilles, size=(55, -1), style=wx.TE_CENTRE, mask="#####") self.ctrl_ville_arrivee = TextCtrlVille( self, value="", ctrlCp=self.ctrl_cp_arrivee, listeVilles=self.listeVilles, listeNomsVilles=self.listeNomsVilles) self.ctrl_cp_arrivee.ctrlVille = self.ctrl_ville_arrivee self.bouton_options_arrivee = wx.Button(self, -1, "...", size=(20, 20)) self.label_distance = wx.StaticText(self, -1, _(u"Distance :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_distance = wx.TextCtrl(self, -1, "0", size=(55, -1)) self.label_km = wx.StaticText(self, -1, _(u"Km (Aller simple)")) self.label_aller_retour = wx.StaticText(self, -1, _(u"Aller/retour :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_aller_retour = wx.CheckBox(self, -1, u"") ############################################################## # Pour désactiver l'autocomplete du controle VILLE qui ne fonctionne pas sous Linux if "linux" in sys.platform: self.ctrl_ville_depart.Enable(False) self.ctrl_ville_arrivee.Enable(False) ############################################################## # Remboursement self.staticbox_remboursement = wx.StaticBox(self, -1, _(u"Remboursement")) self.label_tarif = wx.StaticText(self, -1, _(u"Tarif du Km :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_tarif = wx.TextCtrl(self, -1, "0.00", size=(55, -1)) self.label_euro_tarif = wx.StaticText(self, -1, u"¤") self.label_montant = wx.StaticText(self, -1, _(u"Montant du rmbst :"), size=(110, -1), style=wx.ALIGN_RIGHT) self.ctrl_montant = wx.StaticText(self, -1, u"0.00 ¤") font = wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD) self.ctrl_montant.SetFont(font) self.label_remboursement = wx.StaticText(self, -1, _(u"Remboursement :"), size=(95, -1), style=wx.ALIGN_RIGHT) self.ctrl_remboursement = wx.StaticText(self, -1, _(u"Aucun remboursement.")) # Boutons self.bouton_ok = CTRL_Bouton_image.CTRL( self, texte=_(u"Ok"), cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png")) self.bouton_annuler = CTRL_Bouton_image.CTRL( self, id=wx.ID_CANCEL, texte=_(u"Annuler"), cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png")) self.bouton_aide = CTRL_Bouton_image.CTRL( self, texte=_(u"Aide"), cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png")) # IDpersonne : if self.IDpersonne != None: self.SetPersonne(self.IDpersonne) # Si c'est une modification : if self.IDdeplacement != None: self.SetTitle(_(u"Modification d'un déplacement")) self.Importation() else: self.ImportDernierTarif() # Cache le controle utilisateur : if self.IDpersonne != None: self.label_utilisateur.Show(False) self.ctrl_utilisateur.Show(False) self.SetSize((-1, 430)) self.__set_properties() self.__do_layout() # Binds self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok) self.Bind(wx.EVT_BUTTON, self.OnBoutonOptionsDepart, self.bouton_options_depart) self.Bind(wx.EVT_BUTTON, self.OnBoutonOptionsArrivee, self.bouton_options_arrivee) self.Bind(wx.EVT_CHECKBOX, self.OnAllerRetour, self.ctrl_aller_retour) self.ctrl_distance.Bind(wx.EVT_KILL_FOCUS, self.distance_EvtKillFocus) self.ctrl_tarif.Bind(wx.EVT_KILL_FOCUS, self.tarif_EvtKillFocus) def __set_properties(self): self.bouton_ok.SetSize(self.bouton_ok.GetBestSize()) self.bouton_annuler.SetSize(self.bouton_annuler.GetBestSize()) self.bouton_aide.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide"))) self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider"))) self.bouton_annuler.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour annuler la saisie"))) self.ctrl_date.SetToolTip( wx.ToolTip(_(u"Sélectionnez ici la date du déplacement"))) self.ctrl_utilisateur.SetToolTip( wx.ToolTip( _(u"Sélectionnez ici l'utilisateur pour ce déplacement"))) self.ctrl_objet.SetToolTip( wx.ToolTip( _(u"Saisissez ici l'objet du déplacement. Ex : réunion, formation, etc..." ))) self.ctrl_cp_depart.SetToolTip( wx.ToolTip( _(u"Saisissez ici le code postal de la ville de départ"))) self.ctrl_ville_depart.SetToolTip( wx.ToolTip(_(u"Saisissez ici le nom de la ville de départ"))) self.ctrl_cp_arrivee.SetToolTip( wx.ToolTip( _(u"Saisissez ici le code postal de la ville d'arrivée"))) self.ctrl_ville_arrivee.SetToolTip( wx.ToolTip(_(u"Saisissez ici le nom de la ville d'arrivée"))) self.ctrl_distance.SetToolTip( wx.ToolTip( _(u"Saisissez ici la distance en Km entre les 2 villes sélectionnées.\nSi Teamworks la connait, il l'indiquera automatiquement." ))) self.ctrl_aller_retour.SetToolTip( wx.ToolTip( _(u"Cochez cette case si le déplacement a fait l'objet d'un aller/retour.\nLa distance sera ainsi doublée." ))) self.ctrl_tarif.SetToolTip( wx.ToolTip( _(u"Saisissez ici le montant du tarif du Km pour permettre calculer le montant du remboursement pour ce déplacement." ))) self.bouton_options_depart.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel" ))) self.bouton_options_arrivee.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel" ))) def __do_layout(self): grid_sizer_base = wx.FlexGridSizer(rows=4, cols=1, vgap=10, hgap=10) # Généralités sizerStaticBox_generalites = wx.StaticBoxSizer( self.staticbox_generalites, wx.HORIZONTAL) grid_sizer_generalites = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10) grid_sizer_generalites.Add(self.label_date, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_generalites.Add(self.ctrl_date, 0, wx.ALL, 0) grid_sizer_generalites.Add(self.label_utilisateur, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_generalites.Add(self.ctrl_utilisateur, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_generalites.Add(self.label_objet, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_generalites.Add(self.ctrl_objet, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_generalites.AddGrowableCol(1) sizerStaticBox_generalites.Add(grid_sizer_generalites, 1, wx.EXPAND | wx.ALL, 5) grid_sizer_base.Add(sizerStaticBox_generalites, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10) # Trajet sizerStaticBox_trajet = wx.StaticBoxSizer(self.staticbox_trajet, wx.HORIZONTAL) grid_sizer_trajet = wx.FlexGridSizer(rows=4, cols=2, vgap=10, hgap=10) grid_sizer_trajet.Add(self.label_depart, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_depart = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5) sizer_depart.Add(self.ctrl_cp_depart, 1, wx.EXPAND | wx.ALL, 0) sizer_depart.Add(self.ctrl_ville_depart, 1, wx.EXPAND | wx.ALL, 0) sizer_depart.Add(self.bouton_options_depart, 1, wx.EXPAND | wx.ALL, 0) sizer_depart.AddGrowableCol(1) grid_sizer_trajet.Add(sizer_depart, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_trajet.Add(self.label_arrivee, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_arrivee = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5) sizer_arrivee.Add(self.ctrl_cp_arrivee, 1, wx.EXPAND | wx.ALL, 0) sizer_arrivee.Add(self.ctrl_ville_arrivee, 1, wx.EXPAND | wx.ALL, 0) sizer_arrivee.Add(self.bouton_options_arrivee, 1, wx.EXPAND | wx.ALL, 0) sizer_arrivee.AddGrowableCol(1) grid_sizer_trajet.Add(sizer_arrivee, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_trajet.Add(self.label_distance, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_distance = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5) sizer_distance.Add(self.ctrl_distance, 1, wx.EXPAND | wx.ALL, 0) sizer_distance.Add(self.label_km, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_trajet.Add(sizer_distance, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_trajet.Add(self.label_aller_retour, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_ar = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5) sizer_ar.Add(self.ctrl_aller_retour, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_trajet.Add(sizer_ar, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_trajet.AddGrowableCol(1) sizerStaticBox_trajet.Add(grid_sizer_trajet, 1, wx.EXPAND | wx.ALL, 5) grid_sizer_base.Add(sizerStaticBox_trajet, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) # Remboursement sizerStaticBox_rbmt = wx.StaticBoxSizer(self.staticbox_remboursement, wx.HORIZONTAL) grid_sizer_rbmt = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10) grid_sizer_rbmt.Add(self.label_tarif, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_rbmt = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5) sizer_rbmt.Add(self.ctrl_tarif, 1, wx.EXPAND | wx.ALL, 0) sizer_rbmt.Add(self.label_euro_tarif, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_rbmt.Add(self.label_montant, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_rbmt.Add(self.ctrl_montant, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_rbmt.Add(sizer_rbmt, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_rbmt.Add(self.label_remboursement, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_rbmt.Add(self.ctrl_remboursement, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_rbmt.AddGrowableCol(1) sizerStaticBox_rbmt.Add(grid_sizer_rbmt, 1, wx.EXPAND | wx.ALL, 5) grid_sizer_base.Add(sizerStaticBox_rbmt, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) # Boutons grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10) grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0) grid_sizer_boutons.Add((20, 20), 0, 0, 0) grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0) grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0) grid_sizer_boutons.AddGrowableCol(1) grid_sizer_base.Add(grid_sizer_boutons, 1, wx.ALL | wx.EXPAND, 10) self.SetSizer(grid_sizer_base) grid_sizer_base.AddGrowableCol(0) grid_sizer_base.Fit(self) self.Layout() self.CenterOnScreen() def ImportDernierTarif(self): # Récupération du dernier tarif saisi DB = GestionDB.DB() req = """SELECT cp_depart, ville_depart, tarif_km FROM deplacements ORDER BY IDdeplacement DESC LIMIT 1; """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() if len(listeDonnees) == 0: return else: cp_depart = listeDonnees[0][0] ville_depart = listeDonnees[0][1] tarif_km = listeDonnees[0][2] self.ctrl_cp_depart.autoComplete = False self.ctrl_ville_depart.autoComplete = False self.ctrl_cp_depart.SetValue(str(cp_depart)) self.ctrl_ville_depart.SetValue(ville_depart) self.ctrl_cp_depart.autoComplete = True self.ctrl_ville_depart.autoComplete = True self.ctrl_tarif.SetValue(str(tarif_km)) def OnBoutonOptionsDepart(self, event): print("options ville depart") def OnBoutonOptionsArrivee(self, event): print("options ville arrivee") def ImportationPersonnes(self): """ Importation de la liste des personnes """ # Récupération de la liste des personnes DB = GestionDB.DB() req = """SELECT IDpersonne, nom, prenom FROM personnes ORDER BY nom, prenom; """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() # Création de la liste pour le listBox self.listePersonnes = [] self.dictPersonnes = {} index = 0 for IDpersonne, nom, prenom in listeDonnees: self.listePersonnes.append(nom + " " + prenom) self.dictPersonnes[index] = IDpersonne index += 1 def ImportationDistances(self): """ Importation de la table des distances """ DB = GestionDB.DB() req = """SELECT * FROM distances """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() self.listeDistances = listeDonnees def Importation(self): """ Importation des données si c'est une modification de déplacement """ # Récupération des données du déplacement DB = GestionDB.DB() req = """SELECT * FROM deplacements WHERE IDdeplacement=%d; """ % self.IDdeplacement DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() if len(listeDonnees) == 0: return # Intégration des données dans le formulaire self.IDpersonne = listeDonnees[0][1] self.SetPersonne(self.IDpersonne) date = listeDonnees[0][2] self.SetDate( datetime.date(year=int(date[:4]), month=int(date[5:7]), day=int(date[8:10]))) self.ctrl_objet.SetValue(listeDonnees[0][3]) self.SetVilleDepart(str(listeDonnees[0][4]), listeDonnees[0][5]) self.SetVilleArrivee(str(listeDonnees[0][6]), listeDonnees[0][7]) distance = str(listeDonnees[0][8]) self.ctrl_distance.SetValue(str(distance)) if listeDonnees[0][9] == "True": self.SetAllerRetour(True) else: self.SetAllerRetour(False) self.ctrl_tarif.SetValue(str(listeDonnees[0][10])) self.CalcMontantRmbst() self.SetRemboursement(listeDonnees[0][11]) def SetRemboursement(self, IDremboursement=None): """ Définit le remboursement """ if IDremboursement == None or IDremboursement == 0 or IDremboursement == "": self.ctrl_remboursement.SetLabel("Aucun remboursement.") else: # Recherche date du remboursement DB = GestionDB.DB() req = """SELECT date FROM remboursements WHERE IDremboursement=%d; """ % IDremboursement DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() dateRemboursement = self.DateEngFr(listeDonnees[0][0]) self.ctrl_remboursement.SetLabel("N°" + str(IDremboursement) + " du " + dateRemboursement) def DateEngFr(self, textDate): text = str(textDate[8:10]) + "/" + str(textDate[5:7]) + "/" + str( textDate[:4]) return text def SetAllerRetour(self, etat=False): """ Définit l'aller retour """ self.ctrl_aller_retour.SetValue(etat) if etat == False: self.label_km.SetLabel("Km (Aller simple)") else: self.label_km.SetLabel("Km (Aller/retour)") def OnAllerRetour(self, event): if self.ValideControleFloat(self.ctrl_distance) == False: return distanceActuelle = float(self.ctrl_distance.GetValue()) if self.ctrl_aller_retour.GetValue() == False: self.label_km.SetLabel("Km (Aller simple)") self.ctrl_distance.SetValue(str(distanceActuelle / 2.0)) else: self.label_km.SetLabel("Km (Aller/retour)") self.ctrl_distance.SetValue(str(distanceActuelle * 2.0)) # Recalcule le montant self.CalcMontantRmbst() def CalcMontantRmbst(self): if self.ValideControleFloat(self.ctrl_distance) == False: return if self.ValideControleFloat(self.ctrl_tarif) == False: return distance = decimal.Decimal(self.ctrl_distance.GetValue()) tarif = decimal.Decimal(self.ctrl_tarif.GetValue()) montant = distance * tarif self.ctrl_montant.SetLabel(u"%.2f ¤" % montant) def distance_EvtKillFocus(self, event): # Vérifie la validité de la valeur if self.ValideControleFloat(self.ctrl_distance) == False: dlg = wx.MessageDialog( self, _(u"La distance saisie n'est pas correcte. \nElle doit être sous la forme '32.50' ou '54' par exemple..." ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() self.ctrl_distance.SetFocus() return # Recalcule le montant self.CalcMontantRmbst() def tarif_EvtKillFocus(self, event): # Vérifie la validité de la valeur if self.ValideControleFloat(self.ctrl_tarif) == False: dlg = wx.MessageDialog( self, _(u"Le tarif n'est pas valide. \nIl doit être sous la forme '0.32' ou '1.53' par exemple..." ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() self.ctrl_tarif.SetFocus() return # Recalcule le montant self.CalcMontantRmbst() def ValideControleFloat(self, controle=None): """ Vérifie la validité d'un contrôle de type Float """ valeur = controle.GetValue() # Vérifie que la valeur est bien constituée de chiffres uniquement incoherences = "" for lettre in valeur: if lettre not in "0123456789.": incoherences += "'" + lettre + "', " if len(incoherences) != 0: return False else: try: test = float(valeur) except: controle.SetValue("0.0") # Recalcule le montant self.CalcMontantRmbst() return False return True def MajDistance(self): """ Met à jour le Contrôle Distance en fonction des villes saisies """ depart = (self.ctrl_cp_depart.GetValue(), self.ctrl_ville_depart.GetValue()) arrivee = (self.ctrl_cp_arrivee.GetValue(), self.ctrl_ville_arrivee.GetValue()) # Recherche une distance dans la base de données des distances for IDdistance, cp_depart, ville_depart, cp_arrivee, ville_arrivee, distance in self.listeDistances: depart_temp = (str(cp_depart), ville_depart) arrivee_temp = (str(cp_arrivee), ville_arrivee) if (depart == depart_temp and arrivee == arrivee_temp) or ( depart == arrivee_temp and arrivee == depart_temp): if self.ctrl_aller_retour.GetValue() == True: self.ctrl_distance.SetValue(str(distance * 2.0)) else: self.ctrl_distance.SetValue(str(distance * 1.0)) break # MAJ du montant total self.CalcMontantRmbst() def SetVilleDepart(self, cp=None, ville=None): """ Ecrit une ville dans le contrôle ville de départ """ if cp != None: self.ctrl_cp_depart.autoComplete = False self.ctrl_cp_depart.SetValue(cp) self.ctrl_cp_depart.autoComplete = True if ville != None: self.ctrl_ville_depart.autoComplete = False self.ctrl_ville_depart.SetValue(ville.upper()) self.ctrl_ville_depart.autoComplete = True def SetVilleArrivee(self, cp=None, ville=None): """ Ecrit une ville dans le contrôle ville de départ """ if cp != None: self.ctrl_cp_arrivee.autoComplete = False self.ctrl_cp_arrivee.SetValue(cp) self.ctrl_cp_arrivee.autoComplete = True if ville != None: self.ctrl_ville_arrivee.autoComplete = False self.ctrl_ville_arrivee.SetValue(ville.upper()) self.ctrl_ville_arrivee.autoComplete = True def SetPersonne(self, IDpersonne=None): # Recherche de l'index dans le dictPersonnes for index, IDpers in self.dictPersonnes.items(): if IDpersonne == IDpers: self.ctrl_utilisateur.Select(index) break def SetDate(self, date): """ Saisi une date au format datetime dans le datepicker """ self.SetDatePicker(self.ctrl_date, date) def SetDatePicker(self, controle, date): """ Met une date au format datetime dans un datePicker donné """ annee = int(date.year) mois = int(date.month) - 1 jour = int(date.day) date = wx.DateTime() date.Set(jour, mois, annee) controle.SetValue(date) def GetDatePickerValue(self, controle): """ Renvoie la date au format datetime d'un datePicker """ date_tmp = controle.GetValue() return datetime.date(date_tmp.GetYear(), date_tmp.GetMonth() + 1, date_tmp.GetDay()) def OnBoutonAide(self, event): """ Aide """ from Utils import UTILS_Aide UTILS_Aide.Aide("Enregistrerundplacement") def OnBoutonOk(self, event): """ Validation des données saisies """ # Vérifie contrôle Utilisateur valeur = self.ctrl_utilisateur.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement sélectionner un utilisateur."), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_utilisateur.SetFocus() return # Vérifie contrôle Objet valeur = self.ctrl_objet.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous n'avez pas saisi d'objet pour ce déplacement. \n\nVoulez-vous quand même valider ce déplacement ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant l'objet)" ), _(u"Erreur de saisie"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() if reponse == wx.ID_NO or reponse == wx.ID_CANCEL: dlg.Destroy() self.ctrl_objet.SetFocus() return else: dlg.Destroy() # Vérifie contrôle cp départ valeur = self.ctrl_cp_depart.GetValue() if valeur == "" or valeur == " ": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un code postal pour la ville de départ." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_cp_depart.SetFocus() return # Vérifie contrôle ville départ valeur = self.ctrl_ville_depart.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un nom de ville de départ." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_ville_depart.SetFocus() return # Vérifie contrôle cp arrivée valeur = self.ctrl_cp_arrivee.GetValue() if valeur == "" or valeur == " ": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un code postal pour la ville d'arrivée." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_cp_arrivee.SetFocus() return # Vérifie contrôle ville arrivée valeur = self.ctrl_ville_arrivee.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un nom de ville d'arrivée" ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_ville_arrivee.SetFocus() return # Vérifie contrôle distance valeur = self.ctrl_distance.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir une distance en Km pour le trajet." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_distance.SetFocus() return if self.ValideControleFloat(self.ctrl_distance) == False: dlg = wx.MessageDialog( self, _(u"La distance saisie n'est pas correcte. \nElle doit être sous la forme '32.50' ou '54' par exemple..." ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() self.ctrl_distance.SetFocus() return if float(valeur) == 0: dlg = wx.MessageDialog( self, _(u"La distance est de 0 Km. \n\nVoulez-vous quand même valider ce déplacement ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant la distance)" ), _(u"Erreur de saisie"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() if reponse == wx.ID_NO or reponse == wx.ID_CANCEL: dlg.Destroy() self.ctrl_distance.SetFocus() return else: dlg.Destroy() # Vérifie contrôle tarif valeur = self.ctrl_tarif.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir la valeur du tarif du Km en euros." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_tarif.SetFocus() return if self.ValideControleFloat(self.ctrl_tarif) == False: dlg = wx.MessageDialog( self, _(u"Le tarif n'est pas valide. \nIl doit être sous la forme '0.32' ou '1.53' par exemple..." ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() self.ctrl_tarif.SetFocus() return if float(valeur) == 0: dlg = wx.MessageDialog( self, _(u"Le tarif du Km est de 0 ¤. \n\nVoulez-vous quand même valider ce déplacement ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant ce tarif)" ), _(u"Erreur de saisie"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() if reponse == wx.ID_NO or reponse == wx.ID_CANCEL: dlg.Destroy() self.ctrl_distance.SetFocus() return else: dlg.Destroy() # Sauvegarde self.SauvegardeDeplacement() # Sauvegarde les Distances self.SauvegardeDistance() # Ferme la boîte de dialogue self.EndModal(wx.ID_OK) def SauvegardeDeplacement(self): """ Sauvegarde des données """ # Récupération des valeurs saisies date = str(self.GetDatePickerValue(self.ctrl_date)) IDpersonne = self.dictPersonnes[ self.ctrl_utilisateur.GetCurrentSelection()] objet = self.ctrl_objet.GetValue() cp_depart = self.ctrl_cp_depart.GetValue() ville_depart = self.ctrl_ville_depart.GetValue() cp_arrivee = self.ctrl_cp_arrivee.GetValue() ville_arrivee = self.ctrl_ville_arrivee.GetValue() distance = float(self.ctrl_distance.GetValue()) aller_retour = str(self.ctrl_aller_retour.GetValue()) tarif_km = float(self.ctrl_tarif.GetValue()) DB = GestionDB.DB() # Création de la liste des données listeDonnees = [ ("date", date), ("IDpersonne", IDpersonne), ("objet", objet), ("cp_depart", cp_depart), ("ville_depart", ville_depart), ("cp_arrivee", cp_arrivee), ("ville_arrivee", ville_arrivee), ("distance", distance), ("aller_retour", aller_retour), ("tarif_km", tarif_km), ("IDremboursement", 0), ] if self.IDdeplacement == None: # Enregistrement d'un nouveau déplacement newID = DB.ReqInsert("deplacements", listeDonnees) ID = newID else: # Modification du déplacement DB.ReqMAJ("deplacements", listeDonnees, "IDdeplacement", self.IDdeplacement) ID = self.IDdeplacement DB.Commit() DB.Close() return ID def SauvegardeDistance(self): """ Sauvegarde la distance dans la base de données """ # Recherche dans la base si la distance existe depart = (self.ctrl_cp_depart.GetValue(), self.ctrl_ville_depart.GetValue()) arrivee = (self.ctrl_cp_arrivee.GetValue(), self.ctrl_ville_arrivee.GetValue()) distanceExiste = False distanceValeur = 0 distanceID = None for IDdistance, cp_depart, ville_depart, cp_arrivee, ville_arrivee, distance in self.listeDistances: depart_temp = (str(cp_depart), ville_depart) arrivee_temp = (str(cp_arrivee), ville_arrivee) if (depart == depart_temp and arrivee == arrivee_temp) or ( depart == arrivee_temp and arrivee == depart_temp): distanceExiste = True distanceValeur = distance distanceID = IDdistance break # Récupération des données cp_depart = int(self.ctrl_cp_depart.GetValue()) ville_depart = self.ctrl_ville_depart.GetValue() cp_arrivee = int(self.ctrl_cp_arrivee.GetValue()) ville_arrivee = self.ctrl_ville_arrivee.GetValue() distance = float(self.ctrl_distance.GetValue()) aller_retour = self.ctrl_aller_retour.GetValue() if aller_retour == True: distance = distance / 2 DB = GestionDB.DB() # Création de la liste des données listeDonnees = [ ("cp_depart", cp_depart), ("ville_depart", ville_depart), ("cp_arrivee", cp_arrivee), ("ville_arrivee", ville_arrivee), ("distance", distance), ] if distanceExiste == False: # Enregistrement d'une nouvelle distance newID = DB.ReqInsert("distances", listeDonnees) else: # Modification de la distance DB.ReqMAJ("distances", listeDonnees, "IDdistance", distanceID) DB.Commit() DB.Close()
class SaisieRemboursement(wx.Dialog): """ Saisie d'un remboursement pour les frais de déplacement """ def __init__(self, parent, id=-1, title=_(u"Saisie d'un remboursement"), IDremboursement=None, IDpersonne=None): wx.Dialog.__init__(self, parent, id, title) #, size=(400, 450) self.IDremboursement = IDremboursement self.IDpersonne = IDpersonne # Généralités self.staticbox_generalites = wx.StaticBox(self, -1, _(u"Caractéristiques")) self.label_date = wx.StaticText(self, -1, _(u"Date :"), size=(60, -1), style=wx.ALIGN_RIGHT) self.ctrl_date = DatePickerCtrl(self, -1, style=DP_DROPDOWN) self.label_montant = wx.StaticText(self, -1, _(u"Montant :"), size=(60, -1), style=wx.ALIGN_RIGHT) self.ctrl_montant = wx.TextCtrl( self, -1, u"", size=(50, -1), ) self.label_euro_montant = wx.StaticText(self, -1, u"¤") self.label_utilisateur = wx.StaticText(self, -1, _(u"Utilisateur :"), size=(60, -1), style=wx.ALIGN_RIGHT) self.ImportationPersonnes() self.ctrl_utilisateur = AdvancedComboBox(self, "", size=(100, -1), choices=self.listePersonnes) # Déplacements self.staticbox_deplacements = wx.StaticBox( self, -1, _(u"Déplacements rattachés")) self.label_rattachement = wx.StaticText(self, -1, u"", size=(-1, -1)) self.ctrl_deplacements = ListCtrl_deplacements( self, size=(-1, 200), IDremboursement=IDremboursement, IDpersonne=self.IDpersonne) # Boutons self.bouton_ok = CTRL_Bouton_image.CTRL( self, texte=_(u"Ok"), cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png")) self.bouton_annuler = CTRL_Bouton_image.CTRL( self, id=wx.ID_CANCEL, texte=_(u"Annuler"), cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png")) self.bouton_aide = CTRL_Bouton_image.CTRL( self, texte=_(u"Aide"), cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png")) # IDpersonne : if self.IDpersonne != None: self.SetPersonne(self.IDpersonne) # Si c'est une modification : if self.IDremboursement != None: self.SetTitle(_(u"Modification d'un remboursement")) self.Importation() # Cache le controle utilisateur : if self.IDpersonne != None: self.label_utilisateur.Show(False) self.ctrl_utilisateur.Show(False) self.SetSize((-1, 415)) self.__set_properties() self.__do_layout() # Binds self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok) self.ctrl_montant.Bind(wx.EVT_KILL_FOCUS, self.montant_EvtKillFocus) def __set_properties(self): self.bouton_ok.SetSize(self.bouton_ok.GetBestSize()) self.bouton_annuler.SetSize(self.bouton_annuler.GetBestSize()) self.bouton_aide.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide"))) self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider"))) self.bouton_annuler.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour annuler la saisie"))) self.ctrl_date.SetToolTip( wx.ToolTip(_(u"Sélectionnez ici la date du déplacement"))) self.ctrl_utilisateur.SetToolTip( wx.ToolTip( _(u"Sélectionnez ici l'utilisateur pour ce déplacement"))) ## self.ctrl_objet.SetToolTip(wx.ToolTip(_(u"Saisissez ici l'objet du déplacement. Ex : réunion, formation, etc..."))) ## self.ctrl_cp_depart.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code postal de la ville de départ"))) ## self.ctrl_ville_depart.SetToolTip(wx.ToolTip(_(u"Saisissez ici le nom de la ville de départ"))) ## self.ctrl_cp_arrivee.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code postal de la ville d'arrivée"))) ## self.ctrl_ville_arrivee.SetToolTip(wx.ToolTip(_(u"Saisissez ici le nom de la ville d'arrivée"))) ## self.ctrl_distance.SetToolTip(wx.ToolTip(_(u"Saisissez ici la distance en Km entre les 2 villes sélectionnées.\nSi Teamworks la connait, il l'indiquera automatiquement."))) ## self.ctrl_aller_retour.SetToolTip(wx.ToolTip(_(u"Cochez cette case si le déplacement a fait l'objet d'un aller/retour.\nLa distance sera ainsi doublée."))) ## self.ctrl_tarif.SetToolTip(wx.ToolTip(_(u"Saisissez ici le montant du tarif du Km pour permettre calculer le montant du remboursement pour ce déplacement."))) ## self.bouton_options_depart.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel"))) ## self.bouton_options_arrivee.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour rechercher une ville ou pour saisir manuellement une ville non présente dans la base de données du logiciel"))) def __do_layout(self): grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=10, hgap=10) # Généralités sizerStaticBox_generalites = wx.StaticBoxSizer( self.staticbox_generalites, wx.HORIZONTAL) grid_sizer_generalites = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10) grid_sizer_generalites.Add(self.label_date, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_generalites = wx.FlexGridSizer(rows=1, cols=5, vgap=5, hgap=5) sizer_generalites.Add(self.ctrl_date, 0, wx.ALL, 0) sizer_generalites.Add((20, 5), 0, wx.ALL, 0) sizer_generalites.Add(self.label_montant, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) sizer_generalites.Add(self.ctrl_montant, 1, wx.EXPAND | wx.ALL, 0) sizer_generalites.Add(self.label_euro_montant, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_generalites.Add(sizer_generalites, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_generalites.Add(self.label_utilisateur, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 0) grid_sizer_generalites.Add(self.ctrl_utilisateur, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_generalites.AddGrowableCol(1) sizerStaticBox_generalites.Add(grid_sizer_generalites, 1, wx.EXPAND | wx.ALL, 5) grid_sizer_base.Add(sizerStaticBox_generalites, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10) # Déplacements sizerStaticBox_deplacements = wx.StaticBoxSizer( self.staticbox_deplacements, wx.HORIZONTAL) grid_sizer_deplacements = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10) grid_sizer_deplacements.Add(self.ctrl_deplacements, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_deplacements.Add(self.label_rattachement, 1, wx.EXPAND | wx.ALL, 0) grid_sizer_deplacements.AddGrowableRow(0) grid_sizer_deplacements.AddGrowableCol(0) sizerStaticBox_deplacements.Add(grid_sizer_deplacements, 1, wx.EXPAND | wx.ALL, 5) grid_sizer_base.Add(sizerStaticBox_deplacements, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) # Boutons grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10) grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0) grid_sizer_boutons.Add((20, 20), 0, 0, 0) grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0) grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0) grid_sizer_boutons.AddGrowableCol(1) grid_sizer_base.Add(grid_sizer_boutons, 1, wx.ALL | wx.EXPAND, 10) self.SetSizer(grid_sizer_base) grid_sizer_base.AddGrowableCol(0) grid_sizer_base.Fit(self) self.Layout() self.CenterOnScreen() def ImportationPersonnes(self): """ Importation de la liste des personnes """ # Récupération de la liste des personnes DB = GestionDB.DB() req = """SELECT IDpersonne, nom, prenom FROM personnes ORDER BY nom, prenom; """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() # Création de la liste pour le listBox self.listePersonnes = [] self.dictPersonnes = {} index = 0 for IDpersonne, nom, prenom in listeDonnees: self.listePersonnes.append(nom + " " + prenom) self.dictPersonnes[index] = IDpersonne index += 1 def Importation(self): """ Importation des données si c'est une modification de déplacement """ # Récupération des données du déplacement DB = GestionDB.DB() req = """SELECT IDremboursement, IDpersonne, date, montant, listeIDdeplacement FROM remboursements WHERE IDremboursement=%d; """ % self.IDremboursement DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() if len(listeDonnees) == 0: return # Intégration des données dans le formulaire self.IDpersonne = listeDonnees[0][1] self.SetPersonne(self.IDpersonne) date = listeDonnees[0][2] self.SetDate( datetime.date(year=int(date[:4]), month=int(date[5:7]), day=int(date[8:10]))) self.ctrl_montant.SetValue(str(listeDonnees[0][3])) # MAJ de l'affichage self.MajIDpersonne() self.MajLabelRattachement(float(self.ctrl_montant.GetValue())) def SetRemboursement(self, IDremboursement=None): """ Définit le remboursement """ if IDremboursement == None or IDremboursement == 0 or IDremboursement == "": self.ctrl_remboursement.SetLabel("Aucun remboursement.") else: # Recherche date du remboursement DB = GestionDB.DB() req = """SELECT date FROM remboursements WHERE IDremboursement=%d; """ % IDremboursement DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() dateRemboursement = self.DateEngFr(listeDonnees[0][0]) self.ctrl_remboursement.SetLabel("N°" + str(IDremboursement) + " du " + dateRemboursement) def DateEngFr(self, textDate): text = str(textDate[8:10]) + "/" + str(textDate[5:7]) + "/" + str( textDate[:4]) return text def SetAllerRetour(self, etat=False): """ Définit l'aller retour """ self.ctrl_aller_retour.SetValue(etat) if etat == False: self.label_km.SetLabel("Km (Aller simple)") else: self.label_km.SetLabel("Km (Aller/retour)") def CalcMontantRmbst(self): if self.ValideControleFloat(self.ctrl_distance) == False: return if self.ValideControleFloat(self.ctrl_tarif) == False: return distance = float(self.ctrl_distance.GetValue()) tarif = float(self.ctrl_tarif.GetValue()) montant = distance * tarif self.ctrl_montant.SetLabel(u"%.2f ¤" % montant) def montant_EvtKillFocus(self, event): # Vérifie la validité de la valeur if self.ValideControleFloat(self.ctrl_montant) == False: dlg = wx.MessageDialog( self, _(u"Le montant n'est pas valide. \nIl doit être sous la forme '1.32' ou '100.50' par exemple..." ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() self.ctrl_deplacements.Enable(False) self.ctrl_montant.SetFocus() return # Met à jour le montant dans le listCtrl if self.ctrl_utilisateur.GetCurrentSelection() != -1: self.MajLabelRattachement(float(self.ctrl_montant.GetValue())) def MajIDpersonne(self): """ Quand l'utilisateur est mis à jour """ self.IDpersonne = self.GetPersonne() self.ctrl_deplacements.IDpersonne = self.IDpersonne self.ctrl_deplacements.MAJListeCtrl() def MajLabelRattachement(self, montant=None): # Met à jour le montant dans le listCtrl if montant != None: self.ctrl_deplacements.montantRemboursement = montant self.ctrl_deplacements.MajLabelRattachement() def ValideControleFloat(self, controle=None): """ Vérifie la validité d'un contrôle de type Float """ valeur = controle.GetValue() if valeur == "": return True # Vérifie que la valeur est bien constituée de chiffres uniquement incoherences = "" for lettre in valeur: if lettre not in "0123456789.": incoherences += "'" + lettre + "', " if len(incoherences) != 0: return False else: try: test = float(valeur) except: return False return True def MajDistance(self): """ Met à jour le Contrôle Distance en fonction des villes saisies """ depart = (self.ctrl_cp_depart.GetValue(), self.ctrl_ville_depart.GetValue()) arrivee = (self.ctrl_cp_arrivee.GetValue(), self.ctrl_ville_arrivee.GetValue()) for IDdistance, cp_depart, ville_depart, cp_arrivee, ville_arrivee, distance in self.listeDistances: depart_temp = (str(cp_depart), ville_depart) arrivee_temp = (str(cp_arrivee), ville_arrivee) if (depart == depart_temp and arrivee == arrivee_temp) or ( depart == arrivee_temp and arrivee == depart_temp): if self.ctrl_aller_retour.GetValue() == True: self.ctrl_distance.SetValue(str(distance * 2)) else: self.ctrl_distance.SetValue(str(distance)) break def GetPersonne(self): """ Récupère l'IDpersonne du comboBox """ index = self.ctrl_utilisateur.GetCurrentSelection() if index == -1: return None IDpersonne = self.dictPersonnes[index] return IDpersonne def SetPersonne(self, IDpersonne=None): # Recherche de l'index dans le dictPersonnes for index, IDpers in self.dictPersonnes.items(): if IDpersonne == IDpers: self.ctrl_utilisateur.Select(index) break def SetDate(self, date): """ Saisi une date au format datetime dans le datepicker """ self.SetDatePicker(self.ctrl_date, date) def SetDatePicker(self, controle, date): """ Met une date au format datetime dans un datePicker donné """ annee = int(date.year) mois = int(date.month) - 1 jour = int(date.day) date = wx.DateTime() date.Set(jour, mois, annee) controle.SetValue(date) def GetDatePickerValue(self, controle): """ Renvoie la date au format datetime d'un datePicker """ date_tmp = controle.GetValue() return datetime.date(date_tmp.GetYear(), date_tmp.GetMonth() + 1, date_tmp.GetDay()) def OnBoutonAide(self, event): """ Aide """ from Utils import UTILS_Aide UTILS_Aide.Aide("Enregistrerunremboursement") def OnBoutonOk(self, event): """ Validation des données saisies """ # Vérifie contrôle Utilisateur valeur = self.ctrl_utilisateur.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement sélectionner un utilisateur."), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_utilisateur.SetFocus() return # Vérifie contrôle montant valeur = self.ctrl_montant.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un montant en euros pour ce remboursement." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_montant.SetFocus() return if self.ValideControleFloat(self.ctrl_montant) == False: dlg = wx.MessageDialog( self, _(u"Le montant saisi n'est pas valide \nIl doit être sous la forme '32.50' ou '54' par exemple..." ), _(u"Erreur de saisie"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() self.ctrl_montant.SetFocus() return if float(valeur) == 0: dlg = wx.MessageDialog( self, _(u"Le montant que vous avez saisi est de 0 ¤\n\nSouhaitez-vous conserver ce montant ?\n(Cliquez sur 'Non' ou 'Annuler' pour modifier maintenant le montant)" ), _(u"Erreur de saisie"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() if reponse == wx.ID_NO or reponse == wx.ID_CANCEL: dlg.Destroy() self.ctrl_montant.SetFocus() return else: dlg.Destroy() # Vérifie contrôle déplacements listeIDcoches, listeIDdecoches = self.ctrl_deplacements.ListeItemsCoches( ) if len(listeIDcoches) == 0: dlg = wx.MessageDialog( self, _(u"Vous n'avez coché aucun déplacement dans la liste.\n\nSouhaitez-vous quand même valider ?\n(Cliquez sur 'Non' ou 'Annuler' pour cocher maintenant des déplacements)" ), _(u"Erreur de saisie"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() if reponse == wx.ID_NO or reponse == wx.ID_CANCEL: dlg.Destroy() return else: dlg.Destroy() # Sauvegarde self.Sauvegarde() # Ferme la boîte de dialogue self.EndModal(wx.ID_OK) def Sauvegarde(self): """ Sauvegarde des données """ # Récupération des valeurs saisies date = str(self.GetDatePickerValue(self.ctrl_date)) IDpersonne = self.dictPersonnes[ self.ctrl_utilisateur.GetCurrentSelection()] montant = float(self.ctrl_montant.GetValue()) # Récupération des déplacements cochés listeIDcoches, listeIDdecoches = self.ctrl_deplacements.ListeItemsCoches( ) texteID = "" if len(listeIDcoches) != 0: for ID in listeIDcoches: texteID += str(ID) + "-" texteID = texteID[:-1] DB = GestionDB.DB() # Création de la liste des données listeDonnees = [ ("date", date), ("IDpersonne", IDpersonne), ("montant", montant), ("listeIDdeplacement", texteID), ] if self.IDremboursement == None: # Enregistrement d'un nouveau remboursement newID = DB.ReqInsert("remboursements", listeDonnees) ID = newID else: # Modification du remboursement DB.ReqMAJ("remboursements", listeDonnees, "IDremboursement", self.IDremboursement) ID = self.IDremboursement DB.Commit() DB.Close() # # Modification du IDdeplacement de chaque déplacement rattaché # DB = GestionDB.DB() # Création de la liste des données for IDdeplacement in listeIDcoches: listeDonnees = [ ("IDremboursement", ID), ] DB.ReqMAJ("deplacements", listeDonnees, "IDdeplacement", IDdeplacement) # Décoche les autres items for IDdeplacement in listeIDdecoches: listeDonnees = [ ("IDremboursement", 0), ] DB.ReqMAJ("deplacements", listeDonnees, "IDdeplacement", IDdeplacement) DB.Commit() DB.Close() return ID
class Panel(wx.Panel): def __init__(self, parent, IDemploi=None): wx.Panel.__init__(self, parent, id=-1, name="panel_emploi", style=wx.TAB_TRAVERSAL) self.IDemploi = IDemploi self.listeDisponibilites = [] # Général self.sizer_generalites_staticbox = wx.StaticBox( self, -1, _(u"1. Généralités")) self.label_introduction = wx.StaticText( self, -1, _(u"Vous pouvez ici saisir les informations concernant l'offre d'emploi." )) self.label_date_debut = wx.StaticText(self, -1, _(u"Lancement :")) self.ctrl_date_debut = DatePickerCtrl(self, -1, style=DP_DROPDOWN) self.label_date_fin = wx.StaticText(self, -1, _(u"Clôture :")) self.ctrl_date_fin = DatePickerCtrl(self, -1, style=DP_DROPDOWN) self.label_intitule = wx.StaticText(self, -1, _(u"Intitulé :")) self.ctrl_intitule = wx.TextCtrl(self, -1, "") self.label_detail = wx.StaticText(self, -1, _(u"Détail :")) self.ctrl_detail = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE) self.ctrl_detail.SetMinSize((-1, 100)) self.label_reference = wx.StaticText(self, -1, _(u"N° ANPE :")) self.ctrl_reference = wx.TextCtrl(self, -1, "") # Disponibilités self.sizer_disponibilites_staticbox = wx.StaticBox( self, -1, _(u"2. Disponibilités")) self.label_periodes = wx.StaticText(self, -1, _(u"Périodes :")) self.ctrl_periodes = ListBoxDisponibilites(self) self.ctrl_periodes.SetMinSize((20, 20)) self.bouton_ajouter_periode = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"), wx.BITMAP_TYPE_ANY)) self.bouton_modifier_periode = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Modifier.png"), wx.BITMAP_TYPE_ANY)) self.bouton_supprimer_periode = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"), wx.BITMAP_TYPE_ANY)) self.label_periodes_remarques = wx.StaticText(self, -1, _(u"Remarques :")) self.ctrl_periodes_remarques = wx.TextCtrl(self, -1, u"") # Poste self.sizer_poste_staticbox = wx.StaticBox(self, -1, _(u"3. Poste")) self.label_fonction = wx.StaticText(self, -1, _(u"Fonction :")) self.ctrl_fonction = CheckListBox(self) self.ctrl_fonction.SetMinSize((20, 20)) self.ctrl_fonction.Remplissage(self.Importation_fonctions()) self.bouton_fonctions = wx.Button(self, -1, "...", size=(20, 20)) self.label_affectation = wx.StaticText(self, -1, _(u"Affectation :")) self.ctrl_affectations = CheckListBox(self) self.ctrl_affectations.SetMinSize((20, 20)) self.ctrl_affectations.Remplissage(self.Importation_affectations()) self.bouton_affectations = wx.Button(self, -1, "...", size=(20, 20)) self.label_poste_remarques = wx.StaticText(self, -1, _(u"Remarques :")) self.ctrl_poste_remarques = wx.TextCtrl(self, -1, "") # Diffuseurs self.sizer_diffusion_staticbox = wx.StaticBox( self, -1, _(u"4. Diffusion de l'offre")) self.label_diffuseurs = wx.StaticText(self, -1, _(u" Diffuseurs :")) self.ctrl_diffuseurs = CheckListBox(self) self.ctrl_diffuseurs.SetMinSize((20, 20)) self.ctrl_diffuseurs.Remplissage(self.Importation_diffuseurs()) self.bouton_diffuseurs = wx.Button(self, -1, "...", size=(20, 20)) # Commandes self.bouton_aide = CTRL_Bouton_image.CTRL( self, texte=_(u"Aide"), cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png")) self.bouton_ok = CTRL_Bouton_image.CTRL( self, texte=_(u"Ok"), cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png")) self.bouton_annuler = CTRL_Bouton_image.CTRL( self, texte=_(u"Annuler"), cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png")) self.bouton_aide.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide"))) self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider"))) self.bouton_annuler.SetToolTip( wx.ToolTip(_(u"Cliquez pour annuler et fermer"))) self.__set_properties() self.__do_layout() # Binds self.Bind(wx.EVT_BUTTON, self.Onbouton_aide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.Onbouton_ok, self.bouton_ok) self.Bind(wx.EVT_BUTTON, self.Onbouton_annuler, self.bouton_annuler) self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_BUTTON, self.OnAjouterPeriode, self.bouton_ajouter_periode) self.Bind(wx.EVT_BUTTON, self.OnModifierPeriode, self.bouton_modifier_periode) self.Bind(wx.EVT_BUTTON, self.OnSupprimerPeriode, self.bouton_supprimer_periode) self.Bind(wx.EVT_BUTTON, self.OnGestionFonctions, self.bouton_fonctions) self.Bind(wx.EVT_BUTTON, self.OnGestionAffectations, self.bouton_affectations) self.Bind(wx.EVT_BUTTON, self.OnGestionDiffuseurs, self.bouton_diffuseurs) self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu) # Importation des données if self.IDemploi != None: self.Importation() def __set_properties(self): self.ctrl_date_debut.SetToolTip( wx.ToolTip( _(u"Saisissez la date de lancement de l'offre d'emploi"))) self.ctrl_date_fin.SetToolTip( wx.ToolTip( _(u"Sélectionnez la date de clôture du recrutement pour cette offre d'emploi" ))) self.ctrl_intitule.SetToolTip( wx.ToolTip( _(u"Saisissez l'intitulé (nom) de l'offre. Ex : Animateur Mercredis et vacances Saison 2009-10" ))) self.ctrl_detail.SetToolTip( wx.ToolTip( _(u"Saisissez le texte détaillé de l'offre d'emploi"))) self.ctrl_reference.SetToolTip( wx.ToolTip( _(u"Saisissez le numéro de l'annonce déposé à l'ANPE. Ex : X455676E" ))) self.ctrl_periodes.SetToolTip( wx.ToolTip( _(u"Sélectionnez un ou plusieurs périodes de disponibilités" ))) self.ctrl_periodes_remarques.SetToolTip( wx.ToolTip( _(u"Saisissez un complement d'information sur les disponibilités" ))) self.ctrl_fonction.SetToolTip( wx.ToolTip(_(u"Cochez la ou les fonctions du poste"))) self.ctrl_affectations.SetToolTip( wx.ToolTip(_(u"Cochez la ou les affectations pour le poste"))) self.ctrl_poste_remarques.SetToolTip( wx.ToolTip( _(u"Saisissez un complément d'information sur le poste"))) self.bouton_ajouter_periode.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour ajouter une période"))) self.bouton_modifier_periode.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour modifier la période sélectionnée"))) self.bouton_supprimer_periode.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour supprimer la période sélectionnée"))) self.bouton_fonctions.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour ajouter, modifier ou supprimer des fonctions" ))) self.bouton_affectations.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour ajouter, modifier ou supprimer des affectations" ))) self.bouton_diffuseurs.SetToolTip( wx.ToolTip( _(u"Cliquez ici pour ajouter, modifier ou supprimer des diffuseurs" ))) self.ctrl_diffuseurs.SetToolTip( wx.ToolTip( _(u"Cochez ici les organismes ou moyens de communication utilisés pour diffuser cette offre d'emploi. Ex : ANPE, Presse, fédération, etc..." ))) def __do_layout(self): grid_sizer_base = wx.FlexGridSizer(rows=4, cols=1, vgap=0, hgap=0) grid_sizer_contenu = wx.FlexGridSizer(rows=1, cols=2, vgap=10, hgap=10) grid_sizer_droite = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10) sizer_diffusion = wx.StaticBoxSizer(self.sizer_diffusion_staticbox, wx.VERTICAL) grid_sizer_diffusion = wx.FlexGridSizer(rows=3, cols=2, vgap=5, hgap=10) sizer_poste = wx.StaticBoxSizer(self.sizer_poste_staticbox, wx.VERTICAL) grid_sizer_poste = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10) grid_sizer_affectation = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5) grid_sizer_fonction = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5) grid_sizer_gauche = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10) sizer_disponibilites = wx.StaticBoxSizer( self.sizer_disponibilites_staticbox, wx.VERTICAL) grid_sizer_disponibilites = wx.FlexGridSizer(rows=2, cols=2, vgap=10, hgap=10) grid_sizer_periodes = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5) grid_sizer_boutons_periodes = wx.FlexGridSizer(rows=5, cols=1, vgap=5, hgap=5) sizer_generalites = wx.StaticBoxSizer(self.sizer_generalites_staticbox, wx.VERTICAL) grid_sizer_generalites = wx.FlexGridSizer(rows=4, cols=2, vgap=5, hgap=10) grid_sizer_type = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5) grid_sizer_base.Add(self.label_introduction, 0, wx.ALL, 10) grid_sizer_generalites.Add(self.label_date_debut, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_dates = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5) grid_sizer_dates.Add(self.ctrl_date_debut, 0, 0, 0) grid_sizer_dates.Add((5, 5), 0, wx.EXPAND, 0) grid_sizer_dates.Add(self.label_date_fin, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_dates.Add(self.ctrl_date_fin, 0, 0, 0) grid_sizer_dates.AddGrowableCol(1) grid_sizer_generalites.Add(grid_sizer_dates, 0, wx.EXPAND, 0) grid_sizer_generalites.Add(self.label_intitule, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_generalites.Add(self.ctrl_intitule, 0, wx.EXPAND, 0) grid_sizer_generalites.Add(self.label_detail, 0, wx.ALIGN_RIGHT, 0) grid_sizer_generalites.Add(self.ctrl_detail, 0, wx.EXPAND, 0) grid_sizer_generalites.Add(self.label_reference, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_generalites.Add(self.ctrl_reference, 0, wx.EXPAND, 0) grid_sizer_generalites.AddGrowableCol(1) sizer_generalites.Add(grid_sizer_generalites, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_gauche.Add(sizer_generalites, 1, wx.EXPAND, 0) grid_sizer_disponibilites.Add(self.label_periodes, 0, wx.ALIGN_RIGHT, 0) grid_sizer_periodes.Add(self.ctrl_periodes, 0, wx.EXPAND, 0) grid_sizer_boutons_periodes.Add(self.bouton_ajouter_periode, 0, 0, 0) grid_sizer_boutons_periodes.Add(self.bouton_modifier_periode, 0, 0, 0) grid_sizer_boutons_periodes.Add(self.bouton_supprimer_periode, 0, 0, 0) grid_sizer_periodes.Add(grid_sizer_boutons_periodes, 1, wx.EXPAND, 0) grid_sizer_periodes.AddGrowableRow(0) grid_sizer_periodes.AddGrowableCol(0) grid_sizer_disponibilites.Add(grid_sizer_periodes, 1, wx.EXPAND, 0) grid_sizer_disponibilites.Add( self.label_periodes_remarques, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_disponibilites.Add(self.ctrl_periodes_remarques, 0, wx.EXPAND, 0) grid_sizer_disponibilites.AddGrowableRow(0) grid_sizer_disponibilites.AddGrowableCol(1) sizer_disponibilites.Add(grid_sizer_disponibilites, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_gauche.Add(sizer_disponibilites, 1, wx.EXPAND, 0) grid_sizer_gauche.AddGrowableRow(1) grid_sizer_gauche.AddGrowableCol(0) grid_sizer_contenu.Add(grid_sizer_gauche, 1, wx.EXPAND, 0) grid_sizer_poste.Add(self.label_fonction, 0, wx.ALIGN_RIGHT, 0) grid_sizer_fonction.Add(self.ctrl_fonction, 0, wx.EXPAND, 0) grid_sizer_fonction.Add(self.bouton_fonctions, 0, 0, 0) grid_sizer_fonction.AddGrowableRow(0) grid_sizer_fonction.AddGrowableCol(0) grid_sizer_poste.Add(grid_sizer_fonction, 1, wx.EXPAND, 0) grid_sizer_poste.Add(self.label_affectation, 0, wx.ALIGN_RIGHT, 0) grid_sizer_affectation.Add(self.ctrl_affectations, 0, wx.EXPAND, 0) grid_sizer_affectation.Add(self.bouton_affectations, 0, 0, 0) grid_sizer_affectation.AddGrowableRow(0) grid_sizer_affectation.AddGrowableCol(0) grid_sizer_poste.Add(grid_sizer_affectation, 1, wx.EXPAND, 0) grid_sizer_poste.Add(self.label_poste_remarques, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_poste.Add(self.ctrl_poste_remarques, 0, wx.EXPAND, 0) grid_sizer_poste.AddGrowableRow(0) grid_sizer_poste.AddGrowableRow(1) grid_sizer_poste.AddGrowableCol(1) sizer_poste.Add(grid_sizer_poste, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_droite.Add(sizer_poste, 1, wx.EXPAND, 0) grid_sizer_diffuseurs = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5) grid_sizer_diffusion.Add(self.label_diffuseurs, 0, wx.ALIGN_RIGHT, 0) grid_sizer_diffuseurs.Add(self.ctrl_diffuseurs, 0, wx.EXPAND, 0) grid_sizer_diffuseurs.Add(self.bouton_diffuseurs, 0, 0, 0) grid_sizer_diffuseurs.AddGrowableRow(0) grid_sizer_diffuseurs.AddGrowableCol(0) grid_sizer_diffusion.Add(grid_sizer_diffuseurs, 1, wx.ALL | wx.EXPAND, 0) grid_sizer_diffusion.AddGrowableRow(0) grid_sizer_diffusion.AddGrowableCol(1) sizer_diffusion.Add(grid_sizer_diffusion, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_droite.Add(sizer_diffusion, 1, wx.EXPAND, 0) grid_sizer_droite.AddGrowableRow(0) grid_sizer_droite.AddGrowableRow(1) grid_sizer_droite.AddGrowableCol(0) grid_sizer_contenu.Add(grid_sizer_droite, 1, wx.EXPAND, 0) grid_sizer_contenu.AddGrowableRow(0) grid_sizer_contenu.AddGrowableCol(0) grid_sizer_contenu.AddGrowableCol(1) grid_sizer_base.Add(grid_sizer_contenu, 1, wx.ALL | wx.EXPAND, 10) # Spacer grid_sizer_base.Add((5, 5), 0, wx.EXPAND, 0) # Commandes grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=6, vgap=10, hgap=10) grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0) grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0) grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0) grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0) grid_sizer_boutons.AddGrowableCol(1) grid_sizer_base.Add(grid_sizer_boutons, 1, wx.LEFT | wx.BOTTOM | wx.RIGHT | wx.EXPAND, 10) self.SetSizer(grid_sizer_base) grid_sizer_base.Fit(self) grid_sizer_base.AddGrowableRow(1) grid_sizer_base.AddGrowableCol(0) def OnContextMenu(self, event): pass def SetDatePicker(self, controle, date): """ Met une date au format datetime dans un datePicker donné """ annee = int(date.year) mois = int(date.month) - 1 jour = int(date.day) date = wx.DateTime() date.Set(jour, mois, annee) controle.SetValue(date) def GetDatePickerValue(self, controle): """ Renvoie la date au format datetime d'un datePicker """ date_tmp = controle.GetValue() return datetime.date(date_tmp.GetYear(), date_tmp.GetMonth() + 1, date_tmp.GetDay()) def Importation_diffuseurs(self): # Importation des diffuseurs DB = GestionDB.DB() req = """SELECT IDdiffuseur, diffuseur FROM diffuseurs ORDER BY diffuseur; """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() return listeDonnees def Importation_fonctions(self): # Importation des fonctions disponibles DB = GestionDB.DB() req = """SELECT IDfonction, fonction FROM fonctions ORDER BY fonction; """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() return listeDonnees def Importation_affectations(self): # Importation des affectations disponibles DB = GestionDB.DB() req = """SELECT IDaffectation, affectation FROM affectations ORDER BY affectation; """ DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() return listeDonnees def Importation(self): # Importation des données de la candidature DB = GestionDB.DB() req = """SELECT IDemploi, date_debut, date_fin, intitule, detail, reference_anpe, periodes_remarques, poste_remarques FROM emplois WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() if len(listeDonnees) == 0: return IDemploi, date_debut, date_fin, intitule, detail, reference_anpe, periodes_remarques, poste_remarques = listeDonnees[ 0] self.SetDatePicker( self.ctrl_date_debut, datetime.date(year=int(date_debut[:4]), month=int(date_debut[5:7]), day=int(date_debut[8:10]))) self.SetDatePicker( self.ctrl_date_fin, datetime.date(year=int(date_fin[:4]), month=int(date_fin[5:7]), day=int(date_fin[8:10]))) self.ctrl_intitule.SetValue(intitule) self.ctrl_detail.SetValue(detail) self.ctrl_reference.SetValue(reference_anpe) self.ctrl_periodes_remarques.SetValue(periodes_remarques) self.ctrl_poste_remarques.SetValue(poste_remarques) # Importation des disponibilités DB = GestionDB.DB() req = """SELECT IDdisponibilite, date_debut, date_fin FROM emplois_dispo WHERE IDemploi=%d ORDER BY date_debut; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() self.listeDisponibilites = [] for IDdisponibilite, date_debut, date_fin in listeDonnees: date_debut = datetime.date(year=int(date_debut[:4]), month=int(date_debut[5:7]), day=int(date_debut[8:10])) date_fin = datetime.date(year=int(date_fin[:4]), month=int(date_fin[5:7]), day=int(date_fin[8:10])) self.listeDisponibilites.append( (IDdisponibilite, date_debut, date_fin)) self.ctrl_periodes.Remplissage(self.listeDisponibilites) # Importation des fonctions DB = GestionDB.DB() req = """SELECT IDemploi_fonction, IDfonction FROM emplois_fonctions WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() listeFonctions = [] for IDemploi_fonction, IDfonction in listeDonnees: listeFonctions.append(IDfonction) self.ctrl_fonction.CocheListe(listeFonctions) # Importation des affectations DB = GestionDB.DB() req = """SELECT IDemploi_affectation, IDaffectation FROM emplois_affectations WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() listeAffectations = [] for IDemploi_affectation, IDaffectation in listeDonnees: listeAffectations.append(IDaffectation) self.ctrl_affectations.CocheListe(listeAffectations) # Importation des diffuseurs DB = GestionDB.DB() req = """SELECT IDemploi_diffuseur, IDdiffuseur FROM emplois_diffuseurs WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() listeDiffuseurs = [] for IDemploi_diffuseur, IDdiffuseur in listeDonnees: listeDiffuseurs.append(IDdiffuseur) self.ctrl_diffuseurs.CocheListe(listeDiffuseurs) def MAJ_fonctions(self): # Récupère liste des fonctions disponibles self.ctrl_fonction.Remplissage(self.Importation_fonctions()) self.ctrl_fonction.CocheListe() def MAJ_affectations(self): # Récupère liste des fonctions disponibles self.ctrl_affectations.Remplissage(self.Importation_affectations()) self.ctrl_affectations.CocheListe() def MAJ_diffuseurs(self): # Récupère liste des fonctions disponibles self.ctrl_diffuseurs.Remplissage(self.Importation_diffuseurs()) self.ctrl_diffuseurs.CocheListe() def OnAjouterPeriode(self, event): # Ajout d'une période de disponibilités dlg = DLG_Selection_periode.SelectionPeriode(self) if dlg.ShowModal() == wx.ID_OK: date_debut, date_fin = dlg.GetDates() dlg.Destroy() else: dlg.Destroy() return False # Modification de la liste self.listeDisponibilites.append((None, date_debut, date_fin)) self.ctrl_periodes.Remplissage(self.listeDisponibilites) def OnModifierPeriode(self, event): # Modification d'une période de disponibilité index = self.ctrl_periodes.GetSelection() if index == -1: dlg = wx.MessageDialog( self, _(u"Vous devez déjà sélectionner une période dans la liste" ), _(u"Erreur"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() return IDdisponibilite, date_debut, date_fin = self.listeDisponibilites[index] dlg = DLG_Selection_periode.SelectionPeriode(self) dlg.SetDates(date_debut=date_debut, date_fin=date_fin) if dlg.ShowModal() == wx.ID_OK: date_debut, date_fin = dlg.GetDates() dlg.Destroy() else: dlg.Destroy() return False # Modification de la liste self.listeDisponibilites[index] = (IDdisponibilite, date_debut, date_fin) self.ctrl_periodes.Remplissage(self.listeDisponibilites) def OnSupprimerPeriode(self, event): # Suppression d'une période de disponibilité index = self.ctrl_periodes.GetSelection() if index == -1: dlg = wx.MessageDialog( self, _(u"Vous devez déjà sélectionner une période dans la liste" ), _(u"Erreur"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() return IDdisponibilite, date_debut, date_fin = self.listeDisponibilites[index] # Demande de confirmation formatDate = "%d/%m/%Y" texteDates = _(u"Du %s au %s") % (date_debut.strftime(formatDate), date_fin.strftime(formatDate)) txtMessage = six.text_type((_( u"Voulez-vous vraiment supprimer cette période de disponibilité ? \n\n> %s" ) % texteDates)) dlgConfirm = wx.MessageDialog( self, txtMessage, _(u"Confirmation de suppression"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) reponse = dlgConfirm.ShowModal() dlgConfirm.Destroy() if reponse == wx.ID_NO: return # Modification de la liste self.listeDisponibilites.pop(index) self.ctrl_periodes.Remplissage(self.listeDisponibilites) def OnGestionFonctions(self, event): dlg = DLG_Config_fonctions.Dialog(self) dlg.ShowModal() dlg.Destroy() self.MAJ_fonctions() def OnGestionAffectations(self, event): dlg = DLG_Config_affectations.Dialog(self) dlg.ShowModal() dlg.Destroy() self.MAJ_affectations() def OnGestionDiffuseurs(self, event): dlg = DLG_Config_diffuseurs.Dialog(self) dlg.ShowModal() dlg.Destroy() self.MAJ_diffuseurs() def OnClose(self, event): self.GetParent().Fermer() def Onbouton_aide(self, event): dlg = wx.MessageDialog( self, _(u"L'aide du module Recrutement est en cours de rédaction.\nElle sera disponible lors d'une mise à jour ultérieure." ), "Aide indisponible", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def Onbouton_annuler(self, event): # Fermeture self.GetParent().Fermer() def Onbouton_ok(self, event): """ Validation des données saisies """ # Type du dépôt valeur = self.ctrl_intitule.GetValue() if valeur == "": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement un intitulé pour cette offre d'emploi." ), "Erreur", wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() self.ctrl_intitule.SetFocus() return # Disponibilités if len(self.listeDisponibilites) == 0: dlgConfirm = wx.MessageDialog( self, _(u"Vous n'avez saisi aucune période de disponibilité. Confirmez-vous ce choix ?" ), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) reponse = dlgConfirm.ShowModal() dlgConfirm.Destroy() if reponse == wx.ID_NO: return # Fonctions if len(self.ctrl_fonction.listeIDcoches) == 0: dlgConfirm = wx.MessageDialog( self, _(u"Vous n'avez saisi aucune demande de fonction. Confirmez-vous ce choix ?" ), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) reponse = dlgConfirm.ShowModal() dlgConfirm.Destroy() if reponse == wx.ID_NO: return # Affectations if len(self.ctrl_affectations.listeIDcoches) == 0: dlgConfirm = wx.MessageDialog( self, _(u"Vous n'avez saisi aucune demande d'affectation. Confirmez-vous ce choix ?" ), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) reponse = dlgConfirm.ShowModal() dlgConfirm.Destroy() if reponse == wx.ID_NO: return # Sauvegarde des données self.Sauvegarde() # Fermeture self.GetParent().Fermer() def Sauvegarde(self): # Sauvegarde des données # Généralités date_debut = str(self.GetDatePickerValue(self.ctrl_date_debut)) date_fin = str(self.GetDatePickerValue(self.ctrl_date_fin)) intitule = self.ctrl_intitule.GetValue() detail = self.ctrl_detail.GetValue() reference_anpe = self.ctrl_reference.GetValue() # Disponibilités listeDisponibilites = self.listeDisponibilites remarques_periodes = self.ctrl_periodes_remarques.GetValue() # Poste listeFonctions = self.ctrl_fonction.listeIDcoches listeAffectations = self.ctrl_affectations.listeIDcoches remarques_poste = self.ctrl_poste_remarques.GetValue() # Diffuseurs listeDiffuseurs = self.ctrl_diffuseurs.listeIDcoches DB = GestionDB.DB() # Sauvegarde de la candidature listeDonnees = [ ("IDemploi", self.IDemploi), ("date_debut", date_debut), ("date_fin", date_fin), ("intitule", intitule), ("detail", detail), ("reference_anpe", reference_anpe), ("periodes_remarques", remarques_periodes), ("poste_remarques", remarques_poste), ] if self.IDemploi == None: newID = DB.ReqInsert("emplois", listeDonnees) self.IDemploi = newID nouvelEmploi = True else: DB.ReqMAJ("emplois", listeDonnees, "IDemploi", self.IDemploi) nouvelEmploi = False DB.Commit() # Sauvegarde des disponibilités listeID = [] for IDdisponibilite, date_debut, date_fin in listeDisponibilites: listeDonnees = [ ("IDemploi", self.IDemploi), ("date_debut", date_debut), ("date_fin", date_fin), ] if IDdisponibilite == None: newID = DB.ReqInsert("emplois_dispo", listeDonnees) IDdisponibilite = newID else: DB.ReqMAJ("emplois_dispo", listeDonnees, "IDdisponibilite", IDdisponibilite) DB.Commit() listeID.append(IDdisponibilite) # Effacement des disponibilités supprimées if nouvelEmploi == False: req = """SELECT IDdisponibilite, date_debut, date_fin FROM emplois_dispo WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() for IDdisponibilite, date_debut, date_fin in listeDonnees: if IDdisponibilite not in listeID: DB.ReqDEL("emplois_dispo", "IDdisponibilite", IDdisponibilite) # Sauvegarde des fonctions listeIDexistantes = [] listeIDemploi_fonction = [] req = """SELECT IDemploi_fonction, IDfonction FROM emplois_fonctions WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() for IDemploi_fonction, IDfonction in listeDonnees: listeIDexistantes.append(IDfonction) listeIDemploi_fonction.append((IDemploi_fonction, IDfonction)) for IDfonction in listeFonctions: if IDfonction not in listeIDexistantes: # Si n'existe pas : listeDonnees = [ ("IDemploi", self.IDemploi), ("IDfonction", IDfonction), ] newID = DB.ReqInsert("emplois_fonctions", listeDonnees) DB.Commit() # Effacement des fonctions supprimées if nouvelEmploi == False: for IDemploi_fonction, IDfonction in listeIDemploi_fonction: if IDfonction not in listeFonctions: DB.ReqDEL("emplois_fonctions", "IDemploi_fonction", IDemploi_fonction) # Sauvegarde des affectations listeIDexistantes = [] listeIDemploi_affectation = [] req = """SELECT IDemploi_affectation, IDaffectation FROM emplois_affectations WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() for IDemploi_affectation, IDaffectation in listeDonnees: listeIDexistantes.append(IDaffectation) listeIDemploi_affectation.append( (IDemploi_affectation, IDaffectation)) for IDaffectation in listeAffectations: if IDaffectation not in listeIDexistantes: # Si n'existe pas : listeDonnees = [ ("IDemploi", self.IDemploi), ("IDaffectation", IDaffectation), ] newID = DB.ReqInsert("emplois_affectations", listeDonnees) DB.Commit() # Effacement des affectations supprimées if nouvelEmploi == False: for IDemploi_affectation, IDaffectation in listeIDemploi_affectation: if IDaffectation not in listeAffectations: DB.ReqDEL("emplois_affectations", "IDemploi_affectation", IDemploi_affectation) # Sauvegarde des diffuseurs listeIDexistantes = [] listeIDemploi_diffuseur = [] req = """SELECT IDemploi_diffuseur, IDdiffuseur FROM emplois_diffuseurs WHERE IDemploi=%d; """ % self.IDemploi DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() for IDemploi_diffuseur, IDdiffuseur in listeDonnees: listeIDexistantes.append(IDdiffuseur) listeIDemploi_diffuseur.append((IDemploi_diffuseur, IDdiffuseur)) for IDdiffuseur in listeDiffuseurs: if IDdiffuseur not in listeIDexistantes: # Si n'existe pas : listeDonnees = [ ("IDemploi", self.IDemploi), ("IDdiffuseur", IDdiffuseur), ] newID = DB.ReqInsert("emplois_diffuseurs", listeDonnees) DB.Commit() # Effacement des diffuseur supprimés if nouvelEmploi == False: for IDemploi_diffuseur, IDdiffuseur in listeIDemploi_diffuseur: if IDdiffuseur not in listeDiffuseurs: DB.ReqDEL("emplois_diffuseurs", "IDemploi_diffuseur", IDemploi_diffuseur) # Fin de la sauvegarde DB.Close()
class Dialog(wx.Dialog): def __init__(self, parent, IDentretien=None, IDcandidat=None, IDpersonne=None): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX) self.IDentretien = IDentretien self.IDcandidat = IDcandidat self.IDpersonne = IDpersonne self.panel = wx.Panel(self, -1) self.sizer_contenu_staticbox = wx.StaticBox(self.panel, -1, "") self.label_date = wx.StaticText(self.panel, -1, _(u"Date :")) self.ctrl_date = DatePickerCtrl(self.panel, -1, style=DP_DROPDOWN) self.label_heure = wx.StaticText(self.panel, -1, _(u"Heure :")) self.ctrl_heure = masked.TextCtrl(self.panel, -1, "", size=(60, -1), style=wx.TE_CENTRE, mask="##:##", validRegex="[0-2][0-9]:[0-5][0-9]") self.ctrl_heure.SetCtrlParameters(invalidBackgroundColour="PINK") self.label_avis = wx.StaticText(self.panel, -1, _(u"Avis :")) listeImages = [ (_(u"Avis inconnu"), "Smiley_question.png"), (_(u"Pas convaincant"), "Smiley_nul.png"), (_(u"Mitigé"), "Smiley_bof.png"), (_(u"Bien"), "Smiley_bien.png"), (_(u"Très bien"), "Smiley_genial.png"), ] self.ctrl_avis = MyBitmapComboBox(self.panel, listeImages=listeImages) self.label_remarques = wx.StaticText(self.panel, -1, _(u"Commentaire :")) self.ctrl_remarques = wx.TextCtrl(self.panel, -1, "", style=wx.TE_MULTILINE) self.bouton_aide = CTRL_Bouton_image.CTRL( self.panel, texte=_(u"Aide"), cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png")) self.bouton_ok = CTRL_Bouton_image.CTRL( self.panel, texte=_(u"Ok"), cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png")) self.bouton_annuler = CTRL_Bouton_image.CTRL( self.panel, texte=_(u"Annuler"), cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png")) if self.IDentretien != None: self.Importation() self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok) self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler) self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu) def __set_properties(self): nom_complet = self.GetNomCandidat(self.IDcandidat, self.IDpersonne) if self.IDentretien == None: type = _(u"Saisie") else: type = _(u"Modification") if nom_complet == " None": self.SetTitle(_(u"%s d'un entretien") % type) else: self.SetTitle( _(u"%s d'un entretien pour %s") % (type, nom_complet)) if 'phoenix' in wx.PlatformInfo: _icon = wx.Icon() else: _icon = wx.EmptyIcon() _icon.CopyFromBitmap( wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Logo.png"), wx.BITMAP_TYPE_ANY)) self.SetIcon(_icon) self.ctrl_date.SetToolTip( wx.ToolTip(_(u"Saisissez la date de l'entretien"))) self.ctrl_heure.SetToolTip( wx.ToolTip(_(u"Saisissez l'heure de l'entretien"))) self.ctrl_avis.SetToolTip( wx.ToolTip(_(u"Sélectionnez une appréciation de l'entretien"))) self.ctrl_remarques.SetToolTip( wx.ToolTip( _(u"Saisissez l'avis complet émis après l'entretien"))) self.bouton_aide.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide"))) self.bouton_ok.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour valider la saisie des données"))) self.bouton_annuler.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour annuler"))) self.SetMinSize((450, 330)) def __do_layout(self): sizer_base = wx.BoxSizer(wx.VERTICAL) grid_sizer_base = wx.FlexGridSizer(rows=2, cols=1, vgap=0, hgap=0) grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10) sizer_contenu = wx.StaticBoxSizer(self.sizer_contenu_staticbox, wx.VERTICAL) grid_sizer_contenu = wx.FlexGridSizer(rows=3, cols=2, vgap=10, hgap=10) grid_sizer_date = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5) grid_sizer_contenu.Add(self.label_date, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_date.Add(self.ctrl_date, 0, 0, 0) grid_sizer_date.Add((20, 20), 0, 0, 0) grid_sizer_date.Add(self.label_heure, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_date.Add(self.ctrl_heure, 0, 0, 0) grid_sizer_contenu.Add(grid_sizer_date, 1, wx.EXPAND, 0) grid_sizer_contenu.Add(self.label_avis, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_contenu.Add(self.ctrl_avis, 0, wx.EXPAND, 0) grid_sizer_contenu.Add(self.label_remarques, 0, wx.ALIGN_RIGHT, 0) grid_sizer_contenu.Add(self.ctrl_remarques, 0, wx.EXPAND, 0) grid_sizer_contenu.AddGrowableRow(2) grid_sizer_contenu.AddGrowableCol(1) sizer_contenu.Add(grid_sizer_contenu, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_base.Add(sizer_contenu, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0) grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0) grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0) grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0) grid_sizer_boutons.AddGrowableCol(1) grid_sizer_base.Add(grid_sizer_boutons, 1, wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 10) self.panel.SetSizer(grid_sizer_base) grid_sizer_base.AddGrowableRow(0) grid_sizer_base.AddGrowableCol(0) sizer_base.Add(self.panel, 1, wx.EXPAND, 0) self.SetSizer(sizer_base) sizer_base.Fit(self) self.Layout() self.CenterOnScreen() def OnContextMenu(self, event): pass def SetDatePicker(self, controle, date): """ Met une date au format datetime dans un datePicker donné """ annee = int(date.year) mois = int(date.month) - 1 jour = int(date.day) date = wx.DateTime() date.Set(jour, mois, annee) controle.SetValue(date) def GetDatePickerValue(self, controle): """ Renvoie la date au format datetime d'un datePicker """ date_tmp = controle.GetValue() return datetime.date(date_tmp.GetYear(), date_tmp.GetMonth() + 1, date_tmp.GetDay()) def Importation(self): DB = GestionDB.DB() req = "SELECT IDentretien, IDcandidat, IDpersonne, date, heure, avis, remarques FROM entretiens WHERE IDentretien=%d" % self.IDentretien DB.ExecuterReq(req) donnees = DB.ResultatReq()[0] DB.Close() if len(donnees) == 0: return # Récupération des données IDentretien, IDcandidat, IDpersonne, date, heure, avis, remarques = donnees # Date self.SetDatePicker( self.ctrl_date, datetime.date(year=int(date[:4]), month=int(date[5:7]), day=int(date[8:10]))) # Heure self.ctrl_heure.SetValue(heure) # Avis self.ctrl_avis.SetSelection(avis) # Remarques self.ctrl_remarques.SetValue(remarques) def Sauvegarde(self): """ Sauvegarde des données dans la base de données """ # Récupération ds valeurs saisies date = self.GetDatePickerValue(self.ctrl_date) heure = self.ctrl_heure.GetValue() avis = self.ctrl_avis.GetSelection() remarques = self.ctrl_remarques.GetValue() DB = GestionDB.DB() # Création de la liste des données listeDonnees = [ ("IDcandidat", self.IDcandidat), ("IDpersonne", self.IDpersonne), ("date", date), ("heure", heure), ("avis", avis), ("remarques", remarques), ] if self.IDentretien == None: # Enregistrement d'une nouvelle valeur newID = DB.ReqInsert("entretiens", listeDonnees) ID = newID else: # Modification de la valeur DB.ReqMAJ("entretiens", listeDonnees, "IDentretien", self.IDentretien) ID = self.IDentretien DB.Commit() DB.Close() return ID def OnBoutonAide(self, event): from Utils import UTILS_Aide UTILS_Aide.Aide("") def OnBoutonAnnuler(self, event): self.EndModal(wx.ID_CANCEL) def OnBoutonOk(self, event): """ Validation des données saisies """ heure = self.ctrl_heure.GetValue() if heure == "" or heure == " : ": dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir une heure"), "Erreur", wx.OK) dlg.ShowModal() dlg.Destroy() self.ctrl_heure.SetFocus() return # Sauvegarde self.Sauvegarde() # MAJ parents parent = self.GetParent() if parent.GetName() == "OL_entretiens" or parent.GetName( ) == "OL_gadget_entretiens": parent.MAJ() if parent.GetName() == "OL_gadget_entretiens": parent.GetGrandParent().GetGrandParent().MAJpanel() try: if parent.GetGrandParent().GetParent().GetName() == "Recrutement": parent.GetGrandParent().GetParent().gadget_entretiens.MAJ() parent.GetGrandParent().GetParent().gadget_informations.MAJ() except: pass try: if self.GetGrandParent().GetParent().GetName() == "panel_resume": panelRecrutement = self.GetGrandParent().GetGrandParent( ).GetGrandParent() panelRecrutement.MAJpanel(MAJpanelResume=False) self.GetGrandParent().GetParent().MAJlabelsPages("entretiens") except: pass # Fermeture self.EndModal(wx.ID_OK) def GetNomCandidat(self, IDcandidat=None, IDpersonne=None): # Récupération des données DB = GestionDB.DB() if IDpersonne == None or IDpersonne == 0: req = """SELECT civilite, nom, prenom FROM candidats WHERE IDcandidat=%d; """ % IDcandidat else: req = """SELECT civilite, nom, prenom FROM personnes WHERE IDpersonne=%d; """ % IDpersonne DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() if len(listeDonnees) == 0: return "" civilite, nom, prenom = listeDonnees[0] return u"%s %s" % (nom, prenom)
class Dialog(wx.Dialog): def __init__(self, parent, title="", IDperiode=0): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX) self.parent = parent self.panel_base = wx.Panel(self, -1) self.sizer_periode_staticbox = wx.StaticBox(self.panel_base, -1, _(u"Nom de la période")) choices = [ _(u"Février"), _(u"Pâques"), _(u"Eté"), _(u"Toussaint"), _(u"Noël") ] self.label_nom = wx.StaticText(self.panel_base, -1, _(u"Nom :")) self.choice_nom = wx.Choice(self.panel_base, -1, choices=choices, size=(100, -1)) self.label_annee = wx.StaticText(self.panel_base, -1, _(u"Année :")) self.text_annee = wx.TextCtrl(self.panel_base, -1, "", style=wx.TE_CENTRE, size=(50, -1)) self.sizer_dates_staticbox = wx.StaticBox(self.panel_base, -1, _(u"Dates de la période")) self.label_dateDebut = wx.StaticText(self.panel_base, -1, u"Du") self.datepicker_dateDebut = DatePickerCtrl(self.panel_base, -1, style=DP_DROPDOWN) self.label_dateFin = wx.StaticText(self.panel_base, -1, _(u"au")) self.datepicker_dateFin = DatePickerCtrl(self.panel_base, -1, style=DP_DROPDOWN) self.bouton_aide = CTRL_Bouton_image.CTRL( self.panel_base, texte=_(u"Aide"), cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png")) self.bouton_ok = CTRL_Bouton_image.CTRL( self.panel_base, texte=_(u"Ok"), cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png")) self.bouton_annuler = CTRL_Bouton_image.CTRL( self.panel_base, texte=_(u"Annuler"), cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png")) self.IDperiode = IDperiode if IDperiode != 0: self.Importation() self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok) self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler) def __set_properties(self): self.SetTitle(_(u"Gestion des périodes de vacances")) if 'phoenix' in wx.PlatformInfo: _icon = wx.Icon() else: _icon = wx.EmptyIcon() _icon.CopyFromBitmap( wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Logo.png"), wx.BITMAP_TYPE_ANY)) self.SetIcon(_icon) self.choice_nom.SetToolTip( wx.ToolTip(_(u"Choisissez ici le nom de la période"))) self.text_annee.SetToolTip( wx.ToolTip( _(u"Saisissez ici l'année de la période. Ex. : '2008'"))) self.datepicker_dateDebut.SetToolTip( wx.ToolTip(_(u"Saisissez ici la date de début de la période"))) self.datepicker_dateFin.SetToolTip( wx.ToolTip(_(u"Saisissez ici la date de fin de la période"))) self.bouton_aide.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide"))) self.bouton_aide.SetSize(self.bouton_aide.GetBestSize()) self.bouton_ok.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour valider"))) self.bouton_ok.SetSize(self.bouton_ok.GetBestSize()) self.bouton_annuler.SetToolTip( wx.ToolTip(_(u"Cliquez ici pour annuler la saisie"))) self.bouton_annuler.SetSize(self.bouton_annuler.GetBestSize()) def __do_layout(self): sizer_base = wx.BoxSizer(wx.VERTICAL) grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=10, hgap=10) grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10) sizer_contenu_1 = wx.StaticBoxSizer(self.sizer_periode_staticbox, wx.VERTICAL) grid_sizer_contenu_1 = wx.FlexGridSizer(rows=1, cols=6, vgap=10, hgap=10) grid_sizer_contenu_1.Add(self.label_nom, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_contenu_1.Add(self.choice_nom, 0, 0, 0) grid_sizer_contenu_1.Add(self.label_annee, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_contenu_1.Add(self.text_annee, 0, 0, 0) sizer_contenu_1.Add(grid_sizer_contenu_1, 1, wx.ALL | wx.EXPAND, 10) sizer_contenu_2 = wx.StaticBoxSizer(self.sizer_dates_staticbox, wx.VERTICAL) grid_sizer_contenu_2 = wx.FlexGridSizer(rows=1, cols=6, vgap=10, hgap=10) grid_sizer_contenu_2.Add(self.label_dateDebut, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_contenu_2.Add(self.datepicker_dateDebut, 0, 0, 0) grid_sizer_contenu_2.Add(self.label_dateFin, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_contenu_2.Add(self.datepicker_dateFin, 0, 0, 0) sizer_contenu_2.Add(grid_sizer_contenu_2, 1, wx.ALL | wx.EXPAND, 10) grid_sizer_base.Add(sizer_contenu_1, 1, wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, 10) grid_sizer_base.Add(sizer_contenu_2, 1, wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.EXPAND, 10) grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0) grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0) grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0) grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0) grid_sizer_boutons.AddGrowableCol(1) grid_sizer_base.Add(grid_sizer_boutons, 1, wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 10) self.panel_base.SetSizer(grid_sizer_base) sizer_base.Add(self.panel_base, 1, wx.EXPAND, 0) self.SetSizer(sizer_base) sizer_base.Fit(self) self.Layout() self.CenterOnScreen() def Importation(self): DB = GestionDB.DB() req = "SELECT * FROM periodes_vacances WHERE IDperiode=%d" % self.IDperiode DB.ExecuterReq(req) donnees = DB.ResultatReq()[0] DB.Close() if len(donnees) == 0: return # Place la valeur dans le controle nom période self.SelectChoice(self.choice_nom, donnees[1]) # Place la valeur dans le controle annee self.text_annee.SetValue(str(donnees[2])) # Place la date de début dans le cdatePicker jour = int(donnees[3][8:10]) mois = int(donnees[3][5:7]) - 1 annee = int(donnees[3][:4]) date = wx.DateTime() date.Set(jour, mois, annee) self.datepicker_dateDebut.SetValue(date) # Place la date de fin dans le cdatePicker jour = int(donnees[4][8:10]) mois = int(donnees[4][5:7]) - 1 annee = int(donnees[4][:4]) date = wx.DateTime() date.Set(jour, mois, annee) self.datepicker_dateFin.SetValue(date) def SelectChoice(self, controle, data): nbreItems = controle.GetCount() index = 0 for item in range(nbreItems): if controle.GetString(index) == data: controle.SetSelection(index) return index += 1 def GetChoiceValue(self, controle): selection = controle.GetSelection() if selection != -1: IDselection = controle.GetString(selection) else: IDselection = None return IDselection def Sauvegarde(self): """ Sauvegarde des données dans la base de données """ # Récupération ds valeurs saisies varNom = self.GetChoiceValue(self.choice_nom) varAnnee = self.text_annee.GetValue() varDateDebut = self.datepicker_dateDebut.GetValue() varTxtDateDebut = str( datetime.date(varDateDebut.GetYear(), varDateDebut.GetMonth() + 1, varDateDebut.GetDay())) varDateFin = self.datepicker_dateFin.GetValue() varTxtDateFin = str( datetime.date(varDateFin.GetYear(), varDateFin.GetMonth() + 1, varDateFin.GetDay())) DB = GestionDB.DB() # Création de la liste des données listeDonnees = [ ("nom", varNom), ("annee", varAnnee), ("date_debut", varTxtDateDebut), ("date_fin", varTxtDateFin), ] if self.IDperiode == 0: # Enregistrement d'une nouvelle valeur newID = DB.ReqInsert("periodes_vacances", listeDonnees) ID = newID else: # Modification des valeurs DB.ReqMAJ("periodes_vacances", listeDonnees, "IDperiode", self.IDperiode) ID = self.IDperiode DB.Commit() DB.Close() return ID def OnBoutonAide(self, event): from Utils import UTILS_Aide UTILS_Aide.Aide("Lespriodesdevacances") def OnBoutonAnnuler(self, event): self.EndModal(wx.ID_CANCEL) def OnBoutonOk(self, event): """ Validation des données saisies """ # Vérifie que des valeurs ont été saisies valeur = self.GetChoiceValue(self.choice_nom) if valeur == None: dlg = wx.MessageDialog( self, _(u"Vous devez sélectionner un nom de période dans la liste proposée !" ), "Erreur", wx.OK) dlg.ShowModal() dlg.Destroy() self.choice_nom.SetFocus() return valeur = self.text_annee.GetValue() if valeur == "": dlg = wx.MessageDialog(self, _(u"Vous devez saisir une année valide."), "Erreur", wx.OK) dlg.ShowModal() dlg.Destroy() self.text_annee.SetFocus() return # Vérifie que la valeur est bien constituée de chiffres uniquement incoherences = "" for lettre in valeur: if lettre not in "0123456789.": incoherences += "'" + lettre + "', " if len(incoherences) != 0: dlg = wx.MessageDialog( self, _(u"L'année que vous avez saisie n'est pas correcte."), "Erreur", wx.OK) dlg.ShowModal() dlg.Destroy() self.text_annee.SetFocus() return valeur = int(valeur) if valeur < 1000 or valeur > 3000: dlg = wx.MessageDialog( self, _(u"L'année que vous avez saisie n'est pas correcte."), "Erreur", wx.OK) dlg.ShowModal() dlg.Destroy() self.text_annee.SetFocus() return date_debut = self.datepicker_dateDebut.GetValue( ) # self.GetDatePickerValue(self.datepicker_date_debut) date_fin = self.datepicker_dateFin.GetValue( ) # self.GetDatePickerValue(self.datepicker_date_fin) # Vérifie que la date de fin est supérieure à la date de début de contrat if date_debut > date_fin: dlg = wx.MessageDialog( self, _(u"La date de fin de vacances doit être supérieure à la date de début !" ), "Erreur", wx.OK) dlg.ShowModal() dlg.Destroy() self.datepicker_dateFin.SetFocus() return # Sauvegarde self.Sauvegarde() # MAJ du listCtrl des valeurs de points if FonctionsPerso.FrameOuverte("panel_config_periodes_vacs") != None: self.GetParent().MAJ_ListCtrl() # Fermeture self.EndModal(wx.ID_OK)