<?php
namespace App\Controller\Ajax\Privado\Administracion;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Administracion\Cliente;
use App\Entity\Administracion\Propuesta;
use App\Entity\Administracion\PropuestaLinea;
use App\Entity\Almacen\Serie;
use App\Repository\Administracion\PropuestaRepository;
use App\Repository\Almacen\ModeloRepository;
use App\Repository\Almacen\AccesorioModeloLineaRepository;
use App\Repository\Almacen\AccesorioRepository;
use App\Repository\Almacen\SerieRepository;
use App\Repository\Administracion\DocumentosRepository;
use App\Repository\Ajustes\ConfigGlobalRepository;
use App\Form\Privado\Filtros\Administracion\PropuestaFilterType;
use App\Form\Privado\Filtros\Administracion\Modal\PropuestaModalFilterType;
use App\Form\Privado\Filtros\Administracion\PropuestaFilterMaquinaType;
use App\Form\Privado\Administracion\PropuestaEstadoType;
use App\Form\Privado\Administracion\PropuestaType;
use Symfony\Component\Filesystem\Filesystem;
use Xthiago\PDFVersionConverter\Converter\GhostscriptConverterCommand;
use Xthiago\PDFVersionConverter\Converter\GhostscriptConverter;
use App\Utils\HelperUtil;
use App\Utils\CustomFilter;
use Knp\Snappy\Pdf;
/** SERIALIZER AJAX */
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Doctrine\Common\Annotations\AnnotationReader;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpKernel\KernelInterface;
use Tomsgu\PdfMerger\PdfCollection;
use Tomsgu\PdfMerger\PdfFile;
use Tomsgu\PdfMerger\PdfMerger;
use App\Helper\ObjectUtils;
use App\Repository\Administracion\PropuestaLineaRepository;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
/**
* @Route("/propuesta", name="propuesta_")
*
*/
class PropuestaAjaxController extends AbstractController
{
const BaseDir = Propuesta::BaseDir;
protected $em;
protected $bd;
protected $repo;
protected $paginator;
protected $helper;
protected $trans;
private $serializer;
private $SerieRepo;
protected $objectUtils;
protected $snappy;
protected $kernel;
private $params;
protected $ConfGlobRepo;
public function __construct(EntityManagerInterface $em, Breadcrumbs $bd, PaginatorInterface $pg, PropuestaRepository $repo, SerieRepository $SerieRepo, HelperUtil $hlp, ParameterBagInterface $pb, TranslatorInterface $tr, ModeloRepository $ModRepo, AccesorioModeloLineaRepository $AccModLinea, AccesorioRepository $AccesorioRepo, DocumentosRepository $DocRepo, ObjectUtils $objectUtils, PdfMerger $merger, KernelInterface $kernel, Pdf $snappy, ParameterBagInterface $params, ConfigGlobalRepository $ConfGlobRepo, PropuestaLineaRepository $PropLineaRepo, Security $sec)
{
$this->em = $em;
$this->bread = $bd;
$this->param = $pb;
$this->paginator = $pg;
$this->repo = $repo;
$this->helper = $hlp;
$this->trans = $tr;
$this->SerieRepo = $SerieRepo;
$this->DocRepo = $DocRepo;
$this->ModRepo = $ModRepo;
$this->AccModLinea = $AccModLinea;
$this->AccesorioRepo = $AccesorioRepo;
$this->objectUtils = $objectUtils;
$this->merger = $merger;
$this->snappy = $snappy;
$this->kernel = $kernel;
$this->params = $params;
$this->ConfGlobRepo = $ConfGlobRepo;
$this->PropLineaRepo = $PropLineaRepo;
$this->security = $sec;
$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
$metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
$this->serializer = new Serializer(
[
new DateTimeNormalizer(['datetime_format' => 'd-m-Y H:i']),
new ObjectNormalizer($classMetadataFactory, $metadataAwareNameConverter),
],
[new JsonEncoder()]
);
}
/**
* @Route("/{id}", name="index", methods={"GET", "POST"}, options={"expose"=true})
* @IsGranted("ROLE_PRO_LIST")
*/
public function indexAction(Request $request, Cliente $cliente): Response
{
$semafor = false;
$mensaje = $html = '';
//MassActions retrieve and apply
$massOptions = $this->massAction($request);
if($massOptions instanceof RedirectResponse){
return $massOptions;
}
//Filter data
$default_values = [ 'sort' => 'pro.ProCreatedDate' , 'order' => 'desc' , 'page' => 1, 'limit' => 0 ];
$filtro = new CustomFilter($request, $default_values, 'propuesta_filter', $this->param);
if($request->query->get('clear', false) == 1){
return $this->redirectToRoute('pro_index');
}
$data_Sesio = $filtro->checkFiltroForm();
$form_filtro = $this->createForm(PropuestaFilterType::class, $data_Sesio);
$data = $form_filtro->handleRequest($request)->getData();
if ($form_filtro->isSubmitted() && $form_filtro->isValid()) {
$filtro->añadirFiltrosForm($data);
}
try{
$resultBD = $this->repo->filter($data, '', true);
//Pagination values
$pagination = $this->paginator->paginate(
$resultBD, /*query NOT result*/
$filtro->getPage() /*page number*/,
$filtro->getLimit(),
$filtro->getSortKnp()
);
}catch(\Exception $e){
$this->helper->error($e);
$this->addFlash('danger', $this->trans->trans('error.sort_or_filter'));
return $this->redirectToRoute('pro_index', ['clear' => 1]);
}
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), "pro_index");
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_index.html.twig', [
'cliente' => $cliente,
'BaseDir' => self::BaseDir,
'pagination' => $pagination,
'mass_options' => $massOptions,
'form_filtro' => $form_filtro->createView(),
'p_filter' => $filtro->getData(),
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/modal_add/", name="modal", methods={"GET", "POST"}, options={"expose"=true})
* @IsGranted("ROLE_PRO_LIST")
*/
public function indexModal(Request $request): Response
{
$semafor = false;
$mensaje = $html = '';
$tipo_acc = $request->query->get('datos');
$divisa = $request->query->get('divisa');
$valor_divisa = $request->query->get('valor_divisa');
//MassActions retrieve and apply
$massOptions = $this->massAction($request);
if($massOptions instanceof RedirectResponse){
return $massOptions;
}
//Filter data
$default_values = [ 'sort' => 'acc.id' , 'order' => 'desc' , 'page' => 1, 'limit' => 999999999 ];
$filtro = new CustomFilter($request, $default_values, 'accesorio_filter', $this->param);
if($request->query->get('clear', false) == 1){
return $this->redirectToRoute('pro_index');
}
$data_Sesio = $filtro->checkFiltroForm();
$form_filtro = $this->createForm(PropuestaModalFilterType::class, $data_Sesio);
$data = $form_filtro->handleRequest($request)->getData();
if ($form_filtro->isSubmitted() && $form_filtro->isValid()) {
$filtro->añadirFiltrosForm($data);
}
try{
$resultBD = $this->AccesorioRepo->filter_modal($data, '', true, $tipo_acc);
//Pagination values
$pagination = $this->paginator->paginate(
$resultBD, /*query NOT result*/
$filtro->getPage() /*page number*/,
$filtro->getLimit(),
$filtro->getSortKnp()
);
}catch(\Exception $e){
$this->helper->error($e);
$this->addFlash('danger', $this->trans->trans('error.sort_or_filter'));
return $this->redirectToRoute('pro_index', ['clear' => 1]);
}
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_search_modal.html.twig', [
'BaseDir' => self::BaseDir,
'pagination' => $pagination,
'mass_options' => $massOptions,
'form_filtro' => $form_filtro->createView(),
'divisa' => $divisa,
'valor_divisa' => $valor_divisa,
'p_filter' => $filtro->getData(),
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/crear/prev", name = "new_prev", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_CREATE")
*/
public function createPrevAction(Cliente $cliente = null, Request $request): Response
{
$semafor = false;
$mensaje = $html = '';
if($cliente === null || $cliente === false){
$this->addFlash('danger', $this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
//Filter data
$default_values = [ 'sort' => 'serie.SerName' , 'order' => 'ASC' , 'page' => 1, 'limit' => 300 ];
$filtro = new CustomFilter($request, $default_values, 'propuesta_filter_maquina', $this->param);
if($request->query->get('clear', false) == 1){
return $this->redirectToRoute('serie_index');
}
$data_Sesio = $filtro->checkFiltroForm();
$form_filtro = $this->createForm(PropuestaFilterMaquinaType::class, $data_Sesio);
$data = $form_filtro->handleRequest($request)->getData();
if ($form_filtro->isSubmitted() && $form_filtro->isValid()) {
$filtro->añadirFiltrosForm($data);
}
try{
$resultBD = $this->SerieRepo->filter_propuestas($data, '', true);
//Pagination values
$pagination = $this->paginator->paginate(
$resultBD, /*query NOT result*/
$filtro->getPage() /*page number*/,
$filtro->getLimit(),
$filtro->getSortKnp()
);
}catch(\Exception $e){
$this->helper->error($e);
$this->addFlash('danger', $this->trans->trans('error.sort_or_filter'));
return $this->redirectToRoute('pro_index', ['clear' => 1]);
}
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
//$this->bread->addRouteItem("Nueva", 'pro_new', ['id' => $cliente->getId()]);
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_new_prev.html.twig', [
'cliente' => $cliente,
'BaseDir' => self::BaseDir,
'pagination' => $pagination,
'form_filtro' => $form_filtro->createView(),
'p_filter' => $filtro->getData(),
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/crear/{serie}", name = "new", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_EDIT")
*/
public function createPropuesta(Cliente $cliente = null, Request $request, Serie $serie): Response
{
// Esto mostrará XML de divisas
$xml = file_get_contents('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
$object = simplexml_load_string($xml);
$json = json_encode($object);
$cube = json_decode($json,TRUE);
$divisas = [];
$divisa_fecha = $cube['Cube']['Cube']['@attributes']['time'];
foreach($cube['Cube']['Cube']['Cube'] as $item){
$divisas[] = $item['@attributes'];
}
foreach($cube['Cube']['Cube']['Cube'] as $item){
$divisas[] = $item['@attributes'];
}
$semafor = false;
$mensaje = $html = '';
$accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
$modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
if($cliente === null || $cliente === false){
$this->addFlash('danger', $this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
$AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('956', $request->request->get('propuesta')['ProModelo']) : [] );
$AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : [] );
$entity = new Propuesta();
$prefijo = $this->ConfGlobRepo->getValueOrCreateEntity('PREFIJO_PROPUESTA');
if($prefijo->getConfigUpdated()){
$div_pref = explode('-', $prefijo->getConfigValue());
$int_plush = intval($div_pref[1]);
$entity->setProReferencia($div_pref[0].'-'.$int_plush);
$prefijo->setConfigUpdated(false);
}else{
$lastProp = $this->repo->LastProp();
$div_pref = explode('-', $lastProp->getProReferencia());
$int_plush = $div_pref[1] + 1;
$entity->setProReferencia($div_pref[0].'-'.$int_plush);
}
if($modelo != null){
$entity->setProModelo($modelo);
}
/** Se gestiona el formulario la primera vez para cuando se envie el formulario */
$form = $this->createForm(PropuestaType::class, $entity,
[
'action' => $request->getRequestUri(),
'serie' => $serie->getId()
],
);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if($form->isValid()){
try{
foreach($AccModLinea_incluid as $acc){
$accesorios = $acc->getAmlAccesorio();
if($accesorios != null){
$PropuestaLinea = new PropuestaLinea();
$PropuestaLinea
->setPropLineaCantidad(1)
->setReferenciaAccesorio($accesorios->getAccReferencia())
->setPropLineaPrecio($accesorios->getAccPrecio())
->setPropLineaPrecioBase($accesorios->getAccPrecio())
->setPropLineaAccTipo($accesorios)
->setPropLineaDescripcion($accesorios->translate()->getAccName())
->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
->setPropLineaReferencia(null)
->setPropuestaLineaListadoValor($accesorios->getAccTipo())
->setPropLineaTipo(2)
->setPropLineaPropuesta($entity)
;
$trans = strtolower($this->security->getUser()->getUsuIdioma());
$PropuestaLinea->translate($trans)->setNombreAccesorio($accesorios->translate($trans)->getAccName());
$entity->addPropuestaLineas($PropuestaLinea);
$PropuestaLinea->mergeNewTranslations();
}
}
foreach($entity->getPropuestaLineas() as $opcion){
$opcion->setPropLineaPropuesta($entity);
$accesorio = $opcion->getPropLineaAccTipo();
$trans = strtolower($this->security->getUser()->getUsuIdioma());
if($accesorio != null){
$opcion->translate($trans)->setNombreAccesorio($accesorio->translate($trans)->getAccName());
$opcion->setReferenciaAccesorio($opcion->getPropLineaReferencia());
$opcion->setPropLTipoAccesorio(strtoupper($accesorio->getAccTipo()->getLvalValue()));
$opcion->mergeNewTranslations();
}else{
$opcion->translate($trans)->setNombreAccesorio($opcion->getPropLineaDescripcion());
$opcion->setReferenciaAccesorio($opcion->getPropLineaReferencia());
$opcion->setPropLTipoAccesorio(strtoupper($opcion->getPropLTipoAccesorio()));
$opcion->mergeNewTranslations();
}
}
$entity->setProDivision($serie->getSerDivision());
$entity->setProSerie($serie);
$entity->setProCliente($cliente);
$this->em->persist($entity);
$this->em->flush();
$this->addFlash('success', $this->trans->trans('propuesta.crear.success', [], 'propuesta'). $entity);
if ($form->getClickedButton() && 'guardarvolver' === $form->getClickedButton()->getName()) {
return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
}elseif($form->getClickedButton() && 'guardar' === $form->getClickedButton()->getName()){
return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
}else{
return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
}
}catch(\Exception $e){
$this->helper->error($e);
$this->addFlash('danger', $this->trans->trans('propuesta.crear.error', [], 'propuesta'));
}
}
}
if(isset($request->request->get('propuesta')['ProModelo'])){
$entity->setProPrecio(null);
$entity->setProPrecioBase(null);
$entity->LineasACC_RESET();
}
foreach($AccModLinea as $acc){
$accesorios = $acc->getAmlAccesorio();
if($accesorios != null){
$PropuestaLinea = new PropuestaLinea();
$PropuestaLinea
->setPropLineaCantidad(1)
->setPropLineaPrecio($accesorios->getAccPrecio())
->setPropLineaPrecioBase($accesorios->getAccPrecio())
->setPropLineaDescripcion($accesorios->translate()->getAccName())
->setPropLineaAccTipo($accesorios)
->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
->setPropLineaReferencia($accesorios->getAccReferencia())
->setPropuestaLineaListadoValor($accesorios->getAccTipo())
->setReferenciaAccesorio($accesorios->getAccReferencia())
->setPropLineaTipo(3)
->setPropLineaPropuesta($entity)
;
$entity->addPropuestaLineas($PropuestaLinea);
/** Tipo de accesorio Software ETC... */
}
}
$form = $this->createForm(PropuestaType::class, $entity,
[
'action' => $request->getRequestUri(),
'serie' => $serie->getId()
],
);
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
$this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $cliente->getId(), 'serie' => $serie->getId()]);
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_new_edit.html.twig', [
'pro' => $entity,
'ser' => $serie,
'AccModLinea' => $AccModLinea_incluid,
'modelo' => $modelo,
'cliente' => $cliente,
'BaseDir' => self::BaseDir,
'form' => $form->createView(),
'divisas' => $divisas,
'date_divisa' => $divisa_fecha
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/clonar", name="clonar", methods={"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_DUPLICATE")
*/
public function clonarPropuesta(Propuesta $prop, Request $request): Response
{
$cliente = $prop->getProCliente();
$serie = $prop->getProSerie();
// Esto mostrará XML de divisas
$xml = file_get_contents('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
$object = simplexml_load_string($xml);
$json = json_encode($object);
$cube = json_decode($json,TRUE);
$divisas = [];
$divisa_fecha = $cube['Cube']['Cube']['@attributes']['time'];
foreach($cube['Cube']['Cube']['Cube'] as $item){
$divisas[] = $item['@attributes'];
}
foreach($cube['Cube']['Cube']['Cube'] as $item){
$divisas[] = $item['@attributes'];
}
$semafor = false;
$mensaje = $html = '';
$accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
$modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : $prop->getProModelo() );
if($cliente === null || $cliente === false){
$this->addFlash('danger', $this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
$AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('956', $request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('956', $prop->getProModelo()->getId()));
$AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955', $prop->getProModelo()->getId()) );
$entity = new Propuesta();
$ref = $prop->getProReferencia();
$div_pref = explode('/', $ref);
/** Contar iguales */
$PropCount = $this->repo->PropCountCopy($div_pref[0]);
$entity->setProReferencia($div_pref[0].'/'.$PropCount[1] + 1);
if($modelo != null){
$entity->setProModelo($modelo);
}
/** Se gestiona el formulario la primera vez para cuando se envie el formulario */
$form = $this->createForm(PropuestaType::class, $entity,
[
'action' => $request->getRequestUri(),
'serie' => $serie->getId()
],
);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if($form->isValid()){
try{
foreach($AccModLinea_incluid as $acc){
$accesorios = $acc->getAmlAccesorio();
if($accesorios != null){
$PropuestaLinea = new PropuestaLinea();
$PropuestaLinea
->setPropLineaCantidad(1)
->setReferenciaAccesorio($accesorios->getAccReferencia())
->setPropLineaPrecio($accesorios->getAccPrecio())
->setPropLineaPrecioBase($accesorios->getAccPrecio())
->setPropLineaAccTipo($accesorios)
->setPropLineaDescripcion($accesorios->translate()->getAccName())
->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
->setPropLineaReferencia(null)
->setPropuestaLineaListadoValor($accesorios->getAccTipo())
->setPropLineaTipo(2)
->setPropLineaPropuesta($entity)
;
$trans = strtolower($this->security->getUser()->getUsuIdioma());
$PropuestaLinea->translate($trans)->setNombreAccesorio($accesorios->translate($trans)->getAccName());
$entity->addPropuestaLineas($PropuestaLinea);
$PropuestaLinea->mergeNewTranslations();
}
}
foreach($entity->getPropuestaLineas() as $opcion){
$opcion->setPropLineaPropuesta($entity);
$accesorio = $opcion->getPropLineaAccTipo();
$trans = strtolower($this->security->getUser()->getUsuIdioma());
$opcion->translate($trans)->setNombreAccesorio($accesorio->translate($trans)->getAccName());
$opcion->setReferenciaAccesorio($accesorio->getAccReferencia());
$opcion->setPropLTipoAccesorio(strtoupper($accesorio->getAccTipo()->getLvalValue()));
$opcion->mergeNewTranslations();
}
$entity->setProDivision($serie->getSerDivision());
$entity->setProSerie($serie);
$entity->setProCliente($cliente);
//dd($entity);
$this->em->persist($entity);
$this->em->flush();
$this->addFlash('success', $this->trans->trans('propuesta.crear.success', [], 'propuesta'). $entity);
if ($form->getClickedButton() && 'guardarvolver' === $form->getClickedButton()->getName()) {
return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
}elseif($form->getClickedButton() && 'guardar' === $form->getClickedButton()->getName()){
return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
}else{
return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
}
}catch(\Exception $e){
$this->helper->error($e);
$this->addFlash('danger', $this->trans->trans('propuesta.crear.error', [], 'propuesta'));
}
}
}
if(isset($request->request->get('propuesta')['ProModelo'])){
$entity->setProPrecio(null);
$entity->setProPrecioBase(null);
$entity->LineasACC_RESET();
}
if($AccModLinea != null){
foreach($AccModLinea as $acc){
$accesorios = $acc->getAmlAccesorio();
if($accesorios != null){
$PropuestaLinea = new PropuestaLinea();
$PropuestaLinea
->setPropLineaCantidad(1)
->setPropLineaPrecio($accesorios->getAccPrecio())
->setPropLineaPrecioBase($accesorios->getAccPrecio())
->setPropLineaDescripcion($accesorios->translate()->getAccName())
->setPropLineaAccTipo($accesorios)
->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
->setPropLineaReferencia($accesorios->getAccReferencia())
->setPropuestaLineaListadoValor($accesorios->getAccTipo())
->setReferenciaAccesorio($accesorios->getAccReferencia())
->setPropLineaTipo(3)
->setPropLineaPropuesta($entity)
;
$entity->addPropuestaLineas($PropuestaLinea);
/** Tipo de accesorio Software ETC... */
}
}
}
$form = $this->createForm(PropuestaType::class, $entity,
[
'action' => $request->getRequestUri(),
'serie' => $serie->getId()
],
);
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
$this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $cliente->getId(), 'serie' => $serie->getId()]);
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_new_edit.html.twig', [
'pro' => $entity,
'ser' => $serie,
'AccModLinea' => $AccModLinea_incluid,
'modelo' => $modelo,
'cliente' => $cliente,
'BaseDir' => self::BaseDir,
'form' => $form->createView(),
'divisas' => $divisas,
'date_divisa' => $divisa_fecha
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/modal_propuesta/", name = "modal_send", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_CREATE")
*/
public function ModalPropuesta(Request $request): Response
{
$semafor = false;
$mensaje = $html = '';
$accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
$accesorios = [];
foreach($accesorios_new as $acc){
$acc = $this->AccesorioRepo->findOneById($acc);
$accesorios [] = [
'acc_precios' => $acc->getAccPrecio(),
'acc_precios_base' => $acc->getAccPrecio(),
'acc_name' => $acc->translate()->getAccName(),
'acc_ref' => $acc->getAccReferencia(),
'acc_tipo' => $acc->getAccTipo()->getId(),
'acc_to_order' => strtoupper($acc->getAccTipo()->getLvalValue()),
'acc_tipo_int' => 3,
];
}
$semafor = true;
$object = [
'valid' => $semafor,
'accesorio' => $accesorios,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/editar", name = "edit", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_CREATE")
*/
public function editPropuesta(Propuesta $entity = null, Request $request): Response
{
$semafor = false;
$mensaje = $html = '';
$accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
$modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
if($entity->getProCliente() === null || $entity->getProCliente() === false){
$this->addFlash('danger', $this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
$AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : [] );
$AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955', $entity->getProModelo()));
//$PropuestaModLinea = $entity->getPropuestaLineas();
if($modelo != null){
$entity->setProModelo($modelo);
}
/** Se gestiona el formulario la primera vez para cuando se envie el formulario */
$form = $this->createForm(PropuestaType::class, $entity,
[
'action' => $request->getRequestUri(),
'serie' => $entity->getProSerie()->getId()
],
);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if($form->isValid()){
try{
foreach($entity->getPropuestaLineas() as $opcion){
$opcion->setPropLineaPropuesta($entity);
}
$this->em->flush();
//dd($entity->getPropuestaLineas());
$this->addFlash('success', $this->trans->trans('propuesta.crear.success', [], 'propuesta'). $entity);
if ($form->getClickedButton() && 'guardarvolver' === $form->getClickedButton()->getName()) {
return $this->redirectToRoute('cliente_view', ['id' => $entity->getProCliente()->getId()]);
}elseif($form->getClickedButton() && 'guardar' === $form->getClickedButton()->getName()){
return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
}else{
return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
}
}catch(\Exception $e){
$this->helper->error($e);
$this->addFlash('danger', $this->trans->trans('propuesta.crear.error', [], 'propuesta'));
}
}
}
/** Se gestiona la segunda vez para añadir las lineas de categoria al formulario */
if(isset($request->request->get('propuesta')['ProModelo'])){
$entity->setProPrecio(null);
$entity->setProPrecioBase(null);
$entity->LineasACC_RESET();
}
foreach ($AccModLinea as $acc) {
$accesorios = $acc->getAmlAccesorio();
$PropuestaLinea = new PropuestaLinea();
$PropuestaLinea
->setPropLineaCantidad(1)
->setPropLineaPrecio($accesorios->getAccPrecio())
->setPropLineaPrecioBase($accesorios->getAccPrecio())
->setPropLineaDescripcion($accesorios->translate()->getAccName())
->setPropLineaReferencia(/*$accesorios->getAccReferencia()*/ null)
->setPropuestaLineaListadoValor($accesorios->getAccTipo())
->setPropLineaPropuesta($entity)
->setPropLineaDescuento($accesorios->getAccAdmiteDescuento())
;
$entity->addPropuestaLineas($PropuestaLinea);
}
$form = $this->createForm(PropuestaType::class, $entity,
[
'action' => $request->getRequestUri(),
'serie' => $entity->getProSerie()->getId()
],
);
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
$this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $entity->getProCliente()->getId(), 'serie' => $entity->getProSerie()->getId()]);
// Esto mostrará XML de divisas
$xml = file_get_contents('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
$object = simplexml_load_string($xml);
$json = json_encode($object);
$cube = json_decode($json,TRUE);
$divisas = [];
$divisa_fecha = $cube['Cube']['Cube']['@attributes']['time'];
foreach($cube['Cube']['Cube']['Cube'] as $item){
$divisas[] = $item['@attributes'];
}
foreach($cube['Cube']['Cube']['Cube'] as $item){
$divisas[] = $item['@attributes'];
}
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_new_edit.html.twig', [
'pro' => $entity,
'ser' => $entity->getProSerie(),
'AccModLinea' => $AccModLinea_incluid,
'modelo' => $modelo,
'cliente' => $entity->getProCliente(),
'BaseDir' => self::BaseDir,
'form' => $form->createView(),
'divisas' => $divisas,
'date_divisa' => $divisa_fecha
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/ver", name = "view", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_CREATE")
*/
public function viewPropuesta(Propuesta $entity = null, Request $request): Response
{
$semafor = false;
$mensaje = $html = '';
$accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
$modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
if($entity->getProCliente() === null || $entity->getProCliente() === false){
$this->addFlash('danger', $this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
$AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : [] );
$AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955', $entity->getProModelo()));
if($modelo != null){
$entity->setProModelo($modelo);
}
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
$this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $entity->getProCliente()->getId(), 'serie' => $entity->getProSerie()->getId()]);
$form = $this->createForm(PropuestaEstadoType::class, $entity);
$propLineas = $this->PropLineaRepo->PropToOrderList($entity);
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_view.html.twig', [
'pro' => $entity,
'PropLineas' => $propLineas,
'ser' => $entity->getProSerie(),
'AccModLinea' => $AccModLinea_incluid,
'modelo' => $modelo,
'cliente' => $entity->getProCliente(),
'BaseDir' => self::BaseDir,
'form' => $form->createView(),
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/status", name = "status", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_CREATE")
*/
public function changeStatusPropuesta(Propuesta $entity = null, Request $request): Response
{
$semafor = false;
$mensaje = $html = '';
$accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
$modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
if($entity->getProCliente() === null || $entity->getProCliente() === false){
$this->addFlash('danger', $this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
$AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : [] );
$AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955', $request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955', $entity->getProModelo()));
if($modelo != null){
$entity->setProModelo($modelo);
}
//Breadcrumbs
$this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
$this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $entity->getProCliente()->getId(), 'serie' => $entity->getProSerie()->getId()]);
$form = $this->createForm(PropuestaEstadoType::class, $entity);
$html = $this->renderView(self::BaseDir . '/ajax/propuesta_view.html.twig', [
'pro' => $entity,
'ser' => $entity->getProSerie(),
'AccModLinea' => $AccModLinea_incluid,
'modelo' => $modelo,
'cliente' => $entity->getProCliente(),
'BaseDir' => self::BaseDir,
'form' => $form->createView(),
]);
$semafor = true;
$object = [
'valid' => $semafor,
'html' => $html,
'message' => $mensaje,
];
return new Response($this->serializer->serialize($object, 'json'));
}
/**
* @Route("/{id}/pdf", name="pdf", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
* @IsGranted("ROLE_PRO_PDF")
*/
public function PropuestaPDF(Propuesta $prop = null, Request $request)
{
$cbox1 = $request->query->get('cbox1');
$cbox2 = $request->query->get('cbox2');
$status = $request->query->get('status');
if($status == 1){
$url = $this->params->get('APP_PROPUESTA').'/documentos'.'/';
$doc = $this->DocRepo->DocumentoPropuesta($prop->getProModelo()->getId(), $request->getLocale());
return $this->split_pdf($url, $doc->getDocNombreArchivo(), $prop, $cbox1, $cbox2, $prop);
}else{
return $this->contractPdfAction($prop, $cbox1, $cbox2);
}
}
/** Crear página PDF de la propuesta */
public function contractPdfAction(Propuesta $entity, $cbox1 = true, $cbox2 = true)
{
$propLineas = $this->PropLineaRepo->PropToOrderList($entity);
$content = $this->renderView(
self::BaseDir . '/pdf/propuesta_view.html.twig', [
'pro' => $entity,
'PropLineas' => $propLineas,
'ser' => $entity->getProSerie(),
'cliente' => $entity->getProCliente(),
'BaseDir' => self::BaseDir,
'BaseURL' => $this->params->get('BASE_URL'),
'cbox1' => $cbox1,
'cbox2' => $cbox2,
]
);
return new PdfResponse($this->snappy->getOutputFromHtml(
$content,
[
'margin-left' => 0,
'margin-right' => 0,
'margin-top' => 5,
//'margin-bottom' => 20.5,
//'header-html' => $header,
//'footer-html' => $footer,
//'cover' => $cover,
]
),'PriceSummary.pdf');
}
/** Recorta PDF y añade a la página indicada */
public function split_pdf($url2, $filename, $prop, $cbox1 = true, $cbox2 = true, $entity) {
// Parse pdf file and build necessary objects.
$url = $url2.$filename;
$parser = new \Smalot\PdfParser\Parser();
$pdf = $parser->parseFile($url);
$pages = $pdf->getPages();
$fileRoute = $this->params->get('APP_PROPUESTA').'/prueba.pdf';
$propLineas = $this->PropLineaRepo->PropToOrderList($entity);
$content = $this->renderView(
self::BaseDir . '/pdf/propuesta_view.html.twig', [
'pro' => $prop,
'PropLineas' => $propLineas,
'ser' => $prop->getProSerie(),
'cliente' => $prop->getProCliente(),
'BaseDir' => self::BaseDir,
'BaseURL' => $this->params->get('BASE_URL'),
'cbox1' => $cbox1,
'cbox2' => $cbox2,
]
);
$this->snappy->generateFromHtml($content, $fileRoute,[
'margin-bottom' => 0,
'margin-top' => 0,
'margin-left' => 0,
'margin-right' => 0,
'page-size' => 'A4',
//'disable-smart-shrinking' => true
], true);
$recorte = count($pages);
$rec_def = $recorte - 4;
//Primero bajamos la versión del pdf para que no produzca errores de lectura o división
$command = new GhostscriptConverterCommand();
$filesystem = new Filesystem();
//Comprobar versión del pdf cuando la versión es distinta a 1.5 no se suben correctamente
$converter = new GhostscriptConverter($command, $filesystem);
$converter->convert($url, '1.4');
//Finalmente unimos los dos PDF's y los guardamos en la ruta de contrato.
$pdfCollection = new PdfCollection();
foreach ($pages as $key => $page) {
if($key != $rec_def){
$pdfCollection->addPdf($url, $key+1, PdfFile::ORIENTATION_PORTRAIT);
}else{
$pdfCollection->addPdf($fileRoute, PdfFile::ALL_PAGES, PdfFile::ORIENTATION_PORTRAIT);
}
}
//$pdfCollection->addPdf($fileRoute, PdfFile::ALL_PAGES, PdfFile::ORIENTATION_PORTRAIT);
$this->merger->merge($pdfCollection, 'offer.pdf', PdfMerger::MODE_DOWNLOAD, PdfFile::ORIENTATION_PORTRAIT);
return true;
}
/*MASS ACTIONS*/
private function massAction(Request $request)
{
$massOptions = [];
if($this->isGranted('ROLE_PRO_DELETE')){
$massOptions['marcados_eliminar'] = $this->trans->trans('propuesta.massactions.label', [], 'propuesta');
}
if($request->query->get('mass_action') && $request->query->get('mass_action') != "" && $request->query->get('mass_check')){
foreach($request->query->get('mass_check') as $id){
$entityBD = $this->repo->find($id);
if($entityBD){
switch($request->query->get('mass_action')){
case 'marcados_eliminar':
if($this->isGranted('PRO_DELETE', $entityBD)){
$this->deleteAction($request, $entityBD, true );
}
break;
}
}
}
$this->addFlash('success', $this->trans->trans('propuesta.massactions.success', [], 'propuesta'));
return $this->redirectToRoute('pro_index');
}
return $massOptions;
}
/**
* @Route("/buscar/propuesta", name="search_autocomplete")
*/
public function searchAutocomplete(Request $request)
{
$message = "";
$semafor = $paginator = false;
$data = [];
if($request !== null){
$filters = [
'texto' => $request->query->get('q'),
'enabled' => true,
];
if ($request->query->get('params', false)) {
$filters = array_merge($filters, $request->query->get('params'));
}
$resultBD = $this->repo->filter($filters/*, $partials*/,"",false, $request->query->get('limit'));
if($resultBD){
$semafor = true;
$data = $this->serializer->normalize($resultBD, null, ['groups' => 'Simple']);
}
$object = $data;
}
return new Response($this->serializer->serialize($object, "json"), ($semafor ? Response::HTTP_OK : Response::HTTP_BAD_REQUEST));
}
}