<?php
namespace App\Controller;
use App\Entity\CarSale;
use App\Entity\CarSaleBankCheck;
use App\Entity\CarBuy;
use App\Form\CarSaleType;
use App\Repository\CarSaleRepository;
use App\Repository\UserRepository;
use Doctrine\Persistence\ManagerRegistry;
use Dompdf\Dompdf;
use Dompdf\Options;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
//use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Doctrine\Common\Collections\ArrayCollection;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use App\Service\WhatsAppService;
/**
* @Route("/car/sale")
*/
class CarSaleController extends AbstractController
{
/**
* @Route("/indexJson", name="car_sale_index_json", methods={"GET", "POST"})
*/
public function indexJson(Request $request, CarSaleRepository $entityRepository): Response
{
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$isDone = $request->get('isDone');
$curMonth = $request->get('curMonth');
$dateFromRaw = $request->get('dateFrom');
$dateToRaw = $request->get('dateTo');
$dateFilter = filter_var($request->get('dateFilter'), FILTER_VALIDATE_BOOLEAN);
$priceFrom = $request->get('priceFrom');
$priceTo = $request->get('priceTo');
$priceFilter = filter_var($request->get('priceFilter'), FILTER_VALIDATE_BOOLEAN);
$agency = $request->get('agency');
$seller = $request->get('seller');
$dateFrom = $dateFromRaw ? $dateFromRaw . ' 00:00:00' : null;
$dateTo = $dateToRaw ? $dateToRaw . ' 23:59:59' : null;
/*---- Filters [END] ----*/
$totalR = 0;
$curPage = $request->get('current');
$sizePage = $request->get('rowCount');
$startPage = $curPage == 1 ? 0 : (($curPage - 1) * $sizePage);
$data = $entityRepository->createQueryBuilder('cs')
->leftJoin('cs.carSale', 'c')
//->leftJoin('cs.carSalePayment', 'cp')
->leftJoin('cs.carPayment', 'cscp')
->leftJoin('cs.bankCheckId', 'csb')
->leftJoin('cscp.car', 'cp')
->leftJoin('cs.user', 'u')
->leftJoin('cs.client', 'cl')
->addSelect('c')
->addSelect('cscp')
->addSelect('csb')
->addSelect('cp')
->addSelect('u')
->addSelect('cl')
->where('cs.id > :id')
->setParameter('id', '0');
if ($search !== null && $search !== '') {
$data->andWhere(
$data->expr()->orX(
'c.name LIKE :search',
'c.patent LIKE :search',
'u.firstName LIKE :search',
'u.lastName LIKE :search',
'cs.price LIKE :search',
'cs.origin LIKE :search'
)
)->setParameter(':search', "%$search%");
}
$data = $data->leftJoin(\App\Entity\Agency::class, 'ag', 'WITH', 'cs.id = ag.saleId')
->addSelect('ag.enabledNotification, ag.status');
if ($isDone !== '' && $isDone !== null) {
$data = $data->andWhere('cs.isDone = :isDone')
->setParameter(':isDone', $isDone);
}
if ($dateFilter && $dateFrom && $dateTo) {
$data->andWhere('cs.isDoneDate BETWEEN :dateFrom AND :dateTo')
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo);
}
if ($priceFilter && $priceFrom !== null && $priceTo !== null && $priceFrom !== '' && $priceTo !== '') {
$data->andWhere('cs.price BETWEEN :priceFrom AND :priceTo')
->setParameter(':priceFrom', $priceFrom)
->setParameter(':priceTo', $priceTo);
}
if (!empty($seller)) {
$data->andWhere('u.id = :userId')
->setParameter(':userId', $seller);
}
if ($curMonth === '1') {
$data->andWhere(
$data->expr()->orX(
$data->expr()->andX(
'cs.isDone = 1',
'MONTH(cs.isDoneDate) = MONTH(CURRENT_DATE())',
'YEAR(cs.isDoneDate) = YEAR(CURRENT_DATE())'
),
'cs.isDone = 0'
)
);
}
$total = $data->getQuery()
->getArrayResult();
$data = $data->orderBy('cs.isDone', 'DESC')
->addOrderBy('cs.isDoneDate', 'ASC')
->setFirstResult($startPage)
->setMaxResults($sizePage)
->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
//->getScalarResult();
$nDelivered = 0;
$nSignaled = 0;
$nDeliveredPrice = 0;
$nSignaledPrice = 0;
/*---- Fix data for twig template [BEGIN] ----*/
foreach ($data as $key => $item) {
$aTmp = $item[0];
$aTmp['enabledNotification'] = $item['enabledNotification'];
$aTmp['status'] = $item['status'];
if (!empty($aTmp['fechaFacturacion']) && $aTmp['fechaFacturacion'] instanceof \DateTimeInterface) {
$aTmp['fechaFacturacion'] = $aTmp['fechaFacturacion']->format('Y-m-d');
}
$data[$key] = $aTmp;
}
/*---- Fix data for twig template [END] ----*/
//dump($data); exit();
foreach ($total as $item) {
/*if ($agency) {
$isDone = $item[0]['isDone'];
$price = $item[0]['price'];
$signaledDate = $item[0]['signaledDate'];
} else {
$isDone = $item['isDone'];
$price = $item['price'];
$signaledDate = $item['signaledDate'];
}*/
$isDone = $item[0]['isDone'];
$price = $item[0]['price'];
$signaledDate = $item[0]['signaledDate'];
if ($isDone) {
$nDelivered ++;
$nDeliveredPrice = $nDeliveredPrice + $price;
}
if (!$isDone && $signaledDate != null) {
$nSignaled ++;
$nSignaledPrice = $nSignaledPrice + $price;
}
}
$json_data = array(
'current' => intval($curPage),
'rowCount' => $sizePage,
'total' => count($total),
'rows' => $data,
'delivered' => $nDelivered,
'signaled' => $nSignaled,
'deliveredPrice' => $nDeliveredPrice,
'signaledPrice' => $nSignaledPrice,
'totalPrice' => $nDeliveredPrice + $nSignaledPrice,
);
//dump($data); exit();
return $this->json($json_data);
}
/**
* @Route("/{id}/print", name="car_sale_print", methods={"GET"})
*/
public function print(CarSale $carSale, Pdf $pdf): Response
{
/* Load the snappy pdf service * /
//$snappy = $this->get('knp_snappy.pdf');
$snappy = new Pdf();
$snappy->setOption('no-outline', true);
$snappy->setOption('page-size','LETTER');
$snappy->setOption('encoding', 'UTF-8');
/* Set title for pdf * /
$title = 'Detalle';
/* Render view, you can pass variables here to template view * /
$html = $this->renderView('car_sale/print.html.twig', [
'car_sale' => $carSale,
]);
/* Set output file name and force pdf download in browser with PDFResponse * /
$filename = 'Detalle-ventas.pdf';
//exit($html);
return new PdfResponse(
$snappy->getOutputFromHtml($html),
$filename
); //*/
/*return new Response(
$this->get('knp_snappy.pdf')->getOutputFromHtml($html),
200,
array(
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="tmp/file.pdf"'
)
);*/
/*---- [BEGIN] ----*/
$moneyAdvanceMultiple = $carSale->getMoneyAdvanceMultiple();
$aTmp = explode('|*|', $moneyAdvanceMultiple);
$moneyAdvanceMultiple = "";
foreach ($aTmp as $item) {
$aTmp2 = explode('|', $item);
if (count($aTmp2) > 1) {
$amount = (float) str_replace(',', '.', str_replace('.', '', $aTmp2[3]));
$moneyAdvanceMultiple .= $aTmp2[2] . number_format($amount, 0, ',', '.') . ', ';
}
}
$moneyAdvanceMultiple = rtrim($moneyAdvanceMultiple, ', ');
/*---- [END] ----*/
/*---- [BEGIN] ----*/
$cashMultiple = $carSale->getCashMultiple();
$aTmp = explode('|*|', $cashMultiple);
$cashMultiple = "";
foreach ($aTmp as $item) {
$aTmp2 = explode('|', $item);
if (count($aTmp2) > 1) {
$amount = (float) str_replace(',', '.', str_replace('.', '', $aTmp2[3]));
$cashMultiple .= $aTmp2[2] . number_format($amount, 0, ',', '.') . ', ';
}
}
$cashMultiple = rtrim($cashMultiple, ', ');
/*---- [END] ----*/
// Configure Dompdf according to your needs
$pdfOptions = new Options();
//$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setIsRemoteEnabled(true);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
//exit( $this->getParameter('kernel.project_dir') );
$dompdf->getOptions()->setChroot( $this->getParameter('kernel.project_dir').'\public' );
//$html = $this->renderView('car_sale/print.html.twig', [
//$html = $this->renderView('pdf/car_sales_detail.html.twig', [
$html = $this->renderView('pdf/car_sales_form.html.twig', [
'car_sale' => $carSale,
'money_advance_multiple' => $moneyAdvanceMultiple,
'cash_multiple' => $cashMultiple,
'server_root' => $_SERVER["DOCUMENT_ROOT"],
]);
//echo $html; exit();
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
ob_get_clean();
// Output the generated PDF to Browser (inline view)
$dompdf->stream("/pdfDetalle-ventas.pdf", [
"Attachment" => false,
]);
/*
$filename = 'Detalle-ventas.pdf';
return new PdfResponse(
$pdf->getOutputFromHtml($html),
$filename
);*/
}
/**
* @Route("/{id}/detail", name="car_sale_detail", methods={"GET"})
*/
public function detail(Request $request, CarSale $carSale): Response
{
if ($carSale->getProcedureDays() != null) {
$procedureDays = $carSale->getProcedureDays();
}
//dump($carSale); exit();
//dump(json_decode($mandateSalePrice)); exit();
return $this->render('car_sale/detail.html.twig', [
'car_sale' => $carSale,
'currentMenu' => 'sales',
]);
}
/**
* @Route("/{id}/receipt", name="car_sale_receipt", methods={"GET"})
*/
public function carSaleReceipt(Request $request, CarSale $carSale, $id): Response
{
$procedureLocation = 'VILLA CARLOS PAZ';
$procedureDate = date('Y/m/d');
$procedureTime = date('H:i:s');
$procedureDays = '7';
if ($carSale->getProcedureLocation() != null) {
$procedureLocation = $carSale->getProcedureLocation();
}
if ($carSale->getProcedureDate() != null) {
$procedureDate = $carSale->getProcedureDate();
}
/*if ($carSale->getProcedureTime() != null) {
$procedureTime = $carSale->getProcedureTime()->format('H:i:s');
}*/
if ($carSale->getProcedureDays() != null) {
$procedureDays = $carSale->getProcedureDays();
}
/*---- [BEGIN] ----*/
$moneyAdvanceMultiple = $carSale->getMoneyAdvanceMultiple();
$aTmp = explode('|*|', $moneyAdvanceMultiple);
$moneyAdvanceMultiple = "";
foreach ($aTmp as $item) {
$aTmp2 = explode('|', $item);
if (count($aTmp2) > 1) {
$amount = (float) str_replace(',', '.', str_replace('.', '', $aTmp2[3]));
$moneyAdvanceMultiple .= $aTmp2[2] . number_format($amount, 0, ',', '.') . ', ';
}
}
/*---- [END] ----*/
return $this->render('car_sale/receipt.html.twig', [
'car_sale' => $carSale,
'money_advance_multiple' => $moneyAdvanceMultiple,
'procedure_location' => $procedureLocation,
'procedure_date' => $procedureDate,
'procedure_time' => $procedureTime,
'procedure_days' => $procedureDays,
'isCreated' => $carSale->getReceiptGenerated(),
'form_number' => $carSale->getId(),
'currentMenu' => 'sales',
]);
}
/**
* @Route("/excel", name="car_sale_excel", methods={"GET", "POST"})
*/
public function excel(Request $request, CarSaleRepository $entityRepository): Response
{
/*---- Filters [START] ----*/
$search = $request->get('searchPhrase');
$isDone = $request->get('isDone');
$curMonth = $request->get('curMonth');
$dateFromRaw = $request->get('dateFrom');
$dateToRaw = $request->get('dateTo');
$dateFilter = filter_var($request->get('dateFilter'), FILTER_VALIDATE_BOOLEAN);
$priceFrom = $request->get('priceFrom');
$priceTo = $request->get('priceTo');
$priceFilter = filter_var($request->get('priceFilter'), FILTER_VALIDATE_BOOLEAN);
$seller = $request->get('seller');
/*---- Filters [END] ----*/
$totalR = 0;
$curPage = $request->get('current');
$sizePage = $request->get('rowCount');
$data = $entityRepository->createQueryBuilder('cs')
->leftJoin('cs.carSale', 'c')
->leftJoin('cs.carSalePayment', 'cp')
->leftJoin('cs.user', 'u')
->leftJoin('cs.client', 'cl')
->addSelect('c')
->addSelect('cp')
->addSelect('u')
->addSelect('cl')
->where('cs.id > :id')
->setParameter('id', '0');
if ($search !== null && $search !== '') {
$data->andWhere(
$data->expr()->orX(
'c.name LIKE :search',
'c.patent LIKE :search',
'u.firstName LIKE :search',
'u.lastName LIKE :search',
'cs.price LIKE :search',
'cs.origin LIKE :search'
)
)->setParameter(':search', "%$search%");
}
$dateFrom = $dateFromRaw ? $dateFromRaw . ' 00:00:00' : null;
$dateTo = $dateToRaw ? $dateToRaw . ' 23:59:59' : null;
if ($isDone !== '' && $isDone !== null) {
$data->andWhere('cs.isDone = :isDone')
->setParameter(':isDone', $isDone);
}
if ($dateFilter && $dateFrom && $dateTo) {
$data->andWhere('cs.isDoneDate BETWEEN :dateFrom AND :dateTo')
->setParameter(':dateFrom', $dateFrom)
->setParameter(':dateTo', $dateTo);
}
if ($priceFilter && $priceFrom !== null && $priceTo !== null && $priceFrom !== '' && $priceTo !== '') {
$data->andWhere('cs.price BETWEEN :priceFrom AND :priceTo')
->setParameter(':priceFrom', $priceFrom)
->setParameter(':priceTo', $priceTo);
}
if (!empty($seller)) {
$data->andWhere('u.id = :userId')
->setParameter(':userId', $seller);
}
if ($curMonth === '1') {
$data->andWhere(
$data->expr()->orX(
$data->expr()->andX(
'cs.isDone = 1',
'MONTH(cs.isDoneDate) = MONTH(CURRENT_DATE())',
'YEAR(cs.isDoneDate) = YEAR(CURRENT_DATE())'
),
'cs.isDone = 0'
)
);
}
$data = $data->getQuery()
->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
->getArrayResult();
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Listado');
$sheet->getCell('A1')->setValue(strtoupper('Vendedor'));
$sheet->getCell('B1')->setValue(strtoupper('VehĂculo Vendido'));
$sheet->getCell('C1')->setValue(strtoupper('Año'));
$sheet->getCell('D1')->setValue(strtoupper('Patente'));
$sheet->getCell('E1')->setValue(strtoupper('VehĂculos Recibido'));
$sheet->getCell('F1')->setValue(strtoupper('Año'));
$sheet->getCell('G1')->setValue(strtoupper('Patente'));
$sheet->getCell('H1')->setValue(strtoupper('Precio Compra'));
$sheet->getCell('I1')->setValue(strtoupper('Adelanto'));
$sheet->getCell('J1')->setValue(strtoupper('Finalizada'));
$sheet->getCell('K1')->setValue(strtoupper('Creado'));
$sheet->getCell('L1')->setValue(strtoupper('Modificado'));
foreach(range('A','H') as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
$sheet->getStyle('A1:L1')
->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('dedede');
setlocale(LC_MONETARY, 'it_IT');
$counter = 2;
foreach ($data as $item) {
$carSalePayment = $item['carSalePayment'] ?? null;
$carSalePaymentText = '';
$carSalePaymentYear = '';
$carSalePaymentPatent = '';
if ($carSalePayment) {
$carSalePaymentText = strtoupper($carSalePayment['name'].' ('.$carSalePayment['patent'].')');
$carSalePaymentYear = strtoupper($carSalePayment['year']);
$carSalePaymentPatent = strtoupper($carSalePayment['patent']);
}
$sheet->getCell('A'.$counter)->setValue(strtoupper($item['user']['firstName'].' '.$item['user']['lastName']));
$sheet->getCell('B'.$counter)->setValue(strtoupper($item['carSale']['name'].' ('.$item['carSale']['patent'].')'));
$sheet->getCell('C'.$counter)->setValue(strtoupper($item['carSale']['year']));
$sheet->getCell('D'.$counter)->setValue(strtoupper($item['carSale']['patent']));
$sheet->getCell('E'.$counter)->setValue($carSalePaymentText);
$sheet->getCell('F'.$counter)->setValue($carSalePaymentYear);
$sheet->getCell('G'.$counter)->setValue($carSalePaymentPatent);
//$sheet->getCell('H'.$counter)->setValue(strtoupper($item['price']));
$sheet->getCell('H'.$counter)->setValue( $item['currency'].number_format($item['price'], 0, ',', '.') );
$sheet->getCell('I'.$counter)->setValue( $item['moneyAdvanceCurrency'].number_format($item['moneyAdvance'], 0, ',', '.') );
$sheet->getCell('J'.$counter)->setValue(strtoupper($item['isDone'] == 0 ? 'No' : 'SĂ'));
if ($item['createdAt'] != null) {
$sheet->getCell('K' . $counter)->setValue($item['createdAt']->format('d-m-Y H:i:s'));
}
if ($item['updatedAt'] != null) {
$sheet->getCell('L'.$counter)->setValue($item['updatedAt']->format('d-m-Y H:i:s'));
}
$counter ++;
}
// Increase row cursor after header write
//$sheet->fromArray($data,null, 'A2', true);
$writer = new Xlsx($spreadsheet);
// Create a Temporary file in the system
$fileName = 'Ventas_'.date('d-m-Y').'.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Create the excel file in the tmp directory of the system
$writer->save($temp_file);
// Return the excel file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/sale/{id}/receiptsave/", name="car_sale_receipt_save", methods="POST")
*/
public function receiptSave(Request $request, $id)
{
$data = json_decode($request->getContent(), true);
$aProcedure['location'] = $data['procedure-location'];
$aProcedure['date'] = new \DateTime($data['procedure-date'].'00:00:01');
$aProcedure['time'] = new \DateTime($data['procedure-date']. $data['procedure-time']);
$aProcedure['days'] = $data['procedure-days'];
/*---- [BEGIN] ----*/
$carsale = $this->getDoctrine()->getRepository('App\Entity\CarSale')->findOneBy([ 'id' => $id ]);
$carsale->setProcedureLocation($aProcedure['location']);
$carsale->setProcedureDate($aProcedure['date']);
$carsale->setProcedureTime($aProcedure['time']);
$carsale->setProcedureDays($aProcedure['days']);
$carsale->setReceiptGenerated(1);
$this->getDoctrine()->getManager()->persist($carsale);
$this->getDoctrine()->getManager()->flush();
/*---- [END] ----*/
return $this->json('ok');
}
/**
* @Route("/sale/{id}/detailsave/", name="car_sale_detail_save", methods="POST")
*/
public function detailSave(Request $request, $id)
{
$data = json_decode($request->getContent(), true);
$aProcedure['balance'] = $data['balance'];
/*---- [BEGIN] ----*/
$carsale = $this->getDoctrine()->getRepository('App\Entity\CarSale')->findOneBy([ 'id' => $id ]);
$carsale->setBalance($aProcedure['balance']);
$this->getDoctrine()->getManager()->persist($carsale);
$this->getDoctrine()->getManager()->flush();
/*---- [END] ----*/
return $this->json('ok');
}
/**
* @Route("/sale/{id}/pdf/receipt", name="car_sale_receipt_pdf", methods="GET")
*/
public function receiptPdf(Request $request, CarSale $carSale, $id)
{
$procedureLocation = $carSale->getProcedureLocation();
$procedureDate = $carSale->getProcedureDate();
$procedureTime = $carSale->getProcedureTime();;
$procedureDays = $carSale->getProcedureDays();;
//$procedureTime = date('H:i:s');
$moneyAdvance = '';
/*---- [BEGIN] ----*/
$moneyAdvanceMultiple = $carSale->getMoneyAdvanceMultiple();
$aTmp = explode('|*|', $moneyAdvanceMultiple);
$moneyAdvanceMultiple = "";
foreach ($aTmp as $item) {
$aTmp2 = explode('|', $item);
if (count($aTmp2) > 1) {
$amount = (float) str_replace(',', '.', str_replace('.', '', $aTmp2[3]));
$moneyAdvanceMultiple .= $aTmp2[2] . number_format($amount, 0, ',', '.') . ', ';
}
}
/*---- [END] ----*/
// Configure Dompdf according to your needs
$pdfOptions = new Options();
//$pdfOptions->set('defaultFont', 'Arial');
$pdfOptions->setIsHtml5ParserEnabled(true);
$pdfOptions->setIsRemoteEnabled(true);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
//exit( $this->getParameter('kernel.project_dir') );
$dompdf->getOptions()->setChroot( $this->getParameter('kernel.project_dir').'\public' );
// Retrieve the HTML generated in our twig file
$html = $this->renderView('pdf/car_sale_receipt.html.twig', [
'car_sale' => $carSale,
'money_advance_multiple' => $moneyAdvanceMultiple,
'procedure_location' => $procedureLocation,
'procedure_date' => $procedureDate,
'procedure_days' => $procedureDays,
'money_advance' => $moneyAdvance,
'form_number' => $carSale->getId(),
'server_root' => $_SERVER["DOCUMENT_ROOT"],
]);
//dump($html); exit();
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
ob_get_clean();
// Output the generated PDF to Browser (inline view)
$dompdf->stream("/Recibo-seña.pdf", [
"Attachment" => false,
]);
//exit(0);
}
/**
* @Route("/index", name="car_sale_index", methods={"GET"})
*/
public function index(ManagerRegistry $doctrine, CarSaleRepository $carSaleRepository): Response
{
$sellers = $this->getDoctrine()->getManager()->getRepository(\App\Entity\User::class)->createQueryBuilder('u')
->indexBy('u', 'u.id')
->orderBy('u.firstName', 'ASC')
->getQuery()
->getArrayResult();
$query = "
SELECT id, name
FROM branches
ORDER BY name ASC
";
$conn = $doctrine->getConnection();
$result = $conn->executeQuery($query);
$branches = $result->fetchAllKeyValue();
return $this->render('car_sale/index.html.twig', [
'car_sales' => $carSaleRepository->findAll(),
'branches' => $branches,
'currentMenu' => 'car_sale',
'sellers' => $sellers,
]);
}
/**
* @Route("/addSeller", name="car_sale_add_seller", methods={"GET"})
*/
public function addSeller(UserRepository $userRepository): Response
{
//$sellers = $userRepository->findBy(['roles' => 'ROLE_SALE']);
//dump($sellers); exit();
return $this->render('car_sale/add_seller.html.twig', [
'sellers' => $userRepository->findAll(),
]);
}
/**
* @Route("/new", name="car_sale_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$carSale = new CarSale();
$form = $this->createForm(CarSaleType::class, $carSale);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$carSale->SetUser($this->getUser());
}
$carSale->SetProcedureDays(7);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($carSale);
$entityManager->flush();
if ($carSale->getIsDone()) {
/*---- Updated vehicle to sale [BEGIN] ----*/
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSale()->getId());
$car->setStatus('sold');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Updated vehicle to sale [END] ----*/
/*---- Updated vehicle_payment [BEGIN] ----*/
if ($carSale->getCarSalePayment()) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSalePayment()->getId());
$car->setStatus('entered');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
}
/*---- Updated vehicle_payment [END] ----*/
} else {
/*---- Updated vehicle to sale [BEGIN] ----*/
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSale()->getId());
$car->setStatus('signaled');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Updated vehicle to sale [END] ----*/
/*---- Updated vehicle_payment [BEGIN] ----*/
if ($carSale->getCarSalePayment()) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSalePayment()->getId());
$car->setStatus('to enter');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
}
/*---- Updated vehicle_payment [END] ----*/
}
$this->syncCarPaymentPurchases($carSale);
return $this->redirectToRoute('car_sale_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('car_sale/new.html.twig', [
'car_sale' => $carSale,
'form' => $form->createView(),
'currentMenu' => 'car_sale',
]);
}
/**
* @Route("/{id}", name="car_sale_show", methods={"GET"})
*/
public function show(CarSale $carSale): Response
{
return $this->render('car_sale/show.html.twig', [
'car_sale' => $carSale,
'currentMenu' => 'car_sale',
]);
}
/**
* @Route("/{id}/modal", name="car_sale_show_modal", methods={"GET"})
*/
public function showModal(CarSale $carSale): Response
{
$sellers = $this->getDoctrine()->getManager()->getRepository(\App\Entity\User::class)->createQueryBuilder('u')
->indexBy('u', 'u.id')
->orderBy('u.firstName', 'ASC')
->getQuery()
->getArrayResult();
return $this->render('car_sale/show_modal.html.twig', [
'car_sale' => $carSale,
'sellers' => $sellers,
'currentMenu' => 'car_sale',
]);
}
/**
* @Route("/{id}/edit", name="car_sale_edit", methods={"GET","POST"})
*/
public function edit(Request $request, CarSale $carSale): Response
{
if ($carSale->getIsDone() && $this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
return $this->render('messages/no_edit_record.html.twig', [
'currentMenu' => 'car_sale',
]);
}
$options['edit'] = true;
$options['carSaleId'] = $carSale->getCarSale() != null ? $carSale->getCarSale()->getId() : 0;
$options['carPaymentId'] = $carSale->getCarSalePayment() != null ? $carSale->getCarSalePayment()->getId() : 0;
// save the records that are in the database first to compare them with the new one the user sent
// make sure this line comes before the $form->handleRequest();
$orignalBankCheck = new ArrayCollection();
foreach ($carSale->getBankCheckId() as $item) {
$orignalBankCheck->add($item);
}
$orignalCarPayment = new ArrayCollection();
foreach ($carSale->getCarPayment() as $item) {
$orignalCarPayment->add($item);
}
//dump($carSale->getCarPayment()); //exit();
//dump($request);
//dump($request->getMethod()); exit();
if ($request->getMethod() == 'POST') {
//exit('---- 1 ----');
}
$form = $this->createForm(CarSaleType::class, $carSale, $options);
$form->handleRequest($request);
if ($request->getMethod() == 'POST') {
//exit('---- 2 ----');
}
/*if ($form->isSubmitted()) {
dump($request);
exit($request->get('carSalePayment') . '-------');
} //*/
//exit($request->get('carSalePayment') . '-------here'. $form->isSubmitted());
if ($form->isSubmitted() && $form->isValid()) {
if ($this->getUser()->getRoles()[0] != 'ROLE_ADMIN') {
$carSale->SetUser($this->getUser());
}
//dump($carSale->getBankCheckId()); exit();
//dump($request); dump($carSale->getBankCheck()); exit();
/*---- get rid of the ones that the user got rid of in the interface (DOM) [BEGIN] ----*/
foreach ($orignalBankCheck as $item) {
// check if the exp is in the $user->getExp()
// dump($user->getExp()->contains($exp));
if ($carSale->getBankCheckId()->contains($item) === false) {
$this->getDoctrine()->getManager()->remove($item);
}
}
foreach ($orignalCarPayment as $item) {
if ($carSale->getCarPayment()->contains($item) === false) {
$this->getDoctrine()->getManager()->remove($item);
}
}
//dump($carSale->getCarPayment()); exit();
/*---- get rid of the ones that the user got rid of in the interface (DOM) [END] ----*/
//dump($carSale); exit();
$this->getDoctrine()->getManager()->flush();
//exit('---- 3 ----');
/*---- Updated vehicle to sale [BEGIN] ----*/
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSale()->getId());
if ($carSale->getIsDone()) {
$car->setStatus('sold');
} else {
$car->setStatus('signaled');
}
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Updated vehicle to sale [END] ----*/
/*---- Updated vehicle_payment [BEGIN] ----*/
if ($carSale->getCarSalePayment()) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSalePayment()->getId());
if ($carSale->getIsDone()) {
$car->setStatus('entered');
} else {
$car->setStatus('to enter');
}
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
} else if ($options['carPaymentId'] > 0) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $options['carPaymentId']);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($car);
$entityManager->flush();
}
/*---- Updated vehicle_payment [END] ----*/
/*
if ($carSale->getIsDone()) {
/*---- Updated vehicle to sale [BEGIN] ----* /
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSale()->getId());
$car->setStatus('sold');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Updated vehicle to sale [END] ----*/
/*---- Updated vehicle_payment [BEGIN] ----* /
if ($carSale->getCarSalePayment()) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSalePayment()->getId());
$car->setStatus('entered');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
} else if ($options['carPaymentId'] > 0) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $options['carPaymentId']);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($car);
$entityManager->flush();
}
/*---- Updated vehicle_payment [END] ----* /
} else {
/*---- Updated vehicle to sale [BEGIN] ----* /
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSale()->getId());
$car->setStatus('signaled');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
/*---- Updated vehicle to sale [END] ----*/
/*---- Updated vehicle_payment [BEGIN] ----* /
if ($carSale->getCarSalePayment()) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $carSale->getCarSalePayment()->getId());
$car->setStatus('to enter');
$this->getDoctrine()->getManager()->persist($car);
$this->getDoctrine()->getManager()->flush();
} else if ($options['carPaymentId'] > 0) {
$car = $this->getDoctrine()->getManager()->getReference(\App\Entity\Car::class, $options['carPaymentId']);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($car);
$entityManager->flush();
}
/*---- Updated vehicle_payment [END] ----* /
}*/
$this->syncCarPaymentPurchases($carSale, $orignalCarPayment);
return $this->redirectToRoute('car_sale_index', [], Response::HTTP_SEE_OTHER);
}
$sellers = $this->getDoctrine()->getManager()->getRepository(\App\Entity\User::class)->createQueryBuilder('u')
->indexBy('u', 'u.id')
->orderBy('u.firstName', 'ASC')
->getQuery()
->getArrayResult();
return $this->render('car_sale/edit.html.twig', [
'car_sale' => $carSale,
'sellers' => $sellers,
'form' => $form->createView(),
//'form' => $form,
'currentMenu' => 'car_sale',
]);
}
private function syncCarPaymentPurchases(CarSale $carSale, ?ArrayCollection $originalCarPayments = null): void
{
$entityManager = $this->getDoctrine()->getManager();
$carBuyRepo = $entityManager->getRepository(CarBuy::class);
$carSaleVehicle = $carSale->getCarSale();
$isDone = $carSale->getIsDone();
$defaultCurrency = $carSale->getCurrency() ?? '$';
$defaultOrigin = $carSale->getOrigin() ?? 'Sales Room';
foreach ($carSale->getCarPayment() as $payment) {
$paymentCar = $payment->getCar();
if ($paymentCar === null) {
continue;
}
$carBuy = $carBuyRepo->findOneBy([
'car' => $paymentCar,
'carSwap' => $carSaleVehicle,
]);
if ($carBuy === null) {
$carBuy = new CarBuy();
$carBuy->setCar($paymentCar);
$carBuy->setCarSwap($carSaleVehicle);
$entityManager->persist($carBuy);
}
$pricePurchase = $paymentCar->getPricePurchase() ?? 0;
$currencyPurchase = $paymentCar->getPriceCurrencyPurchase() ?? $defaultCurrency;
$carBuy->setPrice($pricePurchase);
$carBuy->setCurrency($currencyPurchase);
$carBuy->setOrigin($defaultOrigin);
$carBuy->setDescription(sprintf('VehĂculo tomado en parte de pago de la venta #%d', $carSale->getId()));
$carBuy->setUser($carSale->getUser());
$carBuy->setClient($carSale->getClient());
$carBuy->setIsDone($isDone);
$carBuy->setIsDoneDate($isDone ? $carSale->getIsDoneDate() : null);
$paymentCar->setPricePurchase($pricePurchase);
$paymentCar->setPriceCurrencyPurchase($currencyPurchase);
$paymentCar->setStatus($isDone ? 'entered' : 'to enter');
$entityManager->persist($paymentCar);
}
if ($originalCarPayments !== null) {
foreach ($originalCarPayments as $payment) {
if ($carSale->getCarPayment()->contains($payment)) {
continue;
}
$paymentCar = $payment->getCar();
if ($paymentCar === null) {
continue;
}
$carBuy = $carBuyRepo->findOneBy([
'car' => $paymentCar,
'carSwap' => $carSaleVehicle,
]);
if ($carBuy !== null) {
$entityManager->remove($carBuy);
}
}
}
$entityManager->flush();
}
/**
* @Route("/{id}", name="car_sale_delete", methods={"POST"})
*/
public function delete(Request $request, CarSale $carSale): Response
{
if ($this->isCsrfTokenValid('delete'.$carSale->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($carSale);
$entityManager->flush();
}
return $this->redirectToRoute('car_sale_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/delete", name="car_sale_delete_ra", methods={"GET"})
*/
public function deleteRa(Request $request): Response
{
$entityManager = $this->getDoctrine()->getManager();
$carSale = $entityManager->getReference(\App\Entity\CarSale::class, $request->get('id'));
$entityManager->remove($carSale);
$entityManager->flush();
return $this->redirectToRoute('car_sale_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/ventas/{id}/send-thank-you', name: 'ventas_send_thank_you', methods: ['POST','GET'])]
public function sendThankYou(CarSale $venta, WhatsAppService $whatsappService): JsonResponse
{
$cliente = $venta->getClient();
$ok = $whatsappService->sendThankYouMessage($cliente);
if ($ok) {
return new JsonResponse([
'success' => true,
'message' => 'Mensaje enviado correctamente'
], 200);
}
else{
return new JsonResponse([
'success' => false,
'message' => 'No se pudo enviar el mensaje'
], 500);
}
}
}