creditHistorySolver = $this->loadService(CreditHistorySolver::class); $this->userProducerRepository = $this->loadService(UserProducerRepository::class); $this->orderRepository = $this->loadService(OrderRepository::class); $this->producerRepository = $this->loadService(ProducerRepository::class); $this->orderSolver = $this->loadService(OrderSolver::class); } public function instanciateUserProducer(User $user, Producer $producer, bool $bookmark = true, bool $newsletter = true) { $userProducer = new UserProducer(); $userProducer->populateUser($user); $userProducer->populateproducer($producer); $userProducer->setCredit(0); $userProducer->setActive(true); $userProducer->setBookmark($bookmark); $userProducer->setNewsletter($newsletter); return $userProducer; } public function createUserProducer(User $user, Producer $producer, bool $bookmark = true, bool $newsletter = true): UserProducer { $userProducer = $this->instanciateUserProducer($user, $producer, $bookmark, $newsletter); $this->create($userProducer); return $userProducer; } public function createUserProducerIfNotExist(User $user, Producer $producer, bool $bookmark = true, bool $newsletter = true): UserProducer { return $this->userProducerRepository->findOneUserProducer($user) ?? $this->createUserProducer($user, $producer, $bookmark, $newsletter); } public function updateCredit(CreditHistory $creditHistory): void { $userProducer = $this->userProducerRepository->findOneUserProducer($creditHistory->user); 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()); } $this->update($userProducer); } public function initMeanPaymentOrder($creditHistory) { if ($creditHistory->id_order && $creditHistory->id_order > 0) { $order = $this->orderRepository->findOneOrderById((int) $creditHistory->id_order); if ($order) { $paymentStatus = $this->orderSolver->getPaymentStatus($order); if ($paymentStatus == Order::PAYMENT_PAID || $paymentStatus == Order::PAYMENT_SURPLUS) { $order->mean_payment = MeanPayment::CREDIT; $this->update($order); } } } } 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->findOneUserById($creditHistory->id_user); $producer = $producerRepository->findOneProducerById($creditHistory->id_producer); if($user && $user->email && strlen($user->email) > 0) { \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 = $this->producerRepository->getConfig('credit_limit_reminder'); return !is_null($creditLimitReminder) && $oldCredit > $creditLimitReminder && $newCredit <= $creditLimitReminder; } public function updateActive(User $user, Producer $producer, bool $active): bool { $userProducer = $this->createUserProducerIfNotExist( $user, $producer ); $userProducer->active = $active; return $this->update($userProducer); } public function updateBookmark(UserProducer $userProducer, bool $bookmark) { $userProducer->bookmark = $bookmark; return $this->update($userProducer); } public function addProducerBookmark(User $user) { $userProducer = $this->createUserProducerIfNotExist($user, $this->getProducerContext()); return $this->updateBookmark($userProducer, true); } public function removeProducerBookmark(User $user) { $userProducer = $this->createUserProducerIfNotExist($user, $this->getProducerContext()); return $this->updateBookmark($userProducer, false); } public function unlinkUserProducer(UserProducer $userProducer) { $userProducer->active = 0; $userProducer->bookmark = 0; return $this->update($userProducer); } public function updateUserProducerNewsletter(UserProducer $userProducer, bool $newsletter) { $userProducer->newsletter = $newsletter; return $this->update($userProducer); } }