Commit d84529c14fad3f4c42b4ad9dc1742d5270e5303b

Authored by Etienne Pallier
1 parent fc8a73bb
Exists in master and in 1 other branch dev

ajout scripts connexion BD et executions requetes ORM depuis console ou scripts

CAKE_SHELL 0 → 100755
... ... @@ -0,0 +1,3 @@
  1 +#!/usr/bin/env bash
  2 +
  3 +bin/cake console
... ...
CONNECT_TO_MYSQL_AS_ROOT 0 → 100755
... ... @@ -0,0 +1,23 @@
  1 +#!/usr/bin/env bash
  2 +
  3 +# AVEC DOCKER ?
  4 +if [[ -f ../DOCKER_LABINVENT_DB_ROOT ]] ; then
  5 + cd ../
  6 + ./DOCKER_LABINVENT_DB_ROOT
  7 + exit
  8 +fi
  9 +
  10 +
  11 +# SANS DOCKER
  12 +source install/ENV.sh
  13 +#echo $MYSQL_ROOT_LOGIN
  14 +#echo $MYSQL_ROOT_PASSWORD
  15 +
  16 +#echo $MYSQL_PORT #127.0.0.1:3307
  17 +#MYSQL_PORT=$(echo "$MYSQL_PORT" | cut -d':' -f 2)
  18 +#echo $MYSQL_PORT #3307
  19 +
  20 +mysql -h 127.0.0.1 -u $MYSQL_ROOT_LOGIN -p$MYSQL_ROOT_PASSWORD
  21 +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT --protocol=tcp -p$MYSQL_PASSWORD
  22 +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT -p$MYSQL_PASSWORD
  23 +
... ...
CONNECT_TO_MYSQL_AS_USER 0 → 100755
... ... @@ -0,0 +1,23 @@
  1 +#!/usr/bin/env bash
  2 +
  3 +# AVEC DOCKER ?
  4 +if [[ -f ../DOCKER_LABINVENT_DB_USER ]] ; then
  5 + cd ../
  6 + ./DOCKER_LABINVENT_DB_USER
  7 + exit
  8 +fi
  9 +
  10 +
  11 +# SANS DOCKER
  12 +source install/ENV.sh
  13 +#echo $MYSQL_USER
  14 +#echo $MYSQL_PASSWORD
  15 +
  16 +#echo $MYSQL_PORT #127.0.0.1:3307
  17 +#MYSQL_PORT=$(echo "$MYSQL_PORT" | cut -d':' -f 2)
  18 +#echo $MYSQL_PORT #3307
  19 +
  20 +mysql -h 127.0.0.1 -u $MYSQL_USER -p$MYSQL_PASSWORD
  21 +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT --protocol=tcp -p$MYSQL_PASSWORD
  22 +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT -p$MYSQL_PASSWORD
  23 +
... ...
DB_EXEC 0 → 100755
... ... @@ -0,0 +1,7 @@
  1 +#!/usr/bin/env bash
  2 +
  3 +fname=$1
  4 +arg=$2
  5 +
  6 +bin/cake db $fname $arg
  7 +
