src/Controller/VehiclesController.php line 152

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AuctionVehicles;
  4. use App\Entity\Companies;
  5. use App\Entity\Users;
  6. use App\Entity\VehicleClients;
  7. use App\Entity\VehicleDocTypes;
  8. use App\Entity\VehicleDocs;
  9. use App\Entity\VehicleRegistrations;
  10. use App\Entity\Vehicles;
  11. use App\Entity\VehicleOwnershipTransfer;
  12. use App\Entity\VehicleSales;
  13. use App\Form\VehicleRegistrationsType;
  14. use App\Form\VehiclesSearchType;
  15. use App\Service\FileHandler;
  16. use App\Service\VehiclesService;
  17. use Knp\Component\Pager\PaginatorInterface;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Security\Http\Attribute\IsGranted;
  20. use Symfony\Component\ExpressionLanguage\Expression;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextType;
  24. use Symfony\Component\Form\Form;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Filesystem\Filesystem;
  29. use App\Validator\Constraints\SerialnumberVehicleRegisteration;
  30. use Symfony\Component\Validator\Validator\ValidatorInterface;
  31. use Symfony\Contracts\Translation\TranslatorInterface;
  32. use Doctrine\Persistence\ManagerRegistry;
  33. /**
  34.  * Vehicle controller.
  35.  *
  36.  * @Route("vehicles")
  37.  */
  38. #[Route('vehicles')]
  39. class VehiclesController extends AbstractController
  40. {
  41.     /**
  42.      * Lists all vehicle entities.
  43.      *
  44.      * @return \Symfony\Component\HttpFoundation\Response
  45.      */
  46.     #[Route('/'name'vehicles_index'methods:["GET"])]
  47.     #[IsGranted('ROLE_ADMIN')]
  48.     public function indexAction(Request $requestPaginatorInterface $paginatorVehiclesService $vehiclesServiceManagerRegistry $doctrine)
  49.     {
  50.         $locale $request->getLocale();
  51.         $em $doctrine->getManager();
  52.         //create the search form and bind request to it (this populates the search form fields with posted data)
  53.         $searchForm $this->createForm(VehiclesSearchType::class,array(
  54.             'locale'                 => $locale,
  55.             'em' => $em
  56.         ));
  57.         $searchForm->handleRequest($request);
  58.         $searchFormSubmittedFields= [];
  59.         if ($searchForm->isSubmitted()) {
  60.             $submittedSearchForm $request->query->all()[$searchForm->getConfig()->getType()->getBlockPrefix()];
  61.             $searchFormSubmittedFields array_filter($submittedSearchForm);
  62.         }
  63.         $vehiclesSearch $vehiclesService->listVehiclesSearch($searchFormSubmittedFields);
  64.         $repository $paginator->paginate(
  65.             $vehiclesSearch,
  66.             $request->query->getInt('page'1),
  67.             $request->query->getInt('limit'20)
  68.         );
  69.         return $this->render('vehicles/index.html.twig', [
  70.             'vehicles'    => $repository,
  71.             'searchForm'  => $searchForm->createView(),
  72.             'locale'      => $locale
  73.         ]);
  74.     }
  75.     /**
  76.      * Creates a new vehicle entity.
  77.      *
  78.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
  79.      */
  80.     #[Route('/new'name'vehicles_new'methods:["GET""POST"])]
  81.     #[IsGranted('ROLE_ADMIN')]
  82.     public function newAction(Request $requestFileHandler $fileHandlerTranslatorInterface $translatorValidatorInterface 
  83.             $validatorVehiclesService $vehiclesServiceManagerRegistry $doctrine)
  84.     {
  85.         $loginUser $this->getUser();
  86.         $locale    $request->getLocale();
  87.         $em        $doctrine->getManager();
  88.         $existingSNVehicleId '';
  89.         $existingVINVehicleId '';
  90.         $existingPTVehicleId '';
  91.         $vehicleRegistrations = new VehicleRegistrations();
  92.         $vehicle              = new Vehicles();
  93.         $registrationDoc = new VehicleDocs();
  94.         $docType         VehicleDocTypes::DOC_TYPES['vehicle_registration']; //the document will be from vehicle_registration DocType
  95.         $registrationDoc->setDocType($em->getRepository(VehicleDocTypes::class)->find($docType));
  96.         $registrationDoc->setVehicle($vehicle);
  97.         $registrationDoc->setCreatedBy($loginUser);
  98.         $vehicleRegistrations->setVehicle($vehicle);
  99.         $vehicleRegistrations->setRegistrationDoc($registrationDoc);
  100.         $vehicleForm $this->createForm(VehicleRegistrationsType::class, $vehicleRegistrations, ['locale' => $locale'attr' => ['onsubmit' => "return fnValidate()"]]);
  101.         $vehicleForm->handleRequest($request);
  102.         if ($vehicleForm->isSubmitted() && $vehicleForm->isValid()) {
  103.             $vehiclesService->createNewVehicle($vehicleRegistrations,$registrationDoc,$vehicle,$fileHandler);
  104.             $session $request->getSession();
  105.             $session->getFlashBag()->add('success',
  106.                 $translator->trans('vehicle added successfully', [], 'vehicles')
  107.             );
  108.             return $this->redirectToRoute('vehicles_edit', ['vehicleId' => $vehicle->getVehicleId()]);
  109.         } elseif ($vehicleForm->isSubmitted() && ! $vehicleForm->isValid()) {
  110.             //in case if the form is invalid, check if serial number uniqueness validation is the constraint that was
  111.             //violated. if so, some special handling has to be performed. The user will be prompted to either proceed
  112.             //with creating the vehicle or to ignore the creation of the veihlce and go to the already existing vehicle
  113.             //with that registration serial number
  114.             $violations $validator->validate($vehicleRegistrations);
  115.             if (!== count($violations->findByCodes(SerialnumberVehicleRegisteration::NOT_UNIQUE_SERIAL_ERROR))) {
  116.                 $existingSNVehicleId $vehicleRegistrations->getExistingSNVehicleId();
  117.                 $existingVINVehicleId $vehicleRegistrations->getExistingVINVehicleId();
  118.                 $existingPTVehicleId $vehicleRegistrations->getExistingPTVehicleId();
  119.             }
  120.         }
  121.         return $this->render('vehicles/new.html.twig', [
  122.             'form' => $vehicleForm->createView(),
  123.             'existingSNVehicleId' => $existingSNVehicleId,
  124.             'existingVINVehicleId'=> $existingVINVehicleId,
  125.             'existingPTVehicleId' => $existingPTVehicleId
  126.         ]);
  127.     }
  128.     /**
  129.      * Displays a form to edit an existing vehicle entity or to proceed with new vehicle creation.
  130.      *
  131.      * @return \Symfony\Component\HttpFoundation\Response
  132.      */
  133.     #[Route('/{vehicleId}/edit'name'vehicles_edit'methods:["GET"])]
  134.     #[IsGranted(new Expression("is_granted('ROLE_ADMIN') or is_granted('ROLE_BENEFICIARY_REP')"))]
  135.     public function editAction(VehicleRegistrations $vehicleRegistrationsRequest $request)
  136.     {
  137.         $locale $request->getLocale();
  138.         $vehicle               $vehicleRegistrations->getVehicle();
  139.         $fileRealPath $this->getParameter('web_dir_path') . $this->getParameter('vehicle_uploaded_files') . '/' $vehicle->getVehicleId(). '/';
  140.         $fileSystem = new Filesystem();
  141.         if(!$fileSystem->exists($fileRealPath)){
  142.             //if no dir yet for the vehicle images then create one
  143.             $fileSystem->mkdir($fileRealPath);
  144.         }
  145.         $maker = ($vehicleRegistrations->getModel())?$vehicleRegistrations->getModel()->getMaker() : '';
  146.         //populate panel 0 form: fill a VehicleRegistrations form with VehicleRegistrations entity data
  147.         $vehicleEditForm $this->createForm(VehicleRegistrationsType::class, $vehicleRegistrations, ['locale' => $locale,'maker'=> $maker'attr' => ['onsubmit' => "return fnValidate()"] ]);
  148.         $owner = [];
  149.         if($vehicleRegistrations->getVehicleOwner()){
  150.             $owner['ownerId']  =$vehicleRegistrations->getVehicleOwner()->getClientId();
  151.             $owner['ownerName']  =$vehicleRegistrations->getVehicleOwner()->getName($locale);
  152.         }
  153.         return $this->render('vehicles/edit.html.twig', [
  154.             'vehicle'                     => $vehicle,
  155.             'vehicle_edit_form'           => $vehicleEditForm->createView(),
  156.             'owner'                       => $owner
  157.         ]);
  158.     }
  159.     /**
  160.      * Update an existing vehicle entity or proceed with new vehicle creation.
  161.      *
  162.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  163.      */
  164.     #[Route('/{vehicleId}/edit'name'vehicles_update'methods:["POST"])]
  165.     #[IsGranted(new Expression("is_granted('ROLE_ADMIN') or is_granted('ROLE_BENEFICIARY_REP')"))]
  166.     public function updateAction(Request $requestVehicleRegistrations $vehicleRegistrationsVehiclesService $vehiclesServiceManagerRegistry $doctrine) {
  167.         $locale $request->getLocale();
  168.         $vehicle               $vehicleRegistrations->getVehicle();
  169.         $vehicleId             $vehicle->getVehicleId();
  170.         $registrationDoc       $vehicleRegistrations->getRegistrationDoc();
  171.         //$registrationDoc is holding the data from DB so far. we will check if there is already imagePath for it in DB
  172.         $em                    $doctrine->getManager();
  173.         //$form            = $request->request->get('appbundle_vehicleregistrations');
  174.         $formPostData            $request->request->all();
  175.         $clearImage      $formPostData['appbundle_vehicleregistrations']['registrationDoc']['clearImage'];
  176.         $vehicleEditForm $this->createForm(VehicleRegistrationsType::class, $vehicleRegistrations , ['locale' => $locale ]);
  177.         $imageNameDB "";
  178.         if($registrationDoc && $registrationDoc->getImagePath()){
  179.             $imageNameDB $registrationDoc->getImagePath();
  180.         }
  181.         $vehicleDocsRepository $em->getRepository(VehicleDocs::class);
  182.         $imagesDirWebPath      $this->getParameter('vehicle_uploaded_files') . '/' $vehicle->getVehicleId(). '/';
  183.         $imagesDirRealPath     $this->getParameter('web_dir_path') . $imagesDirWebPath;
  184.         $vehicleEditForm->handleRequest($request);
  185.         //special handling for registration image as it could be an new uploaded binary image or just a path to existing image
  186.         if ($vehicleRegistrations->getRegistrationDoc()) {
  187.             //save or restore image
  188.             $vehicleDocsRepository->saveDocumentImagePathFile($vehicleRegistrations->getRegistrationDoc(), $imagesDirRealPath$imageNameDB$clearImage);
  189.         }
  190.         //validate, get vehicle owner and vehicle actual user preperties, then save
  191.         if ($vehicleEditForm->isSubmitted() && $vehicleEditForm->isValid()) {
  192.             $vehiclesService->updateVehicle($vehicle,$vehicleRegistrations);
  193.             return $this->redirectToRoute('vehicles_update', ['vehicleId' => $vehicleId]);
  194.         }
  195.         $owner = [];
  196.         if($vehicleRegistrations->getVehicleOwner()){
  197.             $owner['ownerId']  =$vehicleRegistrations->getVehicleOwner()->getClientId();
  198.             $owner['ownerName']  =$vehicleRegistrations->getVehicleOwner()->getName($locale);
  199.         }
  200.         return $this->render('vehicles/edit.html.twig', [
  201.             'vehicle'                     => $vehicle,
  202.             'vehicle_edit_form'           => $vehicleEditForm->createView(),
  203.             'owner'                       => $owner
  204.         ]);
  205.     }
  206.     /**
  207.      * Deletes a vehicle entity.
  208.      *
  209.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  210.      */
  211.     #[Route('/{vehicleId}'name'vehicles_delete'methods:["DELETE"])]
  212.     #[IsGranted('ROLE_SUPER_ADMIN')]
  213.     public function deleteAction(Request $requestVehicles $vehicleTranslatorInterface $translatorManagerRegistry $doctrine)
  214.     {
  215.         $form $this->createDeleteForm($vehicle);
  216.         $form->handleRequest($request);
  217.         if ($form->isSubmitted() && $form->isValid()) {
  218.             $em $doctrine->getManager();
  219.             $em->remove($vehicle);
  220.             $em->flush();
  221.             $session $request->getSession();
  222.             $session->getFlashBag()->add('success',
  223.                 $translator->trans('vehicle deleted successfully', [], 'vehicles')
  224.             );
  225.         }
  226.         return $this->redirectToRoute('vehicles_index');
  227.     }
  228.     /**
  229.      * Creates a form to delete a vehicle entity.
  230.      *
  231.      * @param Vehicles $vehicle The vehicle entity
  232.      *
  233.      * @return Form The form
  234.      */
  235.     private function createDeleteForm(Vehicles $vehicle)
  236.     {
  237.         return $this->createFormBuilder()
  238.             ->setAction($this->generateUrl('vehicles_delete', ['vehicleId' => $vehicle->getVehicleId()]))
  239.             ->setMethod('DELETE')
  240.             ->getForm()
  241.             ;
  242.     }
  243.     /**
  244.      * @return Response|JsonResponse json array makers_models under specific maker.
  245.      */
  246.     #[Route('/getUserName'name'get_name_ajax')]
  247.     public function getUserName(Request $requestManagerRegistry $doctrine)
  248.     {
  249.         if ($request->isXMLHttpRequest()) {
  250.             $NID    $request->request->get('ID');
  251.             $checkIdNumber=$NID;
  252.             $leng=strlen((string)$checkIdNumber); //check the string length and make convert to string then check length of string
  253.             if($leng!=10){
  254.                 $res = ['error' => "Id must be 10 digit",'type' => 'swal'];
  255.                 return new JsonResponse($res);
  256.             }
  257.             $repository $doctrine->getRepository(Users::class);
  258.             $names $repository->getUserName($NID);
  259.             if (!empty($names)) {
  260.                 $res = ['success' => true'names' => $names'type' => 'users'];
  261.             } else {
  262.                 $repository $doctrine->getRepository(Companies::class);
  263.                 $names $repository->getNames($NID);
  264.                 $res = empty($names) ? ['error' => "No Record Found"] : ['success' => true'names' => $names'type' => 'comp'];
  265.             }
  266.             return new JsonResponse($res);
  267.         }
  268.         return new Response('This is not ajax!'400);
  269.     }
  270.     /**
  271.      * make a vehicle situation is marked for sale.
  272.      *
  273.      * @return Response
  274.      */
  275.     #[Route('/markedForSale'name'make_vehicle_marked_for_sale')]
  276.     #[IsGranted('ROLE_ADMIN')]
  277.     public function makeVehicleMarkedForSale(Request $requestManagerRegistry $doctrine)
  278.     {
  279.         $loginUser $this->getUser();
  280.         if ($request->isXMLHttpRequest()) {
  281.             $vehicleID $request->request->get('vehicleID');
  282.             $em        $doctrine->getManager();
  283.             $vehicleRepository $em->getRepository(Vehicles::class);
  284.             $vehicle   $vehicleRepository->find($vehicleID);
  285.             $vehicle->setOfferabilityForSale(Vehicles::SALE_OFFERABILITY['Marked_For_Sale']);
  286.             $vehicleRepository->createVehicleOfferailityLog(Vehicles::SALE_OFFERABILITY['Marked_For_Sale'] , $vehicle$loginUser);
  287.             $em->flush();
  288.             return new JsonResponse();
  289.         }
  290.         return new Response('This is not ajax!'400);
  291.     }
  292.     /**
  293.      *  auction information for vehicle.
  294.      *
  295.      * @return \Symfony\Component\HttpFoundation\Response
  296.      */
  297.     #[Route('/{vehicleId}/auctionInfoVehicle'name'auction_info_vehicle'methods:["GET"])]
  298.     #[IsGranted('ROLE_ADMIN')]
  299.     public function getAuctionInfoVehicleAction(Request $requestVehicles $vehicleManagerRegistry $doctrine)
  300.     {
  301.         $locale $request->getLocale();
  302.         $em $doctrine->getManager();
  303.         $auctionVehicles $em->getRepository(AuctionVehicles::class)->findBy(['vehicle' => $vehicle]);
  304.         if ($vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()) {
  305.             $beneficiary $vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()->getName($locale);
  306.             $beneficiary_type $vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()->getClientType();
  307.             $beneficiary_id $vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()->getClientId();
  308.         }
  309.         return $this->render('vehicles/auctionInfoVehicle.html.twig', [
  310.             'auctionVehicles'  => $auctionVehicles,
  311.             'beneficiary'      => $beneficiary,
  312.             'beneficiary_type' => $beneficiary_type,
  313.             'beneficiary_id'   => $beneficiary_id,
  314.             'locale'           => $locale,
  315.             'vehicle'          => $vehicle,
  316.         ]);
  317.     }
  318.     /**
  319.      *  Required papers for sold vehicle ownership transfer
  320.      *
  321.      * @return \Symfony\Component\HttpFoundation\Response
  322.      */
  323.     #[Route('/{vehicleId}/soldvpapers4OT'name'sold_vehicle_papers_4_ot'methods:["GET"])]
  324.     #[IsGranted('ROLE_USER')]
  325.     public function soldVehiclePapers4OTAction(Request $requestVehicles $vehicleManagerRegistry $doctrine)
  326.     {
  327.         $locale $request->getLocale();
  328.         $em $doctrine->getManager();
  329.         $plateNumber$vehicle->getVehicleRegistrations()->getPlateNumber($locale);
  330.         $vehicleOwner$vehicle->getVehicleRegistrations()->getVehicleOwner();
  331.         if($vehicleOwner->getClientType() == VehicleClients::CLIENT_TYPES['user'] ){
  332.             $ownerId$vehicleOwner->getUser()->getUserId();
  333.             $ownerIdentityPhoto$vehicleOwner->getUser()->getUserIdentityInfo()->getImagePath();
  334.             $ownerMobileNumber$vehicleOwner->getUser()->getMobileNumber();
  335.         }elseif($vehicleOwner->getClientType() == VehicleClients::CLIENT_TYPES['company'] ){
  336.             $ownerId$vehicleOwner->getCompany()->getCompanyId();
  337.             $ownerIdentityPhoto$vehicleOwner->getCompany()->getCompanyRegistration()->getFilePath();
  338.         }
  339.         $renunciationLetterType$em->getRepository(VehicleDocTypes::class)->find(
  340.             VehicleDocTypes::DOC_TYPES['letter_of_renunciation'] );
  341.         $renunciationLetter $em->getRepository(VehicleDocs::class)->findOneBy(['vehicle'=>$vehicle'docType'=> $renunciationLetterType]);
  342.         return $this->render('vehicles/soldVehiclePapers4OT.html.twig', [
  343.             'locale'           => $locale,
  344.             'vehicle'          => $vehicle,
  345.             'plateNumber'          => $plateNumber,
  346.             'ownerId'          => $ownerId,
  347.             'ownerIdentityPhoto'          => $ownerIdentityPhoto,
  348.             'ownerMobileNumber'          => (isset($ownerMobileNumber))?$ownerMobileNumber:null,
  349.             'renunciationLetter'          => $renunciationLetter,
  350.         ]);
  351.     }
  352.     /**
  353.      *
  354.      * @return Response|JsonResponse json array warehouses under specific city.
  355.      */
  356.     #[Route('/getImages'name'get_images_ajax')]
  357.     public function getImages(Request $request)
  358.     {
  359.         if (!$request->isXMLHttpRequest()) {
  360.             return new Response('This is not ajax!'400);
  361.         }
  362.         $vehicleId $request->request->get('id');
  363.         $dirRelativePath $this->getParameter('vehicle_uploaded_files') . '/' $vehicleId '/';
  364.         $fileSystem = new Filesystem();
  365.         if(!$fileSystem->exists($dirRelativePath)){
  366.             //if no dir yet for the vehicle images then create one
  367.             $fileSystem->mkdir($dirRelativePath);
  368.         }
  369.         $handle opendir($dirRelativePath);
  370.         $images = [] ;
  371.         while($file readdir($handle)){
  372.             if ($file !== '.' && $file !== '..' && in_array(mime_content_type($dirRelativePath$file), ["image/jpeg""image/png""image/jpg"])) {
  373.                 $images[]= $dirRelativePath$file ;
  374.             }
  375.         }
  376.         return new JsonResponse(array('images' =>$images ));
  377.     }
  378.     /**
  379.      * export all vehicles as csv file
  380.      * 
  381.      * @return Response
  382.      * @throws \Doctrine\DBAL\DBALException
  383.      */
  384.     #[Route('/vehiclesExport'name'vehicles_export'methods:["GET"])]
  385.     #[IsGranted('ROLE_SUPER_ADMIN')]
  386.     public function exportVehicles(Request $request,VehiclesService $vehiclesService){
  387.         return $vehiclesService->exportVehicles();
  388.     }
  389.     /**
  390.      * Displays a form to edit an existing vehicleRepair entity.
  391.      *
  392.      * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
  393.      */
  394.     #[Route('/vehicle_update_states'name'vehicle_update_states'methods:["GET"])]
  395.     #[IsGranted('ROLE_SUPER_ADMIN')]
  396.     public function vehicleUpdateStatesAction(Request $requestManagerRegistry $doctrine){
  397.         $em     $doctrine->getManager();
  398.         $vehiclesRepo $em->getRepository(Vehicles::class);
  399.         $form $this->createFormBuilder()
  400.             ->setAction($this->generateUrl('vehicle_update_states'))
  401.             ->setMethod("GET");
  402.         $form->add('vehicleIdStart'TextType::class, [
  403.             'required'           => true,
  404.             'label'              => 'Vehicle Id Start',
  405.             'translation_domain' => 'vehicles'])
  406.             ->add('vehicleIdEnd'TextType::class, [
  407.                 'required'           => true,
  408.                 'label'              => 'Vehicle Id End',
  409.                 'translation_domain' => 'vehicles'
  410.             ])
  411.             ->add('applyNewState',CheckboxType::class, array(
  412.                 'label'    => 'Apply the new state to the vehicles range',
  413.                 'required' => false
  414.             ))
  415.         ;
  416.         $vehicleUpdateStatesForm $form->getForm();
  417.         $vehicleUpdateStatesForm->handleRequest($request);
  418.         $vehiclesStates= array();
  419.         if( $vehicleUpdateStatesForm->isSubmitted() && $vehicleUpdateStatesForm->isValid()){
  420.             $vehicleIdStart $vehicleUpdateStatesForm->get('vehicleIdStart')->getData();
  421.             $vehicleIdEnd   $vehicleUpdateStatesForm->get('vehicleIdEnd')->getData();
  422.             $applyNewState   $vehicleUpdateStatesForm->get('applyNewState')->getData();
  423.             $vehicleRepository $em->getRepository(Vehicles::class);
  424.             $query      $vehicleRepository->createQueryBuilder('V');
  425.             $query->where('V.vehicleId >= :vehicleIdStart')
  426.                 ->setParameter('vehicleIdStart'$vehicleIdStart);
  427.             $query->andWhere('V.vehicleId <= :vehicleIdEnd')
  428.                 ->setParameter('vehicleIdEnd'$vehicleIdEnd);
  429.             $searchedVehicles $query->getQuery()->getResult();
  430.             foreach ($searchedVehicles as $vehicle) {
  431.                 $vehicleSituation $vehicle->getSituation();
  432.                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'] = array();
  433.                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State'] = array();
  434.                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State'] = array();
  435.                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State'] = array();
  436.                 $vehiclesStates[$vehicle->getVehicleId()]['situation'] = $vehicle->getSituation();
  437.                 //block#1 Special case for Sold_And_Closed
  438.                 if($vehicleSituation =='Sold_And_Closed'){
  439.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Sold_And_Closed'] = 1;
  440.                     $vehiclesStates[$vehicle->getVehicleId()]['vehicleId']=$vehicle->getVehicleId();
  441.                     $vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
  442.                     if($applyNewState){
  443.                         $newState $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'];
  444.                         $vehicle->setState($newState);
  445.                         $em->persist($vehicle);
  446.                     }
  447.                     $vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
  448.                     continue; //break from foreach and continue with the next
  449.                 }
  450.                 //block#2 deriving vehicle states info from its sales info
  451.                 //get the approved vehicle sale if there is any
  452.                 $vehicleApprovedSale $em->getRepository(VehicleSales::class)->getTheVehicleApprovedSale($vehicle->getVehicleId());
  453.                 if($vehicleApprovedSale){
  454.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Sold'] = 1;
  455.                     //existence of exit date tells us some info about vehicle location and it exit permission states
  456.                     if($vehicle->getExitDate()!=null){
  457.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Delivered_To_Buyer'] = 1;
  458.                     }else{
  459.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Received'] = 1;
  460.                     }
  461.                     //trying to derive OT state and exit permission state
  462.                     $vehicleOwnershipTransferRepository $em->getRepository(VehicleOwnershipTransfer::class);
  463.                     $vehicleOwnershipTransferToBuyer $vehicleOwnershipTransferRepository->findOneBy(
  464.                         ['sale'=>$vehicleApprovedSale'approvalStatus'=>VehicleOwnershipTransfer::APPROVAL_STATUSES['approved']]);
  465.                     if(!empty($vehicleOwnershipTransferToBuyer) ){
  466.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Transferred_To_Buyer'] = 1;
  467.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1//if its OT is approved then it is permitted to exit
  468.                     }else{
  469.                         $vehicleInternalOTType $vehiclesRepo->getInternalOTType($vehicle);
  470.                         if ($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_drop']) {
  471.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Dropped'] = 1;
  472.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1//sold dropped vehicles are always permitted to exit
  473.                         } else {
  474.                             if ($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_transfer']) {
  475.                                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Transferred_To_Tjr'] = 1;
  476.                             }else{
  477.                                 //no OT to buyer, no internal OT, then it never transferred
  478.                                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
  479.                             }
  480.                             //trying to derive exit permission state by checking if the vehicle has an OT Security
  481.                             if ($vehiclesRepo->doesBuyerPayedOTSecurity($vehicleApprovedSale)) {
  482.                                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1;
  483.                             }else {
  484.                                 //not transferred to buyer, not dropped, no OT security, then not permitted to exit
  485.                                 $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
  486.                             }
  487.                         }
  488.                     }
  489.                     if($applyNewState){
  490.                         $newState array_merge($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'],
  491.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State'],
  492.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State'],
  493.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']);
  494.                         $vehicle->setState($newState);
  495.                         $em->persist($vehicle);
  496.                     }
  497.                     $vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
  498.                     continue; //break from foreach and continue with the next
  499.                 }else{
  500.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
  501.                 }
  502.                 //block#3 detect the vehicle Internal OT State for not sold vehicles
  503.                 $vehicleInternalOTType $vehiclesRepo->getInternalOTType($vehicle);
  504.                 if($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_drop']) {
  505.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Dropped'] = 1;
  506.                 }elseif($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_transfer']) {
  507.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Transferred_To_Tjr'] = 1;
  508.                 }else{
  509.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1//no OT to buyer, no internal OT, then it is completely untransferred
  510.                 }
  511.                 //block#4 detect the vehicle Location_State
  512.                 switch ($vehicleSituation){
  513.                     case 'In_Repair':
  514.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['In_Repair'] = 1;
  515.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
  516.                         break;
  517.                     case 'New':
  518.                         if(!empty($vehicle->getVehicleRevokeRequest())){
  519.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Requested_For_Transportation'] = 1;
  520.                         }else{
  521.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['New'] = 1;
  522.                         }
  523.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
  524.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
  525.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
  526.                         break;
  527.                     case 'Under_Transportation':
  528.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Under_Transportation'] = 1;
  529.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
  530.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
  531.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
  532.                         break;
  533.                     case 'Received':
  534.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Received'] = 1;
  535.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
  536.                         break;
  537.                     case 'Not_Received':
  538.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Not_Received'] = 1;
  539.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
  540.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
  541.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
  542.                         break;
  543.                     case 'Returned':
  544.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Returned'] = 1;
  545.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
  546.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
  547.                         $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1;
  548.                         break;
  549.                 }
  550.                 //block#5 if vehicle Exit_Permission_State is still not set then assume that the vehicle is not permitted to exit
  551.                 if(empty($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']) ){
  552.                     $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
  553.                 }
  554.                 $countVehicleLocationState  count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']);
  555.                 $countVehicleSaleState  count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']);
  556.                 $countVehicleOTState count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']);
  557.                 $countVehicleExitPermissionState count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']);
  558.                 if($countVehicleLocationState == || $countVehicleLocationState || $countVehicleSaleState == || $countVehicleSaleState || $countVehicleOTState == || $countVehicleOTState || $countVehicleExitPermissionState == || $countVehicleExitPermissionState 1
  559.                 ){
  560.                     $vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= true;
  561.                 }else{
  562.                     $vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
  563.                     //if vehicle has no state yet and `applyNewState` checkbox was checked then update vehicle state with the derived state
  564.                     if($applyNewState && !$vehicle->getState()){
  565.                         $newState array_merge($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'],
  566.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State'],
  567.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State'],
  568.                             $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']);
  569.                         $vehicle->setState($newState);
  570.                         $em->persist($vehicle);
  571.                     }
  572.                 }
  573.             }
  574.         }
  575.         $em->flush();
  576.         return $this->render('vehicles/vehicle_update_states.html.twig', [
  577.             'form'  => $vehicleUpdateStatesForm->createView(),
  578.             'vehiclesStates' => $vehiclesStates
  579.         ]);
  580.     }
  581. }