pde.py 15 KB

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