<?php
namespace App\Controller;
use App\Service\AssociatePartnerService;
use App\Service\DashboardService;
use App\Service\DealerService;
use App\Service\DefaultService;
use App\Service\EstimateService;
use App\Service\SmsService;
use App\Service\UserService;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
class DealerController extends AbstractController
{
private $kernel;
public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
/**
* @Route("/", name="homepage")
*/
public function dashIndex(): Response
{
return $this->redirect('/dealer');
}
/**
* @Route("/dealer", name="dealer_dashboard")
*/
public function index(SmsService $smsService): Response
{
return $this->render('dealer/index.html.twig');
}
/**
* @Route("/backoffice", name="backoffice_dashboard")
*/
public function backoffice(): Response
{
return $this->render('backoffice/index.html.twig');
}
/**
* @Route("/backoffice/api/invoice", name="backoffice_api_invoice", methods={"POST"})
*/
public function backofficeApiInvoice(Request $request, DealerService $dealerService): Response
{
//salva i dati di fatturazione dell'utente backoffice
$data = json_decode($request->getContent(), true);
$dealerService->saveBackofficeInvoiceData($data);
if($dealerService->hasErrors()){
return $this->JsonErrorResponse($dealerService->getErrorMessage());
}
return $this->JsonOkResponse();
}
/**
* @Route("/dealer/api/dashboard-report", name="dealer_api_dashboard_report", methods={"GET"})
*/
public function dealerApiDashboardReport(DashboardService $dashboardService): Response
{
$report = $dashboardService->dealerDashboardReport();
if ($dashboardService->hasErrors()) {
return $this->JsonErrorResponse($dashboardService->getErrorMessage());
}
return $this->JsonOkResponse($report);
}
/**
* @Route("/dealer/api/search-partner", name="dealer_api_search_partner", methods={"POST"})
*/
public function dealerApiSearchPartner(Request $request, AssociatePartnerService $associatePartnerService): Response
{
$data = json_decode($request->getContent(), true);
if (!isset($data['vatCode']) || !$data['vatCode']) {
return $this->JsonErrorResponse('La partita iva è un campo obbligatorio');
}
$partnerArray = $associatePartnerService->searchPartnerByVatCodeOnOpenapi($data['vatCode']);
if ($associatePartnerService->hasErrors()) {
return $this->JsonErrorResponse($associatePartnerService->getErrorMessage());
}
return $this->JsonOkResponse($partnerArray);
}
/**
* @Route("/dealer/api/search-vehicle", name="dealer_api_search_vehicle", methods={"GET"})
*/
public function dealerApiSearchVehicle(Request $request, DefaultService $defaultService): Response
{
$plate = $request->query->get('plate');
$vin = $request->query->get('vin');
if (!$plate && !$vin) {
return $this->JsonErrorResponse("Required params not found");
}
$vehicleFound = $defaultService->importVehicleByField($plate, $vin);
if ($defaultService->hasErrors()) {
return $this->JsonErrorResponse($defaultService->getErrorMessage());
}
return $this->JsonOkResponse($vehicleFound);
}
/**
* @Route("/dealer/api/create-multiple-estimate-partners", name="dealer_api_create_multiple_estimate_partners", methods={"POST"})
*/
public function dealerApiCreateMultipleEstimatePartnerVehicle(Request $request, EstimateService $estimateService): Response
{
$data = json_decode($request->getContent(), true);
$estimateService->createMultipleEstimatePartner($data);
if ($estimateService->hasErrors()) {
return $this->JsonErrorResponse($estimateService->getErrorMessage());
}
return $this->JsonOkResponse(true);
}
/**
* @Route("/dealer/upload_logo", name="dealer_upload_logo", methods={"POST"})
*/
public function dealerUploadLogo(Request $request, UserService $userService): Response
{
$uploadFile = $request->files->get('file');
$imageUrl = $userService->uploadDealerLogo($uploadFile);
if ($userService->hasErrors()) {
return $this->JsonErrorResponse($userService->getErrorMessage());
}
return $this->JsonOkResponse([
'imageUrl' => $imageUrl,
]);
}
/**
* @Route("/dealer/delete_logo", name="dealer_delete_logo", methods={"POST"})
*/
public function dealerDeleteLogo(Request $request, UserService $userService): Response
{
$response = new Response();
$data = json_decode($request->getContent(), true);
if (!isset($data['dealerId'])) {
$response->setStatusCode(500);
return $response;
}
$deleted = $userService->deleteDealerLogo($data['dealerId']);
return $deleted == true ? $this->JsonOkResponse() : $this->JsonErrorResponse($deleted);
}
/**
* @Route("/dealer/api/create", name="dealer_api_create", methods={"POST"})
*/
public function dealerApiCreate(Request $request, DealerService $dealerService): Response
{
//crea nuovo dealer
$data = json_decode($request->getContent(), true);
$requiredFieldsErrors = [];
if (!isset($data['dealerCode']) || !$data['dealerCode']) {
$requiredFieldsErrors[] = 'Il codice dealer è un campo obbligatorio';
}
if (!isset($data['companyName']) || !$data['companyName']) {
$requiredFieldsErrors[] = 'La ragione sociale è un campo obbligatorio';
}
if (!isset($data['vatCode']) || !$data['vatCode']) {
$requiredFieldsErrors[] = 'La ragione sociale è un campo obbligatorio';
}
if (count($requiredFieldsErrors) > 0) {
return $this->JsonErrorResponse(implode(', ', $requiredFieldsErrors));
}
$dealer = $dealerService->createNewDealer($data);
if ($dealerService->hasErrors()) {
return $this->JsonErrorResponse($dealerService->getErrorMessage());
}
//lancia command per creare jobs e parti di default del nuovo dealer
$this->createDealerJobs($dealer->getId());
return $this->JsonOkResponse($dealer);
}
/**
* @Route("/dealer/api/vehicle-uploaded-images", name="dealer_api_vehicle_uploaded_images", methods={"POST"})
*/
public function dealerApiVehicleUploadedImages(Request $request, DealerService $dealerService)
{
if (!$this->isGranted('ROLE_DEALER')) {
return $this->JsonUnauthorizedResponse();
}
$data = json_decode($request->getContent(), true);
if (!isset($data['estimateId']) || !$data['estimateId']) {
$this->JsonErrorResponse('Required params missing');
}
$uploadedImages = $dealerService->getVehicleUploadedImages($data['estimateId']);
if ($dealerService->hasErrors()) {
return $this->JsonErrorResponse($dealerService->getErrorMessage());
}
//struttura array per frontend
$imagesArr = [];
foreach ($uploadedImages as $image) {
$vehicleTag = $image['tags']['vehicle'];
if (isset($image['tags']['vehicle-part'])) {
$imagesArr[$vehicleTag[0]['tagReference']][$image['tags']['vehicle-part'][0]['tagReference']][] = $image;
} else {
$imagesArr[$vehicleTag[0]['tagReference']][] = $image;
}
}
return $this->JsonOkResponse($imagesArr);
}
/**
* @Route("/delaer/api/upload-image", name="dealer_api_upload_image", methods={"POST"})
*/
public function dealerApiUploadImage(Request $request, DealerService $dealerService)
{
if (!$this->isGranted('ROLE_DEALER')) {
return $this->JsonUnauthorizedResponse();
}
$estimateId = $request->request->get('estimateId');
$vehicleId = $request->request->get('vehicleId');
$vehiclePartId = $request->request->get('vehiclePartId');
$uploadFiles = $request->files->get('files');
$uploadedImagesList = $dealerService->uploadVehicleImage($estimateId, $vehicleId, $vehiclePartId, $uploadFiles, 'desktop');
if ($dealerService->hasErrors()) {
return $this->JsonErrorResponse($dealerService->getErrorMessage());
}
return $this->JsonOkResponse($uploadedImagesList);
}
/**
* @Route("/delaer/api/delete-image", name="dealer_api_delete_image", methods={"POST"})
*/
public function dealerApiDeleteImage(Request $request, DealerService $dealerService)
{
if (!$this->isGranted('ROLE_DEALER')) {
return $this->JsonUnauthorizedResponse();
}
$data = json_decode($request->getContent(), true);
if (!isset($data['imageId']) || !$data['imageId']) {
$this->JsonErrorResponse('Required params missing');
}
$dealerService->deleteUploadedImage($data['imageId']);
if ($dealerService->hasErrors()) {
return $this->JsonErrorResponse($dealerService->getErrorMessage());
}
return $this->JsonOkResponse([]);
}
/**
* @Route("/dealer/api/archive-user", name="dealer_api_archive_user", methods={"POST"})
*/
public function dealerApiArchiveUser(Request $request, DealerService $dealerService): Response
{
if (!$this->isGranted('ROLE_DEALER_RESPONSIBLE')) {
return $this->JsonUnauthorizedResponse();
}
$data = json_decode($request->getContent(), true);
if (!isset($data['userId']) || !$data['userId']) {
$this->JsonErrorResponse('Required params missing');
}
$dealerService->archiveUser($data['userId']);
if ($dealerService->hasErrors()) {
return $this->JsonErrorResponse($dealerService->getErrorMessage());
}
return $this->JsonOkResponse([]);
}
/**
* @Route("/dealer/api/warehouses", name="dealer_api_warehouses", methods={"GET"})
*/
public function dealerApiWarehouses(Request $request, DefaultService $defaultService): Response
{
$warehouses = $defaultService->getEnabledWarehouses();
$listArr = [];
if($warehouses){
foreach($warehouses as $item){
$listArr[] = [
'id' => $item->getId(),
'name' => $item->getName(),
'email' => $item->getEmail(),
];
}
}
return $this->JsonOkResponse($listArr);
}
private function createDealerJobs($dealerId)
{
$application = new Application($this->kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'dealer:create-jobs',
'dealerId' => $dealerId,
]);
// You can use NullOutput() if you don't need the output
//$output = new BufferedOutput();
$output = new NullOutput();
$application->run($input, $output);
// return the output, don't use if you used NullOutput()
//$content = $output->fetch();
return true;
}
private function JsonOkResponse($data = [])
{
return new Response(json_encode(['result' => 'OK', 'data' => $data]));
}
private function JsonErrorResponse($errmsg)
{
$json = json_encode(['result' => 'ERROR', 'errmsg' => $errmsg]);
$response = new Response($json);
$response->setStatusCode(500);
return $response;
}
private function JsonUnauthorizedResponse()
{
$json = json_encode(['result' => 'ERROR', 'errmsg' => 'Unauthorized']);
$response = new Response($json);
$response->setStatusCode(401);
return $response;
}
}