def GetTracks(self):
        # Récupération des données
        dlgAttente = PBI.PyBusyInfo(
            _(u"Recherche des prestations à facturer en cours..."),
            parent=None,
            title=_(u"Veuillez patienter..."),
            icon=wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Logo.png"),
                           wx.BITMAP_TYPE_ANY))
        wx.Yield()

        try:
            facturation = UTILS_Facturation.Facturation()
            self.dictComptes = facturation.GetDonnees(
                liste_activites=self.dictParametres["listeActivites"],
                date_debut=self.dictParametres["date_debut"],
                date_fin=self.dictParametres["date_fin"],
                date_edition=self.dictParametres["date_emission"],
                date_echeance=self.dictParametres["date_echeance"],
                prestations=self.dictParametres["prestations"],
            )
            del dlgAttente
        except Exception, err:
            del dlgAttente
            traceback.print_exc(file=sys.stdout)
            dlg = wx.MessageDialog(
                self,
                _(u"Désolé, le problème suivant a été rencontré dans la recherche de factures : \n\n%s"
                  ) % err, _(u"Erreur"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            return False
예제 #2
0
    def GetTracks(self):
        # Récupération des données
        dlgAttente = wx.BusyInfo(
            _(u"Recherche des prestations à facturer en cours..."), None)
        #wx.Yield()

        try:
            facturation = UTILS_Facturation.Facturation()
            self.dictComptes = facturation.GetDonnees(
                liste_activites=self.dictParametres["listeActivites"],
                date_debut=self.dictParametres["date_debut"],
                date_fin=self.dictParametres["date_fin"],
                date_edition=self.dictParametres["date_emission"],
                date_echeance=self.dictParametres["date_echeance"],
                prestations=self.dictParametres["prestations"],
                date_anterieure=self.dictParametres["date_anterieure"],
            )
            del dlgAttente
        except Exception, err:
            del dlgAttente
            traceback.print_exc(file=sys.stdout)
            dlg = wx.MessageDialog(
                self,
                _(u"Désolé, le problème suivant a été rencontré dans la recherche de factures : \n\n%s"
                  ) % err, _(u"Erreur"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            return False
예제 #3
0
 def CreationPDF(self, nomDoc="", afficherDoc=True):
     """ Création du PDF pour Email """
     facturation = UTILS_Facturation.Facturation()
     resultat = facturation.Impression(listeFactures=[self.IDfacture,], nomDoc=nomDoc, afficherDoc=afficherDoc, afficherOptions=self.afficherOptions)
     if resultat == False :
         return False
     dictChampsFusion, dictPieces = resultat
     return dictChampsFusion[self.IDfacture]
예제 #4
0
    def Supprimer(self, event):
        if self.IDcompte_payeur != None and UTILS_Utilisateurs.VerificationDroitsUtilisateurActuel("familles_factures", "supprimer") == False : return
        if self.IDcompte_payeur == None and UTILS_Utilisateurs.VerificationDroitsUtilisateurActuel("facturation_factures", "supprimer") == False : return

        # Avertissements
        if len(self.Selection()) == 0 and len(self.GetTracksCoches()) == 0 :
            dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune facture dans la liste !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Choix entre Suppression et Annulation
        from Dlg import DLG_Supprimer_facture
        dlg = DLG_Supprimer_facture.Dialog(self)
        reponse = dlg.ShowModal()
        dlg.Destroy() 
        if reponse == 100 :
            mode = "annulation"
            verbe = "annuler"
        elif reponse == 200 :
            mode = "suppression"
            verbe = "supprimer"
        else :
            return False
        
        # Demande de confirmation
        if len(self.GetTracksCoches()) > 0 :
            # Suppression multiple
            listeSelections = self.GetTracksCoches()
            dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment %s les %d factures cochées ?") % (verbe, len(listeSelections)), _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_INFORMATION)
            reponse = dlg.ShowModal() 
            dlg.Destroy()
            if reponse != wx.ID_YES :
                return
        
        else :
            # Suppression unique
            listeSelections = self.Selection()        
            dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment %s la facture n°%s ?") % (verbe, listeSelections[0].numero), _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_INFORMATION)
            reponse = dlg.ShowModal() 
            dlg.Destroy()
            if reponse != wx.ID_YES :
                return
        
        # Suppression de la facture
        listeIDfactures = []
        for track in listeSelections :
            # Vérifie que la facture n'est pas dans une période de gestion verrouillée
            if self.gestion.IsPeriodeinPeriodes("factures", track.date_debut, track.date_fin) == False: return False

            # Mémorisation de la facture
            listeIDfactures.append(track.IDfacture)
        
        from Utils import UTILS_Facturation
        UTILS_Facturation.SuppressionFacture(listeIDfactures, mode=mode)
        
        # MAJ du listeView
        self.MAJ() 
예제 #5
0
 def CreationPDF(self, nomDoc="", afficherDoc=True):        
     """ Création du PDF pour Email """
     IDfacture = self.Selection()[0].IDfacture
     from Utils import UTILS_Facturation
     facturation = UTILS_Facturation.Facturation()
     resultat = facturation.Impression(listeFactures=[IDfacture,], nomDoc=nomDoc, afficherDoc=False)
     if resultat == False : 
         return False
     dictChampsFusion, dictPieces = resultat
     return dictChampsFusion[IDfacture]
예제 #6
0
    def GenerationPiecesJointes(self):
        """ Génération des pièces jointes """
        IDfichier = FonctionsPerso.GetIDfichier()

        listeIDfacture = []
        dictTracks = {}
        for track in self.ctrl_pieces.GetObjects():
            listeIDfacture.append(track.IDfacture)
            dictTracks[track.IDfacture] = track

        # Génération des factures au format PDF
        nomFichierUnique = self.ctrl_parametres.GetPropertyValue(
            "format_nom_fichier")

        facturation = UTILS_Facturation.Facturation()
        resultat = facturation.Impression(listeFactures=listeIDfacture,
                                          nomFichierUnique=nomFichierUnique,
                                          afficherDoc=False,
                                          repertoireTemp=True)
        if resultat == False:
            return False
        dictChampsFusion, dictPieces = resultat

        # Conversion des fichiers en GZIP/base64
        dict_pieces_jointes = {}
        for IDfacture, cheminFichier in dictPieces.items():

            # Compression GZIP
            cheminFichierGzip = cheminFichier + ".zip"
            with open(cheminFichier,
                      'rb') as f_in, gzip.open(cheminFichierGzip,
                                               'wb') as f_out:
                shutil.copyfileobj(f_in, f_out)

            # Encodage en base64
            with open(cheminFichierGzip, "rb") as fichier:
                contenu = base64.b64encode(fichier.read())

            # Suppression des fichiers temporaires
            os.remove(cheminFichier)
            os.remove(cheminFichierGzip)

            # Mémorisation des pièces jointes
            NomPJ = os.path.basename(cheminFichier)
            numero_facture = dictTracks[IDfacture].numero
            IdUnique = IDfichier + str(numero_facture)

            dict_pieces_jointes[IDfacture] = {
                "NomPJ": NomPJ,
                "IdUnique": IdUnique,
                "contenu": contenu,
                "numero_facture": numero_facture
            }

        return dict_pieces_jointes
예제 #7
0
    def Modifier(self, event):
        if self.IDcompte_payeur != None and UTILS_Utilisateurs.VerificationDroitsUtilisateurActuel("familles_factures", "modifier") == False: return
        if self.IDcompte_payeur == None and UTILS_Utilisateurs.VerificationDroitsUtilisateurActuel("facturation_factures", "modifier") == False: return

        # Avertissements
        if len(self.Selection()) == 0 and len(self.GetTracksCoches()) == 0:
            dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune facture dans la liste !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Choix entre Suppression et Annulation
        from Dlg import DLG_Factures_modifier
        dlg = DLG_Factures_modifier.Dialog(self)
        if dlg.ShowModal() == wx.ID_OK:
            dict_valeurs = dlg.GetValeurs()
            dlg.Destroy()
        else :
            dlg.Destroy()
            return False

        # Demande de confirmation
        if len(self.GetTracksCoches()) > 0:
            # Suppression multiple
            listeSelections = self.GetTracksCoches()
            dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment modifier les %d factures cochées ?") % (len(listeSelections)), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION)
            reponse = dlg.ShowModal()
            dlg.Destroy()
            if reponse != wx.ID_YES:
                return

        else:
            # Suppression unique
            listeSelections = self.Selection()
            dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment modifier la facture n°%s ?") % (listeSelections[0].numero), _(u"Confirmation"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION)
            reponse = dlg.ShowModal()
            dlg.Destroy()
            if reponse != wx.ID_YES:
                return

        # Suppression de la facture
        listeIDfactures = []
        for track in listeSelections:
            listeIDfactures.append(track.IDfacture)

        from Utils import UTILS_Facturation
        UTILS_Facturation.ModificationFacture(listeIDfactures, dict_valeurs=dict_valeurs)

        # MAJ du listeView
        self.MAJ()
예제 #8
0
    def GetTracks(self):
        # Récupération des données
        dlgAttente = wx.BusyInfo(
            _(u"Recherche des prestations à facturer en cours..."), None)
        #wx.Yield()

        try:
            facturation = UTILS_Facturation.Facturation()
            self.dictComptes = facturation.GetDonnees(
                liste_activites=self.dictParametres["listeActivites"],
                date_debut=self.dictParametres["date_debut"],
                date_fin=self.dictParametres["date_fin"],
                date_edition=self.dictParametres["date_emission"],
                date_echeance=self.dictParametres["date_echeance"],
                prestations=self.dictParametres["prestations"],
                date_anterieure=self.dictParametres["date_anterieure"],
                mention1=self.dictParametres["mention1"],
                mention2=self.dictParametres["mention2"],
                mention3=self.dictParametres["mention3"],
            )
            del dlgAttente
        except Exception as err:
            del dlgAttente
            traceback.print_exc(file=sys.stdout)
            dlg = wx.MessageDialog(
                self,
                _(u"Désolé, le problème suivant a été rencontré dans la recherche de factures : \n\n%s"
                  ) % err, _(u"Erreur"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        # Condition famille unique
        if self.dictParametres["IDcompte_payeur"] != None:
            IDcompte_payeur = self.dictParametres["IDcompte_payeur"]
            if IDcompte_payeur in self.dictComptes:
                self.dictComptes = {
                    IDcompte_payeur: self.dictComptes[IDcompte_payeur],
                }
            else:
                self.dictComptes = {}

        # Branches COMPTE
        listeListeView = []
        for IDcompte_payeur, dictCompte in self.dictComptes.items():
            track = Track(IDcompte_payeur, dictCompte)
            listeListeView.append(track)
        return listeListeView
예제 #9
0
    def Reedition(self, event):
        if len(self.Selection()) == 0 :
            dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune facture à imprimer !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return
        track = self.Selection()[0]
        if track.etat == "annulation" :
            dlg = wx.MessageDialog(self, _(u"Vous ne pouvez pas visualiser une facture annulée !"), _(u"Information"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return

        from Utils import UTILS_Facturation
        facturation = UTILS_Facturation.Facturation()
        facturation.Impression(listeFactures=[track.IDfacture,])
예제 #10
0
    def OnBoutonApercu(self, event):
        """ Aperçu PDF des factures """
        # Validation des données saisies
        tracks = self.ctrl_liste_factures.GetTracksCoches()
        if len(tracks) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous n'avez sélectionné aucune facture à imprimer !"),
                _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return

        listeIDfacture = []
        for track in tracks:
            # Avertissements
            if track.etat == "annulation":
                dlg = wx.MessageDialog(
                    self,
                    _(u"La facture n°%s a été annulée.\n\nVous ne pouvez pas l'imprimer !"
                      ) % track.numero, _(u"Erreur"),
                    wx.OK | wx.ICON_EXCLAMATION)
                dlg.ShowModal()
                dlg.Destroy()
                return

            # Ajout
            listeIDfacture.append(track.IDfacture)

        # Récupération des options
        dictOptions = self.ctrl_options.GetOptions()
        if dictOptions == False:
            return False


##        for nom, valeur in dictOptions.iteritems() :
##            print (nom, valeur)

# Impression des factures sélectionnées
        facturation = UTILS_Facturation.Facturation()
        facturation.Impression(listeFactures=listeIDfacture,
                               afficherDoc=True,
                               dictOptions=dictOptions,
                               repertoire=dictOptions["repertoire_copie"])
예제 #11
0
    def OnBoutonOk(self, event):
        """ Aperçu PDF des factures """
        # Validation des données saisies
        tracks = self.ctrl_liste_factures.GetTracksCoches()
        if len(tracks) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous n'avez sélectionné aucune facture à envoyer par Email !"
                  ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Création des factures sélectionnées
        listeIDfacture = []
        for track in tracks:
            # Avertissements
            if track.etat == "annulation":
                dlg = wx.MessageDialog(
                    self,
                    _(u"La facture n°%s a été annulée.\n\nVous ne pouvez pas l'envoyer par Email !"
                      ) % track.numero, _(u"Erreur"),
                    wx.OK | wx.ICON_EXCLAMATION)
                dlg.ShowModal()
                dlg.Destroy()
                return

            # Ajout
            listeIDfacture.append(track.IDfacture)

        facturation = UTILS_Facturation.Facturation()
        dictOptions = self.ctrl_options.GetOptions()
        if dictOptions == False:
            return

        resultat = facturation.Impression(
            listeFactures=listeIDfacture,
            nomDoc=None,
            afficherDoc=False,
            dictOptions=dictOptions,
            repertoire=dictOptions["repertoire_copie"],
            repertoireTemp=True)
        if resultat == False:
            return
        dictChampsFusion, dictPieces = resultat

        def SupprimerFichiersTemp():
            for IDfacture, fichier in dictPieces.iteritems():
                try:
                    os.remove(fichier)
                except:
                    pass

        # Récupération de toutes les adresses Emails
        DB = GestionDB.DB()
        req = """SELECT IDindividu, mail, travail_mail
        FROM individus;"""
        DB.ExecuterReq(req)
        listeAdressesIndividus = DB.ResultatReq()
        DB.Close()
        dictAdressesIndividus = {}
        for IDindividu, mail, travail_mail in listeAdressesIndividus:
            dictAdressesIndividus[IDindividu] = {
                "perso": mail,
                "travail": travail_mail
            }

        # Récupération des données adresse + champs + pièces
        listeDonnees = []
        listeAnomalies = []
        listeEnvoiNonDemande = []
        for track in tracks:
            liste_adresses = []

            if track.email == True:
                # Si Famille inscrite à l'envoi par Email :
                for valeur in track.email_factures.split("##"):
                    IDindividu, categorie, adresse = valeur.split(";")
                    if IDindividu != "":
                        if dictAdressesIndividus.has_key(int(IDindividu)):
                            adresse = dictAdressesIndividus[int(
                                IDindividu)][categorie]
                            liste_adresses.append(adresse)
                    else:
                        liste_adresses.append(adresse)

            else:
                # Si famille non inscrite à l'envoi par Email
                adresse = UTILS_Envoi_email.GetAdresseFamille(
                    track.IDfamille,
                    choixMultiple=False,
                    muet=True,
                    nomTitulaires=track.nomsTitulaires)
                liste_adresses.append(adresse)

            # Mémorisation des données
            for adresse in liste_adresses:
                if adresse not in (None, "", []):
                    if dictPieces.has_key(track.IDfacture):
                        fichier = dictPieces[track.IDfacture]
                        champs = dictChampsFusion[track.IDfacture]
                        listeDonnees.append({
                            "adresse": adresse,
                            "pieces": [
                                fichier,
                            ],
                            "champs": champs
                        })
                        if track.email == False:
                            if track.nomsTitulaires not in listeEnvoiNonDemande:
                                listeEnvoiNonDemande.append(
                                    track.nomsTitulaires)
                else:
                    listeAnomalies.append(track.nomsTitulaires)

        # Annonce les anomalies trouvées
        if len(listeAnomalies) > 0:
            texte = _(
                u"%d des familles sélectionnées n'ont pas d'adresse Email.\n\n"
            ) % len(listeAnomalies)
            texte += _(
                u"Souhaitez-vous quand même continuer avec les %d autres familles ?"
            ) % len(listeDonnees)
            dlg = wx.MessageDialog(
                self, texte, _(u"Avertissement"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            dlg.Destroy()
            if reponse != wx.ID_YES:
                SupprimerFichiersTemp()
                return

        # Annonce les envois non demandés
        if len(listeEnvoiNonDemande) > 0:
            texte = _(
                u"%d des familles sélectionnées n'ont pas demandé d'envoi par Email de leur facture :\n\n"
            ) % len(listeEnvoiNonDemande)
            texte += _(
                u"Souhaitez-vous quand même leur envoyer une facture ?")
            dlg = wx.MessageDialog(
                self, texte, _(u"Avertissement"),
                wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION)
            reponse = dlg.ShowModal()
            dlg.Destroy()
            if reponse != wx.ID_YES:
                SupprimerFichiersTemp()
                return

        # Dernière vérification avant transfert
        if len(listeDonnees) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Il ne reste finalement aucune facture à envoyer par Email !"
                  ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            SupprimerFichiersTemp()
            return

        # Transfert des données vers DLG Mailer
        import DLG_Mailer
        dlg = DLG_Mailer.Dialog(self, categorie="facture")
        dlg.SetDonnees(listeDonnees, modificationAutorisee=False)
        dlg.ChargerModeleDefaut()
        dlg.ShowModal()
        dlg.Destroy()

        # Suppression des PDF temporaires
        SupprimerFichiersTemp()
예제 #12
0
 def Reedition(self, afficherOptions=True):
     self.afficherOptions = afficherOptions
     facturation = UTILS_Facturation.Facturation()
     facturation.Impression(listeFactures=[self.IDfacture,], afficherOptions=afficherOptions)