DbShell.php 9.25 KB
<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\Utility\Inflector;
//use Cake\Utility\Text;


define("NL", "\n\n");

class DbShell extends Shell
{

    public function initialize():void
    {
        parent::initialize();
        $this->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 = [ '<AucuneRequeteDisponible>' ];
        /*
        $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;
    }


}

?>