src/Controller/Admin/TransactionController.php line 1057

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Controller\Admin;
  3. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use EADPlataforma\Entity\Transaction;
  7. use EADPlataforma\Entity\TransactionItem;
  8. use EADPlataforma\Entity\User;
  9. use EADPlataforma\Entity\Enrollment;
  10. use EADPlataforma\Entity\TransactionRefund;
  11. use EADPlataforma\Entity\TransactionXReceiver;
  12. use EADPlataforma\Entity\TransactionRefundReceiver;
  13. use EADPlataforma\Entity\TransactionContest;
  14. use EADPlataforma\Entity\Commission;
  15. use EADPlataforma\Entity\UserSubscription;
  16. use EADPlataforma\Entity\Course;
  17. use EADPlataforma\Entity\Product;
  18. use EADPlataforma\DataTransferObject\PagarMeBankAccountDTO;
  19. use EADPlataforma\Enum\TransactionEnum;
  20. use EADPlataforma\Enum\TransactionItemEnum;
  21. use EADPlataforma\Enum\TransactionContestEnum;
  22. use EADPlataforma\Enum\TransactionXReceiverEnum;
  23. use EADPlataforma\Enum\UserSubscriptionEnum;
  24. use EADPlataforma\Enum\EnrollmentEnum;
  25. use EADPlataforma\Enum\CourseEnum;
  26. use EADPlataforma\Enum\ProductEnum;
  27. use EADPlataforma\Enum\TagsMarketingEnum;
  28. use EADPlataforma\Enum\NotificationEnum;
  29. use EADPlataforma\Enum\ErrorEnum;
  30. /**
  31.  * @Route(
  32.  *      path          = "/admin/transaction",
  33.  *      schemes         = {"http|https"}
  34.  * )
  35.  * @Cache(
  36.  *      maxage          = "0",
  37.  *      smaxage         = "0",
  38.  *      expires         = "now",
  39.  *      public          = false
  40.  * )
  41.  */
  42. class TransactionController extends AbstractController {
  43.     
  44.     public function getEntityClass(){
  45.         return Transaction::class;
  46.     }
  47.     /**
  48.      * @Route(
  49.      *      path          = "/list/paginate",
  50.      *      methods       = {"GET"},
  51.      * )
  52.      */
  53.     public function getTransactionPaginate(Request $request) {
  54.         $permission $this->userPermissionUtil->getPermission(
  55.             "financial"
  56.             "transaction"
  57.             "see"
  58.         );
  59.         $this->requestUtil->setRequest($request)->setData();
  60.         $receiverId $request->get('receiver');
  61.         $userId $this->requestUtil->getField('user');
  62.         if(empty($receiverId) && (empty($userId) || $userId $this->user->getId())){
  63.             if($this->userPermissionUtil->isLow($permission)){
  64.                 return $this->eadResponse(nullErrorEnum::PERMISSION);
  65.             }
  66.         }
  67.         $enrollmentId $this->requestUtil->getField('enrollment');
  68.         $userSubscriptionId $this->requestUtil->getField('userSubscription');
  69.         $searchText $this->requestUtil->getField('searchText');
  70.         $orderParam $this->requestUtil->getField('order');
  71.         $gateway = (int)$this->requestUtil->getField('gateway');
  72.         $paymentMethod = (int)$this->requestUtil->getField('paymentMethod');
  73.         $dateStart $this->requestUtil->getField('dateStart');
  74.         $dateEnd $this->requestUtil->getField('dateEnd');
  75.         $origin = (int)$this->requestUtil->getField('origin');
  76.         
  77.         $status $this->requestUtil->getField('status');
  78.         $limit $this->requestUtil->getField('limit');
  79.         $offset $this->requestUtil->getField('offset');
  80.         $columns =  [
  81.             "t.id",
  82.             "t.hash"
  83.             "t.status"
  84.             "u.name"
  85.             "u.email"
  86.             "t.gateway"
  87.             "t.amount"
  88.             "t.paymentMethod",
  89.             "t.origin",
  90.             "t.numberItems",
  91.             "DATE_FORMAT(t.dateRegister, '%Y-%m-%d %H:%i:%s') AS dateRegister",
  92.             "DATE_FORMAT(t.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  93.             "ud.name AS userDelete"
  94.         ];
  95.         
  96.         $userClass User::class;
  97.         $joins = [
  98.             "{$userClass} AS u" => "u.id = t.user",
  99.             "{$userClass} AS ud" => ["LEFT""ud.id = t.userDelete"]
  100.         ];
  101.         if($enrollmentId 0){
  102.             $enrollmentClass Enrollment::class;
  103.             $joins["{$enrollmentClass} AS e"] = "e MEMBER OF t.enrollment AND e.id = {$enrollmentId}";
  104.         }
  105.         if($userSubscriptionId 0){
  106.             $userSubscriptionClass UserSubscription::class;
  107.             $joins["{$userSubscriptionClass} AS us"] = "us MEMBER OF t.userSubscription 
  108.                                                         AND us.id = {$userSubscriptionId}";
  109.         }
  110.         if($receiverId 0){
  111.             $trXReceiverClass TransactionXReceiver::class;
  112.             $joins["{$trXReceiverClass} AS tr"] = "tr.transaction = t.id 
  113.                                                    AND tr.receiver = {$receiverId}";
  114.         }
  115.         $filter = [];
  116.         $filterDelete $this->requestUtil->getDeletedParam();
  117.         $filter["whereText"] = "t.id > 0";
  118.         if($userId 0){
  119.             $filter["t.user"] = $userId;
  120.         }
  121.         if(!empty($gateway)){
  122.             $filter["t.gateway"] = $gateway;
  123.         }
  124.         if(!empty($paymentMethod)){
  125.             $filter["t.paymentMethod"] = $paymentMethod;
  126.         }
  127.         if(!empty($origin)){
  128.             $filter["t.origin"] = $origin;
  129.         }
  130.         if(!empty($status)){
  131.             if($status == TransactionEnum::APPROVED){
  132.                 $sComplete TransactionEnum::COMPLETE;
  133.                 $filter["whereText"] .= " AND (t.status = {$status} OR t.status = {$sComplete})";
  134.             }else if($status == TransactionEnum::REPAYMENT){
  135.                 $sReProgress TransactionEnum::REPAYMENT_IN_PROGRESS;
  136.                 $sRePartial TransactionEnum::REPAYMENT_PARTIAL;
  137.                 $filter["whereText"] .= "AND (
  138.                     t.status = {$status} OR 
  139.                     t.status = {$sReProgress} OR 
  140.                     t.status = {$sRePartial} 
  141.                 )";
  142.             }else{
  143.                 $filter["t.status"] = $status;
  144.             }
  145.         }
  146.         if(!empty($dateStart) && !empty($dateEnd)){
  147.             $filter["whereText"] .= " AND (DATE_FORMAT(t.dateRegister, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}') ";
  148.         }
  149.         $group = [ "t.hash" ];
  150.         
  151.         $order = [ "t.id" => "DESC" ];
  152.         if(!empty($orderParam)){
  153.             $order json_decode($orderParamtrue);
  154.         }
  155.         try{
  156.             //$this->repository->updateTransactionPaidAndAnticipated();
  157.         }catch(\Exception $e){
  158.         }
  159.         $data $this->repository->paginate(
  160.             "t",
  161.             $searchText,
  162.             $columns,
  163.             $joins,
  164.             $filter,
  165.             $order,
  166.             $limit,
  167.             $offset,
  168.             $filterDelete,
  169.             false,
  170.             [],
  171.             true,
  172.             $group
  173.         );
  174.         
  175.         return $this->eadResponse($data);
  176.     }
  177.     /**
  178.      * @Route(
  179.      *      path          = "/user/list/paginate",
  180.      *      methods       = {"GET"},
  181.      * )
  182.      */
  183.     public function getTransactionUserPaginate(Request $request) {
  184.         $this->requestUtil->setRequest($request)->setData();
  185.         $userId $this->user->getId();
  186.         $userSubscriptionId $this->requestUtil->getField('userSubscription');
  187.         $searchText $this->requestUtil->getField('searchText');
  188.         $orderParam $this->requestUtil->getField('order');
  189.         $status $this->requestUtil->getField('status');
  190.         $limit $this->requestUtil->getField('limit');
  191.         $offset $this->requestUtil->getField('offset');
  192.         $dateStart $this->requestUtil->getField('dateStart');
  193.         $dateEnd $this->requestUtil->getField('dateEnd');
  194.         $columns =  [
  195.             "t.id",
  196.             "t.hash"
  197.             "t.status"
  198.             "u.name"
  199.             "u.email"
  200.             "t.gateway"
  201.             "t.amount"
  202.             "t.paymentMethod",
  203.             "t.numberItems",
  204.             "DATE_FORMAT(t.dateRegister, '%Y-%m-%d %H:%i:%s') AS dateRegister",
  205.             "DATE_FORMAT(t.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  206.             "ud.name AS userDelete"
  207.         ];
  208.         
  209.         $userClass User::class;
  210.         $joins = [
  211.             "{$userClass} AS u" => "u.id = t.user",
  212.             "{$userClass} AS ud" => ["LEFT""ud.id = t.userDelete"]
  213.         ];
  214.         if($userSubscriptionId 0){
  215.             $userSubscriptionClass UserSubscription::class;
  216.             $joins["{$userSubscriptionClass} AS us"] = "us MEMBER OF t.userSubscription AND us.id = {$userSubscriptionId}";
  217.         }
  218.         $filter = [];
  219.         $filterDelete $this->requestUtil->getDeletedParam();
  220.         $filter = [
  221.             "t.user" => $userId
  222.         ];
  223.         if(!empty($status)){
  224.             $filter["t.status"] = $status;
  225.         }
  226.         if(!empty($dateStart) && !empty($dateEnd)){
  227.             $filter["whereText"] = "DATE_FORMAT(t.dateRegister, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'";
  228.         }
  229.         $group = [ "t.hash" ];
  230.         
  231.         $order = [ "t.id" => "DESC" ];
  232.         if(!empty($orderParam)){
  233.             $order json_decode($orderParamtrue);
  234.         }
  235.         $data $this->repository->paginate(
  236.             "t"
  237.             $searchText
  238.             $columns
  239.             $joins
  240.             $filter
  241.             $order
  242.             $limit
  243.             $offset
  244.             $filterDelete,
  245.             false,
  246.             [],
  247.             true,
  248.             $group
  249.         );
  250.         foreach ($data['rows'] as $key => $item) {
  251.            $item = (object)$item;
  252.             $item->paymentMethodText $this->repository->stringPaymentMethod(
  253.                 $item->paymentMethod
  254.             );
  255.             $item->statusText $this->repository->stringStatus($item->status);
  256.             $data['rows'][$key] = $item;
  257.         }
  258.         return $this->eadResponse($data);
  259.     }
  260.     /**
  261.      * @Route(
  262.      *      path          = "/detail/{id}",
  263.      *      methods       = {"GET"},
  264.      *      requirements  = { "id" = "\d+" }
  265.      * )
  266.      */
  267.     public function getTransaction(Request $request) {
  268.         $permission $this->userPermissionUtil->getPermission(
  269.             "financial"
  270.             "transaction"
  271.             "see"
  272.         );
  273.         if($this->userPermissionUtil->isLow($permission)){
  274.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  275.         }
  276.         $transactionId $request->get('id');
  277.         $transaction $this->repository->findOneBy([
  278.             "id" => $transactionId,
  279.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  280.         ]);
  281.         if (!$transaction) {
  282.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  283.         }
  284.         $userCheckoutInfo $transaction->getUserCheckoutInfo();
  285.         $msgError null;
  286.         if($transaction->getGateway() == TransactionEnum::EAD_CHECKOUT){
  287.             $pagarMeTransaction $this->generalService->getService(
  288.                 'PagarMe\\PagarMeTransaction'
  289.             );
  290.             try{
  291.                 $transactionPagarme $pagarMeTransaction->get($transaction->getHash());
  292.                 
  293.                 if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_BILL){
  294.                     $dateExpire date('Y-m-d'strtotime("+ 7 day"));
  295.                     if(!empty($transactionPagarme->boleto_expiration_date)){
  296.                         $dateExpire date(
  297.                             'Y-m-d'
  298.                             strtotime($transactionPagarme->boleto_expiration_date)
  299.                         );
  300.                     }
  301.                     $transaction->setBillCode($transactionPagarme->boleto_barcode);
  302.                     $transaction->setBillLink($transactionPagarme->boleto_url);
  303.                     $transaction->setDateExpire($dateExpire);
  304.                 }else if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_PIX){
  305.                     $dateExpire date('Y-m-d'strtotime("+ 7 day"));
  306.                     if(!empty($transactionPagarme->pix_qr_code)){
  307.                         $dateExpire date(
  308.                             'Y-m-d'
  309.                             strtotime($transactionPagarme->pix_expiration_date)
  310.                         );
  311.                     }
  312.                     $transaction->setPixCode($transactionPagarme->pix_qr_code);
  313.                     $transaction->setDateExpire($dateExpire);
  314.                 }
  315.                 if($transactionPagarme->status == "authorized"){
  316.                     $dateRef date('Y-m-d'strtotime("- 11 day"));
  317.                     if($dateRef >= $transaction->getDateRegister('Y-m-d')){
  318.                         $transaction->setStatus(TransactionEnum::CANCELED);
  319.                         $transaction->setCancelReason(
  320.                             TransactionEnum::CANCELED_BY_EXPIRATION_MANUAL
  321.                         );
  322.                     }
  323.                 }
  324.                 if(!empty($transactionPagarme->acquirer_response_code)){
  325.                     $msgError $pagarMeTransaction->getTransactionError(
  326.                         $transactionPagarme->acquirer_response_code
  327.                     );
  328.                 }
  329.                 $this->em->flush();
  330.             }catch(Exception $e){
  331.             }
  332.         }
  333.         $transactionItems $this->em->getRepository(TransactionItem::class)->findBy([ 
  334.             "transaction" => $transaction->getId(),
  335.             "deleted" => TransactionItemEnum::ITEM_NO_DELETED
  336.         ]);
  337.         $commissionAmountTotal 0;
  338.         $commissionItems = [];
  339.         foreach ($transactionItems as $key => $transactionItem) {
  340.             $commissionAmount $transactionItem->getCommissionTotalAmount();
  341.             $commissionPercent $transactionItem->getCommissionPercent();
  342.             
  343.             if(!empty($commissionAmount) && !empty($commissionPercent)){
  344.                 $commissionAmountTotal $commissionAmountTotal $commissionAmount;
  345.                 $obj = (object)[
  346.                     "description" => $transactionItem->getDescription(),
  347.                     "commissionPercent" => $commissionPercent,
  348.                     "commissionAmount" => $commissionAmount,
  349.                 ];
  350.                 $commissionItems[$key] = $obj;
  351.             }
  352.         }
  353.         $transaction $this->repository->updatePaidAndAnticipated($transaction);
  354.         $dataTransaction = (object)$transaction->toReturn();
  355.         $netAmount $transaction->getNetTotalAmount();
  356.         $antAmount $transaction->getAnticipationAmount();
  357.         $dataTransaction->finalAmount $netAmount $antAmount $commissionAmountTotal;
  358.         $data = [
  359.             "transaction" => $dataTransaction,
  360.             "commissionItems" => $commissionItems,
  361.             "canceledMessage" => $msgError,
  362.             "userCheckoutInfo" => ( 
  363.                 $userCheckoutInfo $userCheckoutInfo->toReturn() : null 
  364.             ),
  365.         ];
  366.         return $this->eadResponse($data);
  367.     }
  368.     /**
  369.      * @Route(
  370.      *      path          = "/detail/hash/{hash}",
  371.      *      methods       = {"GET"}
  372.      * )
  373.      */
  374.     public function getTransactionHash(Request $request) {
  375.         $permission $this->userPermissionUtil->getPermission(
  376.             "financial"
  377.             "transaction"
  378.             "see"
  379.         );
  380.         if($this->userPermissionUtil->isLow($permission)){
  381.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  382.         }
  383.         $hash $request->get('hash');
  384.         $transaction $this->repository->findOneBy([
  385.             "hash" => $hash,
  386.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  387.         ]);
  388.         if (!$transaction) {
  389.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  390.         }
  391.         $userCheckoutInfo $transaction->getUserCheckoutInfo();
  392.         $msgError null;
  393.         if($transaction->getGateway() == TransactionEnum::EAD_CHECKOUT){
  394.             $pagarMeTransaction $this->generalService->getService(
  395.                 'PagarMe\\PagarMeTransaction'
  396.             );
  397.             try{
  398.                 $transactionPagarme $pagarMeTransaction->get($transaction->getHash());
  399.                 if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_BILL){
  400.                     $dateExpire date('Y-m-d'strtotime("+ 7 day"));
  401.                     if(!empty($transactionPagarme->boleto_expiration_date)){
  402.                         $dateExpire date(
  403.                             'Y-m-d'
  404.                             strtotime($transactionPagarme->boleto_expiration_date)
  405.                         );
  406.                     }
  407.                     $transaction->setBillCode($transactionPagarme->boleto_barcode);
  408.                     $transaction->setBillLink($transactionPagarme->boleto_url);
  409.                     $transaction->setDateExpire($dateExpire);
  410.                 }else if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_PIX){
  411.                     $dateExpire date('Y-m-d'strtotime("+ 7 day"));
  412.                     if(!empty($transactionPagarme->pix_qr_code)){
  413.                         $dateExpire date(
  414.                             'Y-m-d'
  415.                             strtotime($transactionPagarme->pix_expiration_date)
  416.                         );
  417.                     }
  418.                     $transaction->setPixCode($transactionPagarme->pix_qr_code);
  419.                     $transaction->setDateExpire($dateExpire);
  420.                 }
  421.                 if($transactionPagarme->status == "authorized"){
  422.                     $dateRef date('Y-m-d'strtotime("- 11 day"));
  423.                     if($dateRef >= $transaction->getDateRegister('Y-m-d')){
  424.                         $transaction->setStatus(TransactionEnum::CANCELED);
  425.                         $transaction->setCancelReason(
  426.                             TransactionEnum::CANCELED_BY_EXPIRATION_MANUAL
  427.                         );
  428.                     }
  429.                 }
  430.                 if(!empty($transactionPagarme->acquirer_response_code)){
  431.                     $msgError $pagarMeTransaction->getTransactionError(
  432.                         $transactionPagarme->acquirer_response_code
  433.                     );
  434.                 }
  435.                 
  436.                 $this->em->flush();
  437.             }catch(Exception $e){
  438.             }
  439.         }
  440.         $transactionItems $this->em->getRepository(TransactionItem::class)->findBy([ 
  441.             "transaction" => $transaction->getId(),
  442.             "deleted" => TransactionItemEnum::ITEM_NO_DELETED
  443.         ]);
  444.         $commissionAmountTotal 0;
  445.         $commissionItems = [];
  446.         foreach ($transactionItems as $key => $transactionItem) {
  447.             $commissionAmount $transactionItem->getCommissionTotalAmount();
  448.             $commissionPercent $transactionItem->getCommissionPercent();
  449.             
  450.             if(!empty($commissionAmount) && !empty($commissionPercent)){
  451.                 $commissionAmountTotal $commissionAmountTotal $commissionAmount;
  452.                 $obj = (object)[
  453.                     "description" => $transactionItem->getDescription(),
  454.                     "commissionPercent" => $commissionPercent,
  455.                     "commissionAmount" => $commissionAmount,
  456.                 ];
  457.                 $commissionItems[$key] = $obj;
  458.             }
  459.         }
  460.         $transaction $this->repository->updatePaidAndAnticipated($transaction);
  461.         $dataTransaction = (object)$transaction->toReturn();
  462.         $netAmount $transaction->getNetTotalAmount();
  463.         $antAmount $transaction->getAnticipationAmount();
  464.         $dataTransaction->finalAmount $netAmount $antAmount $commissionAmountTotal;
  465.         $data = [
  466.             "transaction" => $dataTransaction,
  467.             "commissionItems" => $commissionItems,
  468.             "canceledMessage" => $msgError,
  469.             "userCheckoutInfo" => ( 
  470.                 $userCheckoutInfo $userCheckoutInfo->toReturn() : null 
  471.             ),
  472.         ];
  473.         return $this->eadResponse($data);
  474.     }
  475.     /**
  476.      * @Route(
  477.      *      path          = "/process/{id}",
  478.      *      methods       = {"GET"},
  479.      *      requirements  = { "id" = "\d+" }
  480.      * )
  481.      */
  482.     public function processTransaction(Request $request) {
  483.         $permission $this->userPermissionUtil->getPermission(
  484.             "financial"
  485.             "transaction"
  486.             "see"
  487.         );
  488.         if($this->userPermissionUtil->isLow($permission)){
  489.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  490.         }
  491.         $transactionId $request->get('id');
  492.         $transaction $this->repository->findOneBy([
  493.             "id" => $transactionId,
  494.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  495.         ]);
  496.         if (!$transaction) {
  497.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  498.         }
  499.         $debug = ($this->user->getId() == TransactionEnum::YES);
  500.         $this->repository->processTransaction($transaction$debug);
  501.         return $this->eadResponse([ "success" => 1"debug" => $debug ]);
  502.     }
  503.     /**
  504.      * @Route(
  505.      *      path          = "/process/invoice/{id}",
  506.      *      methods       = {"GET"},
  507.      *      requirements  = { "id" = "\d+" }
  508.      * )
  509.      */
  510.     public function processTransactionInvoice(Request $request) {
  511.         $permission $this->userPermissionUtil->getPermission(
  512.             "financial"
  513.             "transaction"
  514.             "see"
  515.         );
  516.         if($this->userPermissionUtil->isLow($permission)){
  517.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  518.         }
  519.         $transactionId $request->get('id');
  520.         $transaction $this->repository->findOneBy([
  521.             "id" => $transactionId,
  522.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  523.         ]);
  524.         if (!$transaction) {
  525.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  526.         }
  527.         $debug = ($this->user->getId() == TransactionEnum::YES);
  528.         $result $this->repository->processInvoiceTransaction($transaction$debug);
  529.         if(!$result){
  530.             return $this->eadResponse([ "debug" => $debug ], ErrorEnum::ACTION_INVALID);
  531.         }
  532.         $this->em->flush();
  533.         return $this->eadResponse([ "success" => 1"debug" => $debug ]);
  534.     }
  535.     /**
  536.      * @Route(
  537.      *      path          = "/register",
  538.      *      methods       = {"POST"},
  539.      * )
  540.      */
  541.     public function registerTransaction(Request $request) {
  542.         $permission $this->userPermissionUtil->getPermission(
  543.             "financial"
  544.             "transaction"
  545.             "create"
  546.         );
  547.         if($this->userPermissionUtil->isLow($permission)){
  548.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  549.         }
  550.         $this->requestUtil->setRequest($request)->setData();
  551.         $transaction = new Transaction();
  552.         if($this->requestUtil->issetField('paymentMethod')){
  553.             $transaction->setPaymentMethod(
  554.                 (int)$this->requestUtil->getField('paymentMethod')
  555.             );
  556.         }
  557.         if($this->requestUtil->issetField('amount')){
  558.             $transaction->setAmount($this->requestUtil->getField('amount'));
  559.         }
  560.         if($this->requestUtil->issetField('hashReference')){
  561.             $transaction->setHashReference($this->requestUtil->getField('hashReference'));
  562.         }
  563.         if($this->requestUtil->issetField('hash')){
  564.             $transaction->setHash($this->requestUtil->getField('hash'));
  565.         }
  566.         if($this->requestUtil->issetField('status')){
  567.             $transaction->setStatus((int)$this->requestUtil->getField('status'));
  568.         }
  569.         $transaction->setGateway(TransactionEnum::MANUAL);
  570.         $transaction->setOrigin(TransactionEnum::ORIGIN_MANUAL);
  571.         if($this->requestUtil->issetField('user')){
  572.             $userId = (int)$this->requestUtil->getField('user');
  573.             if($userId 0){
  574.                 $user $this->em->getRepository(User::class)->findOneBy([
  575.                     "id" => $userId,
  576.                     "deleted" => TransactionEnum::ITEM_NO_DELETED
  577.                 ]);
  578.                 
  579.                 if($user){
  580.                     $transaction->setUser($user);
  581.                 }
  582.             }
  583.         }
  584.         $errors $this->validateEntity($transaction);
  585.         if($errors){
  586.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  587.         }
  588.         $products json_decode($this->requestUtil->getField('products'));
  589.         if(empty($products) || count($products) == 0){
  590.             return $this->eadResponse([ "products" ], ErrorEnum::FIELD_EMPTY);
  591.         }
  592.         $enrollUser TransactionEnum::NO;
  593.         if($this->requestUtil->issetField('enroll')){
  594.             $enrollUser = (int)$this->requestUtil->getField('enroll');
  595.         }
  596.         $this->em->persist($transaction);
  597.         $this->repository->processTransactionRegister(
  598.             $transaction
  599.             $products
  600.             $enrollUser
  601.         );
  602.         $this->em->flush();
  603.         $data $transaction->toReturn();
  604.         $this->userLogService->logInsert("transaction"$transaction->getId(), $data);
  605.         return $this->eadResponse($data);
  606.     }
  607.     /**
  608.      * @Route(
  609.      *      path          = "/edit/{id}",
  610.      *      methods       = {"PUT"},
  611.      *      requirements  = { "id" = "\d+" }
  612.      * )
  613.      */
  614.     public function editTransaction(Request $request) {
  615.         $permission $this->userPermissionUtil->getPermission(
  616.             "financial"
  617.             "transaction"
  618.             "edit"
  619.         );
  620.         if($this->userPermissionUtil->isLow($permission)){
  621.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  622.         }
  623.         $transactionId $request->get('id');
  624.         $transaction $this->repository->findOneBy([
  625.             "id" => $transactionId,
  626.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  627.         ]);
  628.         if (!$transaction) {
  629.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  630.         }
  631.         if($transaction->getGateway() == TransactionEnum::EAD_CHECKOUT){
  632.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  633.         }
  634.         $this->requestUtil->setRequest($request)->setData();
  635.         if($this->requestUtil->issetField('hashReference')){
  636.             $transaction->setHashReference($this->requestUtil->getField('hashReference'));
  637.         }
  638.         if($this->requestUtil->issetField('hash')){
  639.             $transaction->setHash($this->requestUtil->getField('hash'));
  640.         }
  641.         if($this->requestUtil->issetField('paymentMethod')){
  642.             $transaction->setPaymentMethod(
  643.                 (int)$this->requestUtil->getField('paymentMethod')
  644.             );
  645.         }
  646.         if($this->requestUtil->issetField('status')){
  647.             $transaction->setStatus((int)$this->requestUtil->getField('status'));
  648.         }
  649.         if($this->requestUtil->issetField('gateway')){
  650.             $transaction->setGateway((int)$this->requestUtil->getField('gateway'));
  651.         }
  652.         if($this->requestUtil->issetField('currencyCode')){
  653.             $transaction->setCurrencyCode($this->requestUtil->getField('currencyCode'));
  654.         }
  655.         if($this->requestUtil->issetField('currencySymbol')){
  656.             $transaction->setCurrencySymbol(
  657.                 $this->requestUtil->getField('currencySymbol')
  658.             );
  659.         }
  660.         if($this->requestUtil->issetField('amount')){
  661.             $transaction->setAmount($this->requestUtil->getField('amount'));
  662.         }
  663.         if($this->requestUtil->issetField('interestAmount')){
  664.             $transaction->setInterestAmount(
  665.                 $this->requestUtil->getField('interestAmount')
  666.             );
  667.         }
  668.         if($this->requestUtil->issetField('totalAmount')){
  669.             $transaction->setTotalAmount($this->requestUtil->getField('totalAmount'));
  670.         }
  671.         if($this->requestUtil->issetField('rate')){
  672.             $transaction->setRate($this->requestUtil->getField('rate'));
  673.         }
  674.         if($this->requestUtil->issetField('fee')){
  675.             $transaction->setFee($this->requestUtil->getField('fee'));
  676.             $transaction->setFeeGateway($this->requestUtil->getField('fee'));
  677.         }
  678.         if($this->requestUtil->issetField('feeAmount')){
  679.             $transaction->setFeeAmount($this->requestUtil->getField('feeAmount'));
  680.         }
  681.         if($this->requestUtil->issetField('feeInterest')){
  682.             $transaction->setFeeInterest($this->requestUtil->getField('feeInterest'));
  683.         }
  684.         if($this->requestUtil->issetField('feeTotalAmount')){
  685.             $transaction->setFeeTotalAmount(
  686.                 $this->requestUtil->getField('feeTotalAmount')
  687.             );
  688.         }
  689.         if($this->requestUtil->issetField('netAmount')){
  690.             $transaction->setNetAmount($this->requestUtil->getField('netAmount'));
  691.         }
  692.         if($this->requestUtil->issetField('netInterestAmount')){
  693.             $transaction->setNetInterestAmount($this->requestUtil->getField('netInterestAmount'));
  694.         }
  695.         if($this->requestUtil->issetField('netTotalAmount')){
  696.             $transaction->setNetTotalAmount($this->requestUtil->getField('netTotalAmount'));
  697.         }
  698.         if($this->requestUtil->issetField('feeAnticipation')){
  699.             $transaction->setFeeAnticipation(
  700.                 $this->requestUtil->getField('feeAnticipation')
  701.             );
  702.         }
  703.         if($this->requestUtil->issetField('anticipationAmount')){
  704.             $transaction->setAnticipationAmount($this->requestUtil->getField('anticipationAmount'));
  705.         }
  706.         if($this->requestUtil->issetField('installments')){
  707.             $transaction->setInstallments($this->requestUtil->getField('installments'));
  708.         }
  709.         if($this->requestUtil->issetField('numberItems')){
  710.             $transaction->setNumberItems($this->requestUtil->getField('numberItems'));
  711.         }
  712.         if($this->requestUtil->issetField('paid')){
  713.             $transaction->setPaid($this->requestUtil->getField('paid'));
  714.         }
  715.         if($this->requestUtil->issetField('anticipated')){
  716.             $transaction->setAnticipated((int)$this->requestUtil->getField('anticipated'));
  717.         }
  718.         if($this->requestUtil->issetField('eadpaymentAmount')){
  719.             $transaction->setEadpaymentAmount($this->requestUtil->getField('eadpaymentAmount'));
  720.         }
  721.         if($this->requestUtil->issetField('dateUpdateGateway')){
  722.             $transaction->setDateUpdateGateway($this->requestUtil->getField('dateUpdateGateway'));
  723.         }
  724.         if($this->requestUtil->issetField('dateApprove')){
  725.             $transaction->setDateApprove($this->requestUtil->getField('dateApprove'));
  726.         }
  727.         if($this->requestUtil->issetField('billLink')){
  728.             $transaction->setBillLink($this->requestUtil->getField('billLink'));
  729.         }
  730.         if($this->requestUtil->issetField('billCode')){
  731.             $transaction->setBillCode($this->requestUtil->getField('billCode'));
  732.         }
  733.         if($this->requestUtil->issetField('pixCode')){
  734.             $transaction->setPixCode($this->requestUtil->getField('pixCode'));
  735.         }
  736.         if($this->requestUtil->issetField('dateExpire')){
  737.             $transaction->setDateExpire($this->requestUtil->getField('dateExpire'));
  738.         }
  739.         if($this->requestUtil->issetField('user')){
  740.             $userId = (int)$this->requestUtil->getField('user');
  741.             if($userId 0){
  742.                 $user $this->em->getRepository(User::class)->findOneBy([
  743.                     "id" => $userId,
  744.                     "deleted" => TransactionEnum::ITEM_NO_DELETED
  745.                 ]);
  746.                 
  747.                 if($user){
  748.                     $transaction->setUser($user);
  749.                 }
  750.             }
  751.         }
  752.         if($this->requestUtil->issetField('userCheckoutInfo')){
  753.             $userCheckoutInfoId = (int)$this->requestUtil->getField('userCheckoutInfo');
  754.             if($userCheckoutInfoId 0){
  755.                 $userCheckoutInfo $this->em->getRepository(User::class)->findOneBy([
  756.                     "id" => $userCheckoutInfoId,
  757.                     "deleted" => TransactionEnum::ITEM_NO_DELETED
  758.                 ]);
  759.                 
  760.                 if($userCheckoutInfo){
  761.                     $transaction->setUserCheckoutInfo($userCheckoutInfo);
  762.                 }
  763.             }
  764.         }
  765.         $errors $this->validateEntity($transaction);
  766.         
  767.         if($errors){
  768.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  769.         }
  770.         
  771.         $this->em->flush();
  772.         $data $transaction->toReturn();
  773.         $this->userLogService->logUpdate("transaction"$transaction->getId(), $data);
  774.         return $this->eadResponse($data);
  775.     }
  776.     /**
  777.      * @Route(
  778.      *      path          = "/statement/{id}",
  779.      *      methods       = {"GET"},
  780.      *      requirements  = { "id" = "\d+" }
  781.      * )
  782.      */
  783.     public function getTransactionBankStatement(Request $request) {
  784.         $permission $this->userPermissionUtil->getPermission(
  785.             "financial"
  786.             "transaction"
  787.             "see"
  788.         );
  789.         if($this->userPermissionUtil->isLow($permission)){
  790.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  791.         }
  792.         $transactionId $request->get('id');
  793.         $transaction $this->repository->findOneBy([
  794.             "id" => $transactionId,
  795.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  796.         ]);
  797.         if (!$transaction) {
  798.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  799.         }
  800.         $trXReceiverRepository $this->em->getRepository(TransactionXReceiver::class);
  801.         $transactionReceivers $trXReceiverRepository->findBy([
  802.             "transaction" => $transactionId
  803.         ]);
  804.         $bankStatements = [];
  805.         foreach ($transactionReceivers as $key => $transactionReceiver) {
  806.             $bankStatements[] = [
  807.                 "receiverId" => $transactionReceiver->getReceiver()->getId(),
  808.                 "receiverName" => $transactionReceiver->getReceiver()->getLegalName(),
  809.                 "receiverType" => $transactionReceiver->getReceiver()->getType(),
  810.                 "paymentMethod" => $transaction->getPaymentMethod(),
  811.             ];
  812.         }
  813.         return $this->eadResponse($bankStatements);
  814.     }
  815.     /**
  816.      * @Route(
  817.      *      path          = "/statement/{id}/receiver/{receiverId}",
  818.      *      methods       = {"GET"},
  819.      *      requirements  = { "id" = "\d+", "receiverId" = "\d+" }
  820.      * )
  821.      */
  822.     public function getTransactionBankStatementPayments(Request $request) {
  823.         $permission $this->userPermissionUtil->getPermission(
  824.             "financial"
  825.             "transaction"
  826.             "see"
  827.         );
  828.         if($this->userPermissionUtil->isLow($permission)){
  829.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  830.         }
  831.         $transactionId $request->get('id');
  832.         $receiverId $request->get('receiverId');
  833.         $transaction $this->repository->findOneBy([
  834.             "id" => $transactionId,
  835.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  836.         ]);
  837.         if (!$transaction) {
  838.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  839.         }
  840.         $pagarMeTransaction $this->generalService->getService(
  841.             'PagarMe\\PagarMeTransaction'
  842.         );
  843.         $transactionService $this->generalService->getService(
  844.             'Transaction\\TransactionService'
  845.         );
  846.         $trXReceiverRepository $this->em->getRepository(TransactionXReceiver::class);
  847.         $transactionReceiver $trXReceiverRepository->findOneBy([
  848.             "transaction" => $transactionId,
  849.             "receiver" => $receiverId,
  850.         ]);
  851.         if (!$transactionReceiver) {
  852.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  853.         }
  854.         $payments $transactionService->getStatementByTransactionReceiver(
  855.             $transaction
  856.             $transactionReceiver->getReceiver()
  857.         );
  858.         return $this->eadResponse([ "payments" => $payments ]);
  859.     }
  860.     /**
  861.      * @Route(
  862.      *      path          = "/receivers/{id}",
  863.      *      methods       = {"GET"},
  864.      *      requirements  = { "id" = "\d+" }
  865.      * )
  866.      */
  867.     public function getReceiversByTransaction(Request $request){
  868.         $permission $this->userPermissionUtil->getPermission(
  869.             "financial"
  870.             "transaction"
  871.             "refund"
  872.         );
  873.         if($this->userPermissionUtil->isLow($permission)){
  874.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  875.         }
  876.         $transactionId $request->get('id');
  877.         $transaction $this->repository->findOneBy([
  878.             "id" => $transactionId,
  879.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  880.         ]);
  881.         if (!$transaction) {
  882.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  883.         }
  884.         if($transaction->getGateway() != TransactionEnum::EAD_CHECKOUT){
  885.             return $this->eadResponse([ 
  886.                 "message" => "Action invalid" 
  887.             ], ErrorEnum::ACTION_INVALID);
  888.         }
  889.         $trXReceiverRepository $this->em->getRepository(TransactionXReceiver::class);
  890.         $trXReceivers $trXReceiverRepository->getReceiversByTransaction($transactionId);
  891.         $data = [];
  892.         foreach ($trXReceivers as $key => $trXReceiver) {
  893.             $data[] = $trXReceiver->toReturn();
  894.         }
  895.         return $this->eadResponse($data);
  896.     }
  897.     /**
  898.      * @Route(
  899.      *      path          = "/refund/{id}",
  900.      *      methods       = {"PUT"},
  901.      *      requirements  = { "id" = "\d+" }
  902.      * )
  903.      */
  904.     public function refundTransaction(Request $request) {
  905.         $permission $this->userPermissionUtil->getPermission(
  906.             "financial"
  907.             "transaction"
  908.             "refund"
  909.         );
  910.         if($this->userPermissionUtil->isLow($permission)){
  911.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  912.         }
  913.         $this->requestUtil->setRequest($request)->setData();
  914.         $transactionId $request->get('id');
  915.         $transaction $this->repository->findOneBy([
  916.             "id" => $transactionId,
  917.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  918.         ]);
  919.         if (!$transaction) {
  920.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  921.         }
  922.         if($transaction->getGateway() != TransactionEnum::EAD_CHECKOUT){
  923.             return $this->eadResponse([ 
  924.                 "message" => "Action invalid" 
  925.             ], ErrorEnum::ACTION_INVALID);
  926.         }
  927.         if(!$transaction->getAllowRefund()){
  928.             return $this->eadResponse([ 
  929.                 "message" => "Action invalid" 
  930.             ], ErrorEnum::ACTION_INVALID);
  931.         }
  932.         $pagarMeTransaction $this->generalService->getService(
  933.             'PagarMe\\PagarMeTransaction'
  934.         );
  935.         $pagarMeBankAccount $this->generalService->getService(
  936.             'PagarMe\\PagarMeBankAccount'
  937.         );
  938.         $numberUtil $this->generalService->getUtil('NumberUtil');
  939.         $amount $this->requestUtil->getField('amount');
  940.         
  941.         $rSplits = (array)json_decode(
  942.             $this->requestUtil->getField('receiverSplits')
  943.         );
  944.         $cancelEnrollments = (int)$this->requestUtil->getField('cancelEnrollments');
  945.         $cancelUserSubscriptions = (int)$this->requestUtil->getField(
  946.             'cancelUserSubscriptions'
  947.         );
  948.         
  949.         $amountCent $numberUtil->numberToCents($amount);
  950.         $bankHash null;
  951.         if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_BILL){
  952.             $bankAccountData = [
  953.                 "bankCode" => $this->requestUtil->getField('bankCode'),
  954.                 "agency" => $this->requestUtil->getField('agency'),
  955.                 "agencyDv" => $this->requestUtil->getField('agencyDv'),
  956.                 "account" => $this->requestUtil->getField('account'),
  957.                 "accountDv" => (int)$this->requestUtil->getField('accountDv'),
  958.                 "documentNumber" => $this->requestUtil->getField('documentNumber'),
  959.                 "legalName" => $this->requestUtil->getField('legalName'),
  960.                 "type" => $this->requestUtil->getField('bankAccountType')
  961.             ];
  962.             $emptyDataBank = [];
  963.             foreach ($bankAccountData as $key => $value) {
  964.                 if(empty($value) && $key != "agencyDv" && $key != "accountDv"){
  965.                     $emptyDataBank[] = $key;
  966.                 }
  967.             }
  968.             if(!empty($emptyDataBank)){
  969.                 return $this->eadResponse($emptyDataBankErrorEnum::FIELD_EMPTY);
  970.             }
  971.             $bankAccountDTO = new PagarMeBankAccountDTO($bankAccountData);
  972.             $bankAccount $pagarMeBankAccount->create($bankAccountDTO);
  973.             $bankHash $bankAccount->id;
  974.             if(empty($bankHash)){
  975.                 return $this->eadResponse([], ErrorEnum::ACTION_INVALID);
  976.             }
  977.         }
  978.         if($amount <= 0){
  979.             return $this->eadResponse([ 
  980.                 "message" => "Amount invalid!" 
  981.             ], ErrorEnum::ACTION_INVALID);
  982.         }
  983.         if(empty($amount)){
  984.             return $this->eadResponse([ 
  985.                 "message" => "Amount invalid!!" 
  986.             ], ErrorEnum::ACTION_INVALID);
  987.         }
  988.         if(empty($rSplits)){
  989.             return $this->eadResponse([ 
  990.                 "message" => "Receivers not found!" 
  991.             ], ErrorEnum::FIELD_EMPTY);
  992.         }
  993.         if(count($rSplits) == 0){
  994.             return $this->eadResponse([ 
  995.                 "message" => "Receivers not found!!" 
  996.             ], ErrorEnum::FIELD_EMPTY);
  997.         }
  998.         $transactionId $transaction->getId();
  999.         $trXReceiverRepository $this->em->getRepository(TransactionXReceiver::class);
  1000.         $trXReceivers $trXReceiverRepository->getReceiversByTransaction($transactionId);
  1001.         $transactionPagarMe $pagarMeTransaction->get($transaction->getHash());
  1002.         $userSubscriptionRepository $this->em->getRepository(UserSubscription::class);
  1003.         if(count($trXReceivers) == 0){
  1004.             return $this->eadResponse([ 
  1005.                 "message" => "Receivers not found!!!" 
  1006.             ], ErrorEnum::FIELD_EMPTY);
  1007.         }
  1008.         $amountPaid $transaction->getAmount();
  1009.         $amountPaidCent $numberUtil->numberToCents($amountPaid);
  1010.         $transactionRefundRepository $this->em->getRepository(TransactionRefund::class);
  1011.         $amountRefund $transactionRefundRepository->sumRefundValueByTransaction(
  1012.             $transactionId
  1013.         );
  1014.         
  1015.         $amountRefundCent $numberUtil->numberToCents($amountRefund);
  1016.         $amountPaidCent $amountPaidCent $amountRefundCent;
  1017.         if($transactionPagarMe->amount < ($amountCent $amountRefundCent)){
  1018.             return $this->eadResponse([ 
  1019.                 "message" => "Amount invalid!!!" 
  1020.             ], ErrorEnum::ACTION_INVALID);
  1021.         }
  1022.         $refundAll false;
  1023.         if($amountPaidCent == $amountCent){
  1024.             $refundAll true;
  1025.         }
  1026.         if($amountCent == $transactionPagarMe->amount){
  1027.             $refundAll true;
  1028.         }
  1029.         $transactionService $this->generalService->getService(
  1030.             'Transaction\\TransactionService'
  1031.         );
  1032.             
  1033.         $checkoutAmountsEAD $transactionService->getEADCheckoutAmountFixedFee(
  1034.             $amount
  1035.             $transaction->getRate(),
  1036.             $transaction->getFee(),
  1037.             $transaction->getFeeGateway(),
  1038.             false
  1039.         );
  1040.         $amountCentPartial $checkoutAmountsEAD->amountTotalCents;
  1041.         $amountEAD $checkoutAmountsEAD->amountEADCents;
  1042.         foreach ($trXReceivers as $key => $trXReceiver) {
  1043.             $receiver $trXReceiver->getReceiver();
  1044.             $receiverId $receiver->getId();
  1045.             if(!empty($rSplits[$receiverId])){
  1046.                 if(!isset($rSplits[$receiverId]->percent)){
  1047.                     $rSplits[$receiverId]->percent 0;
  1048.                 }
  1049.                 if(
  1050.                     $rSplits[$receiverId]->responsible == TransactionEnum::YES || 
  1051.                     $refundAll
  1052.                 ){
  1053.                     
  1054.                     $rSplits[$receiverId]->type $trXReceiver->getType();
  1055.                     $rSplits[$receiverId]->receiver $receiver;
  1056.                     $rSplits[$receiverId]->receiverId $receiverId;
  1057.                     $rSplits[$receiverId]->receiverHash $receiver->getReceiverHash();
  1058.                     $rSplits[$receiverId]->splitRuleHash $trXReceiver->getSplitRuleHash();
  1059.                     $receiverAmount $amountCentPartial * ( 
  1060.                         $rSplits[$receiverId]->percent 100 
  1061.                     );
  1062.                     $rSplits[$receiverId]->amount round($receiverAmount);
  1063.                     if($rSplits[$receiverId]->type == TransactionXReceiverEnum::SCHOOL){
  1064.                         if(
  1065.                             $transaction->getPaymentMethod() == TransactionEnum::PAYMENT_BILL
  1066.                         ){
  1067.                             $rSplits[$receiverId]->amount += 200;
  1068.                             $bankAccount $pagarMeBankAccount->get($bankHash);
  1069.                             if($pagarMeBankAccount->isBradesco($bankAccount->bank_code)){
  1070.                                 $rSplits[$receiverId]->amount += 280;
  1071.                             }
  1072.                         }
  1073.                     }
  1074.                     if(!empty($rSplits[$receiverId]->amount)){
  1075.                         $hasBalance $pagarMeTransaction->receiverHasBalance(
  1076.                             $rSplits[$receiverId]->amount,
  1077.                             $transaction->getHash(),
  1078.                             $transactionId,
  1079.                             $rSplits[$receiverId]->receiverHash,
  1080.                             ($rSplits[$receiverId]->type == TransactionXReceiverEnum::SCHOOL),
  1081.                             $refundAll,
  1082.                             $transaction->getPaymentMethod()
  1083.                         );
  1084.                         if(!$hasBalance){
  1085.                             $transactionReceiverAmount $pagarMeTransaction->getReceiverAmount(
  1086.                                 $transaction->getHash(), 
  1087.                                 $rSplits[$receiverId]->receiverHash
  1088.                             );
  1089.                             return $this->eadResponse([ 
  1090.                                 "message" => "Receiver Amount invalid!",
  1091.                                 "receiverId" => $receiverId,
  1092.                                 "amountReceiver" => $rSplits[$receiverId]->amount,
  1093.                                 "refundAll" => $refundAll,
  1094.                                 "transactionReceiverAmount" => $transactionReceiverAmount,
  1095.                                 "amountCentPartial" => $amountCentPartial,
  1096.                                 "amountEAD" => $amountEAD,
  1097.                                 "percent" => $rSplits[$receiverId]->percent,
  1098.                             ], ErrorEnum::ACTION_INVALID);
  1099.                         }
  1100.                     }
  1101.                     if($rSplits[$receiverId]->type == TransactionXReceiverEnum::SCHOOL){
  1102.                         $paymentMethod $transaction->getPaymentMethod();
  1103.                         if($paymentMethod == TransactionEnum::PAYMENT_BILL){
  1104.                             $rSplits[$receiverId]->amount -= 200;
  1105.                             $bankAccount $pagarMeBankAccount->get($bankHash);
  1106.                             if($pagarMeBankAccount->isBradesco($bankAccount->bank_code)){
  1107.                                 $rSplits[$receiverId]->amount -= 280;
  1108.                             }
  1109.                         }
  1110.                     }
  1111.                 }
  1112.             }
  1113.         }
  1114.         $refundParameters = [ "id" => $transaction->getHash() ];
  1115.         if(
  1116.             $transaction->getPaymentMethod() == TransactionEnum::PAYMENT_BILL && 
  1117.             !empty($bankHash)
  1118.         ){
  1119.             $refundParameters["bank_account_id"] = $bankHash;
  1120.         }
  1121.         $transaction->setStatus(TransactionEnum::APPROVED);
  1122.         if($refundAll){
  1123.             $transaction->setStatus(TransactionEnum::REPAYMENT_IN_PROGRESS);
  1124.         }else{
  1125.             $refundParameters["amount"] = $amountCent;
  1126.             $isSchool false;
  1127.             $splitRules = [];
  1128.             $totalSplit 0;
  1129.             foreach ($rSplits as $key => $receiverSplit) {
  1130.                 if($receiverSplit->responsible == TransactionContestEnum::YES){
  1131.                     $chargeProcessingFee false;
  1132.                     $liable false;
  1133.                     
  1134.                     if($receiverSplit->type == TransactionXReceiverEnum::SCHOOL){
  1135.                         $chargeProcessingFee true;
  1136.                         $liable true;
  1137.                         $isSchool true;
  1138.                     }
  1139.                     $totalSplit $totalSplit $receiverSplit->amount;
  1140.                     $splitRules[] = (object)[
  1141.                         "id" => $receiverSplit->splitRuleHash,
  1142.                         "recipient_id" => $receiverSplit->receiverHash,
  1143.                         "charge_processing_fee" => $chargeProcessingFee,
  1144.                         "liable" => $liable,
  1145.                         "percentage" => null,
  1146.                         "amount" => $receiverSplit->amount,
  1147.                         "date_created" => date('Y-m-d H:i:s'),
  1148.                         "date_updated" => date('Y-m-d H:i:s')
  1149.                     ];
  1150.                 }
  1151.             }
  1152.             if(!$isSchool){
  1153.                 $trXReceiverSchool $trXReceiverRepository->getSchoolReceiverByTransaction(
  1154.                     $transactionId
  1155.                 );
  1156.                 $splitRules[] = (object)[
  1157.                     "id" => $trXReceiverSchool->getSplitRuleHash(),
  1158.                     "recipient_id" => $trXReceiverSchool->getReceiver()->getReceiverHash(),
  1159.                     "charge_processing_fee" => true,
  1160.                     "liable" => true,
  1161.                     "percentage" => null,
  1162.                     "amount" => 0,
  1163.                     "date_created" => date('Y-m-d H:i:s'),
  1164.                     "date_updated" => date('Y-m-d H:i:s')
  1165.                 ];
  1166.             }
  1167.             $eadSplitId $pagarMeTransaction->getEADSplitIdByTransaction(
  1168.                 $transactionPagarMe
  1169.             );
  1170.             $totalSplit $totalSplit $amountEAD;
  1171.             if($totalSplit $amountCent){
  1172.                 $diff $totalSplit $amountCent;
  1173.                 $amountEAD $amountEAD $diff;
  1174.             }
  1175.                 
  1176.             $splitRules[] = (object)[
  1177.                 "id" => $eadSplitId,
  1178.                 "recipient_id" => $pagarMeTransaction->getReceiverIdEAD(),
  1179.                 "charge_processing_fee" => false,
  1180.                 "liable" => false,
  1181.                 "percentage" => null,
  1182.                 "amount" => $amountEAD,
  1183.                 "date_created" => date('Y-m-d H:i:s'),
  1184.                 "date_updated" => date('Y-m-d H:i:s')
  1185.             ];
  1186.             $refundParameters['split_rules'] = $splitRules;
  1187.         }
  1188.         $transactionContests $this->em->getRepository(TransactionContest::class)->findBy([
  1189.             "transaction" => $transaction->getId(),
  1190.             "status" => TransactionContestEnum::WAITING,
  1191.         ]);
  1192.         foreach ($transactionContests as $key => $transactionContest) {
  1193.             $transactionContest->setAmount($amount);
  1194.             $transactionContest->setStatus(TransactionContestEnum::APPROVED);
  1195.             $transactionContest->setNote("Finalizado por reembolso");
  1196.             $transactionContest->setDateEnd(date('Y-m-d H:i:s'));
  1197.         }
  1198.         if($this->debug){
  1199.             $discordService $this->generalService->getService('DiscordService');
  1200.             $discordService->setChannel('debug');
  1201.             $discordService->setMessage(json_encode($refundParameters));
  1202.             $discordService->sendDiscord();
  1203.         }
  1204.         $pagarMeTransaction->refund($refundParameters);
  1205.         if($cancelEnrollments == TransactionEnum::YES){
  1206.             $enrollments $transaction->getEnrollment();
  1207.             foreach ($enrollments as $key => $enrollment) {
  1208.                 $enrollment->setStatus(EnrollmentEnum::STATUS_CANCELED);
  1209.             }
  1210.         }
  1211.         // send marketing
  1212.         $marketingService $this->generalService->getService(
  1213.             'Marketing\\MarketingService'
  1214.         );
  1215.         if($cancelUserSubscriptions == TransactionEnum::YES){
  1216.             $userSubscriptions $transaction->getUserSubscription();
  1217.             foreach ($userSubscriptions as $key => $userSubscription) {
  1218.                 $userSubscription->setStatus(UserSubscriptionEnum::STATUS_CANCELED);
  1219.                 $userSubscription->setCancelReason(UserSubscriptionEnum::CANCELED_BY_REFUND);
  1220.                 
  1221.                 $userSubscription->setDateNextPayment(date('Y-m-d'));
  1222.                 $userSubscription->setDateCancel(date('Y-m-d'));
  1223.                 $userSubscription->setDateExpiration(null);
  1224.                 $marketingService->setTag(TagsMarketingEnum::TAG_CANCELED_SUBSCRIPTION);
  1225.                 $marketingService->setTextComplement(
  1226.                     $userSubscription->getProduct()->getTitle()
  1227.                 );
  1228.                 $marketingService->setUser($userSubscription->getUser());
  1229.                 $marketingService->send();
  1230.             }
  1231.         }
  1232.         $transactionRefund = new TransactionRefund();
  1233.         $transactionRefund->setAmount($amount);
  1234.         $transactionRefund->setTransaction($transaction);
  1235.         if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_BILL){
  1236.             $transactionRefund->setBankHash($bankHash);
  1237.         }
  1238.         $this->em->persist($transactionRefund);
  1239.         $commissionRepository $this->em->getRepository(Commission::class);
  1240.         foreach ($rSplits as $key => $receiverSplit) {
  1241.             if(
  1242.                 $receiverSplit->responsible == TransactionEnum::YES && 
  1243.                 !empty($receiverSplit->receiver)
  1244.             ){
  1245.                 $transactionRefundReceiver = new TransactionRefundReceiver();
  1246.                 $transactionRefundReceiver->setAmount(
  1247.                     $numberUtil->centsToNumber($receiverSplit->amount)
  1248.                 );
  1249.                 $transactionRefundReceiver->setPercent($receiverSplit->percent);
  1250.                 $transactionRefundReceiver->setReceiver($receiverSplit->receiver);
  1251.                 $transactionRefundReceiver->setTransactionRefund($transactionRefund);
  1252.                 $errors $this->validateEntity($transactionRefundReceiver);
  1253.                 if(!$errors){
  1254.                     $this->em->persist($transactionRefundReceiver);
  1255.                 }else{
  1256.                     return $this->eadResponse($transactionRefundReceiver$errors);
  1257.                 }
  1258.                 
  1259.                 $commissions $commissionRepository->getByReceiverAndTransaction(
  1260.                     $transactionId
  1261.                     $receiverSplit->receiverId
  1262.                 );
  1263.                 foreach ($commissions as $keyCommission => $commission) {
  1264.                     $commRefAmount round(
  1265.                         ($receiverSplit->amount 100) / count($commissions), 2
  1266.                     );
  1267.                     $commRefAmount $commission->getRefundAmount() + $commRefAmount;
  1268.                     $commission->setRefundAmount($commRefAmount);
  1269.                 }
  1270.             }
  1271.         }
  1272.         $this->repository->processInvoiceTransaction($transaction);
  1273.         $this->em->flush();
  1274.         if(!$refundAll){
  1275.             $emailService $this->generalService->getService('EmailService');
  1276.             $notificationService $this->generalService->getService('NotificationService');
  1277.             
  1278.             $this->requestUtil->setRequest($request)->setData();
  1279.             //send email partial refund
  1280.             $email $this->requestUtil->getField('email');
  1281.                 
  1282.             $user $transaction->getUser();
  1283.             if(empty($email)){
  1284.                 $email $user->getEmail();
  1285.             }
  1286.             $hash $this->stringUtil->encodeHex($transactionId);
  1287.             $domain "https://{$this->client->getDomainPrimary()}";
  1288.             if($emailService->checkUserToSend($user)){
  1289.                 $emailService->setToEmail($email);
  1290.                 $emailService->setToName($user->getName());
  1291.                 $subText $this->configuration->getLanguage('new_message.subject''email');
  1292.                 $emailService->setSubject(
  1293.                     "{$subText} - {$transaction->getHash()} - {$this->client->getBrand()}"
  1294.                 );
  1295.                 
  1296.                 $emailService->setData([
  1297.                     "userName" => $user->getName(),
  1298.                     "btnLink" => "{$domain}/transaction/refund/view/{$hash}",
  1299.                 ]);
  1300.                 $emailService->setTemplateBody("repayment");
  1301.                 $emailService->send();
  1302.             }
  1303.             $notificationService->create(
  1304.                 $this->user,
  1305.                 $user,
  1306.                 NotificationEnum::ORIGIN_TRANSACTION_REPAYMENT_PARTIAL,
  1307.                 $transaction->getId()
  1308.             );
  1309.         }
  1310.         $data $transaction->toReturn();
  1311.         $this->userLogService->logUpdate("transaction"$transaction->getId(), $data);
  1312.         return $this->eadResponse([ "message" => "Success" ]);
  1313.     }
  1314.     /**
  1315.      * @Route(
  1316.      *      path          = "/send/email/{id}",
  1317.      *      methods       = {"POST"},
  1318.      *      name          = "sendTransactionEmail",
  1319.      *      requirements  = { "id" = "\d+" }
  1320.      * )
  1321.      */
  1322.     public function sendTransactionEmail(Request $request) {
  1323.         $permission $this->userPermissionUtil->getPermission(
  1324.             "financial"
  1325.             "transaction"
  1326.             "send"
  1327.         );
  1328.         $this->requestUtil->setRequest($request)->setData();
  1329.         $client $this->configuration->getClient();
  1330.         $brand $client->getBrand();
  1331.         $domainPrimary $client->getDomainPrimary();
  1332.         $transactionId $request->get('id');
  1333.         $transaction $this->repository->findOneBy([
  1334.             "id" => $transactionId,
  1335.             "deleted" => TransactionEnum::ITEM_NO_DELETED
  1336.         ]);
  1337.         if (!$transaction) {
  1338.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1339.         }
  1340.         if($transaction->getUser()->getId() != $this->user->getId()){
  1341.             if($this->userPermissionUtil->isLow($permission)){
  1342.                 return $this->eadResponse(nullErrorEnum::PERMISSION);
  1343.             }
  1344.         }
  1345.         if($transaction->getPaymentMethod() == TransactionEnum::PAYMENT_CARD){
  1346.             return $this->eadResponse([ 
  1347.                 "message" => "Transaction is not able" 
  1348.             ], ErrorEnum::ACTION_INVALID);
  1349.         }
  1350.         $email $this->requestUtil->getField('email');
  1351.         $user $transaction->getUser();
  1352.         if(empty($email)){
  1353.             $email $user->getEmail();
  1354.         }
  1355.         $emailService $this->generalService->getService('EmailService');
  1356.         if($emailService->checkUserToSend($user) || $email != $user->getEmail()){
  1357.             $emailService->setToEmail($email);
  1358.             $emailService->setToName($user->getName());
  1359.             $transactionItems $this->em->getRepository(TransactionItem::class)->findBy([ 
  1360.                 "transaction" => $transaction->getId(),
  1361.                 "deleted" => TransactionEnum::ITEM_NO_DELETED
  1362.             ]);
  1363.             $isCharge false;
  1364.             foreach ($transactionItems as $key => $value) {
  1365.                 if($value->getType() == TransactionItemEnum::CHARGE){
  1366.                     $isCharge true;
  1367.                 }
  1368.             }
  1369.             $domainPrimary $this->client->getDomainPrimary();
  1370.             $url "https://{$domainPrimary}/transaction/{$transaction->getHash()}";
  1371.             $emailService->setData([
  1372.                 "transaction" => $transaction,
  1373.                 "userName" => $user->getName(),
  1374.                 "statusString" => $this->repository->stringStatus(
  1375.                     $transaction->getStatus()
  1376.                 ),
  1377.                 "paymentMethodString" => $this->repository->stringPaymentMethod(
  1378.                     $transaction->getPaymentMethod()
  1379.                 ),
  1380.                 "itens" => $transactionItems,
  1381.                 "btnLink" => $url,
  1382.                 "isCharge" => $isCharge,
  1383.                 "isBuyer" => true,
  1384.             ]);
  1385.             
  1386.             $emailService->setSubject(
  1387.                 $this->repository->getEmailSubjectPaymentStatus($transaction->getStatus())
  1388.             );
  1389.             $emailService->setTemplateBody("payment");
  1390.             $emailService->send();
  1391.             return $this->eadResponse([ "message" => "E-mail send" ]);
  1392.         }
  1393.         return $this->eadResponse([ "message" => "Erro to send E-mail" ], ErrorEnum::ACTION_INVALID);
  1394.     }
  1395.     
  1396. }