loadModel('Utilisateurs'); $this->loadModel('Familles'); $this->loadModel('PlanningPermanences'); } // bin/cake db show_user Admin public function showUser() { if (empty($this->args[0])) { // Utilisez error() avant CakePHP 3.2 return $this->abort("Merci de rentrer un nom d'utilisateur."); } //$user = $this->Utilisateurs->findByUsername($this->args[0])->first(); $user = $this->Utilisateurs->findByNom($this->args[0])->first(); $this->out(print_r($user, true)); } // bin/cake db voir_user_admin public function voirUserAdmin() { //$this->showUser('Admin'); $user = $this->Utilisateurs->findByNom('Admin')->first(); $this->out(print_r($user, true)); } // bin/cake db hey_there Steven public function heyThere($name = 'Anonymous') { $this->out('Hey there ' . $name); } // bin/cake db liste_beneficiaires_et_personenes public function listePlanningPermanencesEtLeursVisites() { $entities = $this->PlanningPermanences->find()->contain([ // 'Permanences', // TODO ajouter gestion de la table PlanningPermanences // 'EpicerieVisites', // TODO ]); foreach ($entities as $e) print($e); } // bin/cake db listeBenevolesAvecLeurRoleEtEquipe public function listeBenevolesAvecLeurRoleEtEquipe() { $entities = $this->Utilisateurs->find()->contain([ 'Roles', 'Equipes', ]); foreach ($entities as $e) print($e); } // bin/cake db liste_beneficiaires_et_personenes public function listeBeneficiairesAvecLeursPersonnesLienEtLeursContratsTransactionPermanenceHoraireEtLeursVisites() { $familles_personnes = $this->Familles->find()->contain([ 'Personnes' => [ 'sort' => 'Personnes.prenom' ], 'Personnes.Liens', 'Contrats' => [ 'sort' => ['Contrats.date_fin' => 'DESC'] ], 'Contrats.Transactions', 'Contrats.Horaires', 'Contrats.Permanences', 'Contrats.EpicerieVisites', ]); foreach ($familles_personnes as $fp) print($fp); } public function listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire() { $familles = $this->Familles->find()->contain([ // - Seulement le contact principal de la famille 'Personnes.Liens' => function ($q) { return $q ->where(['Liens.nom' => 'principal']); }, // - Les contrats // On les trie du plus récent au plus ancien, par la date de fin, puis la date début // (pour le cas où 2 contrats avec même date fin) 'Contrats' => [ 'sort' => ['Contrats.date_fin'=>'DESC', 'Contrats.date_debut'=>'DESC'] ], 'Contrats.Transactions', 'Contrats.Horaires', 'Contrats.Permanences', // - Les visites (de chaque contrat) 'Contrats.EpicerieVisites', ]); foreach ($familles as $f) { $f->contrats = current($f->contrats); print($f); } return $familles; } public function beneficiaireAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire($id) { $familles = $this->listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire(); echo NL.NL.NL; $f = $familles->where(['id' => $id])->first(); echo $f; $f->contrats = current($f->contrats); echo $f; } // bin/cake db liste_beneficiaires_et_contrats // Liste de toutes les familles avec seulement leur dernier contrat, en 2 étapes // (plus de détails sur https://book.cakephp.org/4/fr/orm/retrieving-data-and-resultsets.html) public function listeBeneficiairesEtContrats($LAST_CONTRAT_ONLY=false) { //$familles = Cake\ORM\TableRegistry::getTableLocator()->get('Familles'); //$familles_contrats = $this->Familles->find()->contain('Contrats'); // 1) On récupère toutes les familles et tous leurs contrats, en triant les contrats par date de fin décroissante. $familles_contrats = $this->Familles->find()->contain([ 'Contrats' => [ 'sort' => ['Contrats.date_fin' => 'DESC'] //'sort' => ['Contrats.date_fin' => 'ASC'] ] ]); // NB: si on remplace DESC par ASC on obtiendra le contrat le plus ancien (à l'étape 2) /* $q = $this->Familles->find(); $familles_contrats = $q->select([ 'Familles.id', 'Familles.adresse', 'Familles.complement_adresse', 'last_contrat_date' => $q->func() ->min('Contrats.date_fin') ->partition('Contrats.famille_id'), /S 'Contrats.id', 'Contrats.date_debut', 'Contrats.date_fin', 'Contrats.recurrence', S/ ]) ->innerJoinWith('Contrats'); */ /* $this->Familles->hasOne('FirstContrat', [ 'className' => 'Contrats', 'foreignKey' => 'famille_id' ]); $familles_contrats = $this->Familles->find()->contain([ 'FirstContrat' => [ 'strategy' => 'select', 'queryBuilder' => function ($q) { return $q->order(['FirstContrat.date_fin' =>'DESC'])->limit(1); } ] ]); */ /* $this->Familles->hasOne('FirstContrat', [ 'className' => 'Contrats', 'foreignKey' => 'famille_id', 'strategy' => 'select', 'sort' => ['FirstContrat.date_fin' => 'DESC'], 'conditions' => function ($e, $query) { $query->limit(1); return []; } ]); */ /* $this->Familles->hasOne('LastContrat', [ 'className' => 'Contrats', 'foreignKey' => 'famille_id', 'strategy' => 'select', 'sort' => ['LastContrat.date_fin' => 'DESC'], //'sort' => ['LastContrat.date_fin' => 'ASC'], 'conditions' => function ($e, $query) { return []; } ]); $familles_contrats = $this->Familles->find()->contain('LastContrat'); */ /* $this->hasOne('FirstImage', [ 'className' => 'Images', 'foreignKey' => 'image_id', 'strategy' => 'select', 'sort' => ['FirstImage.created' => 'DESC'], 'conditions' => function ($e, $query) { $query->limit(1); return []; } ]) */ /* $familles_contrats = $this->Familles->find()->contain([ 'Contrats' => [ // changement de stratégie inutile //'strategy' => 'select', 'strategy' => 'subquery', 'queryBuilder' => function ($q) { //return $q->order(['Contrats.date_fin' =>'ASC'])->limit(1); //return $q->order(['Contrats.date_fin' =>'DESC'])->limit(1); return $q->order(['Contrats.date_fin' =>'DESC'])->limit(1); } ] ]); */ // 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 : //foreach ($familles_contrats as $f) echo $f; foreach ($familles_contrats as $f) { //print_r($f->contrats); //if ( $LAST_CONTRAT_ONLY && count($f->contrats)>0 ) $f->contrats = $f->contrats[0]; if ($LAST_CONTRAT_ONLY) $f->contrats = current($f->contrats); echo $f; } /* // 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) $f215 = $familles_contrats->where(['id' => 215])->first(); echo($f215); */ } /* $query->contain([ 'Comments' => [ 'sort' => ['Comments.created' => 'DESC'] ] ]); */ public function listeBeneficiairesEtTousContrats() { $this->listeBeneficiairesEtContrats(false); } public function listeBeneficiairesEtDernierContrat() { $this->listeBeneficiairesEtContrats(true); } function sl() { echo "\n\n"; //echo $this->nl(2); } // Methode exécutée par défaut si on n'appelle aucune fonction : bin/cake db public function main() { $requests = [ '' ]; /* $requests = [ 'listeBenevolesAvecLeurRoleEtEquipe', 'listeBeneficiairesEtTousContrats', 'listeBeneficiairesEtDernierContrat', 'listeBeneficiairesAvecLeursPersonnesLienEtLeursContratsTransactionPermanenceHoraireEtLeursVisites', 'listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire', 'BeneficiaireAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire', 'listePlanningPermanencesEtLeursVisites', ]; */ //$this->out('Hello world.'); echo NL."Requêtes disponibles (dans fichier src/Shell/DbShell.php) :"; foreach ($requests as $req) { echo NL."- " . Inflector::underscore($req); } echo NL; } } ?>