ctrl2analytique.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. '''
  2. Génère les affaires dans la base Analytique à partir des données de la base Contrôles.
  3. **IMPORTANT**: pour lancer le script sans interaction avec l'utilisateur
  4. (par ex, dans le cas d'une tâche planifiée), appeller le script avec l'option '-n'.
  5. @author: olivier.massot, févr. 2018
  6. '''
  7. from datetime import datetime
  8. import logging
  9. import sys
  10. from path import Path
  11. from core import logconf
  12. from core.model import Model
  13. from core.pde import ControlesDb, AnalytiqueDb, mk_workdir, CommunDb
  14. logger = logging.getLogger("ctrl2analytique")
  15. logconf.start("ctrl2analytique", logging.DEBUG)
  16. # # POUR TESTER, décommenter les lignes suivantes
  17. ##-----------------------------------------------
  18. logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>")
  19. ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
  20. AnalytiqueDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Db_analytique.mdb")
  21. CommunDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Commun_Data.mdb")
  22. ##-----------------------------------------------
  23. # *** Initialisation
  24. logger.info("Initialisation...")
  25. no_prompt = ("-n" in sys.argv)
  26. if no_prompt:
  27. logger.info("> Lancé en mode automatique (sans interruption)")
  28. # Connexion à Analytique
  29. analytique_db = AnalytiqueDb(autocommit=False)
  30. # Connexion à Controles
  31. controles_db = ControlesDb(autocommit=False)
  32. # Connexion à CommunDb
  33. commun_db = CommunDb(autocommit=False)
  34. # Make the working directory
  35. workdir = mk_workdir("ctrl2analytique")
  36. affaires_file = workdir / "affaires.csv"
  37. intervs_file = workdir / "intervs.csv"
  38. errors = []
  39. # > Supprime les fichiers d'import s'il existent
  40. for file in (affaires_file, intervs_file):
  41. if file.exists():
  42. logger.debug("Supprime le fichier %s", file)
  43. file.remove()
  44. class Affaire(Model):
  45. _FIELDS = ["strLiaisonControle", "strMOeId", "strCommneId", "strLieux",
  46. "strEntrepriseId", "strMOId", "dtmCommande", "Ref", "blnMarche",
  47. "dblMarche", "intDevisId", "strCT", "strTypeId",
  48. "intCoefFG", "strSituation"]
  49. def get_type_id(lngChantierId, bytCommandeId):
  50. """ Recupère le type de chantier.
  51. 'ZP': Chantier de contrôle d'étanchéité
  52. 'ZC': Chantier de contrôle du compactage
  53. 'ZI': Chantier d'inspection vidéo
  54. 'ZZ': Chantier mixte.
  55. '': Inconnu
  56. """
  57. sql = """SELECT lngChantierId, 'ZP' as type FROM tblEtancheiteBases WHERE [lngChantierId] = {chantier} AND [bytCommandeId] = {commande}
  58. UNION
  59. SELECT lngChantierId, 'ZC' as type FROM tblCompactageBases WHERE [lngChantierId] = {chantier}
  60. UNION
  61. SELECT lngChantierId, 'ZI' as type FROM tblVideoBases WHERE [lngChantierId] = {chantier};
  62. """.format(chantier=lngChantierId,
  63. commande=bytCommandeId)
  64. res = controles_db.read_all(sql)
  65. if len(res) == 0:
  66. return ""
  67. elif len(res) == 1:
  68. return res[0].type
  69. else:
  70. return "ZZ"
  71. def get_coeff_k(lngChantierId):
  72. # On déduit l'année du chantier à partir du code chantier
  73. annee = "20" + str(lngChantierId)[:2] if len(str(lngChantierId)) == 6 else "200" + str(lngChantierId)[:1]
  74. # On retrouve dans la table tbl_COEFFG le coefficient correspondant
  75. return analytique_db.first("SELECT [COEFFG] FROM tbl_COEFFG WHERE [ANNEE] = {}".format(annee)).COEFFG / 100
  76. # *** 1- Import des chantiers Contrôles dans le fichier affaires.csv
  77. nb_affaires, nb_intervs = 0, 0
  78. logger.debug("Génère le fichier %s", affaires_file)
  79. firstline = "\t".join(Affaire._FIELDS + ["\n"])
  80. with open(affaires_file, 'w+') as f:
  81. f.write(firstline)
  82. # on insère les affaires depuis tblCommandes et tblChantier (le lien est strLiaisonControle)
  83. compteur = 0
  84. sql = """ SELECT tblCommandes.lngChantierId, tblCommandes.bytCommandeId, tblChantiers.strSubdivisionId, tblChantiers.strCollectiviteId as ChantierCollectiviteId, tblChantiers.strLocChantier,
  85. tblChantiers.strEntrepriseId, tblCommandes.strCollectiviteId as CommandeCollectiviteId, tblCommandes.dtmCommande, tblCommandes.strRefCommande, tblCommandes.blnMarche, tblCommandes.dblMtMarche, tblCommandes.strdevis
  86. FROM tblChantiers INNER JOIN tblCommandes ON tblChantiers.lngChantierId = tblCommandes.lngChantierId
  87. WHERE (((tblCommandes.sngAffaireIdMos) Is Null Or (tblCommandes.sngAffaireIdMos)=0))
  88. """
  89. for data in controles_db.read(sql):
  90. affaire = Affaire()
  91. affaire.strLiaisonControle = "{}/{}".format(data.lngChantierId, data.bytCommandeId)
  92. affaire.strMOeId = data.strSubdivisionId
  93. affaire.strCommneId = data.ChantierCollectiviteId
  94. affaire.strLieux = data.strLocChantier
  95. affaire.strEntrepriseId = data.strEntrepriseId
  96. affaire.strMOId = data.CommandeCollectiviteId
  97. affaire.dtmCommande = data.dtmCommande
  98. affaire.Ref = data.strRefCommande
  99. affaire.blnMarche = data.blnMarche
  100. affaire.dblMarche = data.dblMtMarche
  101. affaire.intDevisId = data.strdevis
  102. affaire.strCT = '1'
  103. affaire.strTypeId = get_type_id(data.lngChantierId, data.bytCommandeId)
  104. affaire.intCoefFG = get_coeff_k(data.lngChantierId)
  105. affaire.strSituation = "En cours"
  106. with open(affaires_file, 'a') as f:
  107. f.write(affaire.to_csv())
  108. compteur += 1
  109. logger.info("> {} affaires ajoutées à {}".format(compteur, affaires_file))
  110. # *** 2- Import des interventions de contrôle du compactage dans le fichier intervs.csv
  111. class Interv(Model):
  112. _FIELDS = ["strEquipeId", "strEnginId", "strRapportId", "strTypeInterventionId",
  113. "strTypeInterventionId", "strCatégorieInterventionId", "dblquantite", "strunite", "dtmIntervention",
  114. "dtmDureeIntervention", "dtmDureeInstallation", "strLiaisonControle", "strArticleId", "intPeriode",
  115. "remarques", "strgrandeur1", "strgrandeur2", "strgrandeur3",
  116. "strcaracteristique1", "strcaracteristique2", "strcaracteristique3",
  117. "dtmImportation", "strTest", "LienAff"
  118. ]
  119. logger.debug("Génère le fichier %s", intervs_file)
  120. firstline = "\t".join(Interv._FIELDS + ["\n"])
  121. with open(intervs_file, 'w+') as f:
  122. f.write(firstline)
  123. def engin_existe(strEnginId):
  124. return analytique_db.exists("SELECT strEnginId FROM tbl_Engin WHERE strEnginId='{}'".format(strEnginId))
  125. def get_periode_validite(date_interv):
  126. sql = """SELECT intPeriodeValiditeId FROM tblTarifValidite
  127. WHERE [dtmValiditeDebut] <= #{date_interv}# AND [dtmValiditeFin] > #{date_interv}# AND [bytClasseTarifId]=1
  128. """.format(date_interv=date_interv)
  129. return commun_db.first(sql).intPeriodeValiditeId
  130. compteur = 0
  131. sql = """SELECT tblCompactageIntervs.lngChantierId, tblCompactageIntervs.bytCommandeId, tblCompactageIntervs.bytIntervId, tblCompactageIntervs.strEquipeId,
  132. tblCompactageEngins.strEnginId, tblCompactageIntervs.lngRapportId, tblCompactageBases.memTravaux, tblCompactageResultats.dtmEssai,
  133. tblCompactageResultats.dtmDuree, tblCompactagePartChantiers.strTrcRegard, tblMateriaux.strMatériau,
  134. tblCompactageResultats.bytPartChantierId, tblCompactageIntervs.sngIntervIdMos
  135. FROM ((tblMateriaux RIGHT JOIN ((((tblCompactageIntervs LEFT JOIN tblCompactageEngins ON tblCompactageIntervs.strEquipeId = tblCompactageEngins.strEquipeId)
  136. INNER JOIN tblCompactageResultats ON (tblCompactageIntervs.bytIntervId = tblCompactageResultats.bytIntervId)
  137. AND (tblCompactageIntervs.lngChantierId = tblCompactageResultats.lngChantierId)) INNER JOIN tblCompactagePartChantiers
  138. ON (tblCompactageResultats.bytPartChantierId = tblCompactagePartChantiers.bytPartChantierId)
  139. AND (tblCompactageResultats.lngChantierId = tblCompactagePartChantiers.lngChantierId)) INNER JOIN tblCompactageBases
  140. ON tblCompactageIntervs.lngChantierId = tblCompactageBases.lngChantierId) ON tblMateriaux.strMateriauId = tblCompactagePartChantiers.strMateriauRemblaiId)
  141. LEFT JOIN tblMateriaux AS tblMateriaux_1 ON tblCompactagePartChantiers.strMateriauEnrobageId = tblMateriaux_1.strMateriauId)
  142. LEFT JOIN tblMateriaux AS tblMateriaux_2 ON tblCompactagePartChantiers.strMateriauLitId = tblMateriaux_2.strMateriauId
  143. WHERE (((tblCompactageIntervs.sngIntervIdMos)=0 Or (tblCompactageIntervs.sngIntervIdMos) Is Null))
  144. """
  145. def get_type_compactage_interv(observation):
  146. if "ASSAINISEMENT" or "ASSAINISEMENT" in observation:
  147. return "CC3"
  148. elif "CABLE" in observation:
  149. return "CC1"
  150. elif "A.E.P" in observation:
  151. return "CC2"
  152. elif "GAZ" in observation:
  153. return "CC4"
  154. else:
  155. return "CC3"
  156. for data in controles_db.read(sql):
  157. interv = Interv()
  158. if not engin_existe(data.strEnginId):
  159. errors.append("""Intervention compactage {}/{}/{}/{}: l'engin {} n'existe pas"""
  160. .format(data.lngChantierId, data.bytCommandeId, data.bytIntervId, data.bytPartChantierId, data.strEnginId))
  161. interv.strEquipeId = "C{}".format(data.strEquipeId)
  162. interv.strEnginId = data.strEnginId
  163. interv.strRapportId = data.strRapportId
  164. interv.strTypeInterventionId = get_type_compactage_interv(data.memTravaux)
  165. interv.strCatégorieInterventionId = "CC"
  166. interv.dblquantite = 1
  167. interv.strunite = "u"
  168. interv.dtmIntervention = data.dtmEssai
  169. interv.dtmDureeIntervention = data.dtmDuree
  170. interv.dtmDureeInstallation = 0 # Les temps d'installation seront recalculés en fin de traitement
  171. interv.strLiaisonControle = "{}/{}/{}".format(data.lngChantierId, data.bytCommandeId, data.bytIntervId)
  172. interv.strArticleId = data.strEnginId
  173. interv.intPeriode = get_periode_validite(data.dtmEssai)
  174. interv.remarques = data.strTrcRegard
  175. interv.strgrandeur1 = data.strMatériau
  176. interv.strgrandeur2 = data.strMatériau
  177. interv.strgrandeur3 = data.strMatériau
  178. interv.strcaracteristique1 = "Matériau remblai"
  179. interv.strcaracteristique2 = "Matériau lit de pose"
  180. interv.strcaracteristique3 = "Matériau enrobage"
  181. interv.dtmImportation = "{}".format(datetime.now().strftime("%Y-%m-%d"))
  182. interv.strTest = "{}/{}/{}/{}".format(data.lngChantierId, data.bytCommandeId, data.bytIntervId, data.bytPartChantierId)
  183. interv.LienAff = "{}/{}".format(data.lngChantierId, data.bytCommandeId)
  184. with open(intervs_file, 'a') as f:
  185. f.write(interv.to_csv())
  186. compteur += 1
  187. logger.info("> {} interventions Compactage ajoutées à {}".format(compteur, intervs_file))
  188. # *** 3- Import des interventions de contrôle d'étanchéité dans le fichier intervs.csv
  189. compteur = 0
  190. sql = """SELECT tblEtancheiteIntervs.lngChantierId, tblEtancheiteIntervs.bytCommandeId, tblEtancheiteIntervs.bytIntervId, tblEtancheiteIntervs.strEquipeId,
  191. tblEtancheiteIntervs.lngRapportId, tblEtancheitePartChantiers.bytTypeEssai, tblMateriaux.strMateriauId, tblMateriaux.strMatériau,
  192. tblEtancheitePartChantiers.intDiametre, tblEtancheitePartChantiers.sngLgHt, tblEtancheitePartChantiers.intNbJoint, tblEtancheiteResultats.dtmDuree,
  193. tblEtancheiteResultats.dtmEssai, tblEtancheitePartChantiers.strTrcRegard, tblEtancheiteResultats.bytPartChantierId
  194. FROM ((tblEtancheiteIntervs INNER JOIN tblEtancheiteResultats ON (tblEtancheiteIntervs.lngChantierId = tblEtancheiteResultats.lngChantierId)
  195. AND (tblEtancheiteIntervs.bytIntervId = tblEtancheiteResultats.bytIntervId)) INNER JOIN tblEtancheitePartChantiers
  196. ON (tblEtancheiteResultats.lngChantierId = tblEtancheitePartChantiers.lngChantierId)
  197. AND (tblEtancheiteResultats.bytPartChantierId = tblEtancheitePartChantiers.bytPartChantierId)) INNER JOIN tblMateriaux
  198. ON tblEtancheitePartChantiers.strMateriauId = tblMateriaux.strMateriauId
  199. WHERE (((tblEtancheiteIntervs.sngIntervIdMos)=0 Or (tblEtancheiteIntervs.sngIntervIdMos) Is Null));
  200. """
  201. def get_engin_etancheite(equipe, diametre, materiau, type_essai):
  202. """ retourne l'engin correspondant à l'essai en fonction eds caractéristiques de l'essai """
  203. sql = """SELECT strEnginId FROM tblEtancheiteEngins
  204. WHERE ([strEquipeId] = '{}') AND ([intDiametre] = {}) AND ([strMateriauId] = '{}') AND ([bytTypeEssaiId] ={})
  205. """.format(equipe, diametre, materiau, type_essai)
  206. row = controles_db.first(sql)
  207. return row.strEnginId if row else ""
  208. for data in controles_db.read(sql):
  209. interv = Interv()
  210. interv.strEquipeId = "C{}".format(data.strEquipeId)
  211. interv.strEnginId = get_engin_etancheite(data.strEquipeId, data.intDiametre, data.strMateriauId, data.bytTypeEssai)
  212. interv.strRapportId = data.lngRapportId
  213. interv.strTypeInterventionId = "CE{}".format(data.bytTypeEssai)
  214. interv.strCatégorieInterventionId = "CE"
  215. interv.dblquantite = data.intNbJoint
  216. interv.strunite = "u"
  217. interv.dtmIntervention = data.dtmEssai
  218. interv.dtmDureeIntervention = data.dtmDuree
  219. interv.dtmDureeInstallation = 0 # Les temps d'installation seront recalculés en fin de traitement
  220. interv.strLiaisonControle = "{}/{}/{}".format(data.lngChantierId, data.bytCommandeId, data.bytIntervId)
  221. interv.strArticleId = interv.strEnginId
  222. interv.intPeriode = get_periode_validite(data.dtmEssai)
  223. interv.remarques = data.strTrcRegard
  224. interv.strgrandeur1 = data.strMatériau
  225. interv.strgrandeur2 = data.intDiametre
  226. interv.strgrandeur3 = data.sngLgHt
  227. interv.strcaracteristique1 = "Matériau"
  228. interv.strcaracteristique2 = "Diamètre"
  229. interv.strcaracteristique3 = "Longueur"
  230. interv.strunite2 = "mm"
  231. interv.strunite3 = "m"
  232. interv.dtmImportation = "{}".format(datetime.now().strftime("%Y-%m-%d"))
  233. interv.strTest = "{}/{}/{}/{}".format(data.lngChantierId, data.bytCommandeId, data.bytIntervId, data.bytPartChantierId)
  234. interv.LienAff = "{}/{}".format(data.lngChantierId, data.bytCommandeId)
  235. with open(intervs_file, 'a') as f:
  236. f.write(interv.to_csv())
  237. compteur += 1
  238. logger.info("> {} interventions Etanchéité ajoutées à {}".format(compteur, intervs_file))
  239. # *** 4- Import des interventions d'inspection vidéo dans le fichier intervs.csv
  240. compteur = 0
  241. sql = """SELECT tblVideoIntervs.lngChantierId, tblVideoIntervs.bytCommandeId, tblVideoIntervs.bytIntervId, tblVideoIntervs.strEquipeId,
  242. tblVideoEngins.strEnginId, tblVideoIntervs.lngRapportId, First(tblso_rate_Analyse.MateriauCourt) AS strmateriau, tblVideoIntervs.lngTroncon,
  243. tblVideoIntervs.sngNbJourFact, First(tblso_rate_Analyse.MaxDeDiametre) AS diam, tblVideoIntervs.dtmDuree, tblVideoIntervs.dtmIntervDu,
  244. First(tblVideoIntervs.memObservation) AS memObservation, tblChantiers.strEntrepriseId
  245. FROM ((tblVideoEngins RIGHT JOIN tblVideoIntervs ON tblVideoEngins.strEquipeId = tblVideoIntervs.strEquipeId) INNER JOIN tblso_rate_Analyse ON
  246. (tblVideoIntervs.lngChantierId = tblso_rate_Analyse.lngChantierId) AND (tblVideoIntervs.bytIntervId = tblso_rate_Analyse.bytIntervId)) INNER JOIN
  247. tblChantiers ON tblVideoIntervs.lngChantierId = tblChantiers.lngChantierId
  248. WHERE (((tblVideoIntervs.sngIntervIdMos) Is Null Or (tblVideoIntervs.sngIntervIdMos)=0))
  249. GROUP BY tblVideoIntervs.lngChantierId, tblVideoIntervs.bytCommandeId, tblVideoIntervs.bytIntervId, tblVideoIntervs.strEquipeId,
  250. tblVideoIntervs.lngRapportId, tblVideoIntervs.lngTroncon, tblVideoIntervs.sngNbJourFact, tblVideoIntervs.dtmDuree,
  251. tblVideoIntervs.dtmIntervDu, tblVideoEngins.strEnginId, tblChantiers.strEntrepriseId
  252. """
  253. for data in controles_db.read(sql):
  254. interv = Interv()
  255. if not engin_existe(data.strEnginId):
  256. errors.append("""Intervention compactage {}/{}/{}/1: l'engin {} n'existe pas"""
  257. .format(data.lngChantierId, data.bytCommandeId, data.bytIntervId, data.strEnginId))
  258. interv.strEquipeId = "C{}".format(data.strEquipeId)
  259. interv.strEnginId = data.strEnginId
  260. interv.strRapportId = data.lngRapportId
  261. interv.strTypeInterventionId = "CI1" if data.strEntrepriseId != 195 else "CI2"
  262. interv.strCatégorieInterventionId = "CI"
  263. interv.dblquantite = data.sngNbJourFact
  264. interv.strunite = "j"
  265. interv.dtmIntervention = data.dtmIntervDu
  266. interv.dtmDureeIntervention = data.dtmDuree
  267. interv.dtmDureeInstallation = 0 # Les temps d'installation seront recalculés en fin de traitement
  268. interv.strLiaisonControle = "{}/{}/{}".format(data.lngChantierId, data.bytCommandeId, data.bytIntervId)
  269. interv.strArticleId = data.strEnginId
  270. interv.intPeriode = get_periode_validite(data.dtmIntervDu)
  271. interv.remarques = data.memObservation
  272. interv.strgrandeur1 = data.strmateriau
  273. interv.strgrandeur2 = data.diam
  274. interv.strgrandeur3 = data.lngTroncon
  275. interv.strcaracteristique1 = "Matériau"
  276. interv.strcaracteristique2 = "Diamètre"
  277. interv.strcaracteristique3 = "Longueur inspectée"
  278. interv.strunite2 = "mm"
  279. interv.strunite3 = "m"
  280. interv.dtmImportation = "{}".format(datetime.now().strftime("%Y-%m-%d"))
  281. interv.strTest = "{}/{}/{}/1".format(data.lngChantierId, data.bytCommandeId, data.bytIntervId)
  282. interv.LienAff = "{}/{}".format(data.lngChantierId, data.bytCommandeId)
  283. with open(intervs_file, 'a') as f:
  284. f.write(interv.to_csv())
  285. compteur += 1
  286. logger.info("> {} interventions ITV ajoutées à {}".format(compteur, intervs_file))
  287. # *** 5- Interruption pour corection manuelle des données (si nécessaire)
  288. logging.info("Les données à importer ont été ajoutées aux fichiers '{}' et '{}'".format(affaires_file, intervs_file))
  289. if errors:
  290. logging.error("<!> Des erreurs ont été détectées dans les données à importer. <!>")
  291. for msg in errors:
  292. logging.error(msg)
  293. prompt = ""
  294. while prompt != "v":
  295. prompt = input(">> Veuillez contrôler les données, puis taper 'v' pour continuer, ou 'q' pour quitter...")
  296. if prompt == "q":
  297. sys.exit(1)
  298. # *** 6- Insertion des données dans les tables Analytique
  299. with open(affaires_file) as f:
  300. next(f) # saute la première ligne
  301. for line in f:
  302. affaire = Affaire.from_csv(line)
  303. sql = """ INSERT INTO tbl_Affaires ( strMOId, strMOeId, strEntrepriseId, strCommneId, strLieux, strTypeId, dtmCommande, Ref,
  304. blnMarche, dblMarche, intTypeContrat, strCT, strAvancement, strLiaisonControle, intDevisId, blnTarification,
  305. blnAnalyse, remarques, strSituation, dtmFin, intCoefFG )
  306. SELECT {strMOId}, {strMOeId}, {strEntrepriseId}, {strCommneId}, {strLieux}, {strTypeId}, {dtmCommande},
  307. {Ref}, {blnMarche}, {dblMarche}, {intTypeContrat}, {strCT}, {strAvancement}, {strLiaisonControle}, {intDevisId},
  308. {blnTarification}, {blnAnalyse}, {remarques}, {strSituation}, {dtmFin}, {intCoefFG}
  309. """.format(strMOId=affaire.strMOId,
  310. strMOeId=affaire.strMOeId,
  311. strEntrepriseId=affaire.strEntrepriseId,
  312. strCommneId=affaire.strCommneId,
  313. dtmCommande=affaire.dtmCommande,
  314. Ref=affaire.Ref,
  315. blnMarche=affaire.blnMarche,
  316. dblMarche=affaire.dblMarche,
  317. intTypeContrat=affaire.intTypeContrat,
  318. strCT=affaire.strCT,
  319. strAvancement=affaire.strAvancement,
  320. strLiaisonControle=affaire.strLiaisonControle,
  321. intDevisId=affaire.intDevisId,
  322. blnTarification=affaire.blnTarification,
  323. blnAnalyse=affaire.blnAnalyse,
  324. remarques=affaire.remarques,
  325. strSituation=affaire.strSituation,
  326. dtmFin=affaire.dtmFin,
  327. intCoefFG=affaire.intCoefFG)
  328. analytique_db.execute(sql)
  329. affaire.affaireId = analytique_db.first("SELECT TOP 1 DblAffaireId FROM tbl_Affaires ORDER BY DblAffaireId DESC").DblAffaireId
  330. # Stocker cette valeur dans un dico associéeau strLiaisonControle, pour la maj de tblIntervs
  331. # Insérer ici les intervs liées à l'affaire (?)
  332. # Maj champs MOS, puis committer
  333. with open(intervs_file) as f:
  334. next(f) # saute la première ligne
  335. for line in f:
  336. interv = Interv.from_csv(line)
  337. # Reprendre la fonction PostVerif
  338. # Maj des temps d'installation