EmpruntsTable.php 6.68 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);
            //if ($context['providers']['entity']['emprunt_interne'] !== null) {
            if ($context['data']['emprunt_interne'] !== null) {
                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 ($context['data']['emprunt_interne'] !== null) {
                return $context['data']['emprunt_interne'];
                //return $context['providers']['entity']['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 ($context['data']['emprunt_interne'] !== null) {
                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'
        ]);
        
        $validator->notEmpty('laboratoire', 'Le champ doit être rempli pour un emprunt externe.', function ($context) {
            if ($context['data']['emprunt_interne'] !== null) {
                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.', function ($context) {
            if ($context['data']['emprunt_interne'] !== null) {
                return ! $context['data']['emprunt_interne'];
            }
        });
        
        $validator->notEmpty('email_emprunteur_ext', 'Cet Email n\'est pas valide.', function ($context) {
            if ($context['data']['emprunt_interne'] !== null) {
                return ! $context['data']['emprunt_interne'];
                /*
                 * if (!$context['data']['emprunt_interne']) {
                 * return (Validation::email($context['data']['email_emprunteur_ext']));
                 * }
                 */
            }
        });
        
        $validator->allowEmpty('commentaire')->add('commentaire', 'valid', [
            'rule' => [
                'check_string_with_some_special_cars'
            ],
            'message' => 'Le champ doit être valide.',
            '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'));
        $rules->add($rules->existsIn([
            'site_id'
        ], 'Sites'));
        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;
    }
}