src/Service/VehicleRtsActivitiesService.php line 188
<?php
namespace App\Service;
use App\Entity\Activity;
use App\Entity\InventoryParts;
use App\Entity\TransporterDrivers;
use App\Entity\Transporters;
use App\Entity\VatRate;
use App\Entity\VehicleRevokeRequests;
use App\Entity\VehicleRtsActivitiesInventories;
use App\Entity\VehicleRtsActivitiesInventoriesImages;
use App\Entity\VehicleRtsActivitiesInvoices;
use App\Entity\Vehicles;
use App\Entity\VehicleTechnicalSpecs;
use App\Entity\Warehouses;
use App\Form\VehicleRtsActivitiesType;
use Doctrine\ORM\EntityManagerInterface as EntityManager;
use Symfony\Component\{DependencyInjection\ContainerInterface as Container,
Form\FormFactoryInterface,
HttpFoundation\File\UploadedFile,
HttpFoundation\RequestStack,
Routing\Generator\UrlGeneratorInterface,
Workflow\Registry};
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
/**
* Class VehicleRtsActivitiesService
*
* @Annotation
* @package App\Service
*/
class VehicleRtsActivitiesService
{
protected \Symfony\Component\DependencyInjection\ContainerInterface $container;
protected \Doctrine\ORM\EntityManagerInterface $entityManager;
protected $entityName;
protected ?\Symfony\Component\HttpFoundation\Request $request;
protected \Symfony\Contracts\Translation\TranslatorInterface $translator;
protected \Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface $params;
protected \Symfony\Component\Form\FormFactoryInterface $formFactory;
protected \Symfony\Component\Routing\Generator\UrlGeneratorInterface $router;
protected \Twig\Environment $templating;
protected ?\Symfony\Component\Security\Core\User\UserInterface $user;
protected \Symfony\Component\Workflow\Registry $workflowRegistry;
/**
* Vehicles service constructor
*/
public function __construct(Container $container, EntityManager $EntityManager, TranslatorInterface $translator, ParameterBagInterface $params,
FormFactoryInterface $formFactory, UrlGeneratorInterface $router, \Twig\Environment $templating,
RequestStack $request, Security $security, Registry $workflowRegistry)
{
$this->container = $container;
$this->entityManager = $EntityManager;
$this->translator = $translator;
$this->params = $params;
$this->formFactory = $formFactory;
$this->router = $router;
$this->templating = $templating;
$this->request = $request->getCurrentRequest();
$this->user = $security->getUser();
$this->workflowRegistry = $workflowRegistry;
}
public function newRtsActivity($requestId=null){
$request = $this->request;
$locale = $request->getLocale();
$em = $this->entityManager;
// this will get all url sent data.
$dataFromURL = $request->query->all();
// get activity type & revokeInventory from url
$activityType = $requestId != null ? $dataFromURL['form']['revokeActivity'] : $dataFromURL['revokeActivity'];
$vehicleRtsActivity = new Activity();
// check if the vehicle will have revokeInventory or not.
$revokeInventory = isset($dataFromURL['form']['revokeInventory']) ? true : null;
$inventoryParts = $em->getRepository(InventoryParts::class)->findAll();
$vehicleRtsActivity->setActivityInventory(new VehicleRtsActivitiesInventories());
$vehicleRtsActivity->getActivityInventory()->setParts($inventoryParts);
//we will use the workflow to check to show returned checkbox or disable it and Repair Checkbox
$vehicleId =$request->attributes->get('vehicleId');
$vehicle = $em->getRepository(Vehicles::class)->find($vehicleId);
//we will use the workflow to check
$workflow = $this->workflowRegistry->get($vehicle);
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_RETURN)
|| $workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_UNDER_TRANSPORTATION_AS_READY_FOR_RETURN)) {
$checkDisable['return'] = [];
}else{
$checkDisable['return'] = ['disabled' => 'disabled'];
}
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_REPAIR)) {
$checkDisable['repair'] = [];
}else{
$checkDisable['repair'] = ['disabled' => 'disabled'];
}
$theEffectiveVat= $em->getRepository(VatRate::class)->getTheEffectiveVat();
$form = $this->formFactory->create(VehicleRtsActivitiesType::class, $vehicleRtsActivity,
['locale' => $locale, 'activityType' => $activityType, 'revokeInventory' => $revokeInventory, 'checkDisable' => $checkDisable, 'theEffectiveVat' => $theEffectiveVat]);
$form->handleRequest($request);
$vehicle->getVehicleTechnicalSpecs();
$receivingAt = $vehicle->getReceivingAt();
return array(
'vehicleRtsActivity' => $vehicleRtsActivity,
'form' => $form->createView(),
'locale' => $locale,
'receivingAt' => $receivingAt
);
}
public function addNewRtsActivity($requestId,$vehicleId){
$request = $this->request;
$vehicleRtsActivity = new Activity();
$em = $this->entityManager;
$fileHandler = new FileHandler();
$revokeRequest = '' ;
$locale = $request->getLocale();
$loginUser = $this->user;
$theEffectiveVat= $em->getRepository(VatRate::class)->getTheEffectiveVat();
// this will get all url sent data.
$dataFromURL = $request->query->all();
############################## Note ###############################
# In vehicle rts activities we save either request id or vehicle id #
###################################################################
// get activity type & revokeInventory from url. if request id exist we'll save it without vehicle_id
if ($requestId != null) {
$revokeRequest = $em->getRepository(VehicleRevokeRequests::class)->find($requestId); //get revoke request from the id on the url
$vehicleRtsActivity->setRevokeRequest($revokeRequest);
$activityType = $dataFromURL['form']['revokeActivity']; // get activity type from the url data
} else {
$activityType = $dataFromURL['revokeActivity'];
}
// set activity type equal the type coming from the URL.
$vehicleRtsActivity->setActivityType($activityType);
$vehicleRepository = $em->getRepository(Vehicles::class);
$vehicle = $vehicleRepository->find($vehicleId);
if ($requestId == null) { // if request_id not exist we'll save vehicle_id
$vehicleRtsActivity->setVehicle($vehicle);
}
// check if the vehicle will have revokeInventory or not.
$revokeInventory = isset($dataFromURL['form']['revokeInventory']) ? true : null;
$inventoryParts = $em->getRepository(InventoryParts::class)->findAll();
$vehicleRtsActivity->setActivityInventory(new VehicleRtsActivitiesInventories());
$vehicleRtsActivity->getActivityInventory()->setParts($inventoryParts);
//we will use the workflow to check to show returned checkbox or disable it and Repair Checkbox
$workflow = $this->workflowRegistry->get($vehicle);
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_RETURN)
|| $workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_UNDER_TRANSPORTATION_AS_READY_FOR_RETURN)) {
$checkDisable['return'] = [];
}else{
$checkDisable['return'] = ['disabled' => 'disabled'];
}
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_REPAIR)) {
$checkDisable['repair'] = [];
}else{
$checkDisable['repair'] = ['disabled' => 'disabled'];
}
$form = $this->formFactory->create(VehicleRtsActivitiesType::class, $vehicleRtsActivity,
['locale' => $locale, 'activityType' => $activityType, 'revokeInventory' => $revokeInventory, 'checkDisable' => $checkDisable, 'theEffectiveVat' => $theEffectiveVat]);
$form->handleRequest($request);
if ($form->isValid()) {
$session = $request->getSession();
// if cancel the RTS before reset the revoke cancellation reason column if RTS
if ($requestId != null && $revokeRequest->getRevokeCancellationReason() ) {
$revokeRequest->setRevokeCancellationReason(null);
$em->persist($revokeRequest);
$em->flush($revokeRequest);
}
if ($vehicleRtsActivity->getActivityDestination()) {
$inventoryDeliveryPath = $vehicleRtsActivity->getActivityDestination()->getInventoryDeliveryPath();
if ($inventoryDeliveryPath) {
// Generate a unique name for the file before saving it
$inventoryDeliveryPathName = md5(uniqid()). '.'. $inventoryDeliveryPath->guessClientExtension();
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPath($inventoryDeliveryPathName);
}
}
// put all post data to $formPostData var.
$formPostData = $request->request->all();
// check if destination posted with the form. then if user make vehicle as returned set vehicle status returned.
if (isset($formPostData['appbundle_vehiclertsactivities']['activityDestination'])) {
$vehicleRtsActivityDestination = $formPostData['appbundle_vehiclertsactivities']['activityDestination'];
if (isset($vehicleRtsActivityDestination['isReturned']) && $vehicleRtsActivityDestination['isReturned'] == 1) {
$oldOfferability = $vehicle->getOfferabilityForSale();
$vehicleRtsActivity->getActivityDestination()->setIsReturned(1);
}elseif (isset($vehicleRtsActivityDestination['isRepair']) && $vehicleRtsActivityDestination['isRepair'] == 1) {
$vehicleRtsActivity->getActivityDestination()->setIsRepair(1);
}
$isRepair = (isset($vehicleRtsActivityDestination['isRepair']))? $vehicleRtsActivityDestination['isRepair'] :null;
if (isset($vehicleRtsActivityDestination['exitDate']) && !empty($vehicleRtsActivityDestination['exitDate'])) {
$vehicle->setExitDate(new \DateTime($vehicleRtsActivityDestination['exitDate']));
}
}
$em->flush($vehicle);
// if activity has transport we should add an invoice.
if ($vehicleRtsActivity->getActivityTransport() != null && $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()->getSupplierInvoice()->getTotal()) {
$activityTransportInvoice = $vehicleRtsActivity->getActivityTransport()->getRtsInvoice();
$supplierInvoice = $activityTransportInvoice->getSupplierInvoice();
$transporterID = (int)$formPostData['appbundle_vehiclertsactivities']['activityTransport']['transporter'];
$transporter = $em->getRepository(Transporters::class)->find($transporterID);
$supplierInvoice->setIssuer($transporter->getCompany());
$supplierInvoice->setCreatedBy($loginUser);
// catch the file that uploaded through the form.
$transportFile = $supplierInvoice->getImagePath();
// if an image is uploaded then generate a name for it.
if ($transportFile) {
// Generate a unique name for the file before saving it.
$fileName = md5(uniqid()).'.'. $transportFile->guessClientExtension();
// Set the 'ImagePath' property to store the image filename instead of the binary file.
$supplierInvoice->setImagePath($fileName);
}
//if 'value is VAT inclusive' checkbox was checked then calculate VAT
if (array_key_exists('check_vat_amount',$formPostData['appbundle_vehiclertsactivities']['activityTransport']['rtsInvoice']['supplierInvoice'])
&& $theEffectiveVat) {
$vatAmount = VehicleHelper::calcVatFromTotal($supplierInvoice->getTotal(), $theEffectiveVat->getVatRatio());
$supplierInvoice->setVatRate($theEffectiveVat);
} elseif (! $theEffectiveVat) {
//there is no effective VAT rate at all
$vatAmount= null;
} else{
//there is an Effective VAT rate but the user decided that the invoice is VAT ineligible
$supplierInvoice->setVatRate($theEffectiveVat);
$vatAmount= 0;
}
$value = $supplierInvoice->getTotal() - (float)$vatAmount ;
$supplierInvoice->setValue($value);
$supplierInvoice->setVatAmount($vatAmount);
$em->persist($supplierInvoice);
$em->flush($supplierInvoice);
$activityTransportInvoice->setRtsInvoiceId($supplierInvoice->getInvoiceId());
$activityTransportInvoice->setType(VehicleRtsActivitiesInvoices::INVOICE_TYPES['Transport']);
//set the invoice type as Transport
$activityTransportInvoice->setActivity($vehicleRtsActivity);
// time for saving the uploaded image to disk.
if ($transportFile) { // save transport image.
$fileHandler = new FileHandler();
$fileRealPath = $this->params->get('web_dir_path') . $this->params->get('vehicle_uploaded_files') . '/' . $vehicle->getVehicleId(). '/';
$fileHandler->save($transportFile, $fileRealPath, $fileName);
}
} elseif (isset($formPostData['appbundle_vehiclertsactivities']['activityTransport'])) {
$vehicleRtsActivity->getActivityTransport()->setRtsInvoice(null);
}
if ($revokeInventory) {
$activityInventory = $vehicleRtsActivity->getActivityInventory();
if ($activityInventory) {
$activityInventoryImages = $activityInventory->getInventoryImage();
} else {
$activityInventory = new VehicleRtsActivitiesInventories();
}
}
// broke the relation between activity and inventory.
$vehicleRtsActivity->setActivityInventory(null);
$vehicleRtsActivity->setCreatedBy($loginUser);
$em->persist($vehicleRtsActivity);
$em->flush($vehicleRtsActivity);
// time for saving the uploaded image to disk.
if (isset($inventoryDeliveryPath) && $inventoryDeliveryPath != null) {
$inventoryDeliveryPathRealPath = $this->params->get('web_dir_path') . $this->params->get('vehicle_uploaded_files') . '/' . $vehicleId . '/';
$fileHandler->save($inventoryDeliveryPath, $inventoryDeliveryPathRealPath, $inventoryDeliveryPathName );
}
if ($revokeInventory) {
$activityInventory->setInventoryActivityId($vehicleRtsActivity->getActivityId());
$activityInventory->setInventoryActivity($vehicleRtsActivity);
/*** Saving inventoryMissingPart if they were unchecked in the form ***/
$inventoryPartsSent = $activityInventory->getParts();
$activityInventory->setParts(null);
foreach($inventoryPartsSent as $inventoryPart){
if(!$inventoryPart->getIsNotMessing()) {
$activityInventory->addPart($inventoryPart);
}
}
$em->persist($activityInventory);
$em->flush();
$this->addInventoryImages($request, $vehicleId, $em, $vehicleRtsActivity);
}
$em->flush();
$session->getFlashBag()->add('success',
$this->translator->trans('RTS activity added successfully', array(), 'vehicles') );
return array('result'=>'success');
}else{
$vehicleTechnicalSpec =$vehicle->getVehicleTechnicalSpecs();
$receivingAt = $vehicle->getReceivingAt();
return array('result'=>'failed','param'=>array(
'vehicleRtsActivity' => $vehicleRtsActivity,
'form' => $form->createView(),
'locale' => $locale,
'receivingAt' => $receivingAt
));
}
}
public function editRtsActivity($vehicleRtsActivity,$vehicleId){
$request = $this->request;
$em = $this->entityManager;
$locale = $request->getLocale();
$fileHandler = new FileHandler();
$deleteForm = $this->createDeleteForm($vehicleRtsActivity);
$activityType = $vehicleRtsActivity->getActivityType();
$em = $this->entityManager;
$vehicle = $em->getRepository(Vehicles::class)->find($vehicleId);
$theEffectiveVat= $em->getRepository(VatRate::class)->getTheEffectiveVat();
$imageDirWebPath = $this->params->get('vehicle_uploaded_files') . '/' . $vehicleId . '/';
$imageDirRealPath = $this->params->get('web_dir_path') . $imageDirWebPath;
// get the old inventory images to display in page
$imagesDB = $em->getRepository(VehicleRtsActivitiesInventoriesImages::class)->findBy(['inventory'=>$vehicleRtsActivity]);
$vehicleExitDate = $vehicle->getExitDate();
$vehicleExitDate = $vehicle->getExitDate();
if ($vehicleRtsActivity->getActivityDestination()) {
$isReturnedInActivity = $vehicleRtsActivity->getActivityDestination()->getIsReturned();
$isRepairInActivity = $vehicleRtsActivity->getActivityDestination()->getIsIsRepair();
$inventoryDeliveryPathTextName = $vehicleRtsActivity->getActivityDestination()->getInventoryDeliveryPath();
$inventoryDeliveryPathBinaryFile = $fileHandler->getBinaryFile($imageDirRealPath, $inventoryDeliveryPathTextName);
if ($inventoryDeliveryPathBinaryFile && $imageDirWebPath) {
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPathWebPath($imageDirWebPath . $inventoryDeliveryPathTextName);
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPath($inventoryDeliveryPathBinaryFile);
$inventoryDeliveryImage = $vehicleRtsActivity->getActivityDestination()->getInventoryDeliveryPathWebPath();
} else {
$inventoryDeliveryImage = null;
}
} else {
$isReturnedInActivity = false;
$isRepairInActivity = false;
$inventoryDeliveryImage = null;
}
if ($vehicleRtsActivity->getActivityTransport() && $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()) {
$transportInvoice = $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()->getSupplierInvoice();
} else {
$transportInvoice = null;
}
$revokeInventory = $vehicleRtsActivity->getActivityInventory() ? true : null;
//if there is an associated document to the supplier invoice then do some processing to its imagePath property
if ($transportInvoice) {
//if the document has a physical valid image to be shown then set its web path
$imageBinaryFile = $fileHandler->getBinaryFile($imageDirRealPath, $transportInvoice->getImagePath());
//if image file physically exists and the web path directory provided then set its web path
if($imageBinaryFile && $imageDirWebPath){
$transportInvoice->setImageWebPath($imageDirWebPath. $transportInvoice->getImagePath()); //the form will use this property to show the image
}
$transportInvoice->setImagePath($imageBinaryFile);
$transportInvoiceImage = $transportInvoice->getImageWebPath();
} else {
$transportInvoiceImage = null;
}
// get all parts then compare with saved missing parts
if ($vehicleRtsActivity->getActivityInventory()) {
$allInventoryParts = $em->getRepository(InventoryParts::class)->findAll();
$inventoryMissingParts = $vehicleRtsActivity->getActivityInventory()->getParts();
$missingParts = [];
foreach ($inventoryMissingParts as $inventoryMissingPart) {
$missingParts[$inventoryMissingPart->getPartId()]= $inventoryMissingPart;
}
foreach($allInventoryParts as $inventoryPart) {
if (isset($missingParts[$inventoryPart->getPartId()])) {
$inventoryMissingPart = $missingParts[$inventoryPart->getPartId()];
$inventoryPart->setIsNotMessing(false);
}else{
$inventoryPart->setIsNotMessing(true);
}
}
$vehicleRtsActivity->getActivityInventory()->setParts($allInventoryParts);
}
//if there is a transport invoice and it has a VAT amount then 'value is VAT inclusive' checkbox has to be checked in the form
$shallVatInclusiveChecked = false;
$activityTransport= $vehicleRtsActivity->getActivityTransport();
if($activityTransport && $activityTransport->getRtsInvoice()
&& $activityTransport->getRtsInvoice()->getSupplierInvoice()->getVatAmount()){
$shallVatInclusiveChecked =true ;
}
$oldWarehouseId = null;
if($vehicleRtsActivity && $vehicleRtsActivity->getActivityStorage() && $vehicleRtsActivity->getActivityStorage()->getWarehouse() ){
$oldWarehouseId = $vehicleRtsActivity->getActivityStorage()->getWarehouse()->getWarehouseId();
}
//we will use the workflow to check to show returned checkbox or disable it and Repair Checkbox
$workflow = $this->workflowRegistry->get($vehicle);
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_RETURN)
|| $workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_UNDER_TRANSPORTATION_AS_READY_FOR_RETURN)) {
$checkDisable['return'] = [];
}else{
$checkDisable['return'] = ['disabled' => 'disabled'];
}
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_REPAIR)) {
$checkDisable['repair'] = [];
}else{
$checkDisable['repair'] = ['disabled' => 'disabled'];
}
$editForm = $this->formFactory->create(VehicleRtsActivitiesType::class, $vehicleRtsActivity, [
'locale' => $locale,
'activityType' => $activityType,
'revokeInventory' => $revokeInventory,
'vehicleExitDate' => $vehicleExitDate,
'isReturnedInActivity' => $isReturnedInActivity,
'isRepairInActivity' => $isRepairInActivity,
'oldWarehouseId' => $oldWarehouseId,
'method' => 'PATCH',
'theEffectiveVat' => $theEffectiveVat,
'checkDisable' => $checkDisable
]);
// get activity invoices that aren't estimation or transport.
$vehicleRtsActivity->getActivityInvoice()->filter(
function ($entry) use ($vehicleId, $fileHandler, $imageDirWebPath, $imageDirRealPath) {
if ($entry->getType() == 'Estimation' || $entry->getType() == 'Transport') {
$entry->getActivity()->removeActivityInvoice($entry);
} else {
//if the document has a physical valid image to be shown then set its web path
$imageBinaryFile = $fileHandler->getBinaryFile($imageDirRealPath, $entry->getSupplierInvoice()->getImagePath());
//if image file physically exists and the web path directory provided then set its web path
if ($imageBinaryFile && $imageDirWebPath) {
$entry->getSupplierInvoice()->setImageWebPath($imageDirWebPath. $entry->getSupplierInvoice()->getImagePath()); //the form will use this property to show the image
}
$entry->getSupplierInvoice()->setImagePath($imageBinaryFile);
$entry->getSupplierInvoice()->setImagePath(null);
}
}
);
$activityInvoices = $vehicleRtsActivity->getActivityInvoice();
$vehicle->getVehicleTechnicalSpecs();
$receivingAt = $vehicle->getReceivingAt();
return array(
'vehicleRtsActivity' => $vehicleRtsActivity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
'locale' => $locale,
'activityInvoices' => $activityInvoices,
'filesRoot' => $this->params->get('vehicle_uploaded_files') . '/' . $vehicleId,
'inventoryDeliveryImage' => $inventoryDeliveryImage,
'transportInvoiceImage' => $transportInvoiceImage,
'check_vat_amount' => $shallVatInclusiveChecked,
'imagesDB' => $imagesDB,
'vehicleId' => $vehicleId,
'receivingAt' => $receivingAt
);
}
public function updateRtsActivity($vehicleRtsActivity,$vehicleId){
$request =$this->request;
$locale = $request->getLocale();
$em = $this->entityManager;
$activityType = $vehicleRtsActivity->getActivityType();
$vehicle = $em->getRepository(Vehicles::class)->find($vehicleId);
$inventoryDeliveryImage = null;
$activityTransport= $vehicleRtsActivity->getActivityTransport(); //catch the transport data from Database before form binding for further use
// get the old inventory images to display in page
$imagesDB = $em->getRepository(VehicleRtsActivitiesInventoriesImages::class)->findBy(['inventory'=>$vehicleRtsActivity]);
$fileHandler = new FileHandler();
$imageDirWebPath = $this->params->get('vehicle_uploaded_files') . '/' . $vehicle->getVehicleId() . '/';
$imageDirRealPath = $this->params->get('web_dir_path') . $imageDirWebPath;
// put all post data to $formPostData var.
$formPostData = $request->request->all();
$clearImageDestination = null ;
if (isset($formPostData['appbundle_vehiclertsactivities']['activityDestination'])) {
$clearImageDestination = $formPostData["appbundle_vehiclertsactivities"]['activityDestination']['clearImage'];
}
$clearImageSupplier = null ;
if (isset($formPostData["appbundle_vehiclertsactivities"]['activityTransport']) && isset($formPostData["appbundle_vehiclertsactivities"]['activityTransport']['rtsInvoice']) && isset($formPostData["appbundle_vehiclertsactivities"]['activityTransport']['rtsInvoice']['supplierInvoice'])) {
$clearImageSupplier = $formPostData["appbundle_vehiclertsactivities"]['activityTransport']['rtsInvoice']['supplierInvoice']['clearImage'];
}
// check if destination posted with the form.
if (isset($formPostData['appbundle_vehiclertsactivities']['activityDestination'])) {
$inventoryDeliveryPathTextName = $vehicleRtsActivity->getActivityDestination()->getInventoryDeliveryPath();
$inventoryDeliveryPathBinaryFile = $fileHandler->getBinaryFile($imageDirRealPath, $inventoryDeliveryPathTextName);
if ($inventoryDeliveryPathBinaryFile && $imageDirWebPath) {
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPathWebPath($imageDirWebPath . $inventoryDeliveryPathTextName);
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPath($inventoryDeliveryPathBinaryFile);
$inventoryDeliveryImage = $vehicleRtsActivity->getActivityDestination()->getInventoryDeliveryPathWebPath();
}
}
// get transport invoice for the activity.
if ($vehicleRtsActivity->getActivityTransport() && $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()) {
$transportInvoice = $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()->getSupplierInvoice();
} else {
$transportInvoice = null;
}
$revokeInventory = $vehicleRtsActivity->getActivityInventory() ? true : null;
//if there is an associated document to the activity transport then do some processing to its imagePath property
$transportImageWebPath = null;
if ($transportInvoice) {
//if the document has a phisical valid image to be shown then set its web path
//keep original image path derived from DB along with docId for forther use
$transportImageNameText = $transportInvoice->getImagePath();
$imageBinaryFile = $fileHandler->getBinaryFile($imageDirRealPath, $transportInvoice->getImagePath());
//if image file phisically exists and the web path directory provided then set its web path
if($imageBinaryFile && $imageDirWebPath){
$transportInvoice->setImageWebPath($imageDirWebPath. $transportInvoice->getImagePath()); //the form will use this property to show the image
}
// reset ImagePath property value to avoid string to File conversion error.
$transportInvoice->setImagePath(null);
$transportImageWebPath = $transportInvoice->getImageWebPath(); //get the image that will be shown
}
// get inventory save images and put it in an array to set image path again if no changes made in the form.
$inventoryDbImages = array();
if ($vehicleRtsActivity->getActivityInventory()) {
foreach ($vehicleRtsActivity->getActivityInventory()->getInventoryImage() as $image) {
$inventoryDbImages[] = [
'id' => $image->getImageId(),
'path' => $image->getImagePath()
];
}
}
// get all parts then compare with saved missing parts
if ($vehicleRtsActivity->getActivityInventory()) {
$allInventoryParts = $em->getRepository(InventoryParts::class)->findAll();
$inventoryMissingParts = $vehicleRtsActivity->getActivityInventory()->getParts();
foreach($allInventoryParts as $inventoryPart) {
if ( !array_key_exists('parts',$formPostData['appbundle_vehiclertsactivities']['activityInventory']) || !array_key_exists($inventoryPart->getPartId() -1 , $formPostData['appbundle_vehiclertsactivities']['activityInventory']['parts']) ) {
$inventoryPart->setIsNotMessing(false);
}
}
$vehicleRtsActivity->getActivityInventory()->setParts($allInventoryParts);
}
$theEffectiveVat= $em->getRepository(VatRate::class)->getTheEffectiveVat();
//we will use the workflow to check to show returned checkbox or disable it and Repair Checkbox
$workflow = $this->workflowRegistry->get($vehicle);
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_RETURN)
|| $workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_UNDER_TRANSPORTATION_AS_READY_FOR_RETURN)) {
$checkDisable['return'] = [];
}else{
$checkDisable['return'] = ['disabled' => 'disabled'];
}
if($workflow->can($vehicle,Vehicles::VEHICLE_TRANSITION_MARK_RECEIVED_AS_READY_FOR_REPAIR)) {
$checkDisable['repair'] = [];
}else{
$checkDisable['repair'] = ['disabled' => 'disabled'];
}
$formParams= ['locale' => $locale, 'activityType' => $activityType, 'revokeInventory' => $revokeInventory, 'checkDisable' => $checkDisable, 'theEffectiveVat' => $theEffectiveVat, 'method' => 'PATCH'];
$editForm = $this->formFactory->create(VehicleRtsActivitiesType::class, $vehicleRtsActivity, $formParams);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$vehicleRtsActivity = $this->entityManager->merge($vehicleRtsActivity);
if ($vehicleRtsActivity->getActivityDestination()) {
$newInventoryDeliveryPath = $vehicleRtsActivity->getActivityDestination()->getInventoryDeliveryPath();
if ($newInventoryDeliveryPath) {
$newInventoryDeliveryPathName = md5(uniqid()) . '.' . $newInventoryDeliveryPath->guessClientExtension();
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPath($newInventoryDeliveryPathName);
$fileHandler->save($newInventoryDeliveryPath, $imageDirRealPath, $newInventoryDeliveryPathName);
} elseif ($clearImageDestination == "1") {
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPath(null);
} else{
$vehicleRtsActivity->getActivityDestination()->setInventoryDeliveryPath($inventoryDeliveryPathTextName);
}
}
$supplierInvoice= null;
// to fix issue TP-107 : In edit RTS activity page, if adding the value of transport fees or editing warehouse then save, the page crashes.
if ($vehicleRtsActivity->getActivityTransport() && $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()->getSupplierInvoice()->getTotal() != null) {
$vehicleRtsActivity->setActivityInvoice(null);
$activityTransportInvoice = $vehicleRtsActivity->getActivityTransport()->getRtsInvoice();
$supplierInvoice = $activityTransportInvoice->getSupplierInvoice();
//if the invoice has a VAT rate then we need to recalculate VAT amount without touching its VAT rate
if ($supplierInvoice && $supplierInvoice->getVatRate()) {
//if 'value is VAT inclusive' checkbox was checked then calculate VAT
if (array_key_exists('check_vat_amount', $formPostData['appbundle_vehiclertsactivities']['activityTransport']['rtsInvoice']['supplierInvoice'])) {
$vatAmount = VehicleHelper::calcVatFromTotal($supplierInvoice->getTotal(), $supplierInvoice->getVatRate()->getVatRatio());
} else {
//there is an Effective VAT rate but the user decided that the invoice is VAT ineligible
$vatAmount = 0;
}
$originalValue = $supplierInvoice->getTotal() - (float)$vatAmount;
$supplierInvoice->setValue($originalValue);
$supplierInvoice->setVatAmount($vatAmount);
//if no invoice yet and a value provided
} elseif (!$supplierInvoice->getInvoiceId() && $supplierInvoice->getTotal()) {
$effectiveVat= $em->getRepository(\App\Entity\VatRate::class)->getTheEffectiveVat();
if (array_key_exists('check_vat_amount', $formPostData['appbundle_vehiclertsactivities']['activityTransport']['rtsInvoice']['supplierInvoice'])
&& $effectiveVat) {
// calculate VAT according to the rate of the Effective VAT
$vatAmount= VehicleHelper::calcVatFromTotal($supplierInvoice->getTotal(), $effectiveVat->getVatRatio());
$supplierInvoice->setVatRate($effectiveVat);
} elseif (! $effectiveVat) {
//there is no effective VAT rate at all
$vatAmount= null;
} else{
//there is an Effective VAT rate but the user decided that the invoice is VAT ineligible
$supplierInvoice->setVatRate($effectiveVat);
$vatAmount= 0;
}
$originalValue = $supplierInvoice->getTotal() - (float)$vatAmount;
$supplierInvoice->setValue($originalValue);
$supplierInvoice->setVatAmount($vatAmount);
//if an already invoice but has no VAT rate then just set value = total
} elseif ($supplierInvoice->getInvoiceId() && !$supplierInvoice->getVatRate()) {
$supplierInvoice->setValue( $supplierInvoice->getTotal() );
}
if ($activityTransportInvoice->getSupplierInvoice()->getInvoiceId()) {
$activityTransportInvoice = $this->entityManager->merge($activityTransportInvoice); //it's important to use result of function, not the same element
$activityTransportInvoice->addActivityTransport($vehicleRtsActivity->getActivityTransport());
} else {
$activityTransportInvoice = $vehicleRtsActivity->getActivityTransport()->getRtsInvoice();
$transporterID = (int)$formPostData['appbundle_vehiclertsactivities']['activityTransport']['transporter'];
$transporter = $em->getRepository(Transporters::class)->find($transporterID);
$supplierInvoice->setIssuer($transporter->getCompany());
// catch the file that uploaded through the form.
$transportFile = $supplierInvoice->getImagePath();
// if an image is uploaded then generate a name for it.
if ($transportFile) {
// Generate a unique name for the file before saving it.
$fileName = md5(uniqid()).'.'. $transportFile->guessClientExtension();
// Set the 'ImagePath' property to store the image filename instead of the binary file.
$supplierInvoice->setImagePath($fileName);
}
$em->persist($supplierInvoice);
$em->flush($supplierInvoice);
$activityTransportInvoice->setRtsInvoiceId($supplierInvoice->getInvoiceId());
$activityTransportInvoice->setType(VehicleRtsActivitiesInvoices::INVOICE_TYPES['Transport']); //set the invoice type as Transport
$activityTransportInvoice->setActivity($vehicleRtsActivity);
// time for saving the uploaded image to disk.
if ($transportFile) { // save transport image.
$fileHandler = new FileHandler();
$fileRealPath = $this->params->get('web_dir_path') . $this->params->get('vehicle_uploaded_files') . '/' . $vehicle->getVehicleId(). '/';
$fileHandler->save($transportFile, $fileRealPath, $fileName);
}
}
if ($transportInvoice) {
if ($transportInvoice->getImagePath()) {
//Upload the image then set the ImagePath property to store the image filename not the binary file
$transportInvoice->setImagePath(
$fileHandler->save($transportInvoice->getImagePath(), $imageDirRealPath)
);
} elseif ($clearImageSupplier == "1") {
$transportInvoice->setImagePath(null);
} else{
//No uploaded image, so just put the original image path back in ImagePath property, if there is one there
$transportInvoice->setImagePath($transportImageNameText);
}
}
} else {
if ($vehicleRtsActivity->getActivityTransport()) {
$vehicleRtsActivity->getActivityTransport()->setRtsInvoice(null);
}
$vehicleRtsActivity->setActivityInvoice(null);
}
$em->flush($vehicle);
/*** Upload new added inventoryImages ***/
if ($vehicleRtsActivity->getActivityInventory()) {
$inventoryImages = array();
$activityInventory = $vehicleRtsActivity->getActivityInventory();
$this->addInventoryImages($request,$vehicleId,$em,$vehicleRtsActivity);
/*** Saving inventoryMissingPart if they were unchecked in the form ***/
$inventoryPartsSent = $activityInventory->getParts();
$activityInventory->setParts(null);
foreach ($inventoryPartsSent as $inventoryPart) {
if (!$inventoryPart->getIsNotMessing()) {
$activityInventory->addPart($inventoryPart);
}
}
}
$em->flush();
$session = $request->getSession();
$session->getFlashBag()->add('success',
$this->translator->trans('RTS activity updated successfully', array(), 'vehicles') );
return array('result'=>'updated','param'=>array('vehicleId' => $vehicleId));
}else{
$activityInvoices = $vehicleRtsActivity->getActivityInvoice();
$deleteForm = $this->createDeleteForm($vehicleRtsActivity);
//get $transportInvoiceImage
$imageDirWebPath = $this->params->get('vehicle_uploaded_files') . '/' . $vehicle->getVehicleId() . '/';
$imageDirRealPath = $this->params->get('web_dir_path') . $imageDirWebPath;
if ($vehicleRtsActivity->getActivityTransport() && $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()) {
$transportInvoice = $vehicleRtsActivity->getActivityTransport()->getRtsInvoice()->getSupplierInvoice();
} else {
$transportInvoice = null;
}
$revokeInventory = $vehicleRtsActivity->getActivityInventory() ? true : null;
//if there is an associated document to the supplier invoice then do some processing to its imagePath property
if ($transportInvoice) {
//if the document has a physical valid image to be shown then set its web path
$imageBinaryFile = $fileHandler->getBinaryFile($imageDirRealPath, $transportInvoice->getImagePath());
//if image file physically exists and the web path directory provided then set its web path
if($imageBinaryFile && $imageDirWebPath){
$transportInvoice->setImageWebPath($imageDirWebPath. $transportInvoice->getImagePath()); //the form will use this property to show the image
}
$transportInvoice->setImagePath($imageBinaryFile);
$transportInvoiceImage = $transportInvoice->getImageWebPath();
} else {
$transportInvoiceImage = null;
}
//if there was a transport invoice and it has a VAT amount then 'value is VAT inclusive' checkbox has to be checked in the form
$shallVatInclusiveChecked = false;
if($activityTransport && $activityTransport->getRtsInvoice()
&& $activityTransport->getRtsInvoice()->getSupplierInvoice()->getVatAmount()){
$shallVatInclusiveChecked =true;
}
$vehicleTechnicalSpec =$vehicle->getVehicleTechnicalSpecs();
$receivingAt = $vehicle->getReceivingAt();
return array('result'=>'failed','param'=> array(
'vehicleRtsActivity' => $vehicleRtsActivity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
'locale' => $locale,
'activityInvoices' => $activityInvoices,
'filesRoot' => $this->params->get('vehicle_uploaded_files') . '/' . $vehicleId,
'inventoryDeliveryImage' => $inventoryDeliveryImage,
'transportInvoiceImage' => $transportInvoiceImage,
'check_vat_amount' => $shallVatInclusiveChecked,
'imagesDB' => $imagesDB,
'vehicleId' => $vehicleId,
'receivingAt' => $receivingAt
));
}
}
/**
* add new or delete rts inventory images
* @param $request
* @param $vehicleId
* @param $em
* @param $vehicleRtsActivity
*/
public function addInventoryImages($request,$vehicleId,$em,$vehicleRtsActivity){
$activityInventory = $em->getRepository(VehicleRtsActivitiesInventories::class)->findBy(['inventoryActivity'=>$vehicleRtsActivity])[0];
$em->getRepository(Vehicles::class)->find($vehicleId);
$formPostData = $request->request->all();
$formPosted = $formPostData['appbundle_vehiclertsactivities'];
$formPostFiles = $request->files->all();
$images = $formPostFiles['appbundle_vehiclertsactivities']['images']; // uploaded images
$imageRealPath = $this->params->get('vehicle_uploaded_files') . '/' . $vehicleId . '/';
$fileHandler = new FileHandler();
// get the deleted images by the user when uploaded them
$deletedUploadIds = explode(',',$formPosted['deletedUploadIds']);
end($deletedUploadIds);
unset($deletedUploadIds[key($deletedUploadIds)]); // remove the last item because it's empty because ','
if($images){
foreach ($images as $key => $image) {
++$key;
if ($image instanceof UploadedFile && !in_array($key,$deletedUploadIds)) {// check is uploaded file and not exists in deletedUploadIds array
$imageName = md5(uniqid()). '.'. $image->guessClientExtension();
$rtsInventoryImage = new VehicleRtsActivitiesInventoriesImages();
$rtsInventoryImage->setImagePath($imageName);
$rtsInventoryImage->setInventory($activityInventory);
$em->persist($rtsInventoryImage);
$em->flush($rtsInventoryImage);
$fileHandler->save($image, $imageRealPath, $imageName );
}
}
}
// get the new images the user chose them from modal
$newImages = explode(',',$formPosted['newImages']);
end($newImages);
unset($newImages[key($newImages)]); // remove the last item because it's empty because ','
foreach ($newImages as $imageName) {
$rtsInventoryImage = new VehicleRtsActivitiesInventoriesImages();
$rtsInventoryImage->setImagePath($imageName);
$rtsInventoryImage->setInventory($activityInventory);
$em->persist($rtsInventoryImage);
$em->flush($rtsInventoryImage);
}
// get the id images when user deleted them , this image uploaded before and remove them from db
$deletedImageIds = explode(',',$formPosted['deletedImageIds']);
end($deletedImageIds);
unset($deletedImageIds[key($deletedImageIds)]); // remove the last item because it's empty because ','
foreach ($deletedImageIds as $imageId) {
$image = $em->getRepository(VehicleRtsActivitiesInventoriesImages::class)->find($imageId);
$em->remove($image);
$em->flush();
}
}
/**
* Creates a form to delete a vehicleRtsActivity entity.
*
* @param Activity $vehicleRtsActivity The vehicleRtsActivity entity
* @return \Symfony\Component\Form\Form|\Symfony\Component\Form\FormInterface
*/
private function createDeleteForm(Activity $vehicleRtsActivity)
{
return $this->formFactory->createBuilder()
->setAction($this->router->generate('vehiclertsactivities_delete', array('activityId' => $vehicleRtsActivity->getActivityid())))
->setMethod('DELETE')
->getForm()
;
}
public function getCityWarehouses($cityID){
return $this->entityManager->getRepository(Warehouses::class)->getCityWarehouses($cityID);
}
public function getTransporterDrivers($driverName,$transporterID){
return $this->entityManager->getRepository(TransporterDrivers::class)->getTransporterDrivers($driverName,$transporterID);
}
}