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()
예제 #2
0
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
예제 #3
0
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()
예제 #4
0
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)
예제 #5
0
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)