diff --git a/CHANGELOG b/CHANGELOG
index ccfc622c231c3cc282711f0d7896a290a09f2b21..7b16958113112ea3790134f4377063eee788be1f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -66,5 +66,7 @@ Le fichier n'est donc plus placé dans le répertoire `config`, mais à la **rac
     * notifier-indicateurs
     * synchronisation
     * chargens-calcul-effectifs
- 
+    * calcul-tableaux-bord
+    * formule-calcul
+
 Pour cela, se référer à la procédure d'installation de OSE.
\ No newline at end of file
diff --git a/bin/ose b/bin/ose
index bb6fe0eaa2af43ad021c662cafc5c62204796a60..f153b0f8ded7ba9dbbcd11472333a4a853988562 100755
--- a/bin/ose
+++ b/bin/ose
@@ -27,6 +27,12 @@ switch ($action) {
     case 'chargens-calcul-effectifs':
         $oa->exec('chargens-calcul-effectifs');
     break;
+    case 'calcul-tableaux-bord':
+        $oa->exec('calcul-tableaux-bord');
+    break;
+    case 'formule-calcul':
+        $oa->exec('formule-calcul');
+    break;
     default:
         help($c, $oa);
     break;
@@ -109,6 +115,9 @@ function help(Console $c, OseAdmin $oa)
     $c->println(" - notifier-indicateurs : Envoi des mails relatifs aux indicateurs");
     $c->println(" - synchronisation <job> : Effectue la synchronisation des données pour le <job> transmis");
     $c->println(" - chargens-calcul-effectifs : Calcul des effectifs du module Charges");
+    $c->println(" - calcul-tableaux-bord : Recalcule tous les tableaux de bord de calculs itermédiaires");
+    $c->println(" - formule-calcul : Calcul de toutes les heures complémentaires à l'aide de la formule");
+
 }
 
 
diff --git a/code/GenDbStructure/DdlGen.php b/code/GenDbStructure/DdlGen.php
index 421fa95adfeeccb98b4c3cd2be3920833a65ad1e..e03c08bc369dcc37369f33da6eccfa684aa36919 100644
--- a/code/GenDbStructure/DdlGen.php
+++ b/code/GenDbStructure/DdlGen.php
@@ -108,41 +108,6 @@ class DdlGen
                 }
             }
         }
-
-        $this->ddl[self::JOBS] = [];
-
-        $this->ddl[self::JOBS]['OSE_FORMULE_REFRESH'] = "BEGIN
-  DBMS_SCHEDULER.CREATE_JOB (
-      job_name => 'OSE_FORMULE_REFRESH',
-    job_type => 'STORED_PROCEDURE',
-    job_action => 'OSE_FORMULE.CALCULER_TOUT',
-    number_of_arguments => 1,
-    start_date => TO_TIMESTAMP_TZ('2014-12-09 10:25:17.032495000 EUROPE/PARIS','YYYY-MM-DD HH24:MI:SS.FF TZR'),
-    repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT,SUN;BYHOUR=5;BYMINUTE=0;BYSECOND=0',
-    end_date => NULL,
-    enabled => TRUE,
-    auto_drop => FALSE,
-    comments => 'Recalcul général de la formule de calcul'
-  );
-END;
-/";
-
-        $this->ddl[self::JOBS]['MAJ_ALL_TBL'] = "BEGIN
-  DBMS_SCHEDULER.CREATE_JOB (
-      job_name => 'MAJ_ALL_TBL',
-    job_type => 'STORED_PROCEDURE',
-    job_action => 'OSE_DIVERS.CALCULER_TABLEAUX_BORD',
-    number_of_arguments => 0,
-    start_date => TO_TIMESTAMP_TZ('2017-11-06 16:03:22.734108000 EUROPE/PARIS','YYYY-MM-DD HH24:MI:SS.FF TZR'),
-    repeat_interval => 'FREQ=DAILY;BYHOUR=2,14;BYMINUTE=0;BYSECOND=0',
-    end_date => NULL,
-    enabled => TRUE,
-    auto_drop => FALSE,
-    comments => 'Mise à jour de tous les tableaux de bord (hors formule de calcul)'
-  );
-END;
-/";
-
     }
 
 
