|
@@ -15,7 +15,6 @@
|
|
|
'''
|
|
'''
|
|
|
import logging
|
|
import logging
|
|
|
import re
|
|
import re
|
|
|
-from subprocess import call
|
|
|
|
|
import sys
|
|
import sys
|
|
|
|
|
|
|
|
from path import Path # @UnusedImport
|
|
from path import Path # @UnusedImport
|
|
@@ -32,9 +31,10 @@ logconf.start("gf2analytique", logging.DEBUG)
|
|
|
# # POUR TESTER, décommenter les lignes suivantes
|
|
# # POUR TESTER, décommenter les lignes suivantes
|
|
|
##-----------------------------------------------
|
|
##-----------------------------------------------
|
|
|
|
|
|
|
|
-# logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>")
|
|
|
|
|
# GfWebservice._url = r"http://webservices-t.bas-rhin.fr/CG67.AstreGF.WebServices/public/WsPDE.asmx"
|
|
# GfWebservice._url = r"http://webservices-t.bas-rhin.fr/CG67.AstreGF.WebServices/public/WsPDE.asmx"
|
|
|
# AnalytiqueDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Db_analytique.mdb")
|
|
# AnalytiqueDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Db_analytique.mdb")
|
|
|
|
|
+# logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
|
|
|
|
|
+# logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>")
|
|
|
|
|
|
|
|
##-----------------------------------------------
|
|
##-----------------------------------------------
|
|
|
|
|
|
|
@@ -60,6 +60,8 @@ if importfile.exists():
|
|
|
logger.debug("Supprime le fichier %s", importfile)
|
|
logger.debug("Supprime le fichier %s", importfile)
|
|
|
importfile.remove()
|
|
importfile.remove()
|
|
|
|
|
|
|
|
|
|
+class CsvFormatError(Exception):
|
|
|
|
|
+ pass
|
|
|
|
|
|
|
|
class Facture(Model):
|
|
class Facture(Model):
|
|
|
""" Modèle de données d'une facture """
|
|
""" Modèle de données d'une facture """
|
|
@@ -100,43 +102,41 @@ class Facture(Model):
|
|
|
|
|
|
|
|
def is_valid(self):
|
|
def is_valid(self):
|
|
|
""" controle la validité des données d'une facture """
|
|
""" controle la validité des données d'une facture """
|
|
|
|
|
+ for field in self._FIELDS:
|
|
|
|
|
+ if not hasattr(self, field):
|
|
|
|
|
+ raise CsvFormatError("Un ou plusieurs champs sont manquants dans le fichier '{}'".format(importfile))
|
|
|
|
|
+
|
|
|
|
|
+ errors = False
|
|
|
if not int(self.numExBudget) > 2000:
|
|
if not int(self.numExBudget) > 2000:
|
|
|
logger.error("Exercice budgetaire invalide: %s", self.numExBudget)
|
|
logger.error("Exercice budgetaire invalide: %s", self.numExBudget)
|
|
|
- return False
|
|
|
|
|
|
|
+ errors = True
|
|
|
if self.codeColl != "CG67":
|
|
if self.codeColl != "CG67":
|
|
|
logger.error("Code collectivité invalide: %s", self.codeColl)
|
|
logger.error("Code collectivité invalide: %s", self.codeColl)
|
|
|
- return False
|
|
|
|
|
|
|
+ errors = True
|
|
|
if self.codeBudg != "02":
|
|
if self.codeBudg != "02":
|
|
|
logger.error("Code budgetaire invalide: %s", self.codeBudg)
|
|
logger.error("Code budgetaire invalide: %s", self.codeBudg)
|
|
|
- return False
|
|
|
|
|
|
|
+ errors = True
|
|
|
if self.codeAxe == "ENGIN":
|
|
if self.codeAxe == "ENGIN":
|
|
|
# Controle l'existence du materiel
|
|
# Controle l'existence du materiel
|
|
|
if not analytique_db.first("SELECT intlMaterielID FROM tbl_materiel WHERE txtMateriel='{}'".format(self.codeCout)):
|
|
if not analytique_db.first("SELECT intlMaterielID FROM tbl_materiel WHERE txtMateriel='{}'".format(self.codeCout)):
|
|
|
logger.error("Le materiel n'existe pas: %s", self.codeCout)
|
|
logger.error("Le materiel n'existe pas: %s", self.codeCout)
|
|
|
- return False
|
|
|
|
|
|
|
+ errors = True
|
|
|
elif self.codeAxe == "AFFAI":
|
|
elif self.codeAxe == "AFFAI":
|
|
|
# Controle l'existence de l'affaire
|
|
# Controle l'existence de l'affaire
|
|
|
if not analytique_db.first("SELECT dblAffaireId FROM tbl_Affaires WHERE strLiaisonControle='{}'".format(self.codeCout)):
|
|
if not analytique_db.first("SELECT dblAffaireId FROM tbl_Affaires WHERE strLiaisonControle='{}'".format(self.codeCout)):
|
|
|
logger.error("L'affaire n'existe pas: %s", self.codeCout)
|
|
logger.error("L'affaire n'existe pas: %s", self.codeCout)
|
|
|
- return False
|
|
|
|
|
|
|
+ errors = True
|
|
|
else:
|
|
else:
|
|
|
# CodeAxe invalide
|
|
# CodeAxe invalide
|
|
|
logger.error("Code axe inconnu: %s", self.codeAxe)
|
|
logger.error("Code axe inconnu: %s", self.codeAxe)
|
|
|
- return False
|
|
|
|
|
- return True
|
|
|
|
|
-
|
|
|
|
|
|
|
+ errors = True
|
|
|
|
|
+ return (not errors)
|
|
|
|
|
|
|
|
|
|
|
|
|
# *** 1- Parcourt les factures renvoyées par le webservice, et stoque toutes les lignes non-importées dans Analytique dans un fichier import.csv
|
|
# *** 1- Parcourt les factures renvoyées par le webservice, et stoque toutes les lignes non-importées dans Analytique dans un fichier import.csv
|
|
|
logger.info("Parcourt les données fournies par le webservice")
|
|
logger.info("Parcourt les données fournies par le webservice")
|
|
|
logger.info("(les ligne à importer sont ajoutées au fichier %s)", importfile)
|
|
logger.info("(les ligne à importer sont ajoutées au fichier %s)", importfile)
|
|
|
|
|
|
|
|
-logger.debug("Génère le fichier %s", importfile)
|
|
|
|
|
-firstline = "\t".join(Facture._FIELDS + ["\n"])
|
|
|
|
|
-with open(importfile, 'w+') as f:
|
|
|
|
|
- f.write(firstline)
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
for data in ws:
|
|
for data in ws:
|
|
|
# Génère la facture à partir des données fournies par le web-service
|
|
# Génère la facture à partir des données fournies par le web-service
|
|
|
facture = Facture.from_dict(data)
|
|
facture = Facture.from_dict(data)
|
|
@@ -165,7 +165,7 @@ while errors:
|
|
|
# Parcourt les lignes du fichier d'import, et teste la validité de chacune.
|
|
# Parcourt les lignes du fichier d'import, et teste la validité de chacune.
|
|
|
for facture in Facture.load_csv(importfile):
|
|
for facture in Facture.load_csv(importfile):
|
|
|
if not facture.is_valid():
|
|
if not facture.is_valid():
|
|
|
- errors += 1
|
|
|
|
|
|
|
+ errors += 1
|
|
|
|
|
|
|
|
if errors:
|
|
if errors:
|
|
|
logger.error("<!> Une ou plusieurs erreurs ont été détectées, voir le fichier de log pour plus d'information <!>")
|
|
logger.error("<!> Une ou plusieurs erreurs ont été détectées, voir le fichier de log pour plus d'information <!>")
|
|
@@ -181,10 +181,11 @@ while errors:
|
|
|
sys.exit(errors)
|
|
sys.exit(errors)
|
|
|
else:
|
|
else:
|
|
|
try:
|
|
try:
|
|
|
- call(["start", "", importfile.abspath()], shell=True)
|
|
|
|
|
|
|
+ from core import tsv_editor
|
|
|
|
|
+ tsv_editor.exec_(importfile.abspath())
|
|
|
except:
|
|
except:
|
|
|
- logger.error("Erreur au lancement du fichier %s", importfile)
|
|
|
|
|
- input("Presser une touche pour continuer...")
|
|
|
|
|
|
|
+ logger.error("Erreur à l'ouverture du fichier %s", importfile)
|
|
|
|
|
+ input("Presser une touche pour continuer...")
|
|
|
|
|
|
|
|
logger.info("Les données sont valides.")
|
|
logger.info("Les données sont valides.")
|
|
|
|
|
|