EmpruntsTable.php 8.98 KB
<?php
namespace App\Model\Table;

use Cake\ORM\RulesChecker;
use Cake\Validation\Validator;

/**
 * Emprunts Model
 *
 * @property \Cake\ORM\Association\BelongsTo $Materiels
 */
class EmpruntsTable extends AppTable
{

    /**
     * Initialize method
     *
     * @param array $config
     *            The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        parent::initialize($config);
        
        $this->setTable('emprunts');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');
        
        $this->addBehavior('Timestamp');
        
        $this->belongsTo('Materiels', [
            'foreignKey' => 'materiel_id',
            'joinType' => 'INNER'
        ]);
        
        $this->belongsTo('Sites', [
            'foreignKey' => 'site_id'
        ]);
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator
     *            Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator->integer('id')->allowEmpty('id', 'create');
        
        $validator->notEmpty('date_emprunt', 'Une date d\'emprunt doit être saisi');
        
        $validator->notEmpty('date_retour_emprunt', 'Une date de retour doit être saisie');
        
        $validator->boolean('emprunt_interne')->allowEmpty('emprunt_interne');
        
        /*
        $validator->notEmpty('nom_emprunteur_int', 'Le champ doit être rempli', function ($context) {
            //dump($context);
            debug($context);
            //if ($context['providers']['entity']['emprunt_interne'] !== null) {
            if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                return $context['data']['emprunt_interne'];
                //return $context['providers']['entity']['emprunt_interne'];
            }
        });

        $validator->notEmpty('email_emprunteur_int', "Cet Email n'est pas valide", function ($context) {
            //if ($context['providers']['entity']['emprunt_interne'] !== null) {
            if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                return $context['data']['emprunt_interne'];
                //return $context['providers']['entity']['emprunt_interne'];
            }
        });
        */
        
        // Ce champ s'appelle "Pièce" (emprunt interne)
        $validator->notEmpty('e_lieu_detail', 'Le champ doit être rempli pour un emprunt interne.', 
            function ($context) {
                    //if ($context['providers']['entity']['emprunt_interne'] !== null) {
                    if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                        return $context['data']['emprunt_interne'];
                        //return $context['providers']['entity']['emprunt_interne'];
                    }
            }
        )->add('e_lieu_detail', 'valid', [
            'rule' => [
                'check_string'
            ],
            'message' => 'Le champ doit être valide.',
            'provider' => 'table'
        ]);
        
        // Ce champ s'appelle "Lieu" (emprunt externe) 
        $validator->notEmpty('laboratoire', 'Le champ doit être rempli pour un emprunt externe.',
            function ($context) {
                if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                    //debug($context['data']['emprunt_interne']);
                    return ! $context['data']['emprunt_interne'];
                }
            }
        )->add('laboratoire', 'valid', [
            'rule' => [
                'check_string'
            ],
            'message' => 'Le champ doit être valide.',
            'provider' => 'table'
        ]);
        
        //$validator->notEmpty('nom_emprunteur_ext', 'Le champ doit être rempli');
        $validator->notEmpty('nom_emprunteur_ext', 'Le champ doit être rempli.', 
            function ($context) {
                //debug($context);
                //if ($context['providers']['entity']['emprunt_interne'] !== null) {
                if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                    return ! $context['data']['emprunt_interne'];
                    //return $context['providers']['entity']['emprunt_interne'];
                }
            }
        );

        //$validator->notEmpty('email_emprunteur_ext', "Cet Email n'est pas valide");
        $validator->notEmpty('email_emprunteur_ext', 'Cet Email n\'est pas valide.', 
            function ($context) {
                if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                    return ! $context['data']['emprunt_interne'];
                /*
                 * if (!$context['data']['emprunt_interne']) {
                 * return (Validation::email($context['data']['email_emprunteur_ext']));
                 * }
                 */
                }
            }
        )->add('email_emprunteur_ext', 'valid', [
                'rule' => [
                    'check_mail'
                ],
                'message' => "Cet email n'est pas valide",
                'provider' => 'table'
        ]);
        
        $validator->allowEmpty('commentaire')->add('commentaire', 'valid', [
            'rule' => [
                'check_string_with_some_special_cars'
            ],
            'message' => 'Le champ doit être valide.',
            'provider' => 'table'
        ]);
        
        

        /*
        $validator->notEmpty('site_id', 'Il faut préciser le site',
            function ($context) {
                if ( !empty($context['data']) && !is_null($context['data']['emprunt_interne']) ) {
                    return $context['data']['emprunt_interne'];
                }
            }
        )->add('site_id', 'valid', [
                'rule' => function ($data, $provider) {
                    return ($data != 9);
                 },
                'message' => "Il faut préciser le site (pour un emprunt interne)",
                'provider' => 'table'
        ]);
        */
        
        return $validator;
    }

    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules
     *            The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        $checkReturnDateIsAfterLoanDate = function ($entity) {
            $dateEmprunt = $entity->date_emprunt;
            $dateRetour = $entity->date_retour_emprunt;
            $dateEmprunt = explode("/", $dateEmprunt);
            $dateRetour = explode("/", $dateRetour);
            $dateEmprunt = $dateEmprunt[2] . $dateEmprunt[1] . $dateEmprunt[0];
            $dateRetour = $dateRetour[2] . $dateRetour[1] . $dateRetour[0];
            if ($dateEmprunt > $dateRetour) {
                return false;
            }
            return true;
        };

        
        $rules->add($checkReturnDateIsAfterLoanDate, [
            'errorField' => 'date_retour_emprunt',
            'message' => 'La date de retour doit être postérieure à la date de l\'emprunt.'
        ]);
        
        $rules->add($rules->existsIn([
            'materiel_id'
        ], 'Materiels'));
        
        /* (EP) ne sert à rien, c'est toujours le cas
        $rules->add($rules->existsIn([
            'site_id'
        ], 'Sites'));
        */
        // (EP 4/6/19) Le site doit etre précisé, on ne laisse pas N/A (id=9)
        $checkSiteIsGiven = function ($entity) {
            // Si emprunt externe, ne pas appliquer cette règle
            if (! $entity->emprunt_interne) return TRUE;
            return ($entity->site_id != 9);
        };
        $rules->add($checkSiteIsGiven, [
            'errorField' => 'site_id',
            'message' => 'Il faut préciser le site'
        ]);
        
        
        return $rules;
    }

    public function beforeSave($event, $entity, $options)
    {
        if (! empty($entity->toArray())) {
            $name = '';
            $email = '';
            
            // EMPRUNT INTERNE ?
            if ($entity->get('emprunt_interne') == 1) {
                $name = $entity->get('nom_emprunteur_int');
                $email = $entity->get('email_emprunteur_int');
            }            // EMPRUNT EXTERNE
            else {
                $name = $entity->get('nom_emprunteur_ext');
                $email = $entity->get('email_emprunteur_ext');
            }
            
            $entity->set('nom_emprunteur', $name);
            $entity->set('email_emprunteur', $email);
        }
        
        if (empty($entity->get('date_emprunt'))) {
            $entity->set('date_emprunt', null);
        }
        
        if (empty($entity->get('date_retour_emprunt'))) {
            $entity->set('date_retour_emprunt', null);
        }
        
        return true;
    }
}