pde.py 17 KB

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