瀏覽代碼

Mise en place de l'interaction utilisateur

olivier.massot 7 年之前
父節點
當前提交
3f75884a01
共有 1 個文件被更改,包括 64 次插入26 次删除
  1. 64 26
      agrhum_traitement.py

+ 64 - 26
agrhum_traitement.py

@@ -1,10 +1,24 @@
-'''
+"""
 
-'''
+    Traite les données importées dans PDA pour peupler les tables de la base AGRHum
+
+
+    usage: agrhum_traitement [-c <codeagent>] [-m <mois>] [-a <annee>] [--auto]
+
+    Options:
+      -c <codeagent>         Code de l'agent à traiter
+      -m <mois>              Mois
+      -a <annee>             Annee
+      --auto                 Pas d'interaction utilisateur
+      -h, --help             Affiche l'aide
+
+    @author: emmanuel.pheulpin et olivier.massot, juill 2018
+"""
 
 from datetime import datetime
 import logging
 
+from docopt import docopt
 from path import Path  # @UnusedImport
 
 from core import logconf
@@ -18,26 +32,27 @@ logconf.start("ctrl2analytique", logging.DEBUG)
 # # POUR TESTER, décommenter les lignes suivantes
 ##-----------------------------------------------
 
-# AgrhumDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\BDD_ParcRH.mdb")
-# CommunDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Commun_Data.mdb")
-# logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
-# logger.warning("<<<<<<<<<<<<<<   Mode TEST   >>>>>>>>>>>>>>>>>")
+AgrhumDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\BDD_ParcRH.mdb")
+logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
+logger.warning("<<<<<<<<<<<<<<   Mode TEST   >>>>>>>>>>>>>>>>>")
 
 ##-----------------------------------------------
 
 agrhum_db = AgrhumDb(autocommit=False)
 
-CodeAgent = "T9"
-MoisRH = 12
-AnneeRH = 2017
-
 # Vérification dans la table tbl_suiviRH si la ligne agent mois annnée existe
 # Vérification si état != de Importé ou si valide = True : demande confirmation pour retraitement
 # Si retraitement on supprime des tables cibles tbl_formHS et tbl_formDep
 # Parcours de tbl_importRH transfo donnée et écriture dans tbl_formdep
 # Parcours de tbl_importRH transfo donnée et écriture dans tbl_formHS
 
-def main():
+
+
+def main(CodeAgent, MoisRH, AnneeRH, auto=False):
+
+    logger.error("> Traitement des données de l'agent %s pour le mois %s/%s", CodeAgent, MoisRH, AnneeRH)
+
+
 
     suivi = agrhum_db.first(Sql.format("SELECT * FROM tbl_SuiviRH WHERE CodeAgent ={:text} AND MoisRH = {} AND AnneeRH = {}",
                                        CodeAgent, MoisRH, AnneeRH))
@@ -46,18 +61,24 @@ def main():
         logger.error("Les données de l'agent %s pour le mois %s/%s n'ont pas été importées dans la base PDA. Opération annulée.", CodeAgent, MoisRH, AnneeRH)
         return
 
-    if suivi.Etat == "Importé":
-        logger.warning("Les données de l'agent %s pour le mois %s/%s ont déjà été traitées.")
-        if input("Voulez vous retraiter ces données? Toute modification sur les données existantes seront perdues. (o/n)") != "o" :
-            logger.info("Opération annulée")
-            return
+    if suivi.Etat == "Validé":
+        logger.error("Impossible de traiter des données qui ont déjà été validées. Opération annulée.")
+        return
 
-        agrhum_db.execute(Sql.format("DELETE * FROM tbl_FormDep WHERE CodeAgent ={:text} AND MoisRH = {} AND AnneeRH = {}",
-                                     CodeAgent, MoisRH, AnneeRH))
-        agrhum_db.execute(Sql.format("DELETE * FROM tbl_FormHS WHERE CodeAgent ={:text} AND MoisRH = {} AND AnneeRH = {}",
-                                     CodeAgent, MoisRH, AnneeRH))
+    if agrhum_db.exists(Sql.format("SELECT * FROM tbl_FormDep WHERE CodeAgent ={:text} AND MoisRH = {} AND AnneeRH = {}", CodeAgent, MoisRH, AnneeRH)):
+        logger.warning("Les données de l'agent %s pour le mois %s/%s ont déjà été traitées.", CodeAgent, MoisRH, AnneeRH)
 
+        if not auto and input("Voulez vous retraiter ces données? Toute modification sur les données existantes seront perdues. (o/n)") == "o" :
+            logger.info(">> Effacement des anciennes données")
+            agrhum_db.execute(Sql.format("DELETE * FROM tbl_FormDep WHERE CodeAgent ={:text} AND MoisRH = {} AND AnneeRH = {}",
+                                         CodeAgent, MoisRH, AnneeRH))
+            agrhum_db.execute(Sql.format("DELETE * FROM tbl_FormHS WHERE CodeAgent ={:text} AND MoisRH = {} AND AnneeRH = {}",
+                                         CodeAgent, MoisRH, AnneeRH))
+        else:
+            logger.info("Opération annulée")
+            return
 
+    logger.info("Parcours des données")
     data = agrhum_db.read_all(Sql.format("""SELECT * FROM tbl_ImportRh
                                             WHERE codeagent ={:text} AND Month([daterh]) = {} AND Year([daterh]) = {}
                                             ORDER BY DateRH""", CodeAgent, MoisRH, AnneeRH))
@@ -66,7 +87,7 @@ def main():
                                tbl_PeriodeBareme.DateInf, tbl_PeriodeBareme.DateSup
                         FROM tbl_baremes
                         INNER JOIN tbl_PeriodeBareme ON (tbl_baremes.PeriodeValidite = tbl_PeriodeBareme.CodePeriode) AND (tbl_baremes.NomBareme = tbl_PeriodeBareme.NomBareme)
-                        WHERE  tbl_baremes.NomBareme = 'Heures de route'
+                        WHERE  tbl_baremes.NomBareme = 'Heures de route' or tbl_baremes.NomBareme = 'Heures de route (nuit)'
                             AND tbl_PeriodeBareme.DateInf <= {:date}
                             AND (tbl_PeriodeBareme.DateSup is null or tbl_PeriodeBareme.DateSup > {:date}) """,
                     datetime(AnneeRH, MoisRH, 1), datetime(AnneeRH, MoisRH, 1))