diff --git "a/data/D\303\251ploiement/Changements.pdf" "b/data/D\303\251ploiement/Changements.pdf"
index 363bda2b2febca8291ef5a81ddf8819de0f47e1c..15556c6d0fe6e5fec57b20597cf0a527b88244c1 100644
Binary files "a/data/D\303\251ploiement/Changements.pdf" and "b/data/D\303\251ploiement/Changements.pdf" differ
diff --git "a/data/D\303\251ploiement/Proc\303\251dure d'installation.md" "b/data/D\303\251ploiement/Proc\303\251dure d'installation.md"
index 1a1a04cfa4f24a041254f32decbed0f4bee09f83..45f4e256391107d609aae8f030a31453f444b6cc 100644
--- "a/data/D\303\251ploiement/Proc\303\251dure d'installation.md"	
+++ "b/data/D\303\251ploiement/Proc\303\251dure d'installation.md"	
@@ -128,48 +128,6 @@ Un script d'initialisation vous est fourni (répertoire data/Déploiement/ose-dd
 Attention à bien veiller à ce que les accents soient correctement traités.
 Les caractères du fichier sont en **UTF8**.
 
-En plus de cale, des Jobs Oracle sont à créer pour effectuer une série de tâches.
-Certaines données ont en effet besoin d'être mis à jour périodiquement.
-A vous d'adapter les périodicités à vos besoins.
-
-```sql
-
-/
-
-BEGIN
-  DBMS_SCHEDULER.CREATE_JOB (
-      job_name => 'OSE_FORMULE_REFRESH',
-    job_type => 'STORED_PROCEDURE',
-    job_action => 'OSE_FORMULE.CALCULER_TOUT',
-    number_of_arguments => 1,
-    start_date => TO_TIMESTAMP_TZ('2014-12-09 10:25:17.032495000 EUROPE/PARIS','YYYY-MM-DD HH24:MI:SS.FF TZR'),
-    repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT,SUN;BYHOUR=5;BYMINUTE=0;BYSECOND=0',
-    end_date => NULL,
-    enabled => TRUE,
-    auto_drop => FALSE,
-    comments => 'Recalcul général de la formule de calcul'
-  );
-END;
-
-/
-
-BEGIN
-  DBMS_SCHEDULER.CREATE_JOB (
-      job_name => 'MAJ_ALL_TBL',
-    job_type => 'STORED_PROCEDURE',
-    job_action => 'OSE_DIVERS.CALCULER_TABLEAUX_BORD',
-    number_of_arguments => 0,
-    start_date => TO_TIMESTAMP_TZ('2017-11-06 16:03:22.734108000 EUROPE/PARIS','YYYY-MM-DD HH24:MI:SS.FF TZR'),
-    repeat_interval => 'FREQ=DAILY;BYHOUR=2,14;BYMINUTE=0;BYSECOND=0',
-    end_date => NULL,
-    enabled => TRUE,
-    auto_drop => FALSE,
-    comments => 'Mise à jour de tous les tableaux de bord (hors formule de calcul)'
-  );
-END;
-/
-```
-
 # Configuration technique
 Personnalisez le fichier `config.local.php` pour adapter OSE à votre établissement.
 
@@ -185,12 +143,14 @@ Ce mode vous permettra de :
 Une fois cette étape terminée, il convient de passer OSE en mode production. Cela se fait dans le fichier de configuration `config.local.php`, en positionnant à `false` `global/modeInstallation`.
 
 # Mise en place des tâches CRON
-Des tâches CRON doivent être lancée sur votre serveur régulièrement.
-Elle sert à envoyer les notifications par mail pour les indicateurs à ceux qui se sont abonnés.
+Des tâches CRON doivent être lancée sur votre serveur régulièrement pour mettre à jour certaines données
+ou réaliser des actions.
+
+Ces tâches n'ont pas besoin d'être lancées régulièrement sur un serveur de pré-production.
 
 Dans tous les cas, c'est le script de OSE qui sera appelé.
 Le script est situé dans le répertoire de OSE, `bin/ose`.
-Il est suivi de l'action à exécuter, puis éventuellement de paramètres.
+Il est suivi de l'action à exécuter, puis éventuellement de paramètres à préciser.
 
 Exemple d'utilisation pour lancer une tâche de synchronisation appelée `principal`:
 ```bash
@@ -202,6 +162,8 @@ Exemple d'utilisation pour lancer une tâche de synchronisation appelée `princi
 | Indicateurs : envoi des notifications par mail | Les jours de semaine entre 5h et 17h | notifier-indicateurs |
 | Synchronisation : Mise en place d'un job pour l'import des données. Plusieurs jobs pourront être créés au besoin | Tous les quarts d'heures entre 7h et 21h sauf le dimanche | synchronisation `<Nom du job>` |  
 | Calcul des effectifs du module Charges | une fois par jour, à 20h tous les jours sauf le dimanche. | chargens-calcul-effectifs |
