src/Controller/VehiclesController.php line 152
<?php
namespace App\Controller;
use App\Entity\AuctionVehicles;
use App\Entity\Companies;
use App\Entity\Users;
use App\Entity\VehicleClients;
use App\Entity\VehicleDocTypes;
use App\Entity\VehicleDocs;
use App\Entity\VehicleRegistrations;
use App\Entity\Vehicles;
use App\Entity\VehicleOwnershipTransfer;
use App\Entity\VehicleSales;
use App\Form\VehicleRegistrationsType;
use App\Form\VehiclesSearchType;
use App\Service\FileHandler;
use App\Service\VehiclesService;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Filesystem\Filesystem;
use App\Validator\Constraints\SerialnumberVehicleRegisteration;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Doctrine\Persistence\ManagerRegistry;
/**
* Vehicle controller.
*
* @Route("vehicles")
*/
#[Route('vehicles')]
class VehiclesController extends AbstractController
{
/**
* Lists all vehicle entities.
*
* @return \Symfony\Component\HttpFoundation\Response
*/
#[Route('/', name: 'vehicles_index', methods:["GET"])]
#[IsGranted('ROLE_ADMIN')]
public function indexAction(Request $request, PaginatorInterface $paginator, VehiclesService $vehiclesService, ManagerRegistry $doctrine)
{
$locale = $request->getLocale();
$em = $doctrine->getManager();
//create the search form and bind request to it (this populates the search form fields with posted data)
$searchForm = $this->createForm(VehiclesSearchType::class,array(
'locale' => $locale,
'em' => $em
));
$searchForm->handleRequest($request);
$searchFormSubmittedFields= [];
if ($searchForm->isSubmitted()) {
$submittedSearchForm = $request->query->all()[$searchForm->getConfig()->getType()->getBlockPrefix()];
$searchFormSubmittedFields = array_filter($submittedSearchForm);
}
$vehiclesSearch = $vehiclesService->listVehiclesSearch($searchFormSubmittedFields);
$repository = $paginator->paginate(
$vehiclesSearch,
$request->query->getInt('page', 1),
$request->query->getInt('limit', 20)
);
return $this->render('vehicles/index.html.twig', [
'vehicles' => $repository,
'searchForm' => $searchForm->createView(),
'locale' => $locale
]);
}
/**
* Creates a new vehicle entity.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
#[Route('/new', name: 'vehicles_new', methods:["GET", "POST"])]
#[IsGranted('ROLE_ADMIN')]
public function newAction(Request $request, FileHandler $fileHandler, TranslatorInterface $translator, ValidatorInterface
$validator, VehiclesService $vehiclesService, ManagerRegistry $doctrine)
{
$loginUser = $this->getUser();
$locale = $request->getLocale();
$em = $doctrine->getManager();
$existingSNVehicleId = '';
$existingVINVehicleId = '';
$existingPTVehicleId = '';
$vehicleRegistrations = new VehicleRegistrations();
$vehicle = new Vehicles();
$registrationDoc = new VehicleDocs();
$docType = VehicleDocTypes::DOC_TYPES['vehicle_registration']; //the document will be from vehicle_registration DocType
$registrationDoc->setDocType($em->getRepository(VehicleDocTypes::class)->find($docType));
$registrationDoc->setVehicle($vehicle);
$registrationDoc->setCreatedBy($loginUser);
$vehicleRegistrations->setVehicle($vehicle);
$vehicleRegistrations->setRegistrationDoc($registrationDoc);
$vehicleForm = $this->createForm(VehicleRegistrationsType::class, $vehicleRegistrations, ['locale' => $locale, 'attr' => ['onsubmit' => "return fnValidate()"]]);
$vehicleForm->handleRequest($request);
if ($vehicleForm->isSubmitted() && $vehicleForm->isValid()) {
$vehiclesService->createNewVehicle($vehicleRegistrations,$registrationDoc,$vehicle,$fileHandler);
$session = $request->getSession();
$session->getFlashBag()->add('success',
$translator->trans('vehicle added successfully', [], 'vehicles')
);
return $this->redirectToRoute('vehicles_edit', ['vehicleId' => $vehicle->getVehicleId()]);
} elseif ($vehicleForm->isSubmitted() && ! $vehicleForm->isValid()) {
//in case if the form is invalid, check if serial number uniqueness validation is the constraint that was
//violated. if so, some special handling has to be performed. The user will be prompted to either proceed
//with creating the vehicle or to ignore the creation of the veihlce and go to the already existing vehicle
//with that registration serial number
$violations = $validator->validate($vehicleRegistrations);
if (0 !== count($violations->findByCodes(SerialnumberVehicleRegisteration::NOT_UNIQUE_SERIAL_ERROR))) {
$existingSNVehicleId = $vehicleRegistrations->getExistingSNVehicleId();
$existingVINVehicleId = $vehicleRegistrations->getExistingVINVehicleId();
$existingPTVehicleId = $vehicleRegistrations->getExistingPTVehicleId();
}
}
return $this->render('vehicles/new.html.twig', [
'form' => $vehicleForm->createView(),
'existingSNVehicleId' => $existingSNVehicleId,
'existingVINVehicleId'=> $existingVINVehicleId,
'existingPTVehicleId' => $existingPTVehicleId
]);
}
/**
* Displays a form to edit an existing vehicle entity or to proceed with new vehicle creation.
*
* @return \Symfony\Component\HttpFoundation\Response
*/
#[Route('/{vehicleId}/edit', name: 'vehicles_edit', methods:["GET"])]
#[IsGranted(new Expression("is_granted('ROLE_ADMIN') or is_granted('ROLE_BENEFICIARY_REP')"))]
public function editAction(VehicleRegistrations $vehicleRegistrations, Request $request)
{
$locale = $request->getLocale();
$vehicle = $vehicleRegistrations->getVehicle();
$fileRealPath = $this->getParameter('web_dir_path') . $this->getParameter('vehicle_uploaded_files') . '/' . $vehicle->getVehicleId(). '/';
$fileSystem = new Filesystem();
if(!$fileSystem->exists($fileRealPath)){
//if no dir yet for the vehicle images then create one
$fileSystem->mkdir($fileRealPath);
}
$maker = ($vehicleRegistrations->getModel())?$vehicleRegistrations->getModel()->getMaker() : '';
//populate panel 0 form: fill a VehicleRegistrations form with VehicleRegistrations entity data
$vehicleEditForm = $this->createForm(VehicleRegistrationsType::class, $vehicleRegistrations, ['locale' => $locale,'maker'=> $maker, 'attr' => ['onsubmit' => "return fnValidate()"] ]);
$owner = [];
if($vehicleRegistrations->getVehicleOwner()){
$owner['ownerId'] =$vehicleRegistrations->getVehicleOwner()->getClientId();
$owner['ownerName'] =$vehicleRegistrations->getVehicleOwner()->getName($locale);
}
return $this->render('vehicles/edit.html.twig', [
'vehicle' => $vehicle,
'vehicle_edit_form' => $vehicleEditForm->createView(),
'owner' => $owner
]);
}
/**
* Update an existing vehicle entity or proceed with new vehicle creation.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
#[Route('/{vehicleId}/edit', name: 'vehicles_update', methods:["POST"])]
#[IsGranted(new Expression("is_granted('ROLE_ADMIN') or is_granted('ROLE_BENEFICIARY_REP')"))]
public function updateAction(Request $request, VehicleRegistrations $vehicleRegistrations, VehiclesService $vehiclesService, ManagerRegistry $doctrine) {
$locale = $request->getLocale();
$vehicle = $vehicleRegistrations->getVehicle();
$vehicleId = $vehicle->getVehicleId();
$registrationDoc = $vehicleRegistrations->getRegistrationDoc();
//$registrationDoc is holding the data from DB so far. we will check if there is already imagePath for it in DB
$em = $doctrine->getManager();
//$form = $request->request->get('appbundle_vehicleregistrations');
$formPostData = $request->request->all();
$clearImage = $formPostData['appbundle_vehicleregistrations']['registrationDoc']['clearImage'];
$vehicleEditForm = $this->createForm(VehicleRegistrationsType::class, $vehicleRegistrations , ['locale' => $locale ]);
$imageNameDB = "";
if($registrationDoc && $registrationDoc->getImagePath()){
$imageNameDB = $registrationDoc->getImagePath();
}
$vehicleDocsRepository = $em->getRepository(VehicleDocs::class);
$imagesDirWebPath = $this->getParameter('vehicle_uploaded_files') . '/' . $vehicle->getVehicleId(). '/';
$imagesDirRealPath = $this->getParameter('web_dir_path') . $imagesDirWebPath;
$vehicleEditForm->handleRequest($request);
//special handling for registration image as it could be an new uploaded binary image or just a path to existing image
if ($vehicleRegistrations->getRegistrationDoc()) {
//save or restore image
$vehicleDocsRepository->saveDocumentImagePathFile($vehicleRegistrations->getRegistrationDoc(), $imagesDirRealPath, $imageNameDB, $clearImage);
}
//validate, get vehicle owner and vehicle actual user preperties, then save
if ($vehicleEditForm->isSubmitted() && $vehicleEditForm->isValid()) {
$vehiclesService->updateVehicle($vehicle,$vehicleRegistrations);
return $this->redirectToRoute('vehicles_update', ['vehicleId' => $vehicleId]);
}
$owner = [];
if($vehicleRegistrations->getVehicleOwner()){
$owner['ownerId'] =$vehicleRegistrations->getVehicleOwner()->getClientId();
$owner['ownerName'] =$vehicleRegistrations->getVehicleOwner()->getName($locale);
}
return $this->render('vehicles/edit.html.twig', [
'vehicle' => $vehicle,
'vehicle_edit_form' => $vehicleEditForm->createView(),
'owner' => $owner
]);
}
/**
* Deletes a vehicle entity.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
#[Route('/{vehicleId}', name: 'vehicles_delete', methods:["DELETE"])]
#[IsGranted('ROLE_SUPER_ADMIN')]
public function deleteAction(Request $request, Vehicles $vehicle, TranslatorInterface $translator, ManagerRegistry $doctrine)
{
$form = $this->createDeleteForm($vehicle);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $doctrine->getManager();
$em->remove($vehicle);
$em->flush();
$session = $request->getSession();
$session->getFlashBag()->add('success',
$translator->trans('vehicle deleted successfully', [], 'vehicles')
);
}
return $this->redirectToRoute('vehicles_index');
}
/**
* Creates a form to delete a vehicle entity.
*
* @param Vehicles $vehicle The vehicle entity
*
* @return Form The form
*/
private function createDeleteForm(Vehicles $vehicle)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('vehicles_delete', ['vehicleId' => $vehicle->getVehicleId()]))
->setMethod('DELETE')
->getForm()
;
}
/**
* @return Response|JsonResponse json array makers_models under specific maker.
*/
#[Route('/getUserName', name: 'get_name_ajax')]
public function getUserName(Request $request, ManagerRegistry $doctrine)
{
if ($request->isXMLHttpRequest()) {
$NID = $request->request->get('ID');
$checkIdNumber=$NID;
$leng=strlen((string)$checkIdNumber); //check the string length and make convert to string then check length of string
if($leng!=10){
$res = ['error' => "Id must be 10 digit",'type' => 'swal'];
return new JsonResponse($res);
}
$repository = $doctrine->getRepository(Users::class);
$names = $repository->getUserName($NID);
if (!empty($names)) {
$res = ['success' => true, 'names' => $names, 'type' => 'users'];
} else {
$repository = $doctrine->getRepository(Companies::class);
$names = $repository->getNames($NID);
$res = empty($names) ? ['error' => "No Record Found"] : ['success' => true, 'names' => $names, 'type' => 'comp'];
}
return new JsonResponse($res);
}
return new Response('This is not ajax!', 400);
}
/**
* make a vehicle situation is marked for sale.
*
* @return Response
*/
#[Route('/markedForSale', name: 'make_vehicle_marked_for_sale')]
#[IsGranted('ROLE_ADMIN')]
public function makeVehicleMarkedForSale(Request $request, ManagerRegistry $doctrine)
{
$loginUser = $this->getUser();
if ($request->isXMLHttpRequest()) {
$vehicleID = $request->request->get('vehicleID');
$em = $doctrine->getManager();
$vehicleRepository = $em->getRepository(Vehicles::class);
$vehicle = $vehicleRepository->find($vehicleID);
$vehicle->setOfferabilityForSale(Vehicles::SALE_OFFERABILITY['Marked_For_Sale']);
$vehicleRepository->createVehicleOfferailityLog(Vehicles::SALE_OFFERABILITY['Marked_For_Sale'] , $vehicle, $loginUser);
$em->flush();
return new JsonResponse();
}
return new Response('This is not ajax!', 400);
}
/**
* auction information for vehicle.
*
* @return \Symfony\Component\HttpFoundation\Response
*/
#[Route('/{vehicleId}/auctionInfoVehicle', name: 'auction_info_vehicle', methods:["GET"])]
#[IsGranted('ROLE_ADMIN')]
public function getAuctionInfoVehicleAction(Request $request, Vehicles $vehicle, ManagerRegistry $doctrine)
{
$locale = $request->getLocale();
$em = $doctrine->getManager();
$auctionVehicles = $em->getRepository(AuctionVehicles::class)->findBy(['vehicle' => $vehicle]);
if ($vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()) {
$beneficiary = $vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()->getName($locale);
$beneficiary_type = $vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()->getClientType();
$beneficiary_id = $vehicle->getVehicleBeneficiaryDetails()->getBeneficiary()->getClientId();
}
return $this->render('vehicles/auctionInfoVehicle.html.twig', [
'auctionVehicles' => $auctionVehicles,
'beneficiary' => $beneficiary,
'beneficiary_type' => $beneficiary_type,
'beneficiary_id' => $beneficiary_id,
'locale' => $locale,
'vehicle' => $vehicle,
]);
}
/**
* Required papers for sold vehicle ownership transfer
*
* @return \Symfony\Component\HttpFoundation\Response
*/
#[Route('/{vehicleId}/soldvpapers4OT', name: 'sold_vehicle_papers_4_ot', methods:["GET"])]
#[IsGranted('ROLE_USER')]
public function soldVehiclePapers4OTAction(Request $request, Vehicles $vehicle, ManagerRegistry $doctrine)
{
$locale = $request->getLocale();
$em = $doctrine->getManager();
$plateNumber= $vehicle->getVehicleRegistrations()->getPlateNumber($locale);
$vehicleOwner= $vehicle->getVehicleRegistrations()->getVehicleOwner();
if($vehicleOwner->getClientType() == VehicleClients::CLIENT_TYPES['user'] ){
$ownerId= $vehicleOwner->getUser()->getUserId();
$ownerIdentityPhoto= $vehicleOwner->getUser()->getUserIdentityInfo()->getImagePath();
$ownerMobileNumber= $vehicleOwner->getUser()->getMobileNumber();
}elseif($vehicleOwner->getClientType() == VehicleClients::CLIENT_TYPES['company'] ){
$ownerId= $vehicleOwner->getCompany()->getCompanyId();
$ownerIdentityPhoto= $vehicleOwner->getCompany()->getCompanyRegistration()->getFilePath();
}
$renunciationLetterType= $em->getRepository(VehicleDocTypes::class)->find(
VehicleDocTypes::DOC_TYPES['letter_of_renunciation'] );
$renunciationLetter = $em->getRepository(VehicleDocs::class)->findOneBy(['vehicle'=>$vehicle, 'docType'=> $renunciationLetterType]);
return $this->render('vehicles/soldVehiclePapers4OT.html.twig', [
'locale' => $locale,
'vehicle' => $vehicle,
'plateNumber' => $plateNumber,
'ownerId' => $ownerId,
'ownerIdentityPhoto' => $ownerIdentityPhoto,
'ownerMobileNumber' => (isset($ownerMobileNumber))?$ownerMobileNumber:null,
'renunciationLetter' => $renunciationLetter,
]);
}
/**
*
* @return Response|JsonResponse json array warehouses under specific city.
*/
#[Route('/getImages', name: 'get_images_ajax')]
public function getImages(Request $request)
{
if (!$request->isXMLHttpRequest()) {
return new Response('This is not ajax!', 400);
}
$vehicleId = $request->request->get('id');
$dirRelativePath = $this->getParameter('vehicle_uploaded_files') . '/' . $vehicleId . '/';
$fileSystem = new Filesystem();
if(!$fileSystem->exists($dirRelativePath)){
//if no dir yet for the vehicle images then create one
$fileSystem->mkdir($dirRelativePath);
}
$handle = opendir($dirRelativePath);
$images = [] ;
while($file = readdir($handle)){
if ($file !== '.' && $file !== '..' && in_array(mime_content_type($dirRelativePath. $file), ["image/jpeg", "image/png", "image/jpg"])) {
$images[]= $dirRelativePath. $file ;
}
}
return new JsonResponse(array('images' =>$images ));
}
/**
* export all vehicles as csv file
*
* @return Response
* @throws \Doctrine\DBAL\DBALException
*/
#[Route('/vehiclesExport', name: 'vehicles_export', methods:["GET"])]
#[IsGranted('ROLE_SUPER_ADMIN')]
public function exportVehicles(Request $request,VehiclesService $vehiclesService){
return $vehiclesService->exportVehicles();
}
/**
* Displays a form to edit an existing vehicleRepair entity.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
*/
#[Route('/vehicle_update_states', name: 'vehicle_update_states', methods:["GET"])]
#[IsGranted('ROLE_SUPER_ADMIN')]
public function vehicleUpdateStatesAction(Request $request, ManagerRegistry $doctrine){
$em = $doctrine->getManager();
$vehiclesRepo = $em->getRepository(Vehicles::class);
$form = $this->createFormBuilder()
->setAction($this->generateUrl('vehicle_update_states'))
->setMethod("GET");
$form->add('vehicleIdStart', TextType::class, [
'required' => true,
'label' => 'Vehicle Id Start',
'translation_domain' => 'vehicles'])
->add('vehicleIdEnd', TextType::class, [
'required' => true,
'label' => 'Vehicle Id End',
'translation_domain' => 'vehicles'
])
->add('applyNewState',CheckboxType::class, array(
'label' => 'Apply the new state to the vehicles range',
'required' => false
))
;
$vehicleUpdateStatesForm = $form->getForm();
$vehicleUpdateStatesForm->handleRequest($request);
$vehiclesStates= array();
if( $vehicleUpdateStatesForm->isSubmitted() && $vehicleUpdateStatesForm->isValid()){
$vehicleIdStart = $vehicleUpdateStatesForm->get('vehicleIdStart')->getData();
$vehicleIdEnd = $vehicleUpdateStatesForm->get('vehicleIdEnd')->getData();
$applyNewState = $vehicleUpdateStatesForm->get('applyNewState')->getData();
$vehicleRepository = $em->getRepository(Vehicles::class);
$query = $vehicleRepository->createQueryBuilder('V');
$query->where('V.vehicleId >= :vehicleIdStart')
->setParameter('vehicleIdStart', $vehicleIdStart);
$query->andWhere('V.vehicleId <= :vehicleIdEnd')
->setParameter('vehicleIdEnd', $vehicleIdEnd);
$searchedVehicles = $query->getQuery()->getResult();
foreach ($searchedVehicles as $vehicle) {
$vehicleSituation = $vehicle->getSituation();
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'] = array();
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State'] = array();
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State'] = array();
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State'] = array();
$vehiclesStates[$vehicle->getVehicleId()]['situation'] = $vehicle->getSituation();
//block#1 Special case for Sold_And_Closed
if($vehicleSituation =='Sold_And_Closed'){
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Sold_And_Closed'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['vehicleId']=$vehicle->getVehicleId();
$vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
if($applyNewState){
$newState = $vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'];
$vehicle->setState($newState);
$em->persist($vehicle);
}
$vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
continue; //break from foreach and continue with the next
}
//block#2 deriving vehicle states info from its sales info
//get the approved vehicle sale if there is any
$vehicleApprovedSale = $em->getRepository(VehicleSales::class)->getTheVehicleApprovedSale($vehicle->getVehicleId());
if($vehicleApprovedSale){
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Sold'] = 1;
//existence of exit date tells us some info about vehicle location and it exit permission states
if($vehicle->getExitDate()!=null){
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Delivered_To_Buyer'] = 1;
}else{
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Received'] = 1;
}
//trying to derive OT state and exit permission state
$vehicleOwnershipTransferRepository = $em->getRepository(VehicleOwnershipTransfer::class);
$vehicleOwnershipTransferToBuyer = $vehicleOwnershipTransferRepository->findOneBy(
['sale'=>$vehicleApprovedSale, 'approvalStatus'=>VehicleOwnershipTransfer::APPROVAL_STATUSES['approved']]);
if(!empty($vehicleOwnershipTransferToBuyer) ){
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Transferred_To_Buyer'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1; //if its OT is approved then it is permitted to exit
}else{
$vehicleInternalOTType = $vehiclesRepo->getInternalOTType($vehicle);
if ($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_drop']) {
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Dropped'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1; //sold dropped vehicles are always permitted to exit
} else {
if ($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_transfer']) {
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Transferred_To_Tjr'] = 1;
}else{
//no OT to buyer, no internal OT, then it never transferred
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
}
//trying to derive exit permission state by checking if the vehicle has an OT Security
if ($vehiclesRepo->doesBuyerPayedOTSecurity($vehicleApprovedSale)) {
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1;
}else {
//not transferred to buyer, not dropped, no OT security, then not permitted to exit
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
}
}
}
if($applyNewState){
$newState = array_merge($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'],
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State'],
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State'],
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']);
$vehicle->setState($newState);
$em->persist($vehicle);
}
$vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
continue; //break from foreach and continue with the next
}else{
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
}
//block#3 detect the vehicle Internal OT State for not sold vehicles
$vehicleInternalOTType = $vehiclesRepo->getInternalOTType($vehicle);
if($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_drop']) {
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Dropped'] = 1;
}elseif($vehicleInternalOTType == VehicleOwnershipTransfer::OT_TYPES['internal_transfer']) {
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Transferred_To_Tjr'] = 1;
}else{
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1; //no OT to buyer, no internal OT, then it is completely untransferred
}
//block#4 detect the vehicle Location_State
switch ($vehicleSituation){
case 'In_Repair':
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['In_Repair'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
break;
case 'New':
if(!empty($vehicle->getVehicleRevokeRequest())){
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Requested_For_Transportation'] = 1;
}else{
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['New'] = 1;
}
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
break;
case 'Under_Transportation':
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Under_Transportation'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
break;
case 'Received':
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Received'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
break;
case 'Not_Received':
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Not_Received'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
break;
case 'Returned':
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']['Returned'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']['Not_Sold'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']['Not_Transferred'] = 1;
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Permitted_To_Exit'] = 1;
break;
}
//block#5 if vehicle Exit_Permission_State is still not set then assume that the vehicle is not permitted to exit
if(empty($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']) ){
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']['Not_Permitted_To_Exit'] = 1;
}
$countVehicleLocationState = count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State']);
$countVehicleSaleState = count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State']);
$countVehicleOTState = count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State']);
$countVehicleExitPermissionState = count($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']);
if($countVehicleLocationState == 0 || $countVehicleLocationState > 1 || $countVehicleSaleState == 0 || $countVehicleSaleState > 1 || $countVehicleOTState == 0 || $countVehicleOTState > 1 || $countVehicleExitPermissionState == 0 || $countVehicleExitPermissionState > 1
){
$vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= true;
}else{
$vehiclesStates[$vehicle->getVehicleId()]['inconsistency']= false;
//if vehicle has no state yet and `applyNewState` checkbox was checked then update vehicle state with the derived state
if($applyNewState && !$vehicle->getState()){
$newState = array_merge($vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Sale_State'],
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Location_State'],
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_OT_State'],
$vehiclesStates[$vehicle->getVehicleId()]['Vehicle_Exit_Permission_State']);
$vehicle->setState($newState);
$em->persist($vehicle);
}
}
}
}
$em->flush();
return $this->render('vehicles/vehicle_update_states.html.twig', [
'form' => $vehicleUpdateStatesForm->createView(),
'vehiclesStates' => $vehiclesStates
]);
}
}