... ...
src/Shell/DbShell.php 0 → 100644
... ... @@ -0,0 +1,280 @@
  1 +<?php
  2 +namespace App\Shell;
  3 +
  4 +use Cake\Console\Shell;
  5 +use Cake\Utility\Inflector;
  6 +//use Cake\Utility\Text;
  7 +
  8 +
  9 +define("NL", "\n\n");
  10 +
  11 +class DbShell extends Shell
  12 +{
  13 +
  14 + public function initialize():void
  15 + {
  16 + parent::initialize();
  17 + $this->loadModel('Utilisateurs');
  18 + $this->loadModel('Familles');
  19 + $this->loadModel('PlanningPermanences');
  20 + }
  21 +
  22 + // bin/cake db show_user Admin
  23 + public function showUser()
  24 + {
  25 + if (empty($this->args[0])) {
  26 + // Utilisez error() avant CakePHP 3.2
  27 + return $this->abort("Merci de rentrer un nom d'utilisateur.");
  28 + }
  29 + //$user = $this->Utilisateurs->findByUsername($this->args[0])->first();
  30 + $user = $this->Utilisateurs->findByNom($this->args[0])->first();
  31 + $this->out(print_r($user, true));
  32 + }
  33 + // bin/cake db voir_user_admin
  34 + public function voirUserAdmin()
  35 + {
  36 + //$this->showUser('Admin');
  37 + $user = $this->Utilisateurs->findByNom('Admin')->first();
  38 + $this->out(print_r($user, true));
  39 + }
  40 +
  41 + // bin/cake db hey_there Steven
  42 + public function heyThere($name = 'Anonymous')
  43 + {
  44 + $this->out('Hey there ' . $name);
  45 + }
  46 +
  47 +
  48 + // bin/cake db liste_beneficiaires_et_personenes
  49 + public function listePlanningPermanencesEtLeursVisites()
  50 + {
  51 + $entities = $this->PlanningPermanences->find()->contain([
  52 + // 'Permanences', // TODO ajouter gestion de la table PlanningPermanences
  53 + // 'EpicerieVisites', // TODO
  54 + ]);
  55 + foreach ($entities as $e) print($e);
  56 + }
  57 +
  58 + // bin/cake db listeBenevolesAvecLeurRoleEtEquipe
  59 + public function listeBenevolesAvecLeurRoleEtEquipe()
  60 + {
  61 + $entities = $this->Utilisateurs->find()->contain([
  62 + 'Roles',
  63 + 'Equipes',
  64 + ]);
  65 + foreach ($entities as $e) print($e);
  66 + }
  67 +
  68 +
  69 + // bin/cake db liste_beneficiaires_et_personenes
  70 + public function listeBeneficiairesAvecLeursPersonnesLienEtLeursContratsTransactionPermanenceHoraireEtLeursVisites() {
  71 + $familles_personnes = $this->Familles->find()->contain([
  72 + 'Personnes' => [
  73 + 'sort' => 'Personnes.prenom'
  74 + ],
  75 + 'Personnes.Liens',
  76 + 'Contrats' => [
  77 + 'sort' => ['Contrats.date_fin' => 'DESC']
  78 + ],
  79 + 'Contrats.Transactions',
  80 + 'Contrats.Horaires',
  81 + 'Contrats.Permanences',
  82 + 'Contrats.EpicerieVisites',
  83 + ]);
  84 + foreach ($familles_personnes as $fp) print($fp);
  85 + }
  86 +
  87 + public function listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire() {
  88 + $familles = $this->Familles->find()->contain([
  89 + // - Seulement le contact principal de la famille
  90 + 'Personnes.Liens' => function ($q) {
  91 + return $q
  92 + ->where(['Liens.nom' => 'principal']);
  93 + },
  94 + // - Les contrats
  95 + // On les trie du plus récent au plus ancien, par la date de fin, puis la date début
  96 + // (pour le cas où 2 contrats avec même date fin)
  97 + 'Contrats' => [
  98 + 'sort' => ['Contrats.date_fin'=>'DESC', 'Contrats.date_debut'=>'DESC']
  99 + ],
  100 + 'Contrats.Transactions',
  101 + 'Contrats.Horaires',
  102 + 'Contrats.Permanences',
  103 + // - Les visites (de chaque contrat)
  104 + 'Contrats.EpicerieVisites',
  105 + ]);
  106 + foreach ($familles as $f) {
  107 + $f->contrats = current($f->contrats);
  108 + print($f);
  109 + }
  110 + return $familles;
  111 + }
  112 + public function beneficiaireAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire($id) {
  113 + $familles = $this->listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire();
  114 + echo NL.NL.NL;
  115 + $f = $familles->where(['id' => $id])->first();
  116 + echo $f;
  117 + $f->contrats = current($f->contrats);
  118 + echo $f;
  119 + }
  120 +
  121 + // bin/cake db liste_beneficiaires_et_contrats
  122 + // Liste de toutes les familles avec seulement leur dernier contrat, en 2 étapes
  123 + // (plus de détails sur https://book.cakephp.org/4/fr/orm/retrieving-data-and-resultsets.html)
  124 + public function listeBeneficiairesEtContrats($LAST_CONTRAT_ONLY=false)
  125 + {
  126 + //$familles = Cake\ORM\TableRegistry::getTableLocator()->get('Familles');
  127 + //$familles_contrats = $this->Familles->find()->contain('Contrats');
  128 +
  129 + // 1) On récupère toutes les familles et tous leurs contrats, en triant les contrats par date de fin décroissante.
  130 + $familles_contrats = $this->Familles->find()->contain([
  131 + 'Contrats' => [
  132 + 'sort' => ['Contrats.date_fin' => 'DESC']
  133 + //'sort' => ['Contrats.date_fin' => 'ASC']
  134 + ]
  135 + ]);
  136 + // NB: si on remplace DESC par ASC on obtiendra le contrat le plus ancien (à l'étape 2)
  137 +
  138 +
  139 + /*
  140 + $q = $this->Familles->find();
  141 + $familles_contrats = $q->select([
  142 + 'Familles.id',
  143 + 'Familles.adresse',
  144 + 'Familles.complement_adresse',
  145 + 'last_contrat_date' => $q->func()
  146 + ->min('Contrats.date_fin')
  147 + ->partition('Contrats.famille_id'),
  148 + /S
  149 + 'Contrats.id',
  150 + 'Contrats.date_debut',
  151 + 'Contrats.date_fin',
  152 + 'Contrats.recurrence',
  153 + S/
  154 + ])
  155 + ->innerJoinWith('Contrats');
  156 + */
  157 + /*
  158 + $this->Familles->hasOne('FirstContrat', [
  159 + 'className' => 'Contrats',
  160 + 'foreignKey' => 'famille_id'
  161 + ]);
  162 + $familles_contrats = $this->Familles->find()->contain([
  163 + 'FirstContrat' => [
  164 + 'strategy' => 'select',
  165 + 'queryBuilder' => function ($q) {
  166 + return $q->order(['FirstContrat.date_fin' =>'DESC'])->limit(1);
  167 + }
  168 + ]
  169 + ]);
  170 + */
  171 + /*
  172 + $this->Familles->hasOne('FirstContrat', [
  173 + 'className' => 'Contrats',
  174 + 'foreignKey' => 'famille_id',
  175 + 'strategy' => 'select',
  176 + 'sort' => ['FirstContrat.date_fin' => 'DESC'],
  177 + 'conditions' => function ($e, $query) {
  178 + $query->limit(1);
  179 + return [];
  180 + }
  181 + ]);
  182 + */
  183 + /*
  184 + $this->Familles->hasOne('LastContrat', [
  185 + 'className' => 'Contrats',
  186 + 'foreignKey' => 'famille_id',
  187 + 'strategy' => 'select',
  188 + 'sort' => ['LastContrat.date_fin' => 'DESC'],
  189 + //'sort' => ['LastContrat.date_fin' => 'ASC'],
  190 + 'conditions' => function ($e, $query) {
  191 + return [];
  192 + }
  193 + ]);
  194 + $familles_contrats = $this->Familles->find()->contain('LastContrat');
  195 + */
  196 + /*
  197 + $this->hasOne('FirstImage', [
  198 + 'className' => 'Images',
  199 + 'foreignKey' => 'image_id',
  200 + 'strategy' => 'select',
  201 + 'sort' => ['FirstImage.created' => 'DESC'],
  202 + 'conditions' => function ($e, $query) {
  203 + $query->limit(1);
  204 + return [];
  205 + }
  206 + ])
  207 + */
  208 + /*
  209 + $familles_contrats = $this->Familles->find()->contain([
  210 + 'Contrats' => [
  211 + // changement de stratégie inutile
  212 + //'strategy' => 'select',
  213 + 'strategy' => 'subquery',
  214 + 'queryBuilder' => function ($q) {
  215 + //return $q->order(['Contrats.date_fin' =>'ASC'])->limit(1);
  216 + //return $q->order(['Contrats.date_fin' =>'DESC'])->limit(1);
  217 + return $q->order(['Contrats.date_fin' =>'DESC'])->limit(1);
  218 + }
  219 + ]
  220 + ]);
  221 + */
  222 +
  223 + // 2) Puis on traite les familles une par une, et pour chacune, on prend seulement le dernier contrat, c'est à dire le 1er de la liste :
  224 + //foreach ($familles_contrats as $f) echo $f;
  225 + foreach ($familles_contrats as $f) {
  226 + //print_r($f->contrats);
  227 + //if ( $LAST_CONTRAT_ONLY && count($f->contrats)>0 ) $f->contrats = $f->contrats[0];
  228 + if ($LAST_CONTRAT_ONLY) $f->contrats = current($f->contrats);
  229 + echo $f;
  230 + }
  231 +
  232 + /*
  233 + // Si on veut afficher seulement la famille 215 (qui a 3 contrats) => n'affiche QUE le contrat le plus récent, soit le 240 (date fin 2021-06-01)
  234 + $f215 = $familles_contrats->where(['id' => 215])->first();
  235 + echo($f215);
  236 + */
  237 + }
  238 +
  239 + /*
  240 + $query->contain([
  241 + 'Comments' => [
  242 + 'sort' => ['Comments.created' => 'DESC']
  243 + ]
  244 +]);
  245 + */
  246 +
  247 +
  248 + public function listeBeneficiairesEtTousContrats() { $this->listeBeneficiairesEtContrats(false); }
  249 + public function listeBeneficiairesEtDernierContrat() { $this->listeBeneficiairesEtContrats(true); }
  250 +
  251 + function sl() {
  252 + echo "\n\n";
  253 + //echo $this->nl(2);
  254 + }
  255 +
  256 + // Methode exécutée par défaut si on n'appelle aucune fonction : bin/cake db
  257 + public function main()
  258 + {
  259 + $requests = [
  260 + 'listeBenevolesAvecLeurRoleEtEquipe',
  261 + 'listeBeneficiairesEtTousContrats',
  262 + 'listeBeneficiairesEtDernierContrat',
  263 + 'listeBeneficiairesAvecLeursPersonnesLienEtLeursContratsTransactionPermanenceHoraireEtLeursVisites',
  264 + 'listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire',
  265 + 'BeneficiaireAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire',
  266 + 'listePlanningPermanencesEtLeursVisites',
  267 + ];
  268 +
  269 + //$this->out('Hello world.');
  270 + echo NL."Requêtes disponibles :";
  271 + foreach ($requests as $req) {
  272 + echo NL."- " . Inflector::underscore($req);
  273 + }
  274 + echo NL;
  275 + }
  276 +
  277 +
  278 +}
  279 +
  280 +?>
... ...