Переглянути джерело

NEW analytique2facture: terminé et validé

olivier.massot 7 роки тому
батько
коміт
c893ab27ae
2 змінених файлів з 137 додано та 62 видалено
  1. 14 62
      analytique2facture.py
  2. 123 0
      core/pde.py

+ 14 - 62
analytique2facture.py

@@ -6,60 +6,18 @@
 '''
 from datetime import datetime
 import logging
-import string
 import sys
 
 from path import Path
 
 from core import logconf
-from core.model import Model
-from core.pde import FacturesDb, AnalytiqueDb, CommunDb
+from core.pde import FacturesDb, AnalytiqueDb, CommunDb, EnTete, Ligne
+from core.sqlformatter import SqlFormatter
 
 
 logger = logging.getLogger("analytique2facture")
 logconf.start("analytique2facture", logging.DEBUG)
 
-class EnTete(Model):
-    pass
-
-class Ligne(Model):
-    def __init__(self):
-        # Valeurs fixes
-        self.bytNbDecQuantite = 2
-        self.dblCnvUniteCoef = 1
-        self.bytNbDecQuantiteConvertie = 2
-        self.bytNbDecPU = 2
-        self.bytLigneSousTotal = 1
-        self.intLigneIdRattachement = 0
-        self.blnLigneVisible = True
-        self.blnLigneGeneree = False
-        self.bytGenerateurId = 0
-        self.bytClasseRemiseArticleId = 0
-        self.bytTVAArticleId = 0
-        self.bytTVAId = 0
-        self.dblTVATaux = 0
-        self.bytUniteIdQuantite = 0
-        self.bytUniteIdPrix = 0
-
-class SqlFormatter(string.Formatter):
-    def format_field(self, value, format_spec):
-        if value is None:
-            value = "Null"
-            format_spec = ""
-        if format_spec == "date":
-            value = "#{:%Y-%m-%d %H:%M:%S}#".format(value)
-            format_spec = ""
-
-        formatted = super().format_field(value, "")
-        formatted = formatted.replace("'", "''")
-        formatted = formatted.replace("\"", "''")
-        formatted = formatted.replace("\t", " ")
-
-        if format_spec == "text":
-            formatted = "'{}'".format(formatted)
-
-        return formatted
-Sql = SqlFormatter()
 
 # # POUR TESTER, décommenter les lignes suivantes
 ##-----------------------------------------------
@@ -80,6 +38,8 @@ facture_db = FacturesDb(autocommit=False)
 # Connexion à CommunDb
 commun_db = CommunDb(autocommit=False)
 
+Sql = SqlFormatter()
+
 current = "{:%m/%Y}".format(datetime.now())
 # mois_facturation = input("Veuillez renseigner le mois de facturation [defaut: {}] ('q' pour quitter): ".format(current))  # Format: voir avec jacky
 # if mois_facturation == 'q':
@@ -174,14 +134,14 @@ for affaireId, interventions in a_facturer.items():
     entete.dblCoursDevise = 1
     entete.dtmCoursDevise = datetime(2002, 1, 1)
     entete.bytTypeTarif = 1
-    entete.strReglement = "POUR ACQUITTER CET ETAT DE REDEVANCE, ATTENDEZ IMPERATIVEMENT DE RECEVOIR LE TITRE DE PERCEPTION EMANANT DE LA PAIERIE DEPARTEMENTALE"
+    entete.strReglement = "POUR ACQUITTER CET ETAT DE REDEVANCE,\r\n ATTENDEZ IMPERATIVEMENT DE RECEVOIR LE TITRE DE PERCEPTION EMANANT DE LA PAIERIE DEPARTEMENTALE"
 
     # Commentaires
-    entete.memObsEntete = "[Mois : {mois_facturation}] " \
-                          "[Lieu de travail : ]{affaire.strLieux} " \
-                          "[V/Cde : ] {affaire.Ref} du {affaire.dtmCommande:%d/%m/%Y}" \
+    entete.memObsEntete = "[Mois : {mois_facturation}]\r\n" \
+                          "[Lieu de travail : ]{affaire.strLieux}\r\n" \
+                          "[V/Cde : ] {affaire.Ref} du {affaire.dtmCommande:%d/%m/%Y}\r\n" \
                           "".format(mois_facturation=mois_facturation,
-                                    affaire=affaire).replace("'", "")
+                                    affaire=affaire)
 
     entete.memObsInterne = "N° Affaire analytique : {}".format(affaire.strLiaisonControle)
 
@@ -225,7 +185,7 @@ for affaireId, interventions in a_facturer.items():
         ligne.dblPThtNet = interv.dblPrixTotal
         ligne.bytClasseRemiseArticleId = 1
         ligne.dblPUSaisie = interv.dblPrixUnitaire
-        ligne.strPUAff = "{} EUR/{}".format(interv.dblPrixUnitaire, interv.strUnite)
+        ligne.strPUAff = "{:03.02f} EUR/{}".format(interv.dblPrixUnitaire, interv.strUnite)
         ligne.strQteAff = "{:03.02f} {}".format(interv.dblQuantite, interv.strUnite)
 
         lignes.append(ligne)
@@ -242,6 +202,7 @@ for affaireId, interventions in a_facturer.items():
     ligne_total_1.intLigneId = 32000
     ligne_total_1.strArticleId = ""
     ligne_total_1.strArticle = "Total H.T."
+    ligne_total_1.dblQte = 0
     ligne_total_1.dblPThtNetDev = montant_ht
     ligne_total_1.dblPTttcNetDev = montant_ttc
     ligne_total_1.bytLigneSousTotal = 10
@@ -263,6 +224,7 @@ for affaireId, interventions in a_facturer.items():
                                                                                                montant_ht=montant_ht,
                                                                                                montant_tva=montant_tva,
                                                                                                montant_ttc=montant_ttc)
+    ligne_total_2.dblQte = 0
     ligne_total_2.bytTVAId = lignes[0].bytTVAId
     ligne_total_2.dblTVATaux = taux_tva
     ligne_total_2.dblPThtNetDev = montant_ht
@@ -282,11 +244,12 @@ for affaireId, interventions in a_facturer.items():
     ligne_total_3.intLigneId = 32500
     ligne_total_3.strArticleId = ""
     ligne_total_3.strArticle = "Total T.T.C."
+    ligne_total_3.dblQte = 0
     ligne_total_3.dblPThtNetDev = montant_ht
     ligne_total_3.dblPTttcNetDev = montant_ttc
     ligne_total_3.bytLigneSousTotal = 12
     ligne_total_3.blnLigneVisible = False
-    ligne_total_3.dblPThtNet = montant_ttc
+    ligne_total_3.dblPThtNet = montant_ht
     ligne_total_3.dblPTttcNet = round(montant_ttc, 2)
     ligne_total_3.dblPUSaisie = round(montant_ttc, 2)
     ligne_total_3.strPUAff = "{:03.02f} EUR".format(montant_ttc)
@@ -320,17 +283,6 @@ for affaireId, interventions in a_facturer.items():
 
     for ligne in lignes:
 
-        # Complete les champs manquants
-        for field in ["bytTVAArticleId", "bytTVAId", "dblTVATaux", "dblQte", "bytUniteIdQuantite",
-                     "bytNbDecQuantite", "bytUniteIdPrix", "dblCnvUniteCoef", "bytNbDecQuantiteConvertie", "dblPUhtBrutDev", "dblPUttcBrutDev", "dblPUhtNetDev",
-                     "dblPUttcNetDev", "bytNbDecPU", "dblPThtBrutDev", "dblPTttcBrutDev", "dblPThtNetDev", "dblPTttcNetDev", "strStatArticle", "strStatDocLigne",
-                     "dblTauxRemise1", "dblTauxRemise2", "dblTauxRemise3", "blnPrestation", "strCompteComptable", "memObs", "memObsInterne", "bytLigneSousTotal",
-                     "intLigneIdRattachement", "blnLigneVisible", "blnLigneGeneree", "bytGenerateurId", "dblPUhtBrut", "dblPUttcBrut", "dblPUhtNet", "dblPUttcNet",
-                     "dblPThtBrut", "dblPTttcBrut", "dblPThtNet", "dblPTttcNet", "bytClasseRemiseArticleId", "dblPUSaisie", "strPUAff", "strQteAff"]:
-            if not hasattr(ligne, field):
-                setattr(ligne, field, None)
-
-
         sql = Sql.format("""
                 INSERT INTO tblPieceLigne ( lngPieceId, intLigneId, strArticleId, strArticle, bytTVAArticleId, bytTVAId, dblTVATaux, dblQte, bytUniteIdQuantite,
                                              bytNbDecQuantite, bytUniteIdPrix, dblCnvUniteCoef, bytNbDecQuantiteConvertie, dblPUhtBrutDev, dblPUttcBrutDev, dblPUhtNetDev,

+ 123 - 0
core/pde.py

@@ -1,9 +1,14 @@
 '''
     Configuration des scripts
 '''
+
+from datetime import datetime
+
 from path import Path
 
 from core.db import AccessSDb
+from core.model import Model
+
 
 MAIN = Path(__file__).parent.parent.abspath()
 
@@ -46,6 +51,8 @@ def mk_workdir(name):
     workdir.mkdir_p()
     return workdir
 
+# ## Bases du PDE
+
 class ParcDb(AccessSDb):
     _path = ""
     def __init__(self, **kwargs):
@@ -76,6 +83,122 @@ class PdaDb(ParcDb):
     _path = PDA_DB_PATH
 
 
+
+# ## Modèles
+
+class EnTete(Model):
+    """ En-tête d'une facture dans FacturesDb """
+    def __init__(self):
+        self.lngPieceId = 0
+        self.lngDocId = 0
+        self.lngTiersId = 0
+        self.lngASTRE = None
+        self.strCodeProduit = None
+        self.bytTitreId = 0
+        self.strCodeAdresse = None
+        self.strAdresse1 = None
+        self.strAdresse2 = None
+        self.strAdresse3 = None
+        self.strAdresse4 = None
+        self.strAdresse5 = None
+        self.strPaysIdIso3166 = None  # (!) le nom réel du champ est '[strPaysIdIso3166-A2]'
+        self.bytTVATiersId = 0
+        self.strTelephone = None
+        self.strTelecopie = None
+        self.strPortable = None
+        self.strEMail = None
+        self.strWeb = None
+        self.strLangueIdIso639 = None
+        self.strCompteComptable = None
+        self.strDeviseIdIso4217 = None
+        self.bytReglementId = 0
+        self.strReglement = None
+        self.bytClasseTarifId = 0
+        self.bytClasseRemiseTiersId = 0
+        self.bytNbExFacture = 1
+        self.strStatTiers = None
+        self.bytSituationIdPrincipale = 0
+        self.bytSituationIdSecondaire = 0
+        self.memObsEntete = None
+        self.memObsPied = None
+        self.memObsInterne = None
+        self.bytTypeDocumentId = 0
+        self.strStatDocEntete = None
+        self.dblCoursDevise = 1
+        self.dtmCoursDevise = datetime.now()
+        self.dtmCreation = datetime.now()
+        self.strUserIdCreation = None
+        self.dtmLastMod = datetime.now()
+        self.strUserIdLastMod = None
+        self.dtmPiece = datetime.now()
+        self.dtmFirstPrint = None
+        self.dtmLastPrint = None
+        self.dtmCompta = None
+        self.dtmLivraison = None
+        self.dtmEcheance = None
+        self.bytTypeTarif = 1
+        self.idEtatEmission = None
+
+class Ligne(Model):
+    """ Ligne d'une facture dans FacturesDb """
+    def __init__(self):
+        self.lngPieceId = 0
+        self.intLigneId = 0
+        self.strArticleId = None
+        self.strArticle = None
+        self.bytTVAArticleId = 0
+        self.bytTVAId = 0
+        self.dblTVATaux = 0
+        self.dblQte = 0
+        self.bytUniteIdQuantite = 0
+        self.bytNbDecQuantite = 2
+        self.bytUniteIdPrix = 0
+        self.dblCnvUniteCoef = 1
+        self.bytNbDecQuantiteConvertie = 2
+        self.dblPUhtBrutDev = 0
+        self.dblPUttcBrutDev = 0
+        self.dblPUhtNetDev = 0
+        self.dblPUttcNetDev = 0
+        self.bytNbDecPU = 2
+        self.dblPThtBrutDev = 0
+        self.dblPTttcBrutDev = 0
+        self.dblPThtNetDev = 0
+        self.dblPTttcNetDev = 0
+        self.strStatArticle = None
+        self.strStatDocLigne = None
+        self.dblTauxRemise1 = 0
+        self.dblTauxRemise2 = 0
+        self.dblTauxRemise3 = 0
+        self.blnPrestation = False
+        self.strCompteComptable = None
+        self.memObs = None
+        self.memObsInterne = None
+        self.bytLigneSousTotal = 1
+        self.intLigneIdRattachement = 0
+        self.blnLigneVisible = True
+        self.blnLigneGeneree = False
+        self.bytGenerateurId = 0
+        self.dblPUhtBrut = 0
+        self.dblPUttcBrut = 0
+        self.dblPUhtNet = 0
+        self.dblPUttcNet = 0
+        self.dblPThtBrut = 0
+        self.dblPTttcBrut = 0
+        self.dblPThtNet = 0
+        self.dblPTttcNet = 0
+        self.bytClasseRemiseArticleId = 0
+        self.dblPUSaisie = 0
+        self.strPUAff = ""
+        self.strQteAff = ""
+
+
+
+
+
+
+
+
+
 if __name__ == "__main__":
     for cls in (FacturesDb, ControlesDb, WincanDb, CommunDb, AnalytiqueDb, BoDb, AgrhumDb):
         db = cls()