src/Api/DeliveryController.php line 708

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: parcel
  5.  * Date: 1/3/19
  6.  * Time: 9:02 AM
  7.  */
  8. namespace App\Api;
  9. use App\Controller\SendSms;
  10. use App\Entity\CollectedParcel;
  11. use App\Entity\Delivery;
  12. use App\Entity\DeliveryParcel;
  13. use App\Entity\DeliveryVehicle;
  14. use App\Entity\Parcel;
  15. use App\Entity\Sms;
  16. use App\Entity\Station;
  17. use App\Entity\UserStation;
  18. use App\Entity\Vehicle;
  19. use App\Entity\WayBill;
  20. use App\Service\ActionMatrix;
  21. use DateTime;
  22. use Doctrine\Persistence\ManagerRegistry;
  23. use Doctrine\Persistence\ObjectManager;
  24. use FOS\RestBundle\Controller\AbstractFOSRestController;
  25. use JMS\Serializer\SerializationContext;
  26. use JMS\Serializer\SerializerBuilder;
  27. use Psr\Log\LoggerInterface;
  28. use Symfony\Component\Config\Definition\Exception\Exception;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use FOS\RestBundle\Controller\Annotations as Rest;
  33. use Symfony\Component\Messenger\MessageBusInterface;
  34. class DeliveryController extends AbstractFOSRestController {
  35.     private LoggerInterface $logger;
  36.     private ActionMatrix $actionMatrix;
  37.     private ObjectManager $em;
  38.     private MessageBusInterface $messageBus;
  39.     public function __construct(LoggerInterface $loggerManagerRegistry $managerRegistryMessageBusInterface $messageBus){
  40.         $this->logger $logger;
  41.         $this->em $managerRegistry->getManager();
  42.         $this->messageBus $messageBus;
  43.     }
  44.     /**
  45.      * @Rest\Get("/stations", name="get_all_stations")
  46.      */
  47.     public function  getStations(Request $request): JsonResponse
  48.     {
  49.         $em $this->em;
  50.         /** @var $stations  Station[] */
  51.         $stations $em->getRepository(Station::class)->findAllStations(1);
  52.         return new JsonResponse($stationsResponse::HTTP_OK);
  53.     }
  54.     /**
  55.      * @Rest\Get("/deliveries/receive_init/{station_id}", name="initialize_receive_totals")
  56.      */
  57.     public function  receiveInitDelivery($station_id): JsonResponse
  58.     {
  59.         $em $this->em;
  60.         $deliveries $em->getRepository(Delivery::class)->findBy([
  61.             'destination' => $station_id,
  62.             'isReceivedFully' => false,
  63.             'isVerified' => true
  64.         ]);
  65.         $data = [
  66.             'deliveries_total' =>  count($deliveries),
  67.             'deliveries' => $deliveries
  68.         ];
  69.         return new JsonResponse($dataResponse::HTTP_OK);
  70.     }
  71.     /**
  72.      * @Rest\Get("/deliveries/receive/{station_id}", name="deliveries_on_route")
  73.      */
  74.     public function  onRouteDeliveries($station_id): JsonResponse
  75.     {
  76.         $em $this->em;
  77.         $deliveries $em->getRepository(Delivery::class)->findBy([
  78.             'destination' => $station_id,
  79.             'isReceivedFully' => false,
  80.             'isVerified' => true,
  81.             'isCancelled' => false,
  82.             'isLoaded' => true
  83.         ]);
  84.         return new JsonResponse($deliveriesResponse::HTTP_OK);
  85.     }
  86.     /**
  87.      * @Rest\Patch("/deliveries/receive/{delivery_id}", name="receive_delivery")
  88.      */
  89.     public function  receiveDelivery($delivery_id): JsonResponse
  90.     {
  91.         $em $this->em;
  92.         /** @var Delivery $delivery */
  93.         $delivery $em->getRepository(Delivery::class)->findOneBy([
  94.             'id' => $delivery_id
  95.         ]);
  96.         if($delivery->getisReceived()){
  97.             $data = [
  98.                 'error' => [
  99.                     'message' => "Delivery was received by: ".$delivery->getReceivedBy()->getPerson()->getFirstName().' '.$delivery->getReceivedBy()->getPerson()->getSecondName()
  100.                 ]
  101.             ];
  102.             return new JsonResponse($data,Response::HTTP_CONFLICT);
  103.         }
  104.         try {
  105.             $delivery->setIsReceived(true);
  106.             $delivery->setReceivedAt(new \DateTime());
  107.             $delivery->setReceivedBy($this->getUser());
  108.             $em->flush();
  109.             $data = [
  110.                 'id' => $delivery->getId(),
  111.                 'parcel_count' => $delivery->getParcelCount(),
  112.                 'destination' => $delivery->getDestination()->getId(),
  113.                 'origin_station' => $delivery->getOriginStation()->getId(),
  114.                 'is_cancelled' => $delivery->getisCancelled(),
  115.                 'is_received' => $delivery->getisReceived()
  116.             ];
  117.             return new JsonResponse($dataResponse::HTTP_OK);
  118.         }catch (Exception $e){
  119.             return new JsonResponse($deliveryResponse::HTTP_EXPECTATION_FAILED);
  120.         }
  121.     }
  122.     /**
  123.      * @Rest\Patch("/deliveries/receive/waybill/{waybill}/{station}", name="receive_waybill")
  124.      * @param $waybill
  125.      * @throws \Exception
  126.      */
  127.     public function  receiveSingleWaybill($waybill$station): JsonResponse
  128.     {
  129.         $em $this->em;
  130.         /** @var WayBill $waybill */
  131.         $waybill $em->getRepository(WayBill::class)->findOneBy([
  132.             'id' => $waybill,
  133.             'toStation' => $station
  134.         ]);
  135.         if(!$waybill){
  136.             $data = [
  137.                 'message' => "WAYBILL NOT FOUND"
  138.             ];
  139.             return new JsonResponse($dataResponse::HTTP_NOT_FOUND);
  140.         }
  141. //        if($waybill->getIsReceived()){
  142.         if(0==1){
  143.             $data = [
  144.                 'message' => "WAYBILL ALREADY RECEIVED"
  145.             ];
  146.             return new JsonResponse($dataResponse::HTTP_ALREADY_REPORTED);
  147.         }
  148.         $waybill->setReceivedBy($this->getUser());
  149.         $waybill->setIsReceived(true);
  150.         $waybill->setReceivedAt(new \DateTime());
  151.         $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  152.         $this->actionMatrix->receivingAction($this->getUser());
  153.         $data = [
  154.           "message" => "PARCEL RECEIVED"
  155.         ];
  156.         return new JsonResponse($dataResponse::HTTP_OK);
  157.     }
  158.     /**
  159.      * @Rest\Patch("/deliveries/receive/parcel/{parcel_id}", name="receive_delivery_parcel")
  160.      */
  161.     public function  receiveParcel($parcel_id): JsonResponse
  162.     {
  163.         $em $this->em;
  164.         /** @var DeliveryParcel $deliveryParcel */
  165.         $deliveryParcel $em->getRepository(DeliveryParcel::class)->findOneBy([
  166.             'id' => $parcel_id
  167.         ]);
  168.         if($deliveryParcel->getisReceived()){
  169.             $data = [
  170.                 'id' => $deliveryParcel->getId(),
  171.                 'parcel' => $deliveryParcel->getParcel()->getId(),
  172.                 'delivery' => $deliveryParcel->getDelivery()->getId(),
  173.                 'is_cancelled' => $deliveryParcel->getisCancelled(),
  174.                 'cancelled_because' => $deliveryParcel->getCancelledBecause()
  175.             ];
  176.             return new JsonResponse($dataResponse::HTTP_CONFLICT);
  177.         }
  178.         /** @var UserStation $userStation */
  179.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  180.             'user' => $this->getUser()
  181.         ],['id' =>'DESC']);
  182.         try {
  183.             $deliveryParcel->setIsReceived(true);
  184.             $deliveryParcel->setReceivedAt(new \DateTime());
  185.             $deliveryParcel->setReceivedBy($this->getUser());
  186.             $deliveryParcel->getParcel()->getWaybill()->setIsReceived(true);
  187.             $deliveryParcel->getParcel()->getWaybill()->setReceivedBy($this->getUser());
  188.             $delivery $em->getRepository(Delivery::class)->findOneBy([
  189.                 'id' => $deliveryParcel->getDelivery()
  190.             ]);
  191.             if(($delivery->getReceivedParcels() + 1) === $delivery->getParcelCount()){
  192.                 $delivery->setIsReceivedFully(true);
  193.             }
  194.             $delivery->setReceivedParcels($delivery->getReceivedParcels() + 1);
  195.             if($deliveryParcel->getParcel()->getWaybill()->getToStation() === $userStation->getStation()) {
  196.                 $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$deliveryParcel->getParcel()->getWaybill());
  197.                 $this->actionMatrix->receivingAction($this->getUser());
  198.             }
  199.             $data = [
  200.                 'id' => $deliveryParcel->getId(),
  201.                 'parcel' => $deliveryParcel->getParcel()->getId(),
  202.                 'delivery' => $deliveryParcel->getDelivery()->getId(),
  203.                 'is_cancelled' => $deliveryParcel->getisCancelled(),
  204.                 'cancelled_because' => $deliveryParcel->getCancelledBecause()
  205.             ];
  206.             return new JsonResponse($dataResponse::HTTP_OK);
  207.         }catch (Exception $e){
  208.             $data = [
  209.                 'id' => $deliveryParcel->getId(),
  210.                 'parcel' => $deliveryParcel->getParcel()->getId(),
  211.                 'delivery' => $deliveryParcel->getDelivery()->getId(),
  212.                 'is_cancelled' => $deliveryParcel->getisCancelled(),
  213.                 'cancelled_because' => $deliveryParcel->getCancelledBecause()
  214.             ];
  215.             return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  216.         }
  217.     }
  218.     /**
  219.      * @Rest\Get("/deliveries/collect/{waybill_id}", name="getOneWaybill_for_Collection")
  220.      */
  221.     public function  getWayBillForCollection($waybill_id): JsonResponse
  222.     {
  223.         $em $this->em;
  224.         /** @var UserStation $userStation */
  225.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  226.             'user' => $this->getUser()
  227.         ],['id' => 'DESC']);
  228.         $parcel $em->getRepository(DeliveryParcel::class)->unCollectedParcel(
  229.             $waybill_id
  230.         );
  231.         if(!$parcel) {
  232.             $data = [
  233.                 'error' => [
  234.                     'message' => "Parcel Not found or already Collected"
  235.                 ]
  236.             ];
  237.             return new JsonResponse($dataResponse::HTTP_CONFLICT);
  238.         }
  239.         $waybill $em->getRepository(WayBill::class)->findOneBy([
  240.             'id' => $waybill_id
  241.         ]);
  242.         return new JsonResponse($waybillResponse::HTTP_OK);
  243.     }
  244.     /**
  245.      * @Rest\Get("/deliveries/incoming/waybill/{station_id}/{waybill}", name="search_delivery_by_waybill")
  246.      * @param $station_id
  247.      * @param $waybill
  248.      * @param Request $request
  249.      * @return JsonResponse|Response
  250.      */
  251.     public function  searchDeliveryByWaybill($station_id$waybillRequest $request): JsonResponse|Response
  252.     {
  253.         $em $this->em;
  254.         $context = new SerializationContext();
  255.         $context->setSerializeNull(true);
  256.         $serializer SerializerBuilder::create()->build();
  257.         $resultWaybill $em->getRepository(DeliveryParcel::class)->findWaybill($station_id$waybill);
  258.         if(!$resultWaybill){
  259.             return new JsonResponse(nullResponse::HTTP_NOT_FOUND);
  260.         }
  261.         $delivery_id $resultWaybill['delivery_id'];
  262.         $delivery $em->getRepository(Delivery::class)->findIncomingDelivery($station_id$delivery_id);
  263.         if($delivery){
  264.             $incomingParcels $em->getRepository(DeliveryParcel::class)->commonDeliveryIncomingParcels($delivery_id);
  265.             /** @var DeliveryVehicle $deliveryVehicle */
  266.             $deliveryVehicle $em->getRepository(DeliveryVehicle::class)->findOneBy([
  267.                 'delivery' => $delivery_id
  268.             ],['id' => 'DESC']);
  269.             if($deliveryVehicle){
  270.                 $delivery['delivery_vehicle'] = $deliveryVehicle->getVehicle()->getRegNumber();
  271.             }
  272.             if($incomingParcels){
  273.                 $delivery['parcels'] = $incomingParcels;
  274.             }
  275.         }else{
  276.             return new JsonResponse(nullResponse::HTTP_NOT_FOUND);
  277.         }
  278.         $data $serializer->serialize($delivery'json'$context);
  279.         return new Response($dataResponse::HTTP_OK);
  280.     }
  281.     /**
  282.      * @Rest\Post("/deliveries/collect/{waybill_id}", name="update_waybill_as_collected")
  283.      */
  284.     public function  collectWaybill($waybill_idRequest $request) {
  285.         $em $this->em;
  286.         $collectorName $request->request->get('collector_name');
  287.         $collectorID $request->request->get('collector_id');
  288.         $waybill $em->getRepository(WayBill::class)->findOneBy([
  289.             'id' => $waybill_id
  290.         ]);
  291.         if($waybill) {
  292.             $waybill->setIsCollected(true);
  293.             $collectedParcel = new CollectedParcel();
  294.             $collectedParcel->setCreatedBy($this->getUser());
  295.             $collectedParcel->setCreatedAt(new \DateTime());
  296.             $collectedParcel->setWaybill($waybill);
  297.             $collectedParcel->setCollectorName($collectorName);
  298.             $collectedParcel->setNationalId($collectorID);
  299.             $waybill->setCollectedParcel($collectedParcel);
  300.             try {
  301.                 $em->persist($collectedParcel);
  302.                 $em->flush();
  303.                 $data = [
  304.                     'id' => $waybill->getId(),
  305.                     'sender_name' => $waybill->getSenderName(),
  306.                     'receiver_name' => $waybill->getReceiverName(),
  307.                     'sender_phone_number' => $waybill->getSenderPhoneNumber(),
  308.                     'receiver_phone_number' => $waybill->getReceiverPhoneNumber(),
  309.                     'from_station' => $waybill->getFromStation()->getId(),
  310.                     'to_station' => $waybill->getToStation()->getId(),
  311.                     'transaction' => $waybill->getTransaction()->getId(),
  312.                     'is_collected' => $waybill->getIsCollected()
  313.                     ];
  314.                 return new JsonResponse($dataResponse::HTTP_CREATED);
  315.             }catch (Exception $e){
  316.                 return new JsonResponse($waybillResponse::HTTP_EXPECTATION_FAILED);
  317.             }
  318.         }
  319.     }
  320.     /**
  321.      * @Rest\Get("/deliveries/parcels/{way_bill}/{id}/", name="getOneParcel_for_delivery")
  322.      */
  323.     public function  getParcel($way_bill$id): JsonResponse
  324.     {
  325.         $em $this->em;
  326.         /** @var UserStation $userStation */
  327.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  328.             'user' => $this->getUser()
  329.         ],['id' => 'DESC']);
  330.         $deliveryParcel $em->getRepository(DeliveryParcel::class)->findOneBy([
  331.             'parcel' => $id,
  332.             'isCancelled' => false
  333.         ],['id' => 'DESC']);
  334.         $waybill $em->getRepository(WayBill::class)->findOneBy([
  335.             'id' => $way_bill,
  336.             'fromStation' => $userStation->getStation()
  337.         ]);
  338.         if(!$waybill) {
  339.             $data = [
  340.                 'parcel' => null,
  341.                 'parcels' => null,
  342.                 'waybill' => null
  343.             ];
  344.             return new JsonResponse($dataResponse::HTTP_NOT_FOUND);
  345.         }
  346.         $parcel $em->getRepository(Parcel::class)->findOneBy([
  347.             'number' => $id,
  348.             'waybill' => $waybill
  349.         ]);
  350.         $parcels $em->getRepository(Parcel::class)->findBy([
  351.             'waybill' => $waybill
  352.         ]);
  353.         $data = [
  354.             'parcel' => $parcel,
  355.             'parcels' => $parcels,
  356.             'waybill' => $waybill
  357.         ];
  358.         return new JsonResponse($dataResponse::HTTP_OK);
  359.     }
  360.     /**
  361.      * @Rest\Patch("/deliveries/verify/{delivery}", name="verify_delivery_to_vehicle")
  362.      */
  363.     public function  verifyDelivery($delivery) {
  364.         $em $this->em;
  365.         $deliveryVehicle $em->getRepository(DeliveryVehicle::class)->findOneBy([
  366.             'delivery' => $delivery,
  367.             'isCancelled' => false
  368.         ]);
  369.         $deliveryParcels $em->getRepository(DeliveryParcel::class)->findBy([
  370.             'delivery' => $delivery,
  371.             'isCancelled' => false
  372.         ]);
  373.         if($deliveryVehicle){
  374.             /** @var Delivery $delivery */
  375.             $delivery $em->getRepository(Delivery::class)->findOneBy([
  376.                 'id' => $deliveryVehicle->getDelivery()
  377.             ]);
  378.             if($deliveryVehicle) {
  379.                 $deliveryVehicle->setIsVerified(true);
  380.                 $deliveryVehicle->setVerifiedBy($this->getUser());
  381.                 $deliveryVehicle->setVerifiedAt(new DateTime());
  382.                 $delivery->setIsVerified(true);
  383.                 $delivery->setParcelCount(count($deliveryParcels));
  384.                 try {
  385.                     $em->flush();
  386.                     $data = [
  387.                         'id' => $delivery->getId(),
  388.                         'parcel_count' => $delivery->getParcelCount(),
  389.                         'destination' => $delivery->getDestination()->getId(),
  390.                         'origin_station' => $delivery->getOriginStation()->getId(),
  391.                         'is_cancelled' => $delivery->getisCancelled(),
  392.                     ];
  393.                     $this->sendLoadingSms($delivery$this->logger);
  394.                     return new JsonResponse($dataResponse::HTTP_OK);
  395.                 }catch (Exception $e){
  396.                     return new JsonResponse($deliveryResponse::HTTP_EXPECTATION_FAILED);
  397.                 }
  398.             }
  399.         }else{
  400.             $data = [
  401.                 'error' => [
  402.                     'message' => "This parcel is not loaded"
  403.                 ]
  404.             ];
  405.             return new JsonResponse($dataResponse::HTTP_CONFLICT);
  406.         }
  407.     }
  408.     /**
  409.      * @Rest\Post("/deliveries/load/{delivery_id}/{vehicle_id}", name="load_delivery_to_vehicle")
  410.      */
  411.     public function  loadDelivery($delivery_id$vehicle_id): JsonResponse
  412.     {
  413.         $em $this->em;
  414.         $delivery $em->getRepository(Delivery::class)->findOneBy([
  415.             'id' => $delivery_id
  416.         ]);
  417.         if($vehicle_id == 1796){
  418.             return new JsonResponse(['message' => 'No vehicle'], Response::HTTP_EXPECTATION_FAILED);
  419.         }
  420.         $vehicle $em->getRepository(Vehicle::class)->findOneBy([
  421.             'id' => $vehicle_id
  422.         ]);
  423.         /** @var DeliveryVehicle $deliveryVehicle */
  424.         $deliveryVehicle $em->getRepository(DeliveryVehicle::class)->findOneBy([
  425.             'delivery' => $delivery,
  426.             'isCancelled' => false
  427.         ]);
  428.         if($deliveryVehicle){
  429.             $deliveryVehicle->setIsCancelled(true);
  430.             $deliveryVehicle->setCancelledBy($this->getUser());
  431.             $deliveryVehicle->setCancelledAt(new DateTime());
  432.         }
  433.         $newDeliveryVehicle = new DeliveryVehicle();
  434.         $newDeliveryVehicle->setVehicle($vehicle);
  435.         $newDeliveryVehicle->setDelivery($delivery);
  436.         $newDeliveryVehicle->setCreatedAt(new DateTime());
  437.         $newDeliveryVehicle->setIsCancelled(false);
  438.         $newDeliveryVehicle->setIsVerified(false);
  439.         $newDeliveryVehicle->setCreatedBy($this->getUser());
  440.         $data = [];
  441.         try {
  442.             $em->persist($newDeliveryVehicle);
  443.             $delivery->setIsLoaded(true);
  444.             $delivery->setLoadedAt(new DateTime());
  445.             $delivery->setLoadedBy($this->getUser());
  446.             $em->flush();
  447.             /** @var DeliveryParcel[] $parcels */
  448.             $parcels $delivery->getParcels();
  449.             foreach ($parcels as $index => $parcel) {
  450.                 $waybill $parcel->getParcel()->getWaybill();
  451.                 $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  452.                 $this->actionMatrix->loadingAction($this->getUser());
  453.             }
  454.             $em->flush();
  455.             $data = [
  456.                 'id' => $newDeliveryVehicle->getId(),
  457.                 'delivery' => $newDeliveryVehicle->getDelivery()->getId(),
  458.                 'vehicle' => $newDeliveryVehicle->getVehicle()->getId(),
  459.                 'is_verified' => $newDeliveryVehicle->getisVerified(),
  460.                 'is_cancelled' => $newDeliveryVehicle->getisCancelled()
  461.             ];
  462.             return new JsonResponse($dataResponse::HTTP_CREATED);
  463.         }catch (Exception $e){
  464.             return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  465.         }
  466.     }
  467.     /**
  468.      * @Rest\Delete("/deliveries/delete/{delivery_parcel_id}", name="delete_parcel_from_delivery")
  469.      */
  470.     public function  deleteParcelFromDelivery($delivery_parcel_id) {
  471.         $em $this->getDoctrine()->getManager();
  472.         /** @var DeliveryParcel $deliveryParcel */
  473.         $deliveryParcel $em->getRepository(DeliveryParcel::class)->findOneBy([
  474.             'id' => $delivery_parcel_id
  475.         ]);
  476.         if($deliveryParcel) {
  477.             $delivery $em->getRepository(Delivery::class)->findOneBy([
  478.                 'id' => $deliveryParcel->getDelivery()
  479.             ]);
  480.             $delivery->setParcelCount($delivery->getParcelCount() - 1);
  481.             $em->remove($deliveryParcel);
  482. //            $deliveryParcel->getDelivery()->setParcelCount($deliveryParcel->getDelivery()->getParcelCount() - 1);
  483.             try {
  484.                 $em->flush();
  485.                 return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  486.             }catch (Exception $e){
  487.                 return new JsonResponse($deliveryParcelResponse::HTTP_EXPECTATION_FAILED);
  488.             }
  489.         }
  490.     }
  491.     /**
  492.      * @Rest\Get("/deliveries/parcels/{id}", name="get_delivery_parcels")
  493.      * @param Delivery $delivery
  494.      */
  495.     public function deliveryParcels(Delivery $delivery){
  496.         $em =  $this->em;
  497.         $deliveryParcels $em->getRepository(DeliveryParcel::class)->deliveryParcels($delivery);
  498.         if(!$deliveryParcels)
  499.                 return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  500.         return new JsonResponse($deliveryParcelsResponse::HTTP_OK);
  501.     }
  502.     /**
  503.      * @Rest\Delete("/deliveries/parcels/{id}", name="delete_delivery_parcel")
  504.      * @param $id
  505.      */
  506.     public function deleteDeliveryParcel($id){
  507.         $em =  $this->em;
  508.         $deliveryParcel $em->getRepository(DeliveryParcel::class)->findOneBy([
  509.             'id' => $id
  510.         ]);
  511.         if($deliveryParcel){
  512.             $em->remove($deliveryParcel);
  513.             $em->flush();
  514.             return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  515.         }
  516.         return new JsonResponse(nullResponse::HTTP_NO_CONTENT);
  517.     }
  518.     /**
  519.      * @Rest\Post("/deliveries/parcels", name="add_parcel_delivery")
  520.      * @param Request $request
  521.      */
  522.     public function addParcelDelivery(Request $request){
  523.         $em $this->em;
  524.         $arrayParcels json_decode($request->getContent(), true);
  525.             $delivery $em->getRepository(Delivery::class)->findOneBy([
  526.                 'id' => $arrayParcels['delivery']
  527.             ]);
  528.             $parcel $em->getRepository(Parcel::class)->findOneBy([
  529.                 'id' => $arrayParcels['parcel']
  530.             ]);
  531.             $parcels $em->getRepository(DeliveryParcel::class)->findBy([
  532.                 'delivery' => $delivery
  533.             ]);
  534.             $delivery->setParcelCount(count($parcels));
  535.             if($delivery && $parcel){
  536.                 $deliveryParcel $em->getRepository(DeliveryParcel::class)->findOneBy([
  537.                     'parcel' => $parcel,
  538.                     'isCancelled' => false
  539.                 ]);
  540.                 $newDParcel = new DeliveryParcel();
  541.                 $newDParcel->setParcel($parcel);
  542.                 $newDParcel->setDelivery($delivery);
  543.                 $newDParcel->setCreatedAt(new \DateTime());
  544.                 $newDParcel->setCreatedBy($this->getUser());
  545.                 $newDParcel->setIsCancelled(false);
  546.                 $newDParcel->setIsReceived(false);
  547.                 if($deliveryParcel){
  548.                     $newDParcel->setCancelledAt(new \DateTime());
  549.                     $newDParcel->setCancelledBy($this->getUser());
  550.                     $newDParcel->setIsCancelled(true);
  551.                     $newDParcel->setCancelledBecause("Another parcel is added to delivery:".$deliveryParcel->getDelivery()->getId());
  552.                 }
  553.                 try {
  554. //                    $count = $delivery->getParcelCount()? 0: $delivery->getParcelCount();
  555.                     $count $delivery->getParcelCount();
  556.                     $delivery->setParcelCount(($count+1));
  557.                     $em->persist($newDParcel);
  558.                     $em->flush();
  559.                     $data = [
  560.                         'id' => $newDParcel->getId(),
  561.                         'parcel' => $newDParcel->getParcel()->getId(),
  562.                         'delivery' => $newDParcel->getDelivery()->getId(),
  563.                         'is_cancelled' => $newDParcel->getisCancelled(),
  564.                         'cancelled_because' => $newDParcel->getCancelledBecause()
  565.                     ];
  566.                     return new JsonResponse($dataResponse::HTTP_CREATED);
  567.                 }catch (Exception $e) {
  568.                     $data = [
  569.                         'error' => [
  570.                             'message' => "Error occurred: could not add parcel to this delivery ".$e->getMessage()
  571.                         ]
  572.                     ];
  573. //
  574.                     return new JsonResponse($dataResponse::HTTP_EXPECTATION_FAILED);
  575.                 }
  576.             }
  577.     }
  578.     /**
  579.      * @Rest\Get("/deliveries", name="all_un_verified_deliveries")
  580.      */
  581.     public function  getDeliveries(): JsonResponse
  582.     {
  583.         $em $this->em;
  584.         $deliveries $em->getRepository(Delivery::class)->findBy([
  585.             'isReceived' => false,
  586.             'isLoaded' => false,
  587.             'isCancelled' => false
  588.         ]);
  589.         return new JsonResponse($deliveriesResponse::HTTP_OK);
  590.     }
  591.     /**
  592.      * @Rest\Get("/deliveries/{station_id}", name="all_un_verified_station_deliveries")
  593.      * @param $station_id
  594.      */
  595.     public function  getStationDeliveries($station_id) {
  596.         $em $this->em;
  597.         $deliveries $em->getRepository(Delivery::class)->findDeliveries($station_id);
  598.         $newDeliveries = array();
  599.         foreach ($deliveries as $index => $delivery) {
  600.             $deliveryParcels $em->getRepository(DeliveryParcel::class)->getDeliveryParcels($delivery['id']);
  601.             $deliveryVehicle $em->getRepository(DeliveryVehicle::class)->findDeliveryVehicle($delivery['id']);
  602.             $deliveries[$index]['parcels'] = $deliveryParcels;
  603.             $deliveries[$index]['vehicle'] = $deliveryVehicle;
  604.         }
  605. //        $deliveryVehicles = $em->getRepository(DeliveryVehicle::class)->findDeliveryVehicles($station_id);
  606.         $data = [
  607.             "deliveries" => $deliveries
  608.         ];
  609.         return new JsonResponse($dataResponse::HTTP_OK);
  610.     }
  611.     /**
  612.      * @Rest\Post("/deliveries/{station_id}", name="create_delivery")
  613.      */
  614.     public function  createDelivery($station_idRequest $request) {
  615.         $em $this->em;
  616.         $station $em->getRepository(Station::class)->findOneBy([
  617.             'id' => $station_id
  618.         ]);
  619.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  620.             'user' => $this->getUser()
  621.         ], ['id' => 'DESC']);
  622.         if($station === $userStation->getStation()) {
  623.             $data = [
  624.                 'error' => [
  625.                     'message' => "Cannot create Delivery for ".$userStation->getStation()->getStationName()
  626.                 ]
  627.             ];
  628.             return new JsonResponse($dataResponse::HTTP_OK);
  629.         }
  630.         $delivery = new Delivery();
  631.         $delivery->setCreatedAt(new \DateTime());
  632.         $delivery->setIsCancelled(false);
  633.         $delivery->setCreatedBy($this->getUser());
  634.         $delivery->setIsReceived(false);
  635.         $delivery->setIsLoaded(false);
  636.         $delivery->setDestination($station);
  637.         $delivery->setParcelCount(0);
  638.         $delivery->setIsVerified(false);
  639.         $delivery->setIsReceivedFully(false);
  640.         $delivery->setIsReceived(false);
  641.         $delivery->setReceivedParcels(0);
  642.         $userStation $em->getRepository(UserStation::class)->findOneBy([
  643.             'user' => $this->getUser()
  644.         ], ['id' => 'DESC']);
  645.         $delivery->setOriginStation($userStation->getStation());
  646.         try {
  647.             $em->persist($delivery);
  648.             $em->flush();
  649.             return new JsonResponse($delivery->getId(), Response::HTTP_CREATED);
  650.         }catch (Exception $e){
  651.             return new JsonResponse($deliveryResponse::HTTP_EXPECTATION_FAILED);
  652.         }
  653.     }
  654.     /**
  655.      * @Rest\Get("/deliveries/{id}/{delivery_id}", name="get_delivery")
  656.      */
  657.     public function  getDelivery(Station $station$delivery_id) {
  658.         $em $this->em;
  659.         $delivery $em->getRepository(Delivery::class)->findOneBy([
  660.             'id' => $delivery_id
  661.         ]);
  662.         return new JsonResponse($deliveryResponse::HTTP_OK);
  663.     }
  664.     /**
  665.      * @Rest\Get("/deliveries/incoming/{station_id}/{delivery_id}", name="get_one_incoming_delivery")
  666.      * @param $station_id
  667.      * @param $delivery_id
  668.      * @return JsonResponse
  669.      */
  670.     public function  getIncomingDelivery($station_id$delivery_id): JsonResponse
  671.     {
  672.         $em $this->em;
  673.         $delivery $em->getRepository(Delivery::class)->findIncomingDelivery($station_id$delivery_id);
  674.         if($delivery){
  675.             $incomingParcels $em->getRepository(DeliveryParcel::class)->commonDeliveryIncomingParcels($delivery_id);
  676.             /** @var DeliveryVehicle $deliveryVehicle */
  677.             $deliveryVehicle $em->getRepository(DeliveryVehicle::class)->findOneBy([
  678.                 'delivery' => $delivery_id
  679.             ],['id' => 'DESC']);
  680.             if($deliveryVehicle){
  681.                 $delivery['delivery_vehicle'] = $deliveryVehicle->getVehicle()->getRegNumber();
  682.             }
  683.             if($incomingParcels){
  684.                 $parcels = [
  685.                     'parcels' => $incomingParcels
  686.                 ];
  687.                $delivery['parcels'] = $incomingParcels;
  688.             }
  689.         }else{
  690.             return new JsonResponse(nullResponse::HTTP_NOT_FOUND);
  691.         }
  692.         return new JsonResponse($deliveryResponse::HTTP_OK);
  693.     }
  694.     private function sendLoadingSms(Delivery $delivery): void
  695.     {
  696.         $em $this->em;
  697.         $deliveryParcels $em->getRepository(DeliveryParcel::class)->findBy([
  698.             'isCancelled' => false,
  699.             'delivery'=>$delivery
  700.         ]);
  701.         foreach ($deliveryParcels as $index => $deliveryParcel) {
  702.             $waybill $deliveryParcel->getParcel()->getWaybill();
  703.             $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  704.             $this->actionMatrix->loadingAction($this->getUser());
  705.         }
  706.     }
  707.     /**
  708.      * @Rest\Get("/delivery/sms_test", name="test_sms")
  709.      */
  710.     public function sendTestSMs(): JsonResponse
  711.     {
  712.         $em $this->em;
  713.         /** @var WayBill $waybill */
  714.         $waybill $em->getRepository(WayBill::class)->findOneBy([
  715.             'id' => 10001,
  716.         ]);
  717.         $data $this->sendSms($waybill$em$this->logger);
  718.         return new JsonResponse($dataResponse::HTTP_OK);
  719.     }
  720.     /**
  721.      * @Rest\Get("/delivery/sms_failed", name="failed_smses")
  722.      */
  723.     public function getFailedSms(){
  724.         $em $this->em;
  725.         $sql "SELECT * FROM sms where date(created_at) >= cast('2023-10-05' as date) and amount = 0";
  726.         $stmt $em->getConnection()->prepare($sql);
  727. //        $stmt->bindValue('cap',$cap);
  728. //        $stmt->bindValue('year',$year);
  729. //        $stmt->bindValue('month',$month);
  730.         $stmt->execute();
  731.         $smses $stmt->executeQuery()->fetchAllAssociative();
  732. //        ];
  733.         foreach ($smses as $index => $sms) {
  734.             /** @var Sms $realSms */
  735.             $realSms $em->getRepository(Sms::class)->findOneBy([
  736.                 'id' => $sms['id']
  737.             ]);
  738.             $smsi = new SendSms();
  739. //            $smsi->sendOutSms($sms['recepient'],$sms['sms']);
  740.             $data $this->sendSms($realSms->getTransaction()->getWayBill(), $em$this->logger);
  741.         }
  742.         $view $this->view($smsesResponse::HTTP_OK);
  743. //
  744.         return $view;
  745. //        return new JsonResponse($smses, Response::HTTP_OK);
  746.     }
  747. }