pde.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  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. self.strCreateur = "", str
  158. class FactureGf(Model):
  159. """ Modèle de données d'une facture Astre-GF """
  160. def __init__(self):
  161. self.numExBudget = 0, int
  162. self.codeColl = "", str
  163. self.codeBudg = "", str
  164. self.numEnv = 0, int
  165. self.codeSection = "", str
  166. self.typeMvt = "", str
  167. self.numMandat = 0, int
  168. self.numLiqMandat = 0, int
  169. self.numLigneMandat = 0, int
  170. self.codeAxe = "", str
  171. self.libAxe = "", str
  172. self.codeCout = "", str
  173. self.libCout = "", str
  174. self.dateMandat = None, datetime
  175. self.numBj = 0, int
  176. self.numTiers = 0, int
  177. self.libRai = "", str
  178. self.refIntMandat = "", str
  179. self.codePeriode = "", str
  180. self.dateDepDelai = None, datetime
  181. self.typeNomencMarche = "", str
  182. self.mntTtcMandat = 0, float
  183. self.mntTvaMandat = 0, float
  184. self.mntVent = 0, float
  185. class EnTete(Model):
  186. """ En-tête d'une facture dans FacturesDb """
  187. def __init__(self):
  188. self.lngPieceId = 0, int
  189. self.lngDocId = 0, int
  190. self.lngTiersId = 0, int
  191. self.lngASTRE = None, int
  192. self.strCodeProduit = None, str
  193. self.bytTitreId = 0, int
  194. self.strCodeAdresse = None, str
  195. self.strAdresse1 = None, str
  196. self.strAdresse2 = None, str
  197. self.strAdresse3 = None, str
  198. self.strAdresse4 = None, str
  199. self.strAdresse5 = None, str
  200. self.strPaysIdIso3166 = None , str # (!) le nom réel du champ est '[strPaysIdIso3166-A2]'
  201. self.bytTVATiersId = 0, int
  202. self.strTelephone = None, str
  203. self.strTelecopie = None, str
  204. self.strPortable = None, str
  205. self.strEMail = None, str
  206. self.strWeb = None, str
  207. self.strLangueIdIso639 = None, str
  208. self.strCompteComptable = None, str
  209. self.strDeviseIdIso4217 = None, str
  210. self.bytReglementId = 0, int
  211. self.strReglement = None, str
  212. self.bytClasseTarifId = 0, int
  213. self.bytClasseRemiseTiersId = 0, int
  214. self.bytNbExFacture = 1, int
  215. self.strStatTiers = None, str
  216. self.bytSituationIdPrincipale = 0, int
  217. self.bytSituationIdSecondaire = 0, int
  218. self.memObsEntete = None, str
  219. self.memObsPied = None, str
  220. self.memObsInterne = None, str
  221. self.bytTypeDocumentId = 0, int
  222. self.strStatDocEntete = None, str
  223. self.dblCoursDevise = 1, int
  224. self.dtmCoursDevise = datetime.now(), datetime
  225. self.dtmCreation = datetime.now(), datetime
  226. self.strUserIdCreation = None, str
  227. self.dtmLastMod = datetime.now()
  228. self.strUserIdLastMod = None, str
  229. self.dtmPiece = datetime.now(), datetime
  230. self.dtmFirstPrint = None, datetime
  231. self.dtmLastPrint = None, datetime
  232. self.dtmCompta = None, datetime
  233. self.dtmLivraison = None, datetime
  234. self.dtmEcheance = None, datetime
  235. self.bytTypeTarif = 1, int
  236. self.idEtatEmission = None, str
  237. class Ligne(Model):
  238. """ Ligne d'une facture dans FacturesDb """
  239. def __init__(self):
  240. self.lngPieceId = 0, int
  241. self.intLigneId = 0, int
  242. self.strArticleId = None, str
  243. self.strArticle = None, str
  244. self.bytTVAArticleId = 0, int
  245. self.bytTVAId = 0, int
  246. self.dblTVATaux = 0, float
  247. self.dblQte = 0, float
  248. self.bytUniteIdQuantite = 0, int
  249. self.bytNbDecQuantite = 2, int
  250. self.bytUniteIdPrix = 0, int
  251. self.dblCnvUniteCoef = 1.0, float
  252. self.bytNbDecQuantiteConvertie = 2, int
  253. self.dblPUhtBrutDev = 0, float
  254. self.dblPUttcBrutDev = 0, float
  255. self.dblPUhtNetDev = 0, float
  256. self.dblPUttcNetDev = 0, float
  257. self.bytNbDecPU = 2, int
  258. self.dblPThtBrutDev = 0, float
  259. self.dblPTttcBrutDev = 0, float
  260. self.dblPThtNetDev = 0, float
  261. self.dblPTttcNetDev = 0, float
  262. self.strStatArticle = None, str
  263. self.strStatDocLigne = None, str
  264. self.dblTauxRemise1 = 0, float
  265. self.dblTauxRemise2 = 0, float
  266. self.dblTauxRemise3 = 0, float
  267. self.blnPrestation = False, bool
  268. self.strCompteComptable = None, str
  269. self.memObs = None, str
  270. self.memObsInterne = None, str
  271. self.bytLigneSousTotal = 1, int
  272. self.intLigneIdRattachement = 0, int
  273. self.blnLigneVisible = True, bool
  274. self.blnLigneGeneree = False, bool
  275. self.bytGenerateurId = 0, int
  276. self.dblPUhtBrut = 0, float
  277. self.dblPUttcBrut = 0, float
  278. self.dblPUhtNet = 0, float
  279. self.dblPUttcNet = 0, float
  280. self.dblPThtBrut = 0, float
  281. self.dblPTttcBrut = 0, float
  282. self.dblPThtNet = 0, float
  283. self.dblPTttcNet = 0, float
  284. self.bytClasseRemiseArticleId = 0, int
  285. self.dblPUSaisie = 0, float
  286. self.strPUAff = "", str
  287. self.strQteAff = "", str
  288. class InterventionITV(Model):
  289. """ Modèle d'une intervention vidéo sur un réseau d'assainissement dans Controles """
  290. def __init__(self):
  291. self.lngChantierId = 0, int
  292. self.bytIntervId = 0, int
  293. self.dtmIntervDu = None, datetime
  294. self.dtmIntervAu = None, datetime
  295. self.strEquipeId = "", str
  296. self.intlMaterielID = 0, int
  297. self.bytCommandeId = 0, int
  298. self.lngTroncon = 0, float
  299. self.SI_InspMethod = "", str
  300. self.SI_ReasonOfInspection = "", str
  301. class InspectionTronconWincan(Model):
  302. """ Inspection vidéo d'un tronçon de réseau d'assainissement dans Wincan """
  303. def __init__(self):
  304. self.s_guid = "", str
  305. self.si_guid = "", str
  306. self.nom_chantier = "", str
  307. self.lng_chantier_id = 0, int
  308. self.byt_interv_id = 0, int
  309. self.si_autonumber = 0, int
  310. self.classement_troncons = "", str
  311. self.nom_troncon = "", str
  312. self.startnode_type = "", str
  313. self.endnode_type = "", str
  314. self.sens_ecoul = "", str
  315. self.startnode_z = 0.0, float
  316. self.endnode_z = 0.0, float
  317. self.section_length = 0.0, float
  318. self.section_purpose = "", str
  319. self.section_use = "", str
  320. self.section_type = "", str
  321. self.materiau = "", str
  322. self.annee_pose = 0, int
  323. self.diametre = "", str
  324. self.route = "", str
  325. self.n_route = "", str
  326. self.pipe_shape = "", str
  327. self.pipe_length = 0.0, float
  328. self.arbres = "", str
  329. self.test_ecoulement = "", str
  330. self.si_date = None, datetime
  331. self.nb_ops = 0, int
  332. self.nb_photos = 0, int
  333. self.rate_1 = None, int
  334. self.rate_2 = None, int
  335. self.rate_3 = None, int
  336. self.rate_4 = None, int
  337. self.rate_5 = None, int
  338. self.DG = "", str
  339. #### Objets utilisés par la synchro QGis
  340. class QGisChantier(object):
  341. """represent a chantier (Video+Etancheite or Compactage)"""
  342. def __init__(self):
  343. self.pgid = None
  344. self.dir_path = ""
  345. self.number = 0 # ex: 123000
  346. self.complement = "" # ex: -S1
  347. self.name = "" # ex: 123000-S1 COMMUNE
  348. self.x0 = 0
  349. self.y0 = 0
  350. self.x1 = 0
  351. self.y1 = 0
  352. self.error_msg = ""
  353. self.items = []
  354. def __repr__(self):
  355. return "[Chantier: {}]".format(self.name if self.name else self.number)
  356. class QGisPoint(object):
  357. """represent a point
  358. could be a Point de Compactage or a Regard"""
  359. def __init__(self):
  360. self.number = 0
  361. self.name = ""
  362. self.x = 0
  363. self.y = 0
  364. def __repr__(self):
  365. return "[Point: {}, {}, ({}, {})]".format(self.number, self.name, self.x, self.y)
  366. class QGisRegard(QGisPoint):
  367. """represent a Regard"""
  368. def __init__(self):
  369. QGisPoint.__init__(self)
  370. self.pgid = 0
  371. self.res_ce = None
  372. def sql_res_ce(self):
  373. """return a sql formatted result for Etancheite """
  374. return "'{}'".format(self.res_ce) if self.res_ce != None else "NULL"
  375. def __eq__(self, other):
  376. return self.name == other.name
  377. def __hash__(self):
  378. # used for comparison (in 'set' among others)
  379. return hash((self.number, self.x, self.y))
  380. def __repr__(self):
  381. return "[Regard: {}, {}, {}, {}, ({}, {})]".format(self.pgid,
  382. self.number,
  383. self.name,
  384. self.res_ce,
  385. self.x,
  386. self.y)
  387. class QGisTroncon(object):
  388. """ represent a troncon """
  389. def __init__(self):
  390. self.name = ""
  391. self.r1 = None
  392. self.r2 = None
  393. self.res_itv = None
  394. self.res_ce = None
  395. self.s_autonumber = 0
  396. self.si_autonumber = 0
  397. def __repr__(self):
  398. return "[Troncon > name='{}', r1={}, r2={}, res_ce='{}', \
  399. res_itv='{}', s_autonumber={}, si_autonumber{}]".format(self.name,
  400. self.r1,
  401. self.r2,
  402. self.res_ce,
  403. self.res_itv,
  404. self.s_autonumber,
  405. self.si_autonumber)
  406. class FraisDeplacement(Model):
  407. """ Modèle de données d'un frais de déplacement """
  408. def __init__(self):
  409. self.IDSuivi = None, int
  410. self.CodeAgent = "", str
  411. self.JourRH = 0, int
  412. self.MoisRH = 0, int
  413. self.AnneeRH = 0, int
  414. self.Depart = "", str
  415. self.Itineraire = "", str
  416. self.Distance2_perso = 0 , int
  417. self.Distance2_service = 0 , int
  418. self.Distance1_perso = 0 , int
  419. self.HeuresDep = 0.0 , float
  420. self.HeuresDepNuit = 0.0 , float
  421. self.Repas = 0 , int
  422. self.Remarque = "", str
  423. self.Valide = False, bool
  424. self.CreePar = "scriptauto", str
  425. self.CreeLe = datetime.now(), datetime
  426. class HeureSupp(Model):
  427. """ Modèle de données d'heure supp """
  428. def __init__(self):
  429. self.IDSuivi = None, int
  430. self.CodeAgent = "", str
  431. self.JourRH = 0, int
  432. self.MoisRH = 0, int
  433. self.AnneeRH = 0, int
  434. self.HeureSup1 = 0.0, float
  435. self.HeuresDep = 0.0, float
  436. self.HeuresDepNuit = 0.0, float
  437. self.HeureSup1_inf_14 = 0.0, float
  438. self.HeureSup1_sup_14 = 0.0, float
  439. self.HeureSupNuit = 0.0, float
  440. self.HeureSupDim = 0.0, float
  441. self.HS_VHCanal = 0.0, float
  442. self.HS_Chantier = 0.0, float
  443. self.Valide = False, bool
  444. self.CreePar = "scriptauto", str
  445. self.CreeLe = datetime.now(), datetime
  446. if __name__ == "__main__":
  447. for cls in (FacturesDb, ControlesDb, WincanDb, CommunDb, AnalytiqueDb, BoDb, AgrhumDb):
  448. db = cls()
  449. db.assert_connected()
  450. print("connections ok")