+| Calcul des tableaux de bord | Deux fois par jour sauf le dimanche (Calcul LONG) | calcul-tableaux-bord |
+| Calcul des heures complémentaires à l'aide de la formule (calcul LONG) | Les lundi et jeudi à 3h | formule-calcul |
 
 Après la commande, on ajoute `1> /tmp/oselog 2>&1` pour loguer le résultat dans le fichier`/tmp/oselog`.
 A adapter le cas échéant.
@@ -210,9 +172,11 @@ Voici un exemple de crontab :
 
 ```cron
 # m  h    dom mon dow command
-0    5-17 *   *   1-5 /usr/bin/php /var/www/ose/bin/ose notifier-indicateurs 1> /tmp/oselog 2>&1
-*/15 7-21 *   *   1-6 /usr/bin/php /var/www/ose/bin/ose synchronisation job1 1> /tmp/oselog 2>&1
+0    5-17 *   *   1-5 /usr/bin/php /var/www/ose/bin/ose notifier-indicateurs      1> /tmp/oselog 2>&1
+*/15 7-21 *   *   1-6 /usr/bin/php /var/www/ose/bin/ose synchronisation job1      1> /tmp/oselog 2>&1
 0      20 *   *   1-6 /usr/bin/php /var/www/ose/bin/ose chargens-calcul-effectifs 1> /tmp/oselog 2>&1
+0    6,14 *   *   1-6 /usr/bin/php /var/www/ose/bin/ose calcul-tableaux-bord      1> /tmp/oselog 2>&1
+0       3 *   *   1,4 /usr/bin/php /var/www/ose/bin/ose formule-calcul            1> /tmp/oselog 2>&1
 ```
 
 OSE est maintenant installé.
diff --git "a/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" "b/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf"
index a1557e2f58805c025cc66900d499a088023f53fa..52689c977536916e810755e83df090b179d27f62 100644
Binary files "a/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" and "b/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" differ
diff --git "a/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" "b/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf"
index 5fb3146d38888f758009784448032796a5f677e3..0f10fcfe3b9f6282db0e370fcf9e9d70745a76ba 100644
Binary files "a/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" and "b/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" differ
diff --git "a/data/D\303\251ploiement/ose-ddl.sql" "b/data/D\303\251ploiement/ose-ddl.sql"
index 0877219ec73a90bf8b2cdcd2175234f3f91e2ca6..556f43aa6b312d64972a5eb730a1c2dc402454cc 100755
--- "a/data/D\303\251ploiement/ose-ddl.sql"
+++ "b/data/D\303\251ploiement/ose-ddl.sql"
@@ -18686,44 +18686,6 @@ END;
 /
 ALTER TRIGGER "WF_ETAPE_DEP_CK" ENABLE;
 
---------------------------------------------------
--- Jobs
---------------------------------------------------
-
--- OSE_FORMULE_REFRESH
-BEGIN
-  DBMS_SCHEDULER.CREATE_JOB (
-      job_name => 'OSE_FORMULE_REFRESH',
-    job_type => 'STORED_PROCEDURE',
-    job_action => 'OSE_FORMULE.CALCULER_TOUT',
-    number_of_arguments => 1,
-    start_date => TO_TIMESTAMP_TZ('2014-12-09 10:25:17.032495000 EUROPE/PARIS','YYYY-MM-DD HH24:MI:SS.FF TZR'),
-    repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT,SUN;BYHOUR=5;BYMINUTE=0;BYSECOND=0',
-    end_date => NULL,
-    enabled => TRUE,
-    auto_drop => FALSE,
-    comments => 'Recalcul général de la formule de calcul'
-  );
-END;
-/
-
--- MAJ_ALL_TBL
-BEGIN
-  DBMS_SCHEDULER.CREATE_JOB (
-      job_name => 'MAJ_ALL_TBL',
-    job_type => 'STORED_PROCEDURE',
-    job_action => 'OSE_DIVERS.CALCULER_TABLEAUX_BORD',
-    number_of_arguments => 0,
-    start_date => TO_TIMESTAMP_TZ('2017-11-06 16:03:22.734108000 EUROPE/PARIS','YYYY-MM-DD HH24:MI:SS.FF TZR'),
-    repeat_interval => 'FREQ=DAILY;BYHOUR=2,14;BYMINUTE=0;BYSECOND=0',
-    end_date => NULL,
-    enabled => TRUE,
-    auto_drop => FALSE,
-    comments => 'Mise à jour de tous les tableaux de bord (hors formule de calcul)'
-  );
-END;
-/
-
 
 
 -- Table SOURCE
