creditHistorySolver = $this->loadService(CreditHistorySolver::class); $this->userProducerRepository = $this->loadService(UserProducerRepository::class); } public function instanciate(int $idUser, int $idProducer, int $bookmark = 1) { $userProducer = new UserProducer(); $userProducer->setIdUser($idUser); $userProducer->setIdProducer($idProducer); $userProducer->setCredit(0); $userProducer->setActive(1); $userProducer->setBookmark($bookmark); return $userProducer; } public function updateCredit(CreditHistory $creditHistory): void { $userProducer = $this->userProducerRepository->getOne($creditHistory->getIdUser(), $creditHistory->getIdProducer()); if ($userProducer) { $oldCredit = $userProducer->getCredit(); $this->deductCredit($userProducer, $creditHistory); $this->initMeanPaymentOrder($creditHistory); $this->sendCreditLimitReminder($userProducer, $creditHistory, $oldCredit); } } public function deductCredit(UserProducer $userProducer, CreditHistory $creditHistory) { if ($this->creditHistorySolver->isTypeCredit($creditHistory)) { $userProducer->setCredit($userProducer->getCredit() + $creditHistory->getAmount()); } elseif ($this->creditHistorySolver->isTypeDebit($creditHistory)) { $userProducer->setCredit($userProducer->getCredit() - $creditHistory->getAmount()); } $userProducer->save(); } public function initMeanPaymentOrder($creditHistory) { // set mean payment if ($creditHistory->id_order && $creditHistory->id_order > 0) { $order = Order::searchOne(['id' => (int)$creditHistory->id_order]); if ($order) { $paymentStatus = $order->getPaymentStatus(); if ($paymentStatus == Order::PAYMENT_PAID || $paymentStatus == Order::PAYMENT_SURPLUS) { $order->mean_payment = MeanPayment::CREDIT; $order->save(); } } } } public function sendCreditLimitReminder($userProducer, $creditHistory, $oldCredit) { $userRepository = \Yii::$app->logic->getUserContainer()->getRepository(); $producerRepository = \Yii::$app->logic->getProducerContainer()->getRepository(); $newCredit = $userProducer->credit; if ($this->isCreditLimitCrossed($oldCredit, $newCredit)) { $user = $userRepository->getOneById($creditHistory->id_user); $producer = $producerRepository->getOneById($creditHistory->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' => 'Opendistrib']) ->setSubject('[Opendistrib] Seuil limite de crédit dépassé') ->send(); } } public function isCreditLimitCrossed($oldCredit, $newCredit) { $creditLimitReminder = Producer::getConfig('credit_limit_reminder'); return !is_null($creditLimitReminder) && $oldCredit > $creditLimitReminder && $newCredit <= $creditLimitReminder; } }