255], [['comment'], 'string', 'max' => 2048], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'id_user' => 'Utilisateur', 'id_user_action' => 'Utilisateur', 'id_order' => 'Commande', 'date' => 'Date', 'amount' => 'Montant', 'type' => 'Type', 'id_producer' => 'Producteur', 'mean_payment' => 'Moyen de paiement', 'comment' => 'Commentaire', ]; } /* * Relations */ public function getUser() { return $this->hasOne(User::className(), ['id' => 'id_user']); } public function getUserAction() { return $this->hasOne(User::className(), ['id' => 'id_user_action']); } public function getOrder() { return $this->hasOne(Order::className(), ['id' => 'id_order']); } /** * Retourne les options de base nécessaires à la fonction de recherche. * * @return array */ public static function defaultOptionsSearch() { return [ 'with' => [], 'join_with' => [], 'orderby' => self::tableName().'.date ASc', 'attribute_id_producer' => self::tableName().'.id_producer' ] ; } /** * Retourne le type de CreditHistorique (paiement, remboursement ou débit). * * @return string */ public function getStrType() { switch ($this->type) { case self::TYPE_PAYMENT: return 'Paiement'; break; case self::TYPE_REFUND: return 'Remboursement'; break; case self::TYPE_DEBIT: return 'Débit'; break; } } /** * Enregistre le modèle. * * @param boolean $runValidation * @param array $attributeNames */ public function save($runValidation = true, $attributeNames = NULL) { if($this->amount > -0.01 && $this->amount < 0.01) { return false; } // initialisation du commentaire avant sauvegarde $this->comment .= $this->getStrComment() ; parent::save($runValidation, $attributeNames); // mise à jour du crédit au niveau de UserProducer $userProducer = UserProducer::searchOne([ 'id_user' => $this->id_user, 'id_producer' => $this->id_producer ]) ; $creditLimitReminder = Producer::getConfig('credit_limit_reminder') ; $oldCredit = $userProducer->credit ; if ($userProducer) { if ($this->isTypeCredit()) { $userProducer->credit += $this->amount; } elseif ($this->isTypeDebit()) { $userProducer->credit -= $this->amount; } $userProducer->save(); // set mean payment if($this->id_order && $this->id_order > 0) { $order = Order::searchOne(['id' => (int) $this->id_order]) ; if($order) { $paymentStatus = $order->getPaymentStatus() ; if($paymentStatus == Order::PAYMENT_PAID || $paymentStatus == Order::PAYMENT_SURPLUS) { $order->mean_payment = MeanPayment::CREDIT ; $order->save() ; } } } // seuil limite de crédit $newCredit = $userProducer->credit ; if(!is_null($creditLimitReminder) && $oldCredit > $creditLimitReminder && $newCredit <= $creditLimitReminder) { $user = User::findOne($this->id_user) ; $producer = Producer::findOne($this->id_producer) ; Yii::$app->mailer->compose( [ 'html' => 'creditLimitReminder-html', 'text' => 'creditLimitReminder-text' ], [ 'user' => $user, 'producer' => $producer, 'credit' => $newCredit ] ) ->setTo($user->email) ->setFrom(['contact@opendistrib.net' => 'distrib']) ->setSubject('[distrib] Seuil limite de crédit dépassé') ->send(); } } } /** * Retourne si le CreditHistorique est un débit ou non. * * @return boolean */ public function isTypeDebit() { return in_array($this->type, [ self::TYPE_DEBIT, self::TYPE_PAYMENT, ]) ; } /** * Retourne si le CreditHistorique est un crédit ou non. * * @return boolean */ public function isTypeCredit() { return in_array($this->type, [ self::TYPE_CREDIT, self::TYPE_INITIAL_CREDIT, self::TYPE_REFUND ]) ; } /** * Retourne le montant. * * @param boolean $format * @return float */ public function getAmount($format = false) { if($format) { return number_format($this->amount,2) .' €' ; } else { return $this->amount ; } } /** * Retourne le libellé du CreditHistory informant de son type et * éventuellement de la date de sa commande associée. * * @return string */ public function getStrWording() { $str = '' ; if($this->type == self::TYPE_INITIAL_CREDIT) { $str = 'Crédit initial' ; } elseif($this->type == self::TYPE_CREDIT) { $str = 'Crédit' ; } elseif($this->type == self::TYPE_PAYMENT) { $str = 'Paiement' ; } elseif($this->type == self::TYPE_REFUND) { $str = 'Remboursement' ; } elseif($this->type == self::TYPE_DEBIT) { $str = 'Débit' ; } if($this->type == self::TYPE_PAYMENT || $this->type == self::TYPE_REFUND) { if(isset($this->order) && isset($this->order->distribution)) { $str .= '
Commande : '.date('d/m/Y',strtotime($this->order->distribution->date)) ; } else { $str .= '
Commande supprimée' ; } } return $str ; } /** * Retourne les informations à ajouter au commentaire du CreditHistorique * (libellé, montant, client, action) au format HTML. * * @return string */ public function getStrComment() { $str = '' ; if(strlen($this->comment)) { $str .= '
' ; } $str .= $this->getStrWording() ; if(isset($this->order)) { $str .= '
Montant de la commande : '.$this->order->getAmountWithTax(Order::AMOUNT_TOTAL, true) ; } if(isset($this->user)) { $str .= '
Client : '.Html::encode($this->user->name. ' '.$this->user->lastname) ; } if(isset($this->userAction)) { $str .= '
Action : '.Html::encode($this->userAction->name. ' '.$this->userAction->lastname) ; } return $str ; } /** * Retourne la date. * * @param boolean $format * @return string */ public function getDate($format = false) { if($format) return date('d/m/Y à H:i:s',strtotime($this->date)) ; else return $this->date ; } /** * Retourne le libellé du moyen de paiement du CreditHistory courant. * * @return string */ public function getStrMeanPayment() { return MeanPayment::getStrBy($this->mean_payment) ; } /** * Retourne le libellé de l'utilisateur ayant initié l'action. * * @return string */ public function strUserAction() { if($this->userAction) { return $this->userAction->name . ' ' . $this->userAction->lastname ; } else { return 'Système' ; } } }