suiviactivite2pda.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. """
  2. Importe les fichiers xml de suivi d'activité dans la base PDA et la base agrhum
  3. @author: dominique.freyd et olivier.massot, juillet 2018
  4. """
  5. import datetime
  6. import logging
  7. from lxml import etree # @UnresolvedImport
  8. from path import Path # @UnusedImport
  9. import requests
  10. from requests_ntlm.requests_ntlm import HttpNtlmAuth
  11. from core import logconf
  12. from core.model import Sql
  13. from core.pde import PdaDb, CommunDb, AgrhumDb
  14. AUTH = HttpNtlmAuth(r'CG67\LectureAD', 'Adlecture!')
  15. JSONHEADERS = {'accept': 'application/json;odata=verbose'}
  16. XMLEADERS = {'accept': 'text/xml; charset=utf-8'}
  17. SHAREPOINTBASE = "http://backweb.bas-rhin.fr/perstein/parc-erstein"
  18. SHAREPOINTDIR = SHAREPOINTBASE + "/export/"
  19. SHAREPOINTJSON = SHAREPOINTBASE + "/_vti_bin/listdata.svc/Export"
  20. logger = logging.getLogger("suiviactivite2pda")
  21. logconf.start("suiviactivite2pda", logging.DEBUG)
  22. # # POUR TESTER, décommenter les lignes suivantes
  23. ##-----------------------------------------------
  24. # PdaDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\PDA\db_PDA.mdb")
  25. # CommunDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Commun_Data.mdb")
  26. # AgrhumDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\BDD_ParcRH.mdb")
  27. # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  28. # logger.warning("Mode TEST")
  29. ##-----------------------------------------------
  30. pda_db = PdaDb(autocommit=True)
  31. commun_db = CommunDb(autocommit=True)
  32. agrhum_db = AgrhumDb(autocommit=False)
  33. def make_request(url, typeheaders):
  34. r = requests.get(url, auth=AUTH, headers=typeheaders)
  35. return r.json()
  36. # traite le fichier dont le nom est passé en param
  37. def TraiteUnFichier(fichier):
  38. if pda_db.exists("select * from tbl_import_tmp1 where FichierXml='{}'".format(fichier)):
  39. logger.debug(">> Le fichier a déjà été importé, import annulé (%s)", fichier)
  40. return
  41. if agrhum_db.exists("select * from tbl_importrh where FichierXml='{}'".format(fichier)):
  42. logger.debug(">> Le fichier a déjà été importé, import annulé (%s)", fichier)
  43. return
  44. logger.info("*** Traitement du fichier %s", fichier)
  45. # on recupere le contenu du fichier dans la bibliothèque sp
  46. # on applique le bon décodage de manière a pouvoir le
  47. # parser avec etree
  48. reponse = requests.get((SHAREPOINTDIR + fichier), auth=AUTH, headers=XMLEADERS)
  49. byte = reponse.content
  50. if "encoding=\"UTF-8\"" in reponse.text:
  51. xmldata = byte.decode("utf-8")
  52. xmldata = xmldata.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "")
  53. else:
  54. xmldata = byte.decode("utf-16-le")
  55. tree = etree.fromstring(xmldata)
  56. # code ligne est un compteur qui serveur pour le srapports et les congées
  57. CodeLigne = 1
  58. moisrh = 0
  59. anneerh = 0
  60. # traitement des rapports
  61. for rapport in tree.xpath("/ArrayOfAction/ArrayOfRapport/Rapport"):
  62. CodeAttelage = rapport.find("CodeAttelage").text
  63. CodeAgent = rapport.find("CodeAgent").text
  64. CodeChantier = rapport.find("CodeChantier").text
  65. Duree = rapport.find("Duree").text
  66. if "T" in rapport.find("DateDebut").text:
  67. DateDebut = datetime.datetime.strptime(rapport.find("DateDebut").text, "%Y-%m-%dT%H:%M:%S")
  68. else:
  69. DateDebut = datetime.datetime.strptime(rapport.find("DateDebut").text, "%d/%m/%Y")
  70. if not moisrh: moisrh = DateDebut.month
  71. if not anneerh: anneerh = DateDebut.year
  72. if len(rapport.find("CodeNatureRealisation").text) < 2:
  73. CodeNatureRealisation = ("00" + rapport.find("CodeNatureRealisation").text)[-2:]
  74. else:
  75. CodeNatureRealisation = rapport.find("CodeNatureRealisation").text
  76. CodeLocalisation = rapport.find("CodeLocalisation").text
  77. Remarque = rapport.find("Remarque").text
  78. HeureSup1 = rapport.find("HeureSup1").text
  79. HeureSup2 = rapport.find("HeureSup2").text
  80. HeureSupDimanche = rapport.find("HeureSupDimanche").text
  81. Repas = rapport.find("Repas").text
  82. DistanceTranche1 = rapport.find("DistanceTranche1").text
  83. VehiculePersoTranche1 = rapport.find("VehiculePersoTranche1").text
  84. DistanceTranche2 = rapport.find("DistanceTranche2").text
  85. VehiculePersoTranche2 = rapport.find("VehiculePersoTranche2").text
  86. DateFin = DateDebut
  87. # recuperation de l'identifiant de la période concernée
  88. IdPeriode = commun_db.first(Sql.format("select intPeriodeValiditeId as d from tblTarifValidite where dtmValiditeDebut<={:date} and dtmValiditeFin>{:date}", DateDebut, DateFin)).d
  89. Localisation = commun_db.first("select strTiersMnemo from tblTiers where lngTiersId={}".format(CodeLocalisation)).strTiersMnemo
  90. # ecriture dans la table tbl_Import_tmp1
  91. sql = Sql.format("INSERT INTO tbl_Import_tmp1 ("
  92. "Id, CodeAgent, CodeChantier, CodeLocalisation, Localisation, CodeAttelage, CodeNatureRealisation, DDebut, DFin, Duree, Remarque, FichierXml, intPeriode, strTest, strArticleId, ConcatACE, GRP, CodeChantier_verif ) "
  93. " VALUES "
  94. "({},{:text},{:text},{:text},{:text},{:text},{:text},{:date},{:date},{:float},{:text},{:text}, {},{:text},{:text},{:text},{:text},{})",
  95. CodeLigne, CodeAgent, CodeChantier, CodeLocalisation, Localisation, CodeAttelage, CodeNatureRealisation, DateDebut, DateFin, Duree, Remarque, fichier, IdPeriode, 'scriptauto', CodeAttelage, 'en_cours', 'Non', 0
  96. )
  97. # print (sql)
  98. pda_db.execute(sql)
  99. # # ecriture dans la table tbl_ImportRH
  100. sql = Sql.format("INSERT INTO tbl_ImportRH "
  101. "(CodeLigne, CodeAgent, DateRH, CodeChantier, CodeLocalisation, Localisation,"
  102. "strCategorieInterventionId, HeureSup1, HeureSup2, HeureSupDimanche, Repas, DistanceTranche1,"
  103. "VehiculePersoTranche1, DistanceTranche2, VehiculePersoTranche2, Remarque, Depart, FichierXML,"
  104. "DateImport, ResponsableImport )"
  105. "VALUES "
  106. "({},{:text}, {:date},{:text}, {:text}, {:text},"
  107. "{:text}, {:float}, {:float}, {:float},{}, {:float},"
  108. "{}, {:float}, {}, {:text},{:text},{:text},"
  109. "{:date}, {:text})", CodeLigne, CodeAgent, DateDebut, CodeChantier, CodeLocalisation, Localisation,
  110. CodeNatureRealisation, HeureSup1, HeureSup2, HeureSupDimanche, Repas, DistanceTranche1,
  111. VehiculePersoTranche1, DistanceTranche2, VehiculePersoTranche2, Remarque, "", fichier,
  112. datetime.datetime.today(), 'scriptauto'
  113. )
  114. # print (sql)
  115. agrhum_db.execute(sql)
  116. CodeLigne += 1
  117. # traitement des congés
  118. for conges in tree.xpath("/ArrayOfAction/ArrayOfConges/Conges"):
  119. if "T" in conges.find("DateDebut").text:
  120. DateDebut = datetime.datetime.strptime(conges.find("DateDebut").text, "%Y-%m-%dT%H:%M:%S")
  121. else:
  122. DateDebut = datetime.datetime.strptime(conges.find("DateDebut").text, "%d/%m/%Y")
  123. if "T" in conges.find("DateFin").text:
  124. DateFin = datetime.datetime.strptime(conges.find("DateFin").text, "%Y-%m-%dT%H:%M:%S")
  125. else:
  126. DateFin = datetime.datetime.strptime(conges.find("DateFin").text, "%d/%m/%Y")
  127. Duree = rapport.find("Duree").text
  128. sql = Sql.format("INSERT INTO tbl_Import_tmp1 ("
  129. "Id, DDebut, DFin, Duree, CodeAttelage, CodeNatureRealisation,FichierXml, intPeriode, ConcatACE, GRP, strTest, strArticleId, CodeAgent ) "
  130. " VALUES "
  131. "( {},{:date},{:date},{:float},{:text},{:text}, {:text},{},{:text},{:text},{:text},{:text},{:text})",
  132. CodeLigne, DateDebut, DateFin, Duree, '22MAOE', '02', fichier, IdPeriode, 'en_cours', 'Non', 'scriptauto', '22MAOE', CodeAgent
  133. )
  134. CodeLigne += 1
  135. pda_db.execute(sql)
  136. # ecrite dans la table suivirh
  137. if not agrhum_db.exists(Sql.format("SELECT IDSuivi FROM tbl_SuiviRH WHERE CodeAgent={:text} AND MoisRH={} AND AnneeRH={}", CodeAgent, moisrh, anneerh)):
  138. sql = Sql.format("INSERT INTO tbl_SuiviRH ( CodeAgent, MoisRH, AnneeRH, Etat, Valide ) "
  139. "VALUES ({:text},{},{},'Importé',True)", CodeAgent, moisrh, anneerh)
  140. agrhum_db.execute(sql)
  141. # on valide qui si tout est ok
  142. pda_db.commit()
  143. agrhum_db.commit()
  144. def main():
  145. """ traite fichier de la bibliotheque SP contenant les export """
  146. logger.info("Parcours des fichiers de %s", SHAREPOINTDIR)
  147. data = make_request(SHAREPOINTJSON, JSONHEADERS)
  148. for item in data['d']['results']:
  149. filename = item['Nom']
  150. TraiteUnFichier(filename)
  151. if __name__ == "__main__" :
  152. main()
  153. logger.info("-- Fin --")