@@ -74,7 +95,7 @@ def main():
     baremes = agrhum_db.read_all(sql)
 
 
-
+    logger.info("Mise à jour de frais de déplacement")
     # Parcours des données de la requête
     index_dep = {}
     for el in data :
@@ -112,8 +133,8 @@ def main():
     for fraisdep in index_dep.values() :
 
         distance2 = (fraisdep.Distance2_perso + fraisdep.Distance2_service)
-        fraisdep.HeuresDep = next((bareme.Valeur for bareme in baremes if bareme.BorneInf <= distance2 and bareme.BorneSup > distance2))
-        fraisdep.HeuresDepNuit = next((bareme.Valeur for bareme in baremes if bareme.BorneInf <= fraisdep.Distance1_perso and bareme.BorneSup > fraisdep.Distance1_perso))
+        fraisdep.HeuresDep = next((bareme.Valeur for bareme in baremes if bareme.NomBareme == 'Heures de route' and bareme.BorneInf <= distance2 and bareme.BorneSup > distance2))
+        fraisdep.HeuresDepNuit = next((bareme.Valeur for bareme in baremes if bareme.NomBareme == 'Heures de route (nuit)' and bareme.BorneInf <= distance2 and bareme.BorneSup > distance2))
 
         sql = Sql.format("""INSERT INTO tbl_FormDep
                                 ( IDSuivi, CodeAgent, JourRH, MoisRH,
@@ -130,6 +151,7 @@ def main():
         agrhum_db.execute(sql)
 
     # on re-parcourt des données de la requête
+    logger.info("Mise à jour des heures supplémentaires")
     index_hs = {}
 
     for el in data :
@@ -160,7 +182,7 @@ def main():
     totalhs = 0.0
     totalhsmois = 0.0
     for hs in index_hs.values() :
-        totalhs = hs.HeureSup1 + hs.HeureSupNuit + hs.HeureSupDim
+        totalhs = hs.HeureSup1 + hs.HeuresDep + hs.HeureSupNuit + hs.HeureSupDim
         if totalhs + totalhsmois <= 14 :
             hs.HeureSup1Inf14 = totalhs
         elif totalhsmois > 14 :
@@ -189,9 +211,25 @@ def main():
 
 
     # Commit des données
+    logger.info("Commit des modifications")
     agrhum_db.commit()
 
 
 
 if __name__ == "__main__":
-    main()
+
+    # Parse les arguments
+    args = docopt(__doc__, help=False)
+    CodeAgent = args["-c"] if args["-c"] else None
+    MoisRH = args["-m"] if args["-m"] else None
+    AnneeRH = args["-a"] if args["-a"] else None
+
+    if not CodeAgent:
+        CodeAgent = input("Veuillez saisir le code de l'agent à traiter (ex: T9): ")
+    if not MoisRH:
+        MoisRH = input("Veuillez saisir le mois (ex: 3): ")
+    if not AnneeRH:
+        AnneeRH = input("Veuillez saisir l'année (ex: 2018): ")
+
+    main(CodeAgent, int(MoisRH), int(AnneeRH), args["--auto"])
+    logger.info("-- Fin --")