src/DataPersister/RechargementDataPersister.php line 332

Open in your IDE?
  1. <?php
  2. namespace App\DataPersister;
  3. use App\Utils\Utils;
  4. use App\Utils\Constantes;
  5. use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
  6. use Psr\Log\LoggerInterface;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. use Doctrine\Persistence\ObjectManager as DoctrineObjectManager;
  9. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  10. use ApiPlatform\Core\Util\ClassInfoTrait;
  11. use App\Entity\Entite;
  12. use App\Entity\Service;
  13. use App\Entity\Partenaire;
  14. use App\Entity\Rechargement;
  15. use App\Entity\Commission;
  16. use App\Entity\Compte;
  17. use App\Entity\CommissionFixe;
  18. use App\Entity\AirTime;
  19. use App\Entity\Transfert;
  20. use App\Entity\Encaissement;
  21. use App\Entity\ServicePartenaire;
  22. use App\Entity\Transaction;
  23. use App\Entity\Wallet;
  24. use App\Entity\Client;
  25. use App\Entity\FraisFixe;
  26. use App\Utils\ApiRequest;
  27. use App\Utils\JWTEncoder;
  28. use Symfony\Component\HttpFoundation\RequestStack;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use ApiPlatform\Core\DataPersister\DataPersisterInterface;
  31. final class RechargementDataPersister implements DataPersisterInterface
  32. {
  33.     use ClassInfoTrait;
  34.     private $logger;
  35.     private $managerRegistry;
  36.     private $request;
  37.     private $apiRequest;
  38.     private $jwtFactory;
  39.     private $isAirTime;
  40.     private $apiKey;
  41.     private $trxType;
  42.     private $isDigicashPartner;
  43.     private $codeOperateur;
  44.     private $uid;
  45.     private $auteur;
  46.     private $frais;
  47.     public function __construct(LoggerInterface $loggerManagerRegistry $managerRegistry,  ApiRequest $apiRequestRequestStack $requestStack)
  48.     {
  49.         $this->logger $logger;
  50.         $this->managerRegistry $managerRegistry;
  51.         $this->apiRequest $apiRequest;
  52.         $this->request Request::createFromGlobals();
  53.         $this->requestStack $requestStack;
  54.         $this->jwtFactory JWTEncoder::getInstance(); 
  55.         $this->trxType "envoi";
  56.         $this->isDigicashPartner false;
  57.     }
  58.     public function supports($data, array $context = []): bool
  59.     {
  60.         return $data instanceof Recharge;
  61.     }
  62.     
  63.     public function persist($data)
  64.     {
  65.         try{
  66.             if (!$manager $this->getManager($data)) {
  67.                 return $data;
  68.             }
  69.             var_dump("ici");die;
  70.             $request $this->requestStack->getCurrentRequest();
  71.             $dateAction Utils::getCurrentDateTime();
  72.             $this->apiKey $request->headers->get(Constantes::AUTH_TOKEN);
  73.             
  74.                 $data->setMessage("Sauvegardée avec succes");
  75.                 $this->isDigicashPartner $data->getServicePartenaire()->getNom() == "DIGICASH";
  76.                 $dataToken $this->jwtFactory->decode($this->apiKey);
  77.                 $this->uid $dataToken["id"];
  78.                 $this->auteur $dataToken["nom"];
  79.                 $trxId $this->uid.Utils::generateNumTransacService();
  80.                 $codeEntite $dataToken["codeClient"];
  81.                 $estCaissier in_array(Constantes::ROLE_CAISSIER$dataToken["roles"]);
  82.                 $walletUser in_array(Constantes::ROLE_USER_WALLET$dataToken["roles"]);
  83.                 if(!$estCaissier && !$walletUser){
  84.                     throw new \Exception("Opération non autorisée");
  85.                 }
  86.                 
  87.                 $data->setUid($this->uid);
  88.                 $data->setAuteur($this->auteur);
  89.                 $keyValues = [Constantes::ID => 0
  90.                     Constantes::USERNAME => "BGROBOT"
  91.                     Constantes::ROLES => ["BG_ROBOT"], 
  92.                 ];
  93.                 $serverApiKey $this->jwtFactory->encode($keyValues);
  94.                 $uri $_ENV['PARTNER_SERVICE_URL'];
  95.                 $trx = new Transaction();
  96.                 $montantTTC intval($data->getMontant());
  97.                 $trxId $this->uid.Utils::generateNumTransacService();
  98.                 $trx->setNumTransaction($trxId); 
  99.                 $trx->setStatus(true); 
  100.                 $trx->setPending(true); 
  101.                 $trx->setUid($this->uid); 
  102.                 if ($estCaissier) { 
  103.                     $this->saveCaissierTrx($data$trx);
  104.                 } elseif($walletUser){
  105.                     $this->saveWalletUserTrx($data$trx);
  106.                 }
  107.                 
  108.                 if($isDigicashPartner){
  109.                     $clRepoRepository $this->managerRegistry->getRepository(Client::class);
  110.                     $benef $clRepoRepository->findOneBy(["telephone" => $data->getTelephone()]);
  111.                     if(!$benef){
  112.                         throw new \Exception("Bénéficiaire introuvable");
  113.                     }
  114.                     $compteRepoRepository $this->managerRegistry->getRepository(Compte::class);
  115.                     $compteBenefId $compteRepoRepository->getWalletEntity($benef->getId());
  116.                     if(empty($compteBenefId)){
  117.                         throw new \Exception("Compte wallet bénéficiaire introuvable");
  118.                     }
  119.                     $compteBenef $compteRepoRepository->find($compteBenefId);
  120.                     
  121.                     $trxBenf = new Transaction();
  122.                     $montantNet intval($data->getMontant());
  123.                     $trxBenf->setNumTransaction($trxId); 
  124.                     $trxBenf->setStatus(true); 
  125.                     $trxBenf->setPending(false); 
  126.                     $trxBenf->setMontant($montantNet);
  127.                     $trxBenf->setCommentaires("credit");
  128.                     $trxBenf->setService($serviceP); 
  129.                     $trxBenf->setUid($benef->getUserId()); 
  130.                     $soldeCompteBnef $compteBenef->getSolde();
  131.                     $soldeBenef intval($benef->getSolde());
  132.                     
  133.                     $soldeApresBnef $soldeBenef $montantNet;
  134.                     $soldeApresCmptBnef $soldeCompteBnef $montantNet;
  135.                     $benef->setSolde($soldeApresBnef);
  136.                     $compteBenef->setSolde($soldeApresCmptBnef);
  137.                     $trxBenf->setSoldeCompteAvant($soldeBenef); 
  138.                     $trxBenf->setSoldeCompteApres($soldeApresBnef);
  139.                     $trxBenf->setClient($benef);
  140.                     
  141.                     $benef->setDateModification($dateAction);
  142.                     $compteBenef->setDateModification($dateAction);
  143.                     $trxBenf->setDateCreation($dateAction);
  144.                     $trxBenf->setDateModification($dateAction);
  145.                     $manager->persist($benef);
  146.                     $manager->persist($compteBenef);
  147.                     $manager->persist($trxBenf); 
  148.                 }
  149.                 $data->setStatus(true);
  150.                 $data->setCodeEntite($codeEntite);
  151.                 $data->setMontantTTC($montantTTC);
  152.                
  153.                 if(!$this->isDigicashPartner){
  154.                     if($this->isAirTime || $this->isWallet) {
  155.                         // var_dump($data->getServicePartenaire()->getNom());die;
  156.                         $uri .= $this->isAirTime "/api/intouch/airtime" "/api/intouch/" strtolower($data->getServicePartenaire()->getTag()); 
  157.                         $dataService = [
  158.                             "operateur" => $data->getServicePartenaire()->getNom(),
  159.                             "pays" => $data->getServicePartenaire()->getPays(),
  160.                             "recipient_phone_number" => $data->getTelephone(),
  161.                             "amount" => $data->getMontant(),
  162.                             "transaction_id" => $trxId
  163.                         ];
  164.                         $postRequest $this->apiRequest->postData($dataService$uri$serverApiKey);
  165.                         $createSuccess $postRequest[0] == 200;
  166.                         $retour $postRequest[1];
  167.                         
  168.                         if(!$createSuccess || !isset($retour['status']) || $retour['status'] == "FAILED") {
  169.                             $ex "Service indisponible, veuillez réssayer plus tard";
  170.                             throw new \Exception($ex);
  171.                         } else {
  172.                             $trx->setPending(true); 
  173.                         }    
  174.                     } 
  175.                     
  176.                 } else {
  177.                     $trx->setPending(false);
  178.                     
  179.                 }
  180.                 $object get_class($data);
  181.                 $message "new ".$object."created ";
  182.                 if($data->getId()){
  183.                     $message $object." ".$data->getId()." updated";
  184.                     $data->setDateModification($dateAction);
  185.                 }else{
  186.                     $data->setDateCreation($dateAction);
  187.                     $data->setDateModification($dateAction);
  188.                 }
  189.                 $this->logger->info($message);
  190.                 if (!$manager $this->getManager($data)) {
  191.                     return $data;
  192.                 }
  193.                 $trx->setDateCreation($dateAction);
  194.                 $trx->setDateModification($dateAction);
  195.                 //if (!$manager->contains($data) || $this->isDeferredExplicit($manager, $data)) {
  196.                     if($commEntity) {
  197.                         $manager->persist($commEntity);
  198.                     }
  199.                     $manager->persist($trx);
  200.                     $manager->persist($data);
  201.                     
  202.                 //}
  203.                 
  204.                 $manager->flush();
  205.                 $manager->refresh($data);
  206.             
  207.             
  208.             return $data
  209.         }catch(Exception $ex){
  210.             $data->setId(0);
  211.             // $data->setMessage("Une erreur est survenue lors de la sauvegarde");
  212.             $data->setMessage($ex->getMessage());
  213.             $this->logger->error$ex->getMessage());
  214.             return $data;
  215.         }
  216.     }
  217.     
  218.     public function remove($data)
  219.     {
  220.         try{
  221.             if (!$manager $this->getManager($data)) {
  222.                 return;
  223.             }
  224.             $manager->remove($data);
  225.             $manager->flush();
  226.             $object get_class($data);
  227.             $message =  $object." ".$data->getId()."delete ";
  228.             $this->logger->info$message );
  229.           }catch(\Exception $ex){
  230.             $object get_class($data);
  231.             $message =  $object." ".$data->getId()."delete ";
  232.             $this->logger->info$ex->getMessage() );
  233.           }
  234.     }
  235.     /**
  236.      * Gets the Doctrine object manager associated with given data.
  237.      *
  238.      * @return DoctrineObjectManager|null
  239.      */
  240.     private function getManager($data)
  241.     {
  242.         return \is_object($data) ? $this->managerRegistry->getManagerForClass($this->getObjectClass($data)) : null;
  243.     }
  244.     private function getRepository($data)
  245.     {
  246.         return $this->managerRegistry->getRepository($data);
  247.     }
  248.     
  249.     /**
  250.      * Checks if doctrine does not manage data automatically.
  251.      *
  252.      * @return bool
  253.      */
  254.     private function isDeferredExplicit(DoctrineObjectManager $manager$data)
  255.     {
  256.         $classMetadata $manager->getClassMetadata($this->getObjectClass($data));
  257.         if ($classMetadata instanceof ClassMetadataInfo && method_exists($classMetadata'isChangeTrackingDeferredExplicit')) {
  258.             return $classMetadata->isChangeTrackingDeferredExplicit();
  259.         }
  260.         return false;
  261.     }
  262.     private function getCommission($montantNet) {
  263.         $adminResponse $this->apiRequest->getFraisService($this->codeOperateur$montantNet$this->apiKey);
  264.         if(empty($adminResponse)) {
  265.             $ex "Commission non définie pour ce service";
  266.             throw new \Exception($ex);
  267.         }
  268.         $adminCodeOper $adminResponse["codeOperateur"];
  269.         $checkSoldeOper $adminResponse["checkSolde"];
  270.         $partageCommission $adminResponse["frais"];
  271.         $frais 0;
  272.         $gain = [];
  273.         if(!empty($partageCommission["montant"])) {
  274.             $gain Utils::calculCommission($partageCommission$this->trxType);
  275.             $commissionEnvoi = new Commission(); 
  276.             $commissionEnvoi->setCodeEntite($codeEntite);
  277.             $commissionEnvoi->setCodeAgence($codeAgence);
  278.             $commissionEnvoi->setCodeCaisse($codeCaisse);
  279.             $commissionEnvoi->setMontant($montantNet);
  280.             $frais $partageCommission["montant"];
  281.             $commissionEnvoi->setFrais($partageCommission["montant"]);
  282.             $commissionEnvoi->setNetCaisse($gain["caisse"]["netCaisse"]);
  283.             $commissionEnvoi->setTvaCaisse($gain["caisse"]["tvaCaisse"]);
  284.             $commissionEnvoi->setNetEntite($gain["entite"]["netEntite"]);
  285.             $commissionEnvoi->setTvaEntite($gain["entite"]["tvaEntite"]);
  286.             $commissionEnvoi->setStatus(true);
  287.             $commissionEnvoi->setTvaOperateur($gain["operateur"]["tvaOperateur"]);
  288.             $commissionEnvoi->setNetOperateur($gain["operateur"]["netOperateur"]);
  289.             $commissionEnvoi->setTvaPlateforme($gain["plateforme"]["tvaPlateforme"]);
  290.             $commissionEnvoi->setNetPlateforme($gain["plateforme"]["netPlateforme"]);
  291.             $commissionEnvoi->setDateCreation($dateAction);
  292.             $commissionEnvoi->setDateModification($dateAction);
  293.         }
  294.         $montantTTC $montantNet $frais;
  295.         return ["ttc" => $montantTTC"frais" => $frais"net" => $montantNet"commissions" => $gain"commissionEntity" => $commissionEnvoi $commissionEnvoi null];
  296.     }
  297.     private function saveCaissierTrx(&$data, &$trx){
  298.         if($data->getCompte()){
  299.             throw new \Exception("L'opération sur compte client n'est pas autorisée");
  300.         }
  301.         if(!$data->getCodeService()){
  302.             throw new \Exception("Le code service est obligatoire");
  303.         }
  304.         $this->codeOperateur $data->getCodeService();
  305.         $partnerServiceRepository $this->managerRegistry->getRepository(ServicePartenaire::class);
  306.         $servicePartenaire $partnerServiceRepository->findOneBy(["codePlateforme" => $this->codeOperateur]);
  307.         if(!$servicePartenaire){
  308.             throw new \Exception("Service introuvable");
  309.         }
  310.         $data->setServicePartenaire($servicePartenaire);
  311.         $trx->setMontant($montantTTC);
  312.         $trx->setCommentaires("debit");
  313.         $trx->setService($servicePartenaire); 
  314.         $codeCaisse $dataToken["codeCaisse"];
  315.         $this->apiRequest->verifierPlafondCaisse($codeCaisse$montantTTC);
  316.         $service Constantes::WALLET_CODE_SERVICE;
  317.         $commentaire $this->isAirTime "Airtime"$this->isEnc "Encaissement" "Wallet";
  318.         $operation "RETRAIT";
  319.        
  320.         $frais 0;
  321.         $mtCommission 0;
  322.         $total =  intval($data->getMontant()) + $frais;
  323.         $this->trxType "envoi";
  324.         $detailsComm $this->getCommission($data->getMontant());
  325.         $total $detailsComm["ttc"];
  326.         $this->frais $detailsComm["frais"];
  327.         $data->setFrais($frais);
  328.         $gain $detailsComm["commissions"];
  329.         $commEntity $detailsComm["commissionEntity"];
  330.         $commEntity->setServicePartenaire($servicePartenaire);
  331.         $retour_paiement_reseau $this->apiRequest->saveNetworkTransaction $codeCaisse$total$operation$commentaire$this->codeOperateur$frais$mtCommission$gain$trxId$this->apiKey);
  332.         $trx->setSoldeCompteAvant(intval($retour_paiement_reseau[Constantes::SOLDE_CAISSE_AVANT])); 
  333.         $trx->setSoldeCompteApres(intval($retour_paiement_reseau[Constantes::SOLDE_CAISSE_APRES]));
  334.         $trx->setCodeCaisse($dataToken["codeCaisse"]);
  335.         return $trx;
  336.     }
  337.     private function saveWalletUserTrx(&$data) {
  338.         $clRepoRepository $this->managerRegistry->getRepository(Client::class);
  339.         $cl $clRepoRepository->findOneBy(["userId" => $this->uid]);
  340.         $apiKey $request->headers->get(Constantes::AUTH_TOKEN);
  341.         if( !$data->getPin() ) {
  342.             throw new \Exception("Le code Pin est obligatoire pour valider l'opération");
  343.         }
  344.         if( !$this->apiRequest->pinVerify($data->getPin(), $apiKey) ) {
  345.             throw new \Exception("Code Pin incorrect");
  346.         }
  347.         $compteClient $data->getCompte();
  348.         $soldeCompte $compteClient->getSolde();
  349.         $soldeClient intval($cl->getSolde());
  350.         if($soldeCompte $montantTTC){
  351.             throw new \Exception("Solde insuffisant");
  352.         }
  353.         
  354.         $soldeApres $soldeClient $montantTTC;
  355.         $soldeApresCmpt $soldeCompte $montantTTC;
  356.         $cl->setSolde($soldeApres);
  357.         $data->setSolde($soldeApres);
  358.         $compteClient->setSolde($soldeApresCmpt);
  359.         $trx->setSoldeCompteAvant($soldeClient); 
  360.         $trx->setSoldeCompteApres($soldeApres);
  361.         $trx->setClient($cl);
  362.         $cl->setDateCreation($dateAction);
  363.         $compteClient->setDateModification($dateAction);
  364.         $manager->persist($cl);
  365.         $manager->persist($compteClient);
  366.         
  367.     }
  368. }