diff --git "a/data/Mises \303\240 jour/06.3.sql" "b/data/Mises \303\240 jour/06.3.sql"
index 1a34001cb233f575710a6eec4187d0c895c9befc..5aa6176401f37aa306dea3c91d01e156112150a5 100644
--- "a/data/Mises \303\240 jour/06.3.sql"	
+++ "b/data/Mises \303\240 jour/06.3.sql"	
@@ -90,6 +90,21 @@ BEGIN
                                 force => true);
 END;
 /
+-- Suppression du JOB OSE_FORMULE_REFRESH
+BEGIN
+    DBMS_SCHEDULER.DROP_JOB(job_name => '"OSE"."OSE_FORMULE_REFRESH"',
+                                defer => false,
+                                force => true);
+END;
+/
+-- Suppression du JOB OSE_WF_REFRESH
+BEGIN
+    DBMS_SCHEDULER.DROP_JOB(job_name => '"OSE"."OSE_WF_REFRESH"',
+                                defer => false,
+                                force => true);
+END;
+/
 
+drop package "OSE"."OSE_IMPORT";
 
-drop package "OSE"."OSE_IMPORT";
\ No newline at end of file
+/
\ No newline at end of file
diff --git a/module/Application/Module.php b/module/Application/Module.php
index 552bc9b23c5ebad43af0ab20f167d874353b4883..e08855cfc35961bbe785b869ea0d09b53752786c 100755
--- a/module/Application/Module.php
+++ b/module/Application/Module.php
@@ -163,6 +163,10 @@ class Module implements ConsoleUsageProviderInterface, ConsoleBannerProviderInte
             ['--force', "Facultatif", "Envoie les mails sytématiquement, sans tenir compte de la fréquence de notification."],
             "Charges d'enseignement",
             'chargens-calc-effectifs' => "Calcul des effectifs du module Charges",
+            "Tableaux de bord",
+            'calcul-tableaux-bord' => "Calcul de tous les tableaux de bord (sauf la formule qui est à part)",
+            "Formule de calcul",
+            'formule-calcul' => "Calcul de toutes les heures complémentaires à l'aide de la formule",
         ];
     }
 
