|
- <?php
-
- namespace Lc\ShopBundle\Services ;
-
- use Doctrine\ORM\EntityManagerInterface;
- use Lc\ShopBundle\Context\CreditHistoryInterface;
- use Lc\ShopBundle\Context\MerchantInterface;
- use Lc\ShopBundle\Context\MerchantUtilsInterface;
- use Lc\ShopBundle\Context\UserInterface;
- use Lc\ShopBundle\Context\UserMerchantInterface;
- use Lc\ShopBundle\Model\CreditHistory;
- use Symfony\Component\Security\Core\Security;
-
- class CreditUtils
- {
- protected $em ;
- protected $security ;
- protected $merchantUtils ;
- protected $userMerchantRepository ;
-
- public function __construct(EntityManagerInterface $em, Security $security, MerchantUtilsInterface $merchantUtils)
- {
- $this->em = $em ;
- $this->security = $security ;
- $this->merchantUtils = $merchantUtils ;
- $this->userMerchantRepository = $this->em->getRepository($this->em->getClassMetadata(UserMerchantInterface::class)->getName()) ;
- }
-
- public function getUserMerchant(UserInterface $user = null, MerchantInterface $merchant = null)
- {
- if(!$user) {
- $user = $this->security->getUser() ;
- }
-
- $merchant = $this->getMerchant($merchant) ;
-
- $userMerchant = $this->userMerchantRepository->findOneBy([
- 'user' => $user,
- 'merchant' => $merchant
- ]) ;
- return $userMerchant ;
- }
-
- public function createUserMerchant(UserInterface $user, MerchantInterface $merchant = null)
- {
- $merchant = $this->getMerchant($merchant) ;
- $classUserMerchant = $this->em->getClassMetadata(UserMerchantInterface::class)->getName();
-
- $userMerchant = new $classUserMerchant ;
- $userMerchant->setUser($user) ;
- $userMerchant->setMerchant($merchant) ;
- $userMerchant->setCredit(0) ;
- $userMerchant->setCreditActive(true) ;
-
- $this->em->persist($userMerchant) ;
- $this->em->flush() ;
-
- return $userMerchant ;
- }
-
- public function updateCreditActive($user = null, $merchant = null, $creditActive = true)
- {
- if(!$user) {
- $user = $this->security->getUser() ;
- }
-
- $userMerchant = $this->getUserMerchant($user, $merchant) ;
- if(!$userMerchant) {
- $userMerchant = $this->createUserMerchant($user, $merchant) ;
- }
-
- $userMerchant->setCreditActive($creditActive) ;
-
- $this->em->persist($userMerchant) ;
- $this->em->flush() ;
-
- return $userMerchant ;
- }
-
- public function activeCredit($user = null, $merchant = null)
- {
- return $this->updateCreditActive($user, $merchant, true) ;
- }
-
- public function unactiveCredit($user = null, $merchant = null)
- {
- return $this->updateCreditActive($user, $merchant, false) ;
- }
-
-
- public function isCreditActiveByUser(UserInterface $user, MerchantInterface $merchant = null){
- $userMerchant = $this->getUserMerchant($user, $merchant);
-
- return $this->isCreditActive($userMerchant);
- }
-
- public function isCreditActive(UserMerchantInterface $userMerchant = null){
-
- if(!$userMerchant || ($userMerchant && !$userMerchant->isCreditActive())) {
- return false ;
- }
-
- return true ;
- }
-
- public function isCreditSufficientToPay($userMerchant, $amount)
- {
- if($this->isCreditActive($userMerchant) && $userMerchant->getCredit() >= $amount) {
- return true ;
- }
-
- return false;
- }
-
- public function createCreditHistory($type, $user, $params = [])
- {
- $creditHistory = $this->initCreditHistory($type, $user, $params) ;
- return $this->saveCreditHistory($creditHistory) ;
- }
-
- public function initCreditHistory($type, $user, $params = [])
- {
- $merchant = isset($params['merchant']) ? $params['merchant'] : null ;
- $userMerchant = $this->getUserMerchant($user, $merchant) ;
- $isCreditActive = $this->isCreditActive($userMerchant) ;
-
- if($isCreditActive) {
- $amount = isset($params['amount']) ? $params['amount'] : null ;
- $meanPayment = isset($params['meanPayment']) ? $params['meanPayment'] : null ;
- $reference = isset($params['reference']) ? $params['reference'] : null ;
- $comment = isset($params['comment']) ? $params['comment'] : null ;
- $orderPayment = isset($params['orderPayment']) ? $params['orderPayment'] : null ;
- $orderRefund = isset($params['orderRefund']) ? $params['orderRefund'] : null ;
-
- // credit history
- $classCreditHistory = $this->em->getClassMetadata(CreditHistoryInterface::class)->getName();
-
- $creditHistory = new $classCreditHistory ;
- $creditHistory->setType($type) ;
- $creditHistory->setUserMerchant($userMerchant) ;
- $creditHistory->setAmount($amount) ;
- $creditHistory->setMeanPayment($meanPayment) ;
- $creditHistory->setReference($reference) ;
- $creditHistory->setComment($comment) ;
- $creditHistory->setOrderPayment($orderPayment) ;
- $creditHistory->setOrderRefund($orderRefund) ;
-
- return $creditHistory ;
- }
-
- return false ;
- }
-
- public function saveCreditHistory($creditHistory)
- {
- if($creditHistory) {
- $userMerchant = $creditHistory->getUserMerchant() ;
- $isCreditActive = $this->isCreditActive($userMerchant) ;
-
- if($isCreditActive) {
- if($creditHistory->getType() == CreditHistory::TYPE_CREDIT) {
- $userMerchantAmount = $userMerchant->getCredit() + $creditHistory->getAmountInherited() ;
- $this->updateCredit($userMerchant,$creditHistory, $userMerchantAmount);
- return true;
- }elseif($creditHistory->getType() == CreditHistory::TYPE_DEBIT) {
- if ($this->isCreditSufficientToPay($userMerchant, $creditHistory->getAmountInherited())) {
- $userMerchantAmount = $userMerchant->getCredit() - $creditHistory->getAmountInherited();
- $this->updateCredit($userMerchant,$creditHistory, $userMerchantAmount);
- return true;
- } else {
- return false;
- }
- }
- }
- }
-
- return false ;
- }
-
- public function updateCredit($userMerchant, $creditHistory, $amount)
- {
- $this->em->persist($creditHistory) ;
- $userMerchant->setCredit($amount) ;
- $this->em->persist($userMerchant) ;
- $this->em->flush() ;
- return $userMerchant;
- }
-
- public function getMerchant($merchant)
- {
- if(!$merchant) {
- $merchant = $this->merchantUtils->getMerchantCurrent() ;
- }
-
- return $merchant ;
- }
- }
|