suiviactivite2pda.py 8.3 KB

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