pde.py 15 KB

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