No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

195 líneas
7.2KB

  1. <?php
  2. namespace common\logic\User\UserProducer\Service;
  3. use common\helpers\MeanPayment;
  4. use common\logic\AbstractBuilder;
  5. use common\logic\Order\Order\Model\Order;
  6. use common\logic\Order\Order\Repository\OrderRepository;
  7. use common\logic\Order\Order\Service\OrderSolver;
  8. use common\logic\Payment\Model\Payment;
  9. use common\logic\Payment\Service\PaymentSolver;
  10. use common\logic\Producer\Producer\Model\Producer;
  11. use common\logic\Producer\Producer\Repository\ProducerRepository;
  12. use common\logic\User\User\Model\User;
  13. use common\logic\User\User\Repository\UserRepository;
  14. use common\logic\User\UserProducer\Model\UserProducer;
  15. use common\logic\User\UserProducer\Repository\UserProducerRepository;
  16. class UserProducerBuilder extends AbstractBuilder
  17. {
  18. protected PaymentSolver $paymentSolver;
  19. protected UserProducerRepository $userProducerRepository;
  20. protected OrderRepository $orderRepository;
  21. protected ProducerRepository $producerRepository;
  22. protected OrderSolver $orderSolver;
  23. protected UserRepository $userRepository;
  24. public function loadDependencies(): void
  25. {
  26. $this->paymentSolver = $this->loadService(PaymentSolver::class);
  27. $this->userProducerRepository = $this->loadService(UserProducerRepository::class);
  28. $this->orderRepository = $this->loadService(OrderRepository::class);
  29. $this->producerRepository = $this->loadService(ProducerRepository::class);
  30. $this->orderSolver = $this->loadService(OrderSolver::class);
  31. $this->userRepository = $this->loadService(UserRepository::class);
  32. }
  33. public function instanciateUserProducer(User $user, Producer $producer, bool $bookmark = true, bool $newsletter = true)
  34. {
  35. $userProducer = new UserProducer();
  36. $userProducer->populateUser($user);
  37. $userProducer->populateproducer($producer);
  38. $userProducer->setCredit(0);
  39. $userProducer->setActive(true);
  40. $userProducer->setBookmark($bookmark);
  41. $userProducer->setNewsletter($newsletter);
  42. return $userProducer;
  43. }
  44. public function createUserProducer(User $user, Producer $producer, bool $bookmark = true, bool $newsletter = true): UserProducer
  45. {
  46. $userProducer = $this->instanciateUserProducer($user, $producer, $bookmark, $newsletter);
  47. $this->create($userProducer);
  48. return $userProducer;
  49. }
  50. public function createUserProducerIfNotExist(User $user, Producer $producer, bool $bookmark = true, bool $newsletter = true): UserProducer
  51. {
  52. return $this->userProducerRepository->findOneUserProducer($user)
  53. ?? $this->createUserProducer($user, $producer, $bookmark, $newsletter);
  54. }
  55. public function updateCredit(Payment $payment): void
  56. {
  57. if($payment->user && (
  58. $payment->getType() == Payment::TYPE_DEBIT
  59. || $payment->getType() == Payment::TYPE_CREDIT
  60. || ($payment->getType() == Payment::TYPE_PAYMENT && $this->paymentSolver->isMeanPaymentCredit($payment))
  61. || ($payment->getType() == Payment::TYPE_REFUND && $this->paymentSolver->isMeanPaymentCredit($payment))
  62. )) {
  63. $userProducer = $this->userProducerRepository->findOneUserProducer($payment->user);
  64. if ($userProducer) {
  65. $oldCredit = $userProducer->getCredit();
  66. $this->deductCredit($userProducer, $payment);
  67. //$this->initMeanPaymentOrder($payment);
  68. $this->sendCreditLimitReminder($userProducer, $payment, $oldCredit);
  69. }
  70. }
  71. }
  72. public function deductCredit(UserProducer $userProducer, Payment $payment)
  73. {
  74. if ($this->paymentSolver->isTypeCredit($payment)) {
  75. $userProducer->setCredit($userProducer->getCredit() + $payment->getAmount());
  76. } elseif ($this->paymentSolver->isTypeDebit($payment)) {
  77. $userProducer->setCredit($userProducer->getCredit() - $payment->getAmount());
  78. }
  79. $this->update($userProducer);
  80. }
  81. public function initMeanPaymentOrder(Payment $payment)
  82. {
  83. if ($payment->id_order && $payment->id_order > 0) {
  84. $order = $this->orderRepository->findOneOrderById((int) $payment->id_order);
  85. if ($order) {
  86. $paymentStatus = $this->orderSolver->getPaymentStatus($order);
  87. if ($paymentStatus == Order::PAYMENT_PAID
  88. || $paymentStatus == Order::PAYMENT_SURPLUS) {
  89. $order->mean_payment = MeanPayment::CREDIT;
  90. $this->update($order);
  91. }
  92. }
  93. }
  94. }
  95. public function sendCreditLimitReminder($userProducer, $payment, $oldCredit)
  96. {
  97. $newCredit = $userProducer->credit;
  98. if ($this->isCreditLimitCrossed($oldCredit, $newCredit)) {
  99. $user = $this->userRepository->findOneUserById($payment->id_user);
  100. $producer = $this->producerRepository->findOneProducerById($payment->id_producer);
  101. if($user && $user->email && strlen($user->email) > 0) {
  102. \Yii::$app->mailer->compose(
  103. [
  104. 'html' => 'creditLimitReminder-html',
  105. 'text' => 'creditLimitReminder-text'
  106. ],
  107. [
  108. 'user' => $user,
  109. 'producer' => $producer,
  110. 'credit' => $newCredit
  111. ]
  112. )
  113. ->setTo($user->email)
  114. ->setFrom(['contact@opendistrib.net' => 'Opendistrib'])
  115. ->setSubject('[Opendistrib] Seuil limite de crédit dépassé')
  116. ->send();
  117. }
  118. }
  119. }
  120. public function isCreditLimitCrossed($oldCredit, $newCredit)
  121. {
  122. $creditLimitReminder = $this->producerRepository->getConfig('credit_limit_reminder');
  123. return !is_null($creditLimitReminder) &&
  124. $oldCredit > $creditLimitReminder
  125. && $newCredit <= $creditLimitReminder;
  126. }
  127. public function updateActive(User $user, Producer $producer, bool $active): bool
  128. {
  129. $userProducer = $this->createUserProducerIfNotExist(
  130. $user,
  131. $producer
  132. );
  133. $userProducer->active = $active;
  134. return $this->update($userProducer);
  135. }
  136. public function updateBookmark(UserProducer $userProducer, bool $bookmark)
  137. {
  138. $userProducer->bookmark = $bookmark;
  139. return $this->update($userProducer);
  140. }
  141. public function addProducerBookmark(User $user)
  142. {
  143. $userProducer = $this->createUserProducerIfNotExist($user, $this->getProducerContext());
  144. return $this->updateBookmark($userProducer, true);
  145. }
  146. public function removeProducerBookmark(User $user)
  147. {
  148. $userProducer = $this->createUserProducerIfNotExist($user, $this->getProducerContext());
  149. return $this->updateBookmark($userProducer, false);
  150. }
  151. public function unlinkUserProducer(UserProducer $userProducer)
  152. {
  153. $userProducer->active = 0;
  154. $userProducer->bookmark = 0;
  155. return $this->update($userProducer);
  156. }
  157. public function updateUserProducerNewsletter(UserProducer $userProducer, bool $newsletter)
  158. {
  159. $userProducer->newsletter = $newsletter;
  160. return $this->update($userProducer);
  161. }
  162. }