src/Api/ParcelController.php line 85

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: parcel
  5.  * Date: 8/28/18
  6.  * Time: 2:47 AM
  7.  */
  8. namespace App\Api;
  9. use App\Controller\SendSms;
  10. use App\Entity\DailyAccount;
  11. use App\Entity\Delivery;
  12. use App\Entity\DeliveryParcel;
  13. use App\Entity\Etr;
  14. use App\Entity\Mpesa;
  15. use App\Entity\MpesaAuth;
  16. use App\Entity\MpesaTransaction;
  17. use App\Entity\Organization;
  18. use App\Entity\Parcel;
  19. use App\Entity\ReceivedParcel;
  20. use App\Entity\Station;
  21. use App\Entity\StationDailyAccount;
  22. use App\Entity\TimsStation;
  23. use App\Entity\Transaction;
  24. use App\Entity\UserStation;
  25. use App\Entity\Vehicle;
  26. use App\Entity\WayBill;
  27. use App\Form\api\ApiWayBillForm;
  28. use App\Form\CollectionForm;
  29. use App\Form\ParcelForm;
  30. use App\Form\WayBillForm;
  31. use App\Service\TremolInitiator;
  32. use DateTime;
  33. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  34. use Doctrine\Persistence\ManagerRegistry;
  35. use Doctrine\Persistence\ObjectManager;
  36. use FOS\RestBundle\Controller\Annotations as Rest;
  37. use FOS\RestBundle\View\View;
  38. use JMS\Serializer\SerializationContext;
  39. use JMS\Serializer\SerializerBuilder;
  40. use Mpdf\Mpdf;
  41. use Mpdf\QrCode\Output\Png;
  42. use Mpdf\QrCode\QrCode;
  43. use PDOException;
  44. use Psr\Log\LoggerInterface;
  45. use Sasedev\MpdfBundle\Factory\MpdfFactory;
  46. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  47. use Symfony\Component\Form\FormError;
  48. use Symfony\Component\HttpFoundation\JsonResponse;
  49. use Symfony\Component\HttpFoundation\Request;
  50. use Symfony\Component\HttpFoundation\Response;
  51. use Symfony\Component\Validator\ConstraintViolation;
  52. class ParcelController extends AbstractController
  53. {
  54.     private ObjectManager $em;
  55.     private LoggerInterface $logger;
  56.     public function __construct(ManagerRegistry $managerInterfaceLoggerInterface $logger)
  57.     {
  58.         $this->em $managerInterface->getManager();
  59.         $this->logger $logger;
  60.     }
  61.     /**
  62.      * @Rest\Route("/parcels/new", methods={"POST"}, name="app_register_parcel_api_")
  63.      * @param Request $request
  64.      */
  65.     public function registerParcel(Request $request)
  66.     {
  67.         $waybill = new WayBill();
  68.         $waybill->setLatitude(0);
  69.         $waybill->setLongitude(0);
  70.         $waybill->setParcelValue(1);
  71.         $em $this->em;
  72.         $organization $em->getRepository(Organization::class)->findOneBy([
  73.             'id' => $request->getSession()->get('ORGANIZATION')
  74.         ]);
  75.         $serializer SerializerBuilder::create()->build();
  76.         $context = new SerializationContext();
  77.         $context->setSerializeNull(true);
  78.         $waybill->setOrganization($organization);
  79.         $waybill->setParcelValue(0);
  80.         $body $request->getContent();
  81.         $data json_decode($bodytrue);
  82.         $this->logger->debug($body);
  83.         $form $this->createForm(ApiWayBillForm::class, $waybill, [
  84.             'csrf_protection' => false
  85.         ]);
  86.         $form->submit($data);
  87.         /** @var UserStation $userStation */
  88.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  89.             'user' => $this->getUser(),
  90.             'isActive' => true
  91.         ], ['id' => 'DESC']);
  92.         $date = new \DateTime();
  93.         $stringDate $date->format('Y-m-d');
  94.         $dailyId $em->getRepository(DailyAccount::class)->getMyAccount($userStation->getUser()->getId());
  95.         $dailyAccount null;
  96.         if($dailyId) {
  97.             $dailyAccount $em->getRepository(DailyAccount::class)->findOneBy([
  98.                 'id' => $dailyId
  99.             ]);
  100.         }
  101. //        return new JsonResponse($dailyId, Response::HTTP_FOUND);
  102.         if ($waybill->getToStation()->getId() === $userStation->getStation()->getId()) {
  103.             $data = [
  104.                 'message' => 'Origin Station and Destination Station cannot be the same'
  105.             ];
  106.             return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  107.         }
  108.         if (!$dailyAccount) {
  109.             $availableDailyAccount $this->em->getRepository(DailyAccount::class)->findOneBy([
  110.                 'user' => $this->getUser(),
  111.                 'isClosed' => false,
  112.             ], ['id' => 'DESC']);
  113.             if ($availableDailyAccount) {
  114.                 $data = [
  115.                     'message' => 'Please close your previous daily account to proceed ...'
  116.                 ];
  117.                 $this->logger->debug($data['message']);
  118.                 return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  119.             }
  120.             /** @var StationDailyAccount $stationDailyAccount */
  121.             $stationDailyAccount $em->getRepository(StationDailyAccount::class)->findOneBy([
  122.                 'station' => $request->getSession()->get('STATION'),
  123.                 'accountDate' => $date
  124.             ], ['id' => 'DESC']);
  125.             if (!$stationDailyAccount) {
  126.                 $stationDailyAccount = new StationDailyAccount();
  127.                 $stationDailyAccount->setAccountDate($date);
  128.                 $stationDailyAccount->setCreatedAt($date);
  129.                 $stationDailyAccount->setIsClosed(false);
  130.                 $stationDailyAccount->setIsBanked(false);
  131.                 $stationDailyAccount->setCreatedBy($this->getUser());
  132.                 $stationDailyAccount->setStation($userStation->getStation());
  133.                 $em->persist($stationDailyAccount);
  134.             }
  135.             $dailyAccount = new DailyAccount();
  136.             $dailyAccount->setIsClosed(false);
  137.             $dailyAccount->setCreatedAt($date);
  138.             $dailyAccount->setAccountDate($date);
  139.             $dailyAccount->setUser($this->getUser());
  140.             $dailyAccount->setStationDailyAccount($stationDailyAccount);
  141.             $dailyAccount->setDrawerCash(0);
  142.             $em->persist($dailyAccount);
  143.             $em->flush();
  144.         }
  145.         if ($form->isValid()) {
  146.             $waybill->setCreatedAt(new \DateTime());
  147.             $waybill->setCreatedBy($this->getUser());
  148.             $waybill->setFromStation($userStation->getStation());
  149.             $waybill->setIsCollected(false);
  150.             $waybill->setPercelCount(count($waybill->getParcels()));
  151.             $waybill->setIsCollected(false);
  152.             $waybill->setIsReceived(false);
  153.             $waybill->addTransaction($dailyAccount);
  154.             foreach ($waybill->getParcels() as $key => $item) {
  155.                 $waybill->getParcels()->get($key)->setNumber($key 1);
  156.             }
  157.             $conn $em->getConnection();
  158.             $conn->beginTransaction();
  159.             try {
  160.                 $em->persist($waybill);
  161.                 $em->flush();
  162.                 $em->getConnection()->commit();
  163.                 $this->logger->debug("waybill_id " $waybill->getId());
  164.                 $data $serializer->serialize($waybill'json'$context);
  165.                 return new Response($dataResponse::HTTP_CREATED);
  166.             } catch (PDOException $e) {
  167.                 $em->getConnection()->rollBack();
  168.                 $data = [
  169.                     'message' => 'An Error Occurred Please check whether every thing is filled'
  170.                 ];
  171.                 return new JsonResponse($dataResponse::HTTP_NOT_ACCEPTABLE);
  172.             }
  173.         }else{
  174.             $errorp '';
  175.             foreach ($form->getErrors() as $index => $error) {
  176.                 $this->logger->debug($error);
  177.                 $errorp $error;
  178.             }
  179.             $data = [
  180.                 'message' => 'some error occurred contact admin form not valid '.$errorp
  181.             ];
  182.             return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  183.         }
  184.         $errorp '';
  185.         foreach ($form->getErrors() as $index => $error) {
  186.             $this->logger->debug($error);
  187.             $errorp $error;
  188.         }
  189.         $data = [
  190.             'message' => 'some error occurred contact admin '.$errorp
  191.         ];
  192.         return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  193.     }
  194.     /**
  195.      * @Rest\Route("/parcels/receipt/g03/{waybill_}/{pay_method}", methods={"GET"},name="receipt_action_tremol_api")
  196.      */
  197.     public function ReceiptGO3Action(Request $request$waybill_$pay_methodMpdfFactory $MpdfFactory): Response
  198.     {
  199.         $em $this->em;
  200.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  201.             'user' => $this->getUser()
  202.         ]);
  203.         $timsStation $em->getRepository(TimsStation::class)->findOneBy([
  204.             'station' => $userStation->getStation()
  205.         ]);
  206.         $transaction $em->getRepository(Transaction::class)->findOneBy([
  207.             'wayBill' => $waybill_
  208.         ]);
  209.         if (!$transaction->getIsPaid()) {
  210.             $transaction->setIsComplete(true);
  211.             $transaction->setPaymentMethod($pay_method);
  212.             $transaction->setIsPaid(true);
  213.             if ($pay_method === 'CASH') {
  214.                 $transaction->setCashAmount($transaction->getAmount());
  215.             }else if ($pay_method === 'MPESA') {
  216.                 $transId $request->get('transaction_id');
  217.                 $mpesa $this->em->getRepository(Mpesa::class)->findOneBy([
  218.                     'transactionId' => $transId
  219.                 ]);
  220.                 $mpesaTransaction = new MpesaTransaction();
  221.                 $mpesaTransaction->setTransaction($transaction);
  222.                 $mpesaTransaction->setMpesa($mpesa);
  223.                 $mpesaTransaction->setCreatedAt(new DateTime());
  224.                 $mpesaTransaction->setCreatedBy($this->getUser());
  225.                 $this->em->persist($mpesaTransaction);
  226.                 $mpesa->setIsUsed(true);
  227.                 $transaction->setMpesaAmount($transaction->getAmount());
  228.             }
  229.             if (!$timsStation) {
  230.                 $em->flush();
  231.                 return $this->generateReceipt($transaction$MpdfFactory);
  232.             }
  233.             if ($timsStation->getSupplierCode() !== 'TREMOL' ) {
  234.                 $em->flush();
  235.                 return $this->generateReceipt($transaction$MpdfFactory);
  236.             }else {
  237.                 $t$this->generateCuInvoiceNumber($transaction);
  238.                 $this->em->flush();
  239.                 return $this->generateReceipt($t$MpdfFactory);
  240.             }
  241.         } else {
  242.             if ($pay_method === 'MPESA') {
  243.                 $transId $request->get('transaction_id');
  244.                 $mpesa $this->em->getRepository(Mpesa::class)->findOneBy([
  245.                     'transactionId' => $transId
  246.                 ]);
  247.                 if($mpesa->getTransactionAmount() !== $transaction->getAmount()){
  248.                     $data = [
  249.                       'message' => 'Mpesa Amount should be equal to cost of service'
  250.                     ];
  251.                     return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  252.                 }
  253.                 $mpesaTransaction = new MpesaTransaction();
  254.                 $mpesaTransaction->setTransaction($transaction);
  255.                 $mpesaTransaction->setMpesa($mpesa);
  256.                 $mpesaTransaction->setCreatedAt(new DateTime());
  257.                 $mpesaTransaction->setCreatedBy($this->getUser());
  258.                 $this->em->persist($mpesaTransaction);
  259.                 $mpesa->setIsUsed(true);
  260.                 $transaction->setPaymentMethod($pay_method);
  261.                 $transaction->setMpesaAmount($transaction->getAmount());
  262.                 $transaction->setCashAmount(0);
  263.                 $this->em->flush();
  264.             }
  265.             $receiptType 'FISCAL RECEIPT COPY';
  266.             return $this->generateReceipt($transaction$MpdfFactory$receiptType);
  267.         }
  268.     }
  269.     private function generateReceipt(Transaction $transactionMpdfFactory $MpdfFactory$receipt=null ): Response
  270.     {
  271.         $receiptType $receipt?:'FISCAL RECEIPT';
  272.         $mpesa null;
  273.         if ($transaction->getPaymentMethod() == 'MPESA') {
  274.             $mpesa $this->em->getRepository(MpesaTransaction::class)->findOneBy([
  275.                 'transaction' => $transaction
  276.             ]);
  277.         }
  278.         /** @var WayBill $waybill */
  279.         $waybill $transaction->getWaybill();
  280.         $parcels $this->em->getRepository(Parcel::class)->findBy([
  281.             'waybill' => $waybill
  282.         ]);
  283.         // get the logo image and change it to base64
  284.         $logoImage file_get_contents('../public/logo.png');
  285.         $logoBase64 base64_encode($logoImage);
  286.         $html='';
  287.         if ($transaction->getCuInvoiceNumber()) {
  288.             // create TIMS QRCODE change it to base64;
  289.             $timsQRCode 'https://itax.kra.go.ke/KRA-Portal/invoiceChk.htm?actionCode=loadPage&invoiceNo=' $transaction->getCuInvoiceNumber();
  290.             $timsqrCode = new QrCode($timsQRCode);
  291.             $output = new Png();
  292.             $timsQRCodeData $output->output($timsqrCode100, [255255255], [000]);
  293.             $base64 base64_encode($timsQRCodeData);
  294.             $html $this->renderView('fos/parcels/receipt/receipt_g03_pdf_mobile.html.twig', [
  295.                 'waybill' => $waybill,
  296.                 'transaction' => $transaction,
  297.                 'parcels' => $parcels,
  298.                 'mpesa' => $mpesa,
  299.                 'qrcode' => $base64,
  300.                 'logoBase64' => $logoBase64,
  301.                 'timsInvoiceNumber' => $transaction->getCuInvoiceNumber(),
  302.                 'by' => $waybill->getCreatedBy()->getPerson(),
  303.                 'receiptType' => $receiptType
  304.             ]);
  305.         }else {
  306.             $html $this->renderView('fos/parcels/receipt/receipt_g03_pdf_mobile.html.twig', [
  307.                 'waybill' => $waybill,
  308.                 'transaction' => $transaction,
  309.                 'parcels' => $parcels,
  310.                 'mpesa' => $mpesa,
  311.                 'logoBase64' => $logoBase64,
  312.                 'by' => $waybill->getCreatedBy()->getPerson(),
  313.                 'receiptType' => $receiptType
  314.             ]);
  315.         }
  316.         $mpdf = new Mpdf();
  317.         $height $mpdf->_getHtmlHeight($html);
  318.         $this->logger->debug('HEIGHT ' $height);
  319.         $mPdf $MpdfFactory->createMpdfObject([
  320.             'mode' => 'utf-8',
  321.             'format' => [70230],
  322.             'orientation' => 'P',
  323.             'autoPageBreak' => true
  324.         ]);
  325.         $mPdf->SetTopMargin("0");
  326.         $mpdf->margin_footer 0;
  327.         $mPdf->WriteHTML($html);
  328.         return $MpdfFactory->createDownloadResponse($mPdf"receipt_{$transaction->getWayBill()->getId()}.pdf"Response::HTTP_OK, ["Set-Cookie""fileDownload=true; path=/"]);
  329.     }
  330.     private function generateCuInvoiceNumber(Transaction $transaction): ?Transaction
  331.     {
  332.         /** Check whether etr is available */
  333.         try {
  334.             $waybill $transaction->getWaybill();
  335.             $parcels $this->em->getRepository(Parcel::class)->findBy([
  336.                 'waybill' => $waybill
  337.             ]);
  338.             /** @var Etr $etr */
  339.             $etr $this->em->getRepository(Etr::class)->findOneBy([
  340.                 'isDefault' => 1
  341.             ]);
  342.             try {
  343.                 $tremolInitiator = new TremolInitiator($this->em$etr);
  344.             } catch (\Exception $e) {
  345.                 dump($e);
  346.             }
  347.             $receiptType 'FISCAL RECEIPT';
  348.             if ($transaction->getPinNumber()) {
  349.                 TremolInitiator::$FP->OpenInvoiceWithFreeCustomerData(
  350.                     '',
  351.                     $transaction->getPinNumber(),
  352.                     '',
  353.                     '',
  354.                     '',
  355.                     '',
  356.                     $waybill->getId()
  357.                 );
  358.             } else {
  359.                 TremolInitiator::$FP->OpenReceipt(1$waybill->getId());
  360.             }
  361.             $parcelCount $waybill->getPercelCount();
  362.             foreach ($parcels as $index => $parcel) {
  363.                 TremolInitiator::$FP->SellPLUfromExtDB($parcel->getDescription(),
  364.                     'A',
  365.                     ($transaction->getAmount() / $parcelCount),
  366.                     '',
  367.                     '',
  368.                     '',
  369.                     16.00,
  370.                     1
  371.                 );
  372.             }
  373.             $rec TremolInitiator::$FP->CloseReceipt();
  374. //                var_dump($rec);
  375.             $invoiceNumber $rec->InvoiceNum;
  376.             $transaction->setCuInvoiceNumber($invoiceNumber);
  377.             $transaction->setIsComplete(true);
  378.             $transaction->setIsPaid(true);
  379.             $transaction->setIsFinal(true);
  380.             $transaction->setCuSerialNumber($etr->getSerialNumber());
  381.             if ($transaction->getPaymentMethod() == 'CASH') {
  382.                 $transaction->setCashAmount($transaction->getAmount());
  383.             }
  384.             if ($transaction->getPaymentMethod() == 'MPESA') {
  385.                 $transaction->setMpesaAmount($transaction->getAmount());
  386.             }
  387.             return $transaction;
  388.         } catch (\Exception $e) {
  389.         }
  390.             return null;
  391.     }
  392.     /**
  393.      * @Rest\Route("/parcels", methods={"GET"}, name="app_my_transactions")
  394.      * @param Request $request
  395.      */
  396.     public function getMyTransactions(Request $request): Response
  397.     {
  398.         $serializer SerializerBuilder::create()->build();
  399.         $context = new SerializationContext();
  400.         $context->setSerializeNull(true);
  401.         $dailyAccount $this->em->getRepository(DailyAccount::class)->findOneBy([
  402.             'user' => $this->getUser(),
  403.             'isClosed' => false
  404.         ], ['id' => 'desc']);
  405.         $waybills $this->em->getRepository(WayBill::class)->findMyWaybill($dailyAccount);
  406.         $data $serializer->serialize($waybills'json'$context);
  407.         return new Response($dataResponse::HTTP_OK);
  408.     }
  409.     /**
  410.      * @Rest\Route("/parcels/all", methods={"GET"}, name="app_all_my_transactions")
  411.      * @param Request $request
  412.      */
  413.     public function getAllMyTransactions(Request $request): Response
  414.     {
  415.         $serializer SerializerBuilder::create()->build();
  416.         $context = new SerializationContext();
  417.         $context->setSerializeNull(true);
  418.         $dailyAccount $this->em->getRepository(DailyAccount::class)->findOneBy([
  419.             'user' => $this->getUser(),
  420.             'isClosed' => false
  421.         ], ['id' => 'desc']);
  422.         $userStation $this->em->getRepository(UserStation::class)->findOneBy([
  423.             'user' => $this->getUser()
  424.         ],['id' => 'DESC']);
  425.         if($request->get('waybill')){
  426.             $waybill $request->get('waybill');
  427.             $waybills $this->em->getRepository(WayBill::class)->findAllMyWaybill($userStation->getStation()->getId(), $waybill );
  428.         }else{
  429.             $waybills $this->em->getRepository(WayBill::class)->findAllMyWaybill($userStation->getStation()->getId());
  430.         }
  431.         $data $serializer->serialize($waybills'json'$context);
  432.         return new Response($dataResponse::HTTP_OK);
  433.     }
  434.     /**
  435.      * @Rest\Route("/mpesa_transactions", methods={"GET"}, name="app_mpesa_transactions")
  436.      * @param Request $request
  437.      * @return Response
  438.      */
  439.     public function getMpesaTransactions(Request $request): Response
  440.     {
  441.         $userStation $this->em->getRepository(UserStation::class)->findOneBy([ 
  442.             'user' => $this->getUser()
  443.         ]);
  444.         $mpesaAuth $this->em->getRepository(MpesaAuth::class)->findOneBy([
  445.             'station' => $userStation->getStation(),
  446.             'authType' => 'PROD'
  447.         ]);
  448.         $transactions $this->em->getRepository(Mpesa::class)->getTodaysTransactions($mpesaAuth->getPaybill());
  449.         return new JsonResponse($transactionsResponse::HTTP_OK);
  450.     }
  451.     /**
  452.      * @Rest\Route("/data2", name="get_all_parcels_waybills_transactions_2")
  453.      * @param Request $request
  454.      */
  455.     public function getData2(Request $request)
  456.     {
  457. //        $station_id, $waybill, $last_vehicle, $last_delivery_parcel_id, $last_delivery_id;
  458.         $station_id $request->get("station_id");
  459.         $last_vehicle $request->get("last_vehicle");
  460.         $waybill $request->get("last_parcel_id");
  461.         $em $this->getDoctrine()->getManager();
  462.         $vehicles $em->getRepository(Vehicle::class)->findVehicles($last_vehicle);
  463. //        $waybills = $em->getRepository(WayBill::class)->findAllWaybills($station_id,$waybill);
  464.         $parcels $em->getRepository(Parcel::class)->getAllParcelWaybills($station_id$waybill);
  465.         /*$deliveries = $em->getRepository(Delivery::class)->findOutGoingDeliveries($station_id, $lastDelivery);
  466.         $deliveryParcels  = $em->getRepository(DeliveryParcel::class)->outGoingDeliveryParcels($station_id, $lastDelivery);*/
  467.         $data = [
  468.             "vehicles" => $vehicles,
  469.             "parcels" => $parcels
  470.         ];
  471. //        return $this->view($data, Response::HTTP_OK);
  472.         return new JsonResponse($dataResponse::HTTP_OK);
  473.     }
  474.     /**
  475.      * @Rest\Route("/data", name="get_all_parcels_waybills_transactions")
  476.      * @param Request $request
  477.      */
  478.     public function getData(Request $request): Response
  479.     {
  480. //        $station_id, $waybill, $last_vehicle, $last_delivery_parcel_id, $last_delivery_id;
  481.         $station_id $request->get("station_id");
  482.         $last_vehicle $request->get("last_vehicle");
  483.         $lastIDelivery $request->get("last_id");
  484.         $waybill $request->get("last_w");
  485.         $lastDelivery $request->get("last_d");
  486.         $em $this->getDoctrine()->getManager();
  487.         $vehicles $em->getRepository(Vehicle::class)->findVehicles($last_vehicle);
  488.         $waybills $em->getRepository(WayBill::class)->findAllWaybills($station_id$waybill);
  489.         $parcels $em->getRepository(Parcel::class)->getAllParcels($station_id$waybill);
  490.         $deliveries $em->getRepository(Delivery::class)->findOutGoingDeliveries($station_id$lastDelivery);
  491.         $deliveryParcels $em->getRepository(DeliveryParcel::class)->outGoingDeliveryParcels($station_id$lastDelivery);
  492.         $incomingParcels $em->getRepository(DeliveryParcel::class)->getIncomingParcels($station_id$lastIDelivery);
  493.         $incomingDeliveries $em->getRepository(Delivery::class)->findIncomingDeliveries($station_id$lastIDelivery);
  494.         $incomingDeliveryParcels $em->getRepository(DeliveryParcel::class)->deliveryIncomingParcels($station_id$lastIDelivery);
  495.         $deliveryWaybills $em->getRepository(DeliveryParcel::class)->findAllDeliveryWaybills($station_id$lastIDelivery);
  496.         $data = [
  497.             "vehicles" => $vehicles,
  498.             "incoming_waybills" => $deliveryWaybills,
  499.             "incoming_parcels" => $incomingParcels,
  500.             "incoming_delivery_parcels" => $incomingDeliveryParcels,
  501.             "incoming_deliveries" => $incomingDeliveries,
  502.             "waybills" => $waybills,
  503.             "deliveries" => $deliveries,
  504.             "delivery_parcels" => $deliveryParcels,
  505.             "parcels" => $parcels
  506.         ];
  507. //        return $this->view($data, Response::HTTP_OK);
  508.         return new JsonResponse($dataResponse::HTTP_OK);
  509.         /*if(!$waybills){
  510.             if($vehicles){
  511.                 $data = [
  512.                     "vehicles" => $vehicles,
  513.                     "incoming_waybills"=>$deliveryWaybills,
  514.                     "waybills" => null,
  515.                     "incoming_parcels" => null,
  516.                     "deliveries" => $deliveries,
  517.                     "delivery_parcels" => $deliveryParcels
  518.                 ];
  519.                 return $this->view($data, Response::HTTP_OK);
  520.             }
  521.             if($deliveries){
  522.                 $data = [
  523.                     "incoming_waybills" => $deliveryWaybills,
  524.                     "waybills" => $waybills,
  525.                     "incoming_parcels" => $parcels,
  526.                     "vehicles" => $vehicles,
  527.                     "deliveries" => $deliveries,
  528.                     "delivery_parcels" => $deliveryParcels
  529.                 ];
  530.                 return $this->view($data, Response::HTTP_OK);
  531.             }
  532.             return $this->view(null, Response::HTTP_NO_CONTENT);
  533.         }else if($deliveries){
  534.             $data = [
  535.                 "incoming_waybills" => $deliveryWaybills,
  536.                 "waybills" => null,
  537.                 "incoming_parcels" => $parcels,
  538.                 "vehicles" => $vehicles,
  539.                 "deliveries" => $deliveries,
  540.                 "delivery_parcels" => $deliveryParcels
  541.             ];
  542.             return $this->view($data, Response::HTTP_OK);
  543.         }
  544.         $data = [
  545.             "incoming_waybills" => $deliveryWaybills,
  546.             "waybills" => $waybills,
  547.             "incoming_parcels" => $parcels,
  548.             "vehicles" => $vehicles,
  549.             "deliveries" => $deliveries,
  550.             "delivery_parcels" => $deliveryParcels
  551.         ];
  552.         return $this->view($data, Response::HTTP_OK);*/
  553.     }
  554.     /**
  555.      * @Rest\Route("/data/delivery/{station}/{delivery_number}", name="getOneParcel")
  556.      */
  557.     public function getDelivery($station$delivery_number)
  558.     {
  559.         $em $this->getDoctrine()->getManager();
  560.         /** @var Delivery $delivery */
  561.         $delivery $em->getRepository(Delivery::class)->findOneBy([
  562.             'id' => $delivery_number
  563.         ]);
  564.         $incomingDelivery $em->getRepository(Delivery::class)->findOneIncomingDelivery($delivery_number);
  565.         $incomingParcels $em->getRepository(DeliveryParcel::class)->getOneDeliveryIncomingParcels($delivery_number);
  566.         $incomingDeliveryParcels $em->getRepository(DeliveryParcel::class)->oneDeliveryIncomingParcels($delivery_number);
  567.         $deliveryWaybills $em->getRepository(DeliveryParcel::class)->findAllOneDeliveryWaybills($delivery_number);
  568.         if ($incomingDelivery) {
  569.             if ($delivery->getDestination()->getId() != $station) {
  570.                 $data = [
  571.                     'error' => 'This delivery is meant for:' $delivery->getDestination()->getStationName()
  572.                 ];
  573. //                return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  574.                 return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  575.             }
  576.             $data = [
  577.                 "incoming_waybills" => $deliveryWaybills,
  578.                 "incoming_parcels" => $incomingParcels,
  579.                 "incoming_delivery_parcels" => $incomingDeliveryParcels,
  580.                 "incoming_deliveries" => $incomingDelivery,
  581.             ];
  582. //            $context = new SerializationContext();
  583. //            $context->setSerializeNull(true);
  584. //            $serializer = SerializerBuilder::create()->build();
  585. //            [ DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s']
  586. //            $data = $serializer->serialize($data, 'json', $context );
  587. //            return $this->view($data, Response::HTTP_OK);
  588.             return new JsonResponse($dataResponse::HTTP_OK);
  589.         } else {
  590.             $data = [
  591.                 'error' => 'Delivery Number:' $delivery_number ' NOT FOUND'
  592.             ];
  593. //                return $this->view($data, Response::HTTP_NOT_FOUND);
  594.             return new JsonResponse($dataResponse::HTTP_NOT_FOUND);
  595.         }
  596.     }
  597.     /**
  598.      * @Rest\Route("/parcels/{station_id}/{waybill}", name="getOneWaybill")
  599.      * @param $station_id
  600.      * @param $waybill
  601.      * @return View
  602.      */
  603.     public function getParcelCollection($station_id$waybill)
  604.     {
  605.         $em $this->getDoctrine()->getManager();
  606.         $resultWaybill $em->getRepository(WayBill::class)->findReceivedWaybill($station_id$waybill);
  607.         if (!$resultWaybill) {
  608. //            return $this->view(null, Response::HTTP_NOT_FOUND);
  609.             return new JsonResponse(nullResponse::HTTP_NOT_FOUND);
  610.         }
  611.         /*$waybillParcels = $em->getRepository(Parcel::class)->getWaybillParcels($waybill);
  612.         if($waybillParcels){
  613.             $resultWaybill['parcels'] = $waybillParcels;
  614.         }*/
  615. //        return $this->view($resultWaybill, Response::HTTP_OK);
  616.         return new JsonResponse($resultWaybillResponse::HTTP_OK);
  617.     }
  618.     /**
  619.      * @Rest\Route("/parcels/{}/{}/{way_bill}/{id}/", name="getOneParcel")
  620.      */
  621.     public function getParcel($way_bill$id)
  622.     {
  623.         $em $this->getDoctrine()->getManager();
  624.         $waybill $em->getRepository(WayBill::class)->findOneBy([
  625.             'id' => $way_bill
  626.         ]);
  627.         if (!$waybill) {
  628.             $data = [
  629.                 'parcel' => null,
  630.                 'parcels' => null,
  631.                 'waybill' => null
  632.             ];
  633.             return $this->view($dataResponse::HTTP_NOT_FOUND);
  634.         }
  635.         $parcel $em->getRepository(Parcel::class)->findOneBy([
  636.             'number' => $id,
  637.             'waybill' => $waybill
  638.         ]);
  639.         $parcels $em->getRepository(Parcel::class)->findBy([
  640.             'waybill' => $waybill
  641.         ]);
  642.         $data = [
  643.             'parcel' => $parcel,
  644.             'parcels' => $parcels,
  645.             'waybill' => $waybill
  646.         ];
  647. //        return $this->view($data, Response::HTTP_OK);
  648.         return new JsonResponse($dataResponse::HTTP_OK);
  649.     }
  650.     /**
  651.      * @Rest\Route("/parcels/forms/towns", name="getParcels")
  652.      */
  653.     public function getTowns()
  654.     {
  655.         $em $this->getDoctrine()->getManager();
  656.         $towns $em->getRepository(Station::class)->findBy([
  657.             'isMobile' => false
  658.         ]);
  659. //        return $this->view($towns, Response::HTTP_OK);
  660.         return new JsonResponse($townsResponse::HTTP_OK);
  661.     }
  662.     /**
  663.      * @Rest\Route("/deliveries/delete/{id}", name="getParcels")
  664.      */
  665.     public function deleteParcelFromDelivery($id)
  666.     {
  667.         $em $this->getDoctrine()->getManager();
  668.         $towns $em->getRepository(Station::class)->findAll();
  669. //        return $this->view($towns, Response::HTTP_OK);
  670.         return new JsonResponse($townsResponse::HTTP_OK);
  671.     }
  672.     public function collectParcel(Parcel $parcelRequest $request)
  673.     {
  674.         $em $this->getDoctrine()->getManager();
  675.         $receivedParcel $em->getRepository(ReceivedParcel::class)->findBy([
  676.             'parcel' => $parcel
  677.         ]);
  678.         $user $em->getRepository(UserStation::class)->findOneBy([
  679.             'user' => $this->getUser()
  680.         ], ['id' => 'DESC']);
  681.         if ($parcel->getToTown()->getId() != $user->getTown()->getId()) {
  682.             $data = [
  683.                 'error' => 'You are not logged in from ' $parcel->getToTown()->getTownName()
  684.             ];
  685. //            return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  686.             return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  687.         }
  688.         if (!$receivedParcel) {
  689.             $data = [
  690.                 'error' => 'PARCEL HAS NOT BEEN RECEIVED YET'
  691.             ];
  692. //            return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  693.             return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  694.         }
  695.         $collectParcel = new Collected();
  696.         $collectParcel->setParcel($parcel);
  697.         $collectParcel->setCollectedAt(new \DateTime());
  698.         $collectParcel->setUser($this->getUser());
  699.         $parcel->setIsReceived(true);
  700.         $content $request->getContent();
  701.         $data json_decode($contenttrue);
  702.         $form $this->createForm(CollectionForm::class, $collectParcel);
  703.         $form->submit($data);
  704.         $validator $this->get('validator');
  705.         /** @var  $errors */
  706.         $errors $validator->validate($collectParcel);
  707. //        dump($errors);die;
  708.         if (count($errors) > 0) {
  709.             $fields = array();
  710.             /** @var  $error ConstraintViolation */
  711.             foreach ($errors as $key => $error) {
  712.                 $fields[$error->getPropertyPath()] = $error->getMessage();
  713.             }
  714.             $data = [
  715.                 'error' => 'Please check this fields for errors',
  716.                 'fields' => $fields
  717.             ];
  718. //            $view = $this->view($data, Response::HTTP_BAD_REQUEST);
  719. //
  720. //            return $view;
  721.             return new JsonResponse($dataResponse::HTTP_BAD_REQUEST);
  722.         }
  723.         try {
  724.             $parcel->setIsCollected(true);
  725.             $em->persist($collectParcel);
  726.             $em->flush();
  727.             $sms = new SendSms();
  728.             $sms->sendOutSms($parcel->getSenderPhoneNumber(), "HELLO {$parcel->getSenderName()} THE PARCEL YOU SENT TO {$parcel->getToTown()} FROM {$parcel->getFromTown()} HAS BEEN COLLECTED BY {$parcel->getReceiverName()}");
  729. //            $view = $this->view($collectParcel, Response::HTTP_CREATED);
  730. //            return $view;
  731.             return new JsonResponse($collectParcelResponse::HTTP_OK);
  732.         } catch (UniqueConstraintViolationException $un) {
  733.             $collection $em->getRepository('AppBundle:Collected')->findOneBy([
  734.                 'parcel' => $parcel
  735.             ]);
  736.             $data = [
  737.                 'error' => 'THIS PARCEL HAS ALREADY BEEN COLLECTED #ID ' $collection->getCollectorNationalId()
  738.             ];
  739. //            return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  740.             return new JsonResponse($collectParcelResponse::HTTP_EXPECTATION_FAILED);
  741.         } catch (\PDOException $e) {
  742. //            $view = $this->view($collectParcel, Response::HTTP_EXPECTATION_FAILED);
  743. //
  744. //            return $view;
  745.             return new JsonResponse($collectParcelResponse::HTTP_EXPECTATION_FAILED);
  746.         }
  747.     }
  748.     /**
  749.      * @Rest\Route("/new-parcel", name="api_new-parcel")
  750.      */
  751.     public function newParcel(Request $request)
  752.     {
  753.         $parcel = new Parcel();
  754.         $em $this->getDoctrine()->getManager();
  755.         $parcelForm $this->createForm(ParcelForm::class, $parcel);
  756.         $amount 0;
  757.         if (isset($request->get('app_bundle_parcel_form')['amount'])) {
  758.             $amount $request->get('app_bundle_parcel_form')['amount'];
  759.         }
  760.         $parcelForm->handleRequest($request);
  761.         /** @var UserTown $userTown */
  762.         $userTown $em->getRepository(UserStation::class)->findOneBy([
  763.             'user' => $this->getUser(),
  764.             'isActive' => true
  765.         ], ['id' => 'DESC']);
  766.         if (!$userTown) {
  767.             $parcelForm->addError(new FormError('You are not assigned a town Please contact admin'));
  768.             return $this->render('parcels/new_parcel.html.twig', [
  769.                 'form' => $parcelForm->createView()
  770.             ]);
  771.         }
  772.         if ($parcelForm->isSubmitted() && $parcelForm->isValid()) {
  773.             if ($parcel->getToTown()->getId() === $userTown->getTown()->getId()) {
  774.                 $parcelForm->addError(new FormError('From town and Destination Town cannot be the same'));
  775.                 return $this->render('parcels/new_parcel.html.twig', [
  776.                     'form' => $parcelForm->createView(),
  777.                     'user_town' => $userTown
  778.                 ]);
  779.             }
  780.             $parcel->setCreatedAt(new \DateTime());
  781.             $parcel->setCreatedBy($this->getUser());
  782.             $parcel->setFromTown($userTown->getTown());
  783.             $parcel->setIsEnRoute(false);
  784.             $parcel->setIsCollected(false);
  785.             $parcel->setIsReceived(false);
  786.             $parcelAmount = new Cost();
  787.             $parcelAmount->setCreatedAt(new \DateTime());
  788.             $parcelAmount->setAmount($amount);
  789.             $parcelAmount->setParcel($parcel);
  790.             try {
  791.                 $em->persist($parcelAmount);
  792.                 $em->persist($parcel);
  793.                 $em->flush();
  794.                 $this->addFlash('success''Parcel Saved Successfully');
  795. //                $this->redirectToRoute('pdf_report', ['id' => $parcel->getId()]);
  796. //                $parcel = new Parcel();
  797. //                $parcelForm = $this->createForm(ParcelForm::class, $parcel);
  798.                 return $this->redirectToRoute('one_parcel', ['id' => $parcel->getId()]);
  799.             } catch (\PDOException $e) {
  800.                 $this->addFlash('error''An Error Occurred Please check whether every thin is filled');
  801.                 return $this->render('parcels/new_parcel.html.twig', [
  802.                     'form' => $parcelForm->createView(),
  803.                     'user_town' => $userTown
  804.                 ]);
  805.             }
  806.         }
  807.         return $this->render('parcels/new_parcel.html.twig', [
  808.             'form' => $parcelForm->createView(),
  809.             'user_town' => $userTown
  810.         ]);
  811.     }
  812. }