diff --git a/module/Application/config/formule.config.php b/module/Application/config/formule.config.php
index 7be8a896eb440a1d80336d2b3ff9b85818d6bc03..e79b53727883753b613a370dbdaa6d94fa05a0cf 100644
--- a/module/Application/config/formule.config.php
+++ b/module/Application/config/formule.config.php
@@ -3,6 +3,30 @@
 namespace Application;
 
 return [
+
+    /* Déclaration du contrôleur */
+    'controllers'     => [
+        'factories' => [
+            'Application\Controller\Formule' => Controller\Factory\FormuleControllerFactory::class,
+        ],
+    ],
+
+    'console' => [
+        'router' => [
+            'routes' => [
+                'formule-calcul' => [
+                    'options' => [
+                        'route'    => 'formule-calcul',
+                        'defaults' => [
+                            'controller' => 'Application\Controller\Formule',
+                            'action'     => 'calculer-tout',
+                        ],
+                    ],
+                ],
+            ],
+        ],
+    ],
+
     'service_manager' => [
         'invokables' => [
             Service\FormuleIntervenantService::class                      => Service\FormuleIntervenantService::class,
diff --git a/module/Application/config/workflow.config.php b/module/Application/config/workflow.config.php
index 5899f6135e408022be3199544281be1b64d9fedf..069a575efed0d2de1c9445de2acc063146b1ea1d 100644
--- a/module/Application/config/workflow.config.php
+++ b/module/Application/config/workflow.config.php
@@ -90,6 +90,23 @@ return [
             ],
         ],
     ],
+
+    'console' => [
+        'router' => [
+            'routes' => [
+                'workflow-calcul-tbls' => [
+                    'options' => [
+                        'route'    => 'calcul-tableaux-bord',
+                        'defaults' => [
+                            'controller' => 'Application\Controller\Workflow',
+                            'action'     => 'calcul-tableaux-bord',
+                        ],
+                    ],
+                ],
+            ],
+        ],
+    ],
+
     'navigation'      => [
         'default' => [
             'home' => [
diff --git a/module/Application/src/Application/Controller/Factory/FormuleControllerFactory.php b/module/Application/src/Application/Controller/Factory/FormuleControllerFactory.php
new file mode 100755
index 0000000000000000000000000000000000000000..3f50a3b5247068fdb6ebb98f3a64a0b3cc1f77a5
--- /dev/null
+++ b/module/Application/src/Application/Controller/Factory/FormuleControllerFactory.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Application\Controller\Factory;
+
+use Zend\Mvc\Controller\ControllerManager as ContainerInterface;
+use Application\Controller\FormuleController;
+
+
+
+/**
+ * Description of FormuleControllerFactory
+ *
+ * @author LECLUSE Laurent <laurent.lecluse at unicaen.fr>
+ */
+class FormuleControllerFactory
+{
+
+    /**
+     * @param ContainerInterface $container
+     * @param string             $requestedName
+     * @param array|null         $options
+     *
+     * @return FormuleController
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, $options = null)
+    {
+        /* On quitte le ControllerManager */
+        $container = $container->getServiceLocator();
+
+        $controller = new FormuleController;
+        /* Injectez vos dépendances ICI */
+
+        return $controller;
+    }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Controller/FormuleController.php b/module/Application/src/Application/Controller/FormuleController.php
new file mode 100755
index 0000000000000000000000000000000000000000..8804ec73001c5ef0bac6155a00772f5f1660b0b1
--- /dev/null
+++ b/module/Application/src/Application/Controller/FormuleController.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Application\Controller;
+
+
+/**
+ * Description of FormuleController
+ *
+ * @author LECLUSE Laurent <laurent.lecluse at unicaen.fr>
+ */
+class FormuleController extends AbstractController
+{
+
+    public function calculerToutAction()
+    {
+        $this->em()->getConnection()->exec('BEGIN OSE_FORMULE.CALCULER_TOUT; END;');
+    }
+
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Controller/WorkflowController.php b/module/Application/src/Application/Controller/WorkflowController.php
index 67bc71dfc90092f278648909d977c964c0f91281..00c32f3af2ec0e3f75cf2b2e7c444a6df65e09e4 100644
--- a/module/Application/src/Application/Controller/WorkflowController.php
+++ b/module/Application/src/Application/Controller/WorkflowController.php
@@ -143,6 +143,11 @@ class WorkflowController extends AbstractController
     }
 
 
+    public function calculTableauxBordAction()
+    {
+        $this->getServiceWorkflow()->calculerTousTableauxBord();
+    }
+
 
     public function feuilleDeRouteRefreshAction()
     {
diff --git a/module/Application/src/Application/Service/Factory/WorkflowServiceFactory.php b/module/Application/src/Application/Service/Factory/WorkflowServiceFactory.php
index 0264ea41150dc86c64275450e6aa33a6217135d4..ad5fa713912f70646e65fcbd909d97bb7dc54920 100644
--- a/module/Application/src/Application/Service/Factory/WorkflowServiceFactory.php
+++ b/module/Application/src/Application/Service/Factory/WorkflowServiceFactory.php
@@ -5,6 +5,7 @@ namespace Application\Service\Factory;
 use Application\Service\ContextService;
 use Application\Service\WorkflowService;
 use UnicaenTbl\Service\TableauBordService;
+use Zend\Console\Console;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -22,9 +23,11 @@ class WorkflowServiceFactory implements FactoryInterface
             $serviceLocator->get(ContextService::class)
         );
 
-        $service->setServiceAuthorize(
-            $serviceLocator->get('BjyAuthorize\Service\Authorize')
-        );
+        if (!Console::isConsole()) {
+            $service->setServiceAuthorize(
+                $serviceLocator->get('BjyAuthorize\Service\Authorize')
+            );
+        }
 
         return $service;
     }
diff --git a/module/Application/src/Application/Service/WorkflowService.php b/module/Application/src/Application/Service/WorkflowService.php
index 0f65fc49b30cd4c13ac126bf79da11c7c91605de..e7a15a1773a418dd84a42b1b6a50aad38e5248e0 100755
--- a/module/Application/src/Application/Service/WorkflowService.php
+++ b/module/Application/src/Application/Service/WorkflowService.php
@@ -283,6 +283,17 @@ class WorkflowService extends AbstractService
 
 
 
+    /**
+     * @return int
+     * @throws \Doctrine\DBAL\DBALException
+     */
+    public function calculerTousTableauxBord()
+    {
+        return $this->getEntityManager()->getConnection()->exec('BEGIN OSE_DIVERS.CALCULER_TABLEAUX_BORD; END;');
+    }
+
+
+
     /**
      * @param array                                        $tableauxBords
      * @param Intervenant|Intervenant[]|string $intervenant