pde.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. '''
  2. Configuration des scripts
  3. '''
  4. from datetime import datetime
  5. from path import Path
  6. from core.db import AccessSDb, PostgresDb
  7. from core.model import Model
  8. MAIN = Path(__file__).parent.parent.abspath()
  9. # Web url of the WsPde web service
  10. # PDE_WS_URL = r"http://localhost:2890/public/WsPDE.asmx"
  11. PDE_WS_URL = r"http://webservices.bas-rhin.fr/CG67.AstreGF.WebServices/public/WsPDE.asmx"
  12. # Chemin d'acces au fichier de secu Access, et login/mdp
  13. MDW_PATH = r"\\h2o\local\4-transversal\BDD\mda\cg67Parc.mdw"
  14. UID = "olivier"
  15. PWD = "massot"
  16. # Connexion à la base postgres ControlesSig
  17. CSIG_SERVER = "POSTGIS-02"
  18. CSIG_HOST = "POSTGIS-02"
  19. CSIG_SCHEMA = "public"
  20. CSIG_DB = "ControlesSIG"
  21. CSIG_PORT = "5432"
  22. CSIG_USER = "ControlesSIG_userrw"
  23. CSIG_PWD = "4e7V7Z9lZnD9XFGT0hKo"
  24. # Dirs
  25. WRKDIR = MAIN / "work"
  26. RSCDIR = MAIN / "resources"
  27. DEFAULT_LOG_DIR = MAIN / "log"
  28. LOG_CONFIG_FILE = MAIN / "logging.yaml"
  29. PDA_FILES_DEST = Path(r"\\h2o\LOCAL\4-transversal\BDD\mdb\PDA\Fichiers_PDA")
  30. FACTURES_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\Facture_data.mdb")
  31. CONTROLES_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\cg67Parc_data.mdb")
  32. WINCAN_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\Wincan\parc_2007\DB\PARC_2007.mdb")
  33. COMMUN_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\Commun_Data.mdb")
  34. ANALYTIQUE_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\Db_analytique.mdb")
  35. BO_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\dbBO.mdb")
  36. AGRHUM_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\BDD_ParcRH.mdb")
  37. PDA_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\PDA\db_PDA.mdb")
  38. PIRACA_DB_PATH = Path(r"\\h2o\local\4-transversal\BDD\mdb\db_Piraca.mdb")
  39. # Config de qgis_sync_compactage
  40. SRID = 27561
  41. COMPACTAGE_DIR = Path(r"\\h2o\local\1-PARC\activités\assainissement\Controle Réseaux\compactage\gps compactage")
  42. ITV_DIR = Path(r"\\h2o\local\1-PARC\activités\assainissement\Controle Réseaux\inspection\Projets ITV\GPS")
  43. ### *********** Ne pas modifier en dessous *************** ###
  44. DEFAULT_LOG_DIR.mkdir_p()
  45. WRKDIR.mkdir_p()
  46. def mk_workdir(name):
  47. """ créé le répertoire de travail pour le script 'name' """
  48. workdir = WRKDIR / name
  49. workdir.mkdir_p()
  50. return workdir
  51. # ## Bases du PDE
  52. class ParcDb(AccessSDb):
  53. _path = ""
  54. def __init__(self, **kwargs):
  55. super(AccessSDb, self).__init__(self._path, systemdb=MDW_PATH, uid=UID, pwd=PWD, **kwargs)
  56. class FacturesDb(ParcDb):
  57. _path = FACTURES_DB_PATH
  58. class ControlesDb(ParcDb):
  59. _path = CONTROLES_DB_PATH
  60. class WincanDb(ParcDb):
  61. _path = WINCAN_DB_PATH
  62. class CommunDb(ParcDb):
  63. _path = FACTURES_DB_PATH
  64. class AnalytiqueDb(ParcDb):
  65. _path = ANALYTIQUE_DB_PATH
  66. class BoDb(ParcDb):
  67. _path = BO_DB_PATH
  68. class AgrhumDb(ParcDb):
  69. _path = AGRHUM_DB_PATH
  70. class PdaDb(ParcDb):
  71. _path = PDA_DB_PATH
  72. class PiracaDb(ParcDb):
  73. _path = PIRACA_DB_PATH
  74. class CSigDb(PostgresDb):
  75. server = CSIG_SERVER
  76. db = CSIG_DB
  77. port = CSIG_PORT
  78. user = CSIG_USER
  79. pwd = CSIG_PWD
  80. def __init__(self, **kwargs):
  81. super(CSigDb, self).__init__(server=self.server, dbname=self.db, user=self.user, pwd=self.pwd, **kwargs)
  82. # ## Modeles
  83. class Affaire(Model):
  84. """ Modèle de données d'une affaire Analytique """
  85. def __init__(self):
  86. self.DblAffaireId = None, int
  87. self.strMOId = None, str
  88. self.strMOeId = None, str
  89. self.strEntrepriseId = None, str
  90. self.strCommneId = None, str
  91. self.strLieux = None, str
  92. self.strTypeId = None, str
  93. self.dtmCommande = None, datetime
  94. self.Ref = None, str
  95. self.blnMarche = None, bool
  96. self.dblMarche = 0, float
  97. self.intTypeContrat = None, int
  98. self.strCT = None, str
  99. self.strAvancement = None, str
  100. self.strLiaisonControle = None, str
  101. self.intDevisId = None, int
  102. self.blnTarification = False, bool
  103. self.blnAnalyse = False, bool
  104. self.remarques = None, str
  105. self.strSituation = None, str
  106. self.dtmFin = None, datetime
  107. self.intCoefFG = 0, float
  108. class Interv(Model):
  109. """ Modèle de données d'une intervention de contrôle réseaux telle que représentée dan Analytique """
  110. def __init__(self):
  111. self.dblInterventionId = None, int
  112. self.dblAffaireId = 0, int
  113. self.strEquipeId = None, str
  114. self.strEnginId = None, str
  115. self.strRapportId = None, str
  116. self.strCatégorieInterventionId = None, str
  117. self.strTypeInterventionId = None, str
  118. self.dblquantite = 0, float
  119. self.strunite = None, str
  120. self.dtmIntervention = None, datetime
  121. self.dtmDureeIntervention = None, datetime
  122. self.dtmDureeInstallation = None, datetime
  123. self.strcaracteristique1 = None, str
  124. self.strgrandeur1 = None, str
  125. self.strunite1 = None, str
  126. self.strcaracteristique2 = None, str
  127. self.strgrandeur2 = None, str
  128. self.strunite2 = None, str
  129. self.strcaracteristique3 = None, str
  130. self.strgrandeur3 = None, str
  131. self.strunite3 = None, str
  132. self.strLiaisonControle = None, str
  133. self.strarticleId = None, str
  134. self.intPeriode = 0, int
  135. self.blnTarification = False, bool
  136. self.blnAnalyse = False, bool
  137. self.blnFacturer = None, bool
  138. self.remarques = None, str
  139. self.blnPeriode = None, bool
  140. self.dtnPeriodeDebut = None, datetime
  141. self.dtmImportation = None, datetime
  142. self.blnVerifFacture = None, bool
  143. self.strTest = None, str
  144. class Tarification(Model):
  145. """ Modèle de donnée d'une ligne de tarification """
  146. def __init__(self):
  147. self.DblTarifId = None, int
  148. self.DblAffaireId = 0, int
  149. self.strRapportId = None, int
  150. self.strArticleId = None, str
  151. self.dblQuantite = 0, float
  152. self.strUnite = None, str
  153. self.dtmDebut = None, datetime
  154. self.dtmFin = None, datetime
  155. self.bytPeriode = 0, int
  156. self.dblPrixUnitaire = 0, float
  157. self.dblPrixTotal = 0, float
  158. self.bytCodeTiers = 0, int
  159. self.dblTauxTVA = 0, float
  160. self.dblPrixTVA = 0, float
  161. self.strStatut = None, str
  162. self.strNumFacture = None, str
  163. class FactureGf(Model):
  164. """ Modèle de données d'une facture Astre-GF """
  165. def __init__(self):
  166. self.numExBudget = 0, int
  167. self.codeColl = "", str
  168. self.codeBudg = "", str
  169. self.numEnv = 0, int
  170. self.codeSection = "", str
  171. self.typeMvt = "", str
  172. self.numMandat = 0, int
  173. self.numLiqMandat = 0, int
  174. self.numLigneMandat = 0, int
  175. self.codeAxe = "", str
  176. self.libAxe = "", str
  177. self.codeCout = "", str
  178. self.libCout = "", str
  179. self.dateMandat = None, datetime
  180. self.numBj = 0, int
  181. self.numTiers = 0, int
  182. self.libRai = "", str
  183. self.refIntMandat = "", str
  184. self.codePeriode = "", str
  185. self.dateDepDelai = None, datetime
  186. self.typeNomencMarche = "", str
  187. self.mntTtcMandat = 0, float
  188. self.mntTvaMandat = 0, float
  189. self.mntVent = 0, float
  190. class EnTete(Model):
  191. """ En-tête d'une facture dans FacturesDb """
  192. def __init__(self):
  193. self.lngPieceId = 0, int
  194. self.lngDocId = 0, int
  195. self.lngTiersId = 0, int
  196. self.lngASTRE = None, int
  197. self.strCodeProduit = None, str
  198. self.bytTitreId = 0, int
  199. self.strCodeAdresse = None, str
  200. self.strAdresse1 = None, str
  201. self.strAdresse2 = None, str
  202. self.strAdresse3 = None, str
  203. self.strAdresse4 = None, str
  204. self.strAdresse5 = None, str
  205. self.strPaysIdIso3166 = None , str # (!) le nom réel du champ est '[strPaysIdIso3166-A2]'
  206. self.bytTVATiersId = 0, int
  207. self.strTelephone = None, str
  208. self.strTelecopie = None, str
  209. self.strPortable = None, str
  210. self.strEMail = None, str
  211. self.strWeb = None, str
  212. self.strLangueIdIso639 = None, str
  213. self.strCompteComptable = None, str
  214. self.strDeviseIdIso4217 = None, str
  215. self.bytReglementId = 0, int
  216. self.strReglement = None, str
  217. self.bytClasseTarifId = 0, int
  218. self.bytClasseRemiseTiersId = 0, int
  219. self.bytNbExFacture = 1, int
  220. self.strStatTiers = None, str
  221. self.bytSituationIdPrincipale = 0, int
  222. self.bytSituationIdSecondaire = 0, int
  223. self.memObsEntete = None, str
  224. self.memObsPied = None, str
  225. self.memObsInterne = None, str
  226. self.bytTypeDocumentId = 0, int
  227. self.strStatDocEntete = None, str
  228. self.dblCoursDevise = 1, int
  229. self.dtmCoursDevise = datetime.now(), datetime
  230. self.dtmCreation = datetime.now(), datetime
  231. self.strUserIdCreation = None, str
  232. self.dtmLastMod = datetime.now()
  233. self.strUserIdLastMod = None, str
  234. self.dtmPiece = datetime.now(), datetime
  235. self.dtmFirstPrint = None, datetime
  236. self.dtmLastPrint = None, datetime
  237. self.dtmCompta = None, datetime
  238. self.dtmLivraison = None, datetime
  239. self.dtmEcheance = None, datetime
  240. self.bytTypeTarif = 1, int
  241. self.idEtatEmission = None, str
  242. class Ligne(Model):
  243. """ Ligne d'une facture dans FacturesDb """
  244. def __init__(self):
  245. self.lngPieceId = 0, int
  246. self.intLigneId = 0, int
  247. self.strArticleId = None, str
  248. self.strArticle = None, str
  249. self.bytTVAArticleId = 0, int
  250. self.bytTVAId = 0, int
  251. self.dblTVATaux = 0, float
  252. self.dblQte = 0, float
  253. self.bytUniteIdQuantite = 0, int
  254. self.bytNbDecQuantite = 2, int
  255. self.bytUniteIdPrix = 0, int
  256. self.dblCnvUniteCoef = 1.0, float
  257. self.bytNbDecQuantiteConvertie = 2, int
  258. self.dblPUhtBrutDev = 0, float
  259. self.dblPUttcBrutDev = 0, float
  260. self.dblPUhtNetDev = 0, float
  261. self.dblPUttcNetDev = 0, float
  262. self.bytNbDecPU = 2, int
  263. self.dblPThtBrutDev = 0, float
  264. self.dblPTttcBrutDev = 0, float
  265. self.dblPThtNetDev = 0, float
  266. self.dblPTttcNetDev = 0, float
  267. self.strStatArticle = None, str
  268. self.strStatDocLigne = None, str
  269. self.dblTauxRemise1 = 0, float
  270. self.dblTauxRemise2 = 0, float
  271. self.dblTauxRemise3 = 0, float
  272. self.blnPrestation = False, bool
  273. self.strCompteComptable = None, str
  274. self.memObs = None, str
  275. self.memObsInterne = None, str
  276. self.bytLigneSousTotal = 1, int
  277. self.intLigneIdRattachement = 0, int
  278. self.blnLigneVisible = True, bool
  279. self.blnLigneGeneree = False, bool
  280. self.bytGenerateurId = 0, int
  281. self.dblPUhtBrut = 0, float
  282. self.dblPUttcBrut = 0, float
  283. self.dblPUhtNet = 0, float
  284. self.dblPUttcNet = 0, float
  285. self.dblPThtBrut = 0, float
  286. self.dblPTttcBrut = 0, float
  287. self.dblPThtNet = 0, float
  288. self.dblPTttcNet = 0, float
  289. self.bytClasseRemiseArticleId = 0, int
  290. self.dblPUSaisie = 0, float
  291. self.strPUAff = "", str
  292. self.strQteAff = "", str
  293. class InterventionITV(Model):
  294. """ Modèle d'une intervention vidéo sur un réseau d'assainissement dans Controles """
  295. def __init__(self):
  296. self.lngChantierId = 0, int
  297. self.bytIntervId = 0, int
  298. self.dtmIntervDu = None, datetime
  299. self.dtmIntervAu = None, datetime
  300. self.strEquipeId = "", str
  301. self.intlMaterielID = 0, int
  302. self.bytCommandeId = 0, int
  303. self.lngTroncon = 0, float
  304. self.SI_InspMethod = "", str
  305. self.SI_ReasonOfInspection = "", str
  306. class InspectionTronconWincan(Model):
  307. """ Inspection vidéo d'un tronçon de réseau d'assainissement dans Wincan """
  308. def __init__(self):
  309. self.s_guid = "", str
  310. self.si_guid = "", str
  311. self.nom_chantier = "", str
  312. self.lng_chantier_id = 0, int
  313. self.byt_interv_id = 0, int
  314. self.si_autonumber = 0, int
  315. self.classement_troncons = "", str
  316. self.nom_troncon = "", str
  317. self.startnode_type = "", str
  318. self.endnode_type = "", str
  319. self.sens_ecoul = "", str
  320. self.startnode_z = 0.0, float
  321. self.endnode_z = 0.0, float
  322. self.section_length = 0.0, float
  323. self.section_purpose = "", str
  324. self.section_use = "", str
  325. self.section_type = "", str
  326. self.materiau = "", str
  327. self.annee_pose = 0, int
  328. self.diametre = "", str
  329. self.route = "", str
  330. self.n_route = "", str
  331. self.pipe_shape = "", str
  332. self.pipe_length = 0.0, float
  333. self.arbres = "", str
  334. self.test_ecoulement = "", str
  335. self.si_date = None, datetime
  336. self.nb_ops = 0, int
  337. self.nb_photos = 0, int
  338. self.rate_1 = None, int
  339. self.rate_2 = None, int
  340. self.rate_3 = None, int
  341. self.rate_4 = None, int
  342. self.rate_5 = None, int
  343. self.DG = "", str
  344. #### Objets utilisés par la synchro QGis
  345. class QGisChantier(object):
  346. """represent a chantier (Video+Etancheite or Compactage)"""
  347. def __init__(self):
  348. self.pgid = None
  349. self.dir_path = ""
  350. self.number = 0 # ex: 123000
  351. self.complement = "" # ex: -S1
  352. self.name = "" # ex: 123000-S1 COMMUNE
  353. self.x0 = 0
  354. self.y0 = 0
  355. self.x1 = 0
  356. self.y1 = 0
  357. self.error_msg = ""
  358. self.items = []
  359. def __repr__(self):
  360. return "[Chantier: {}]".format(self.name if self.name else self.number)
  361. class QGisPoint(object):
  362. """represent a point
  363. could be a Point de Compactage or a Regard"""
  364. def __init__(self):
  365. self.number = 0
  366. self.name = ""
  367. self.x = 0
  368. self.y = 0
  369. def __repr__(self):
  370. return "[Point: {}, {}, ({}, {})]".format(self.number, self.name, self.x, self.y)
  371. class QGisRegard(QGisPoint):
  372. """represent a Regard"""
  373. def __init__(self):
  374. QGisPoint.__init__(self)
  375. self.pgid = 0
  376. self.res_ce = None
  377. def sql_res_ce(self):
  378. """return a sql formatted result for Etancheite """
  379. return "'{}'".format(self.res_ce) if self.res_ce != None else "NULL"
  380. def __eq__(self, other):
  381. return self.name == other.name
  382. def __hash__(self):
  383. # used for comparison (in 'set' among others)
  384. return hash((self.number, self.x, self.y))
  385. def __repr__(self):
  386. return "[Regard: {}, {}, {}, {}, ({}, {})]".format(self.pgid,
  387. self.number,
  388. self.name,
  389. self.res_ce,
  390. self.x,
  391. self.y)
  392. class QGisTroncon(object):
  393. """ represent a troncon """
  394. def __init__(self):
  395. self.name = ""
  396. self.r1 = None
  397. self.r2 = None
  398. self.res_itv = None
  399. self.res_ce = None
  400. self.s_autonumber = 0
  401. self.si_autonumber = 0
  402. def __repr__(self):
  403. return "[Troncon > name='{}', r1={}, r2={}, res_ce='{}', \
  404. res_itv='{}', s_autonumber={}, si_autonumber{}]".format(self.name,
  405. self.r1,
  406. self.r2,
  407. self.res_ce,
  408. self.res_itv,
  409. self.s_autonumber,
  410. self.si_autonumber)
  411. class FraisDeplacement(Model):
  412. """ Modèle de données d'un frais de déplacement """
  413. def __init__(self):
  414. self.IDSuivi = None, int
  415. self.CodeAgent = "", str
  416. self.JourRH = 0, int
  417. self.MoisRH = 0, int
  418. self.AnneeRH = 0,int
  419. self.Depart = "", str
  420. self.Itineraire = "", str
  421. self.Distance2_perso = 0 , int
  422. self.Distance2_service = 0 , int
  423. self.Distance1_perso = 0 , int
  424. self.HeuresDep = 0.0 , float
  425. self.HeuresDepNuit = 0.0 , float
  426. self.Repas = 0 , int
  427. self.Remarque = "", str
  428. self.Valide = False,bool
  429. self.CreePar = "scriptauto", str
  430. self.CreeLe = datetime.now(), datetime
  431. class HeureSupp(Model):
  432. """ Modèle de données d'heure supp """
  433. def __init__(self):
  434. self.IDSuivi = None, int
  435. self.CodeAgent = "", str
  436. self.JourRH = 0, int
  437. self.MoisRH = 0, int
  438. self.AnneeRH = 0,int
  439. self.HeureSup1 = 0, int
  440. self.HeuresDep = 0, int
  441. self.HeuresDepNuit = 0, int
  442. self.HeureSup1Inf14 = 0, int
  443. self.HeureSup1Sup14 = 0, int
  444. self.HeureSupNuit = 0, int
  445. self.HeureSupDim = 0, int
  446. self.HS_VHCanal = 0, int
  447. self.HS_Chantier = 0, int
  448. self.Valide = False,bool
  449. self.CreePar = "scriptauto", str
  450. self.CreeLe = datetime.now(), datetime
  451. if __name__ == "__main__":
  452. for cls in (FacturesDb, ControlesDb, WincanDb, CommunDb, AnalytiqueDb, BoDb, AgrhumDb):
  453. db = cls()
  454. db.assert_connected()
  455. print("connections ok")