|
- <?php
-
- /**
- Copyright La boîte à pain (2018)
-
- contact@laboiteapain.net
-
- Ce logiciel est un programme informatique servant à aider les producteurs
- à distribuer leur production en circuits courts.
-
- Ce logiciel est régi par la licence CeCILL soumise au droit français et
- respectant les principes de diffusion des logiciels libres. Vous pouvez
- utiliser, modifier et/ou redistribuer ce programme sous les conditions
- de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
- sur le site "http://www.cecill.info".
-
- En contrepartie de l'accessibilité au code source et des droits de copie,
- de modification et de redistribution accordés par cette licence, il n'est
- offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
- seule une responsabilité restreinte pèse sur l'auteur du programme, le
- titulaire des droits patrimoniaux et les concédants successifs.
-
- A cet égard l'attention de l'utilisateur est attirée sur les risques
- associés au chargement, à l'utilisation, à la modification et/ou au
- développement et à la reproduction du logiciel par l'utilisateur étant
- donné sa spécificité de logiciel libre, qui peut le rendre complexe à
- manipuler et qui le réserve donc à des développeurs et des professionnels
- avertis possédant des connaissances informatiques approfondies. Les
- utilisateurs sont donc invités à charger et tester l'adéquation du
- logiciel à leurs besoins dans des conditions permettant d'assurer la
- sécurité de leurs systèmes et ou de leurs données et, plus généralement,
- à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
-
- Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
- pris connaissance de la licence CeCILL, et que vous en avez accepté les
- termes.
- */
-
- namespace common\models;
-
- use Yii;
- use yii\helpers\Html;
- use common\models\Etablissement;
-
- /**
- * This is the model class for table "commande".
- *
- * @property integer $id
- * @property integer $id_user
- * @property string $date
- * @property string $date_update
- * @property integer $id_point_vente
- * @property integer $id_production
- * @property boolean $paiement_automatique
- */
- class Commande extends \yii\db\ActiveRecord
- {
-
- var $montant = 0 ;
- var $montant_paye = 0 ;
- var $poids = 0 ;
-
- const TYPE_AUTO = 'auto';
- const TYPE_USER = 'user';
- const TYPE_ADMIN = 'admin';
-
- const STATUT_PAYEE = 'payee';
- const STATUT_IMPAYEE = 'impayee';
- const STATUT_SURPLUS = 'surplus';
-
- const ETAT_MODIFIABLE = 'ouverte';
- const ETAT_PREPARATION = 'preparation';
- const ETAT_LIVREE = 'livree';
-
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return 'commande';
- }
-
- /*
- * relations
- */
-
- public function getUser()
- {
- return $this->hasOne(User::className(), ['id' => 'id_user']);
- }
-
- public function getCommandeProduits()
- {
- return $this->hasMany(CommandeProduit::className(),['id_commande' => 'id'])
- ->with('produit');
- }
-
- public function getProduction()
- {
- return $this->hasOne(Production::className(), ['id' => 'id_production'])
- ->with('etablissement');
- }
-
- public function getPointVente()
- {
- return $this->hasOne(PointVente::className(), ['id' => 'id_point_vente'])
- ->with('pointVenteUser');
- }
-
- public function getCreditHistorique()
- {
- return $this->hasMany(CreditHistorique::className(), ['id_commande' => 'id']);
- }
-
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['id_user', 'date', 'id_point_vente', 'id_production'], 'required', 'message' => ''],
- [['id_user', 'id_point_vente', 'id_production'], 'integer'],
- [['paiement_automatique'], 'boolean'],
- [['date', 'date_update', 'commentaire', 'commentaire_point_vente'], 'safe']
- ];
- }
-
- /**
- * @inheritdoc
- */
- public function attributeLabels()
- {
- return [
- 'id' => 'ID',
- 'id_user' => 'Id User',
- 'date' => 'Date',
- 'date_update' => 'Date Update',
- 'id_point_vente' => 'Point de vente',
- 'id_production' => 'Date de production',
- ];
- }
-
- /**
- * Initialise le montant total, le montant déjà payé et le poids de la
- * commande
- */
- public function init()
- {
- // Montant
- if (isset($this->commandeProduits)) {
- foreach ($this->commandeProduits as $p) {
- if ($p->mode_vente == 'unite') {
- $this->montant += $p->prix * $p->quantite;
- if(isset($p->produit)) {
- $this->poids += ($p->quantite * $p->produit->poids) / 1000 ;
- }
- }
- elseif ($p->mode_vente == 'poids') {
- $this->montant += $p->prix * $p->quantite / 1000;
- }
- }
- }
- // Montant payé
- if (isset($this->creditHistorique) && !$this->montant_paye) {
- foreach ($this->creditHistorique as $ch) {
- if ($ch->type == CreditHistorique::TYPE_PAIEMENT) {
- $this->montant_paye += $ch->montant;
- }
- elseif ($ch->type == CreditHistorique::TYPE_REMBOURSEMENT) {
- $this->montant_paye -= $ch->montant;
- }
- }
- }
- }
-
- /**
- * Retourne la quantité d'un produit donné de plusieurs commandes.
- *
- * @param integer $id_produit
- * @param array $commandes
- *
- * @return integer
- */
- public static function getQuantiteProduit($id_produit, $commandes)
- {
- $quantite = 0;
-
- if (isset($commandes) && is_array($commandes) && count($commandes)) {
- foreach ($commandes as $c) {
- if(is_null($c->date_delete)) {
- foreach ($c->commandeProduits as $cp) {
- if ($cp->id_produit == $id_produit) {
- $quantite += $cp->quantite;
- }
- }
- }
- }
- }
-
- return $quantite;
- }
-
- /**
- * Retourne le montant payé de la commande.
- *
- * @return float
- */
- public function getMontantPaye()
- {
- if ($this->montant_paye) {
- return $this->montant_paye;
- }
- else {
- $historique = CreditHistorique::find()
- ->where(['id_commande' => $this->id])
- ->all();
-
- $montant = 0;
-
- foreach ($historique as $ch) {
- if ($ch->type == CreditHistorique::TYPE_PAIEMENT) {
- $montant += $ch->montant;
- }
- elseif ($ch->type == CreditHistorique::TYPE_REMBOURSEMENT) {
- $montant -= $ch->montant;
- }
- }
-
- return $montant;
- }
- }
-
- /**
- * Retourne le montant de la commande.
- *
- * @param boolean $format
- * @return float
- */
- public function getMontant($format = false)
- {
- if ($format) {
- return number_format($this->getMontant(), 2) . ' €';
- }
- else {
- return $this->montant;
- }
- }
-
- /**
- * Retourne le montant restant à payer.
- *
- * @param boolean $format
- * @return float
- */
- public function getMontantRestant($format = false)
- {
- $montant_restant = $this->getMontant() - $this->getMontantPaye();
- if ($format) {
- return number_format($montant_restant, 2) . ' €';
- }
- else {
- return $montant_restant;
- }
- }
-
- /**
- * Retourne le montant payé en surplus.
- *
- * @param boolean $format
- * @return float
- */
- public function getMontantSurplus($format = false)
- {
- $montant_surplus = $this->getMontantPaye() - $this->getMontant();
-
- if ($format) {
- return number_format($montant_surplus, 2) . ' €';
- }
- else {
- return $montant_surplus;
- }
- }
-
- /**
- * Retourne les informations relatives à la commande au format JSON.
- *
- * @return string
- */
- public function getDataJson()
- {
- $commande = Commande::find()->with('commandeProduits')->where(['id' => $this->id])->one();
- $commande->init();
-
- $json_commande = [
- 'produits' => [],
- 'montant' => $commande->montant,
- 'str_montant' => $commande->getMontant(true),
- 'montant_paye' => $commande->getMontantPaye(),
- 'commentaire' => $commande->commentaire,
- ];
-
- foreach ($commande->commandeProduits as $commande_produit) {
- $json_commande['produits'][$commande_produit->id_produit] = $commande_produit->quantite;
- }
-
- return json_encode($json_commande);
- }
-
- /**
- * Enregistre un modèle de type CreditHistorique.
- *
- * @param string $type
- * @param float $montant
- * @param integer $id_etablissement
- * @param integer $id_user
- * @param integer $id_user_action
- */
- public function creditHistorique($type, $montant, $id_etablissement, $id_user, $id_user_action)
- {
- $credit_historique = new CreditHistorique;
- $credit_historique->id_user = $this->id_user;
- $credit_historique->id_commande = $this->id;
- $credit_historique->montant = $montant;
- $credit_historique->type = $type;
- $credit_historique->id_etablissement = $id_etablissement;
- $credit_historique->id_user_action = $id_user_action;
- $credit_historique->populateRelation('commande', $this) ;
- $credit_historique->populateRelation('user', User::find()->where(['id' => $this->id_user])->one()) ;
- $credit_historique->save();
- }
-
- /**
- * Retourne le statut de paiement de la commande (payée, surplus, ou impayée).
- *
- * @return string
- */
- public function getStatutPaiement()
- {
- // payé
- if ($this->getMontant() - $this->getMontantPaye() < 0.01 &&
- $this->getMontant() - $this->getMontantPaye() >= 0)
- {
- return self::STATUT_PAYEE;
- }
- // à rembourser
- elseif ($this->getMontant() - $this->getMontantPaye() <= -0.01) {
- return self::STATUT_SURPLUS;
- }
- // reste à payer
- elseif ($this->getMontant() - $this->getMontantPaye() >= 0.01) {
- return self::STATUT_IMPAYEE;
- }
- }
-
- /**
- * Retourne le résumé du panier au format HTML.
- *
- * @return string
- */
- public function getResumePanier()
- {
- if (!isset($this->commandeProduits)) {
- $this->commandeProduits = CommandeProduit::find()->where(['id_commande' => $this->id])->all();
- }
-
- $html = '';
- $count = count($this->commandeProduits);
- $i = 0;
- foreach ($this->commandeProduits as $p) {
- if (isset($p->produit)) {
- $html .= $p->quantite . ' x ' . Html::encode($p->produit->nom);
- if (++$i != $count) {
- $html .= '<br />';
- }
- }
- }
-
- return $html;
- }
-
- /**
- * Retourne le résumé du point de vente lié à la commande au format HTML.
- *
- * @return string
- */
- public function getResumePointVente()
- {
- $html = '';
-
- if (isset($this->pointVente)) {
- $html .= '<span class="nom-point-vente">' . Html::encode($this->pointVente->nom) . '</span>'
- . '<br /><span class="localite">' . Html::encode($this->pointVente->localite) . '</span>';
- if (strlen($this->commentaire_point_vente)) {
- $html .= '<div class="commentaire"><span>' . Html::encode($this->commentaire_point_vente) . '</span></div>';
- }
- } else {
- $html .= 'Point de vente supprimé';
- }
-
- return $html;
- }
-
- /**
- * Retourne le résumé du paiement (montant, statut).
- *
- * @return string
- */
- public function getResumeMontant()
- {
- $html = '';
-
- $html .= $this->getMontant(true) . '<br />';
-
- if ($this->montant_paye) {
- if ($this->getStatutPaiement() == Commande::STATUT_PAYEE) {
- $html .= '<span class="label label-success">Payée</span>';
- } elseif ($this->getStatutPaiement() == Commande::STATUT_IMPAYEE) {
- $html .= '<span class="label label-danger">Non payée</span><br />
- Reste <strong>' . $this->getMontantRestant(true) . '</strong> à payer';
- } elseif ($this->getStatutPaiement() == Commande::STATUT_SURPLUS) {
- $html .= '<span class="label label-success">Payée</span>';
- }
- }
- else {
- $html .= '<span class="label label-default">À régler sur place</span>';
- }
-
- return $html;
- }
-
- /**
- * Retourne une chaine de caractère décrivant l'utilisateur lié à la commande.
- *
- * @return string
- */
- public function getStrUser()
- {
- if (isset($this->user)) {
- return Html::encode($this->user->prenom . ' ' . $this->user->nom);
- } elseif (strlen($this->username)) {
- return Html::encode($this->username);
- } else {
- return 'Client introuvable';
- }
- }
-
- /**
- * Recherche dans les commandes suivant les paramètres suivants :
- * - id_etablissement
- * - condition
- * - date
- * - type
- * - orderby
- * - limit
- *
- * @param array $params
- * @return array
- */
- public static function findBy($params = [])
- {
- if (!isset($params['id_etablissement']))
- $params['id_etablissement'] = Yii::$app->user->identity->id_etablissement;
-
- $commandes = Commande::find()
- ->with('commandeProduits', 'creditHistorique', 'pointVente')
- ->joinWith(['production', 'user','user.userEtablissement'])
- ->where(['production.id_etablissement' => $params['id_etablissement']]);
-
- if (isset($params['condition']))
- $commandes = $commandes->andWhere($params['condition']);
-
- if (isset($params['date']))
- $commandes = $commandes->andWhere(['production.date' => $params['date']]);
-
- if (isset($params['type']))
- $commandes = $commandes->andWhere(['commande.type' => $params['type']]);
-
-
- if (isset($params['orderby']))
- $commandes = $commandes->orderBy($params['orderby']);
- else
- $commandes = $commandes->orderBy('date ASC');
-
- if (isset($params['limit']))
- $commandes = $commandes->limit($params['limit']);
-
- $commandes = $commandes->all();
-
- return $commandes;
- }
-
- /**
- * Retourne l'état de la commande (livrée, modifiable ou en préparation)
- *
- * @return string
- */
- public function getEtat()
- {
- $delai_commande = Etablissement::getConfig('delai_commande', $this->production->id_etablissement);
- $heure_limite = Etablissement::getConfig('heure_limite_commande', $this->production->id_etablissement);
-
- $date_commande = strtotime($this->production->date);
- $date_today = strtotime(date('Y-m-d'));
- $heure_today = date('G');
-
- $nb_jours = (int) (($date_commande - $date_today) / (24 * 60 * 60));
-
- if ($nb_jours <= 0) {
- return self::ETAT_LIVREE;
- }
- elseif ($nb_jours >= $delai_commande &&
- ($nb_jours != $delai_commande ||
- ($nb_jours == $delai_commande && $heure_today < $heure_limite)))
- {
- return self::ETAT_MODIFIABLE;
- }
-
- return self::ETAT_PREPARATION;
- }
-
- /**
- * Retourne le type de la commande (client, automatique ou admin) sous forme
- * texte ou HTML.
- *
- * @param boolean $with_label
- * @return string
- */
- public function getStrType($with_label = false) {
- $class_label = '';
- $str = '';
-
- if ($this->type == self::TYPE_USER) {
- $class_label = 'success';
- $str = 'Client';
- } elseif ($this->type == self::TYPE_AUTO) {
- $class_label = 'default';
- $str = 'Auto';
- } elseif ($this->type == self::TYPE_ADMIN) {
- $class_label = 'warning';
- $str = 'Vous';
- }
-
- if ($with_label)
- return '<span class="label label-' . $class_label . '">' . $str . '</span>';
- else
- return $str;
- }
-
- /**
- * Retourne l'historique de la commande (ajoutée, modifiée, supprimée) au format
- * HTML.
- *
- * @return string
- */
- public function getStrHistorique()
- {
- $arr = [
- 'class' => 'create',
- 'glyphicon' => 'plus',
- 'str' => 'Ajoutée',
- 'date' => $this->date
- ] ;
-
- if(!is_null($this->date_update)) {
- $arr = [
- 'class' => 'update',
- 'glyphicon' => 'pencil',
- 'str' => 'Modifiée',
- 'date' => $this->date_update
- ] ;
- }
- if(!is_null($this->date_delete)) {
- $arr = [
- 'class' => 'delete',
- 'glyphicon' => 'remove',
- 'str' => 'Annulée',
- 'date' => $this->date_delete
- ] ;
- }
-
- $html = '<div class="small"><span class="'.$arr['class'].'"><span class="glyphicon glyphicon-'.$arr['glyphicon'].'"></span> '.$arr['str'].'</span> le <strong>'.date('d/m/Y à G\hi', strtotime($arr['date'])).'</strong></div>' ;
-
- return $html ;
- }
-
- /**
- * Retourne une classe identifiant l'historique de la commande (ajoutée,
- * modifiée, supprimée).
- *
- * @return string
- */
- public function getClassHistorique()
- {
- if(!is_null($this->date_delete)) {
- return 'commande-delete' ;
- }
- if(!is_null($this->date_update)) {
- return 'commande-update' ;
- }
- return 'commande-create' ;
- }
-
- }
|