src/Controller/CitaController.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  8. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  9. use App\Entity\Usuario;
  10. use App\Entity\Rol;
  11. use App\Entity\Cita;
  12. use App\Entity\CitaHistorico;
  13. use App\Entity\RedsysAPI;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use App\Entity\CitaAceptacion;
  16. use App\Entity\ImagenesAntesCita;
  17. use App\Entity\ImagenesDespuesCita;
  18. use App\Entity\Sobrecostes;
  19. use PHPExcel;
  20. require_once($_SERVER['DOCUMENT_ROOT']."/libs/PHPMailer_5.2.4/class.phpmailer.php");
  21. class CitaController extends AbstractController
  22. {
  23.     public function home(Request $request$loginerror){
  24.         $em=$this->getDoctrine()->getManager();
  25.     
  26.         $this->get('session')->getFlashBag()->clear();
  27.         if ($loginerror == 1){
  28.             $this->get('session')->getFlashBag()->add(
  29.                 'Error',
  30.                 'El mail o la clave no son correctos'
  31.             );
  32.         }
  33.         if ($loginerror == 2){
  34.             $this->get('session')->getFlashBag()->add(
  35.                 'Correcto',
  36.                 'Si su correo esta registrado se le enviará un email de recuperación a su cuenta de correo.'
  37.             );
  38.         }
  39.         if ($loginerror == 4){
  40.             $this->get('session')->getFlashBag()->add(
  41.                 'Correcto',
  42.                 'Su clave ha sido modificada correctamente. Ahora puede iniciar sesión.'
  43.             );
  44.         }
  45.         if ($loginerror == 5){
  46.             $this->get('session')->getFlashBag()->add(
  47.                 'Correcto',
  48.                 'Se ha registrado correctamente. Ahora puede iniciar sesión.'
  49.             );
  50.         }
  51.         $token=" ";
  52.         if(isset($_GET["token"])){
  53.             $token=$_GET["token"];
  54.         }
  55.         //renderizamos el home
  56.         return $this->render('cita/home.html.twig',array(
  57.             'loginerror'=>$loginerror,
  58.             "token"=>$token
  59.         ));
  60.     }
  61.     public function listado(Request $request,$paginaactual){
  62.         date_default_timezone_set('Europe/Madrid');
  63.         $em=$this->getDoctrine()->getManager();
  64.         $usuario_conectado=$this->getUser();
  65.    
  66.         //elimianamos las citas no activas que tengan mas de 10 minutos.
  67.         $sql=" delete from cita where TIMESTAMPDIFF(MINUTE,fecha_alta,NOW()) >=60 and (activo = 0 or activo is null)";
  68.         $stmt$em->getConnection()->query($sql);
  69.         $tipovehiculos=$em->getRepository("App:Tipovehiculo")->findBy(array("activo"=>1),array('nombre' => 'ASC'));
  70.         $talleres=$em->getRepository("App:Taller")->findBy(array("activo"=>1),array('nombre' => 'ASC'));
  71.         if($this->getUser()->getIdrol()->getId()==1){
  72.             
  73.             $sql "select distinct (DATE_FORMAT(fecha,'%d-%m-%Y')) as fecha from cita where activo = 1 order by fecha desc";
  74.             $stmt$em->getConnection()->query($sql);
  75.             $fechas=$stmt->fetchAll();
  76.         }else{
  77.             
  78.             $sql "select distinct (DATE_FORMAT(fecha,'%d-%m-%Y')) as fecha from cita where idtaller =".$this->getUser()->getIdtaller()->getId()." and activo = 1 order by fecha desc";
  79.             $stmt$em->getConnection()->query($sql);
  80.             $fechas=$stmt->fetchAll();
  81.         }
  82.         //filtros
  83.         $postfecha="";
  84.         $postcliente="";
  85.         $postmatricula="";
  86.         $posttipovehiculo="";
  87.         $posttaller="";
  88.         $filtros "";
  89.         if($request->isMethod('POST')){
  90.             if(isset($_POST["btn_buscar"])){
  91.                 $paginaactual=1;
  92.             }
  93.          
  94.          
  95.             if($_POST["fecha"]!=""){
  96.                 $filtros.=" and DATE_FORMAT(c.fecha,'%d-%m-%Y')='".$_POST["fecha"]."'";
  97.             }
  98.             $postfecha=$_POST["fecha"];
  99.             if($_POST["matricula"]!=""){
  100.                 $filtros.=" and matricula like '%".$_POST["matricula"]."%'";
  101.             }
  102.             $postmatricula=$_POST["matricula"];
  103.             if($_POST["tipo"]!=""){
  104.                 $filtros.=" and c.idtipovehiculo =".$_POST["tipo"];
  105.             }
  106.             $posttipovehiculo=$_POST["tipo"];
  107.             
  108.             if(isset($_POST["taller"]) && $_POST["taller"]!=""){
  109.                 $filtros.=" and c.idtaller = ".$_POST["taller"];
  110.                 $posttaller=$_POST["taller"];
  111.             }
  112.         }
  113.  
  114.         //total
  115.         $sql "SELECT count(c.id) as total ";
  116.         $sql .= "FROM cita c ";
  117.         $sql .= " inner join usuario on usuario.id=c.idusuario ";
  118.         $sql .= " inner join taller on taller.id=c.idtaller ";
  119.         $sql .= " inner join tipovehiculo on tipovehiculo.id=c.idtipovehiculo ";
  120.         $sql .= " inner join subtipovehiculo on subtipovehiculo.id=c.idsubtipovehiculo ";
  121.         $sql .= "WHERE c.activo = 1 ";
  122.         if($this->getUser()->getIdrol()->getId()==2){
  123.             $sql .= " and c.idtaller= ".$this->getUser()->getIdtaller()->getId();
  124.         }
  125.      
  126.      
  127.         if($filtros!=""){
  128.             $sql.=$filtros;
  129.         }
  130.        
  131.         $stmt$em->getConnection()->query($sql);
  132.         $total=$stmt->fetchAll()[0]['total'];
  133.         //usuario paginados de 20 en 20
  134.         $sql "SELECT c.*,taller.nombre as taller, ";
  135.         $sql .= "   concat(usuario.nombre,' ',usuario.apellidos) as cliente, ";
  136.         $sql .= "   usuario.telefono, usuario.numagencia, usuario.email, ";
  137.         $sql .= "   tipovehiculo.nombre as tipo, ";
  138.         $sql .= "   tipovehiculo.electrico, ";
  139.         $sql .= "   tipovehiculo.precio, ";
  140.         $sql .= "   subtipovehiculo.nombre as modelo, ";
  141.         $sql .= "   subtipovehiculo.color, ";
  142.         $sql .= "   tiempo ";
  143.         $sql .= " from cita c ";
  144.         $sql .= "   inner join usuario on usuario.id=c.idusuario ";
  145.         $sql .= "   inner join taller on taller.id=c.idtaller ";
  146.         $sql .= "   inner join tipovehiculo on tipovehiculo.id=c.idtipovehiculo ";
  147.         $sql .= "   inner join subtipovehiculo on subtipovehiculo.id=c.idsubtipovehiculo ";
  148.         $sql .= "WHERE c.activo = 1 ";
  149.         if($this->getUser()->getIdrol()->getId()==2){
  150.             $sql .= " and c.idtaller= ".$this->getUser()->getIdtaller()->getId();
  151.         }
  152.         
  153.         if($filtros!=""){
  154.             $sql.=$filtros;
  155.         }
  156.         
  157.         if (($request->isMethod('POST')) && ($_POST["exportar"] == "EXPORTAR")){
  158.             $sql .= " ORDER BY taller.nombre, c.fecha ASC";
  159.         }else{
  160.             $sql .= " ORDER BY c.fecha ASC";
  161.             $sql .= " LIMIT ".(($paginaactual-1)*20).", 20";
  162.         }
  163.         $stmt$em->getConnection()->query($sql);
  164.         $citas=$stmt->fetchAll();
  165.         $numpaginas ceil($total/20);
  166.         if (($request->isMethod('POST')) && ($_POST["exportar"] == "EXPORTAR")){
  167.             
  168.             //creación y exportación de los datos.
  169.             $objPHPExcel = new PHPExcel();
  170.             $objPHPExcel->getProperties()->setTitle("CITAS");
  171.             $objPHPExcel->setActiveSheetIndex(0);
  172.             
  173.             $objPHPExcel->getActiveSheet()->mergeCells('A1:K1');
  174.             $objPHPExcel->getActiveSheet()->getStyle('A1')->applyFromArray($this->getEstilos()["cabecera"]);
  175.             if(isset($_POST["taller"]) && $_POST["taller"]!=""){
  176.                 $taller=$em->getRepository("App:Taller")->find($_POST["taller"]);
  177.                 $objPHPExcel->getActiveSheet()->SetCellValue('A1'$taller->getNombre());
  178.             }
  179.             $derecha=array('alignment' => array(
  180.                 'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_RIGHT
  181.             ));
  182.             $centrado=array('alignment' => array(
  183.                 'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER
  184.             ));
  185.     
  186.     
  187.             $objPHPExcel->getActiveSheet()->getStyle('A2')->applyFromArray($this->getEstilos()["cabecera"]);
  188.             $objPHPExcel->getActiveSheet()->getStyle('B2')->applyFromArray($this->getEstilos()["cabecera"]);
  189.             $objPHPExcel->getActiveSheet()->getStyle('C2')->applyFromArray($this->getEstilos()["cabecera"]);
  190.             $objPHPExcel->getActiveSheet()->getStyle('D2')->applyFromArray($this->getEstilos()["cabecera"]);
  191.             $objPHPExcel->getActiveSheet()->getStyle('E2')->applyFromArray($this->getEstilos()["cabecera"]);
  192.             $objPHPExcel->getActiveSheet()->getStyle('F2')->applyFromArray($this->getEstilos()["cabecera"]);
  193.             $objPHPExcel->getActiveSheet()->getStyle('G2')->applyFromArray($this->getEstilos()["cabecera"]);
  194.             $objPHPExcel->getActiveSheet()->getStyle('H2')->applyFromArray($this->getEstilos()["cabecera"]);
  195.             $objPHPExcel->getActiveSheet()->getStyle('I2')->applyFromArray($this->getEstilos()["cabecera"]);
  196.             $objPHPExcel->getActiveSheet()->getStyle('J2')->applyFromArray($this->getEstilos()["cabecera"]);
  197.             $objPHPExcel->getActiveSheet()->getStyle('K2')->applyFromArray($this->getEstilos()["cabecera"]);
  198.             $objPHPExcel->getActiveSheet()->getStyle('L2')->applyFromArray($this->getEstilos()["cabecera"]);
  199.             $objPHPExcel->getActiveSheet()->getStyle('M2')->applyFromArray($this->getEstilos()["cabecera"]);
  200.             //Agregamos el ancho de las columnas
  201.             
  202.             $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(30);
  203.             $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
  204.             $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
  205.             $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
  206.             $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(40);
  207.             $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);
  208.             $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(30);
  209.             $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(10);
  210.             $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
  211.             $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(20);
  212.             $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(20);
  213.             $objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(20);
  214.             $objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(20);
  215.             $objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(20);
  216.             $objPHPExcel->getActiveSheet()->SetCellValue('A2'"TALLER");
  217.             $objPHPExcel->getActiveSheet()->SetCellValue('B2'"FECHA");
  218.             $objPHPExcel->getActiveSheet()->SetCellValue('C2'"HORA INICIO");
  219.             $objPHPExcel->getActiveSheet()->SetCellValue('D2'"HORA FIN");
  220.             $objPHPExcel->getActiveSheet()->SetCellValue('E2'"CLIENTE");
  221.             $objPHPExcel->getActiveSheet()->SetCellValue('F2'"NUM AGENCIA");
  222.             $objPHPExcel->getActiveSheet()->SetCellValue('G2'"MATRICULA");
  223.             $objPHPExcel->getActiveSheet()->SetCellValue('H2'"TELEFONO");
  224.             $objPHPExcel->getActiveSheet()->SetCellValue('I2'"EMAIL");
  225.             $objPHPExcel->getActiveSheet()->SetCellValue('J2'"TIPO");
  226.             $objPHPExcel->getActiveSheet()->SetCellValue('K2'"DURACIÓN");
  227.             $objPHPExcel->getActiveSheet()->SetCellValue('L2'"VEHICULO");
  228.             $objPHPExcel->getActiveSheet()->SetCellValue('M2'"COLOR");
  229.             $objPHPExcel->getActiveSheet()->SetCellValue('N2'"PRECIO");
  230.             $contador=2;
  231.             foreach($citas as $cita){
  232.                 
  233.                 $contador++;
  234.                 $objPHPExcel->getActiveSheet()->SetCellValue('A'.$contador$cita['taller']);
  235.                 $objPHPExcel->getActiveSheet()->SetCellValue('B'.$contador$cita['fecha']);
  236.                 $objPHPExcel->getActiveSheet()->SetCellValue('C'.$contador$cita['horainicio']);
  237.                 $objPHPExcel->getActiveSheet()->SetCellValue('D'.$contador$cita['horafin']);
  238.                 $objPHPExcel->getActiveSheet()->SetCellValue('E'.$contador$cita['cliente']);
  239.                 $objPHPExcel->getActiveSheet()->SetCellValue('F'.$contador$cita['numagencia']);
  240.                 $objPHPExcel->getActiveSheet()->SetCellValue('G'.$contador$cita['matricula']);
  241.                 $objPHPExcel->getActiveSheet()->SetCellValue('H'.$contador$cita['telefono']);
  242.                 $objPHPExcel->getActiveSheet()->SetCellValue('I'.$contador$cita['email']);
  243.                 $objPHPExcel->getActiveSheet()->SetCellValue('J'.$contador$cita['tipo']);
  244.                 $objPHPExcel->getActiveSheet()->SetCellValue('K'.$contador$cita['tiempo']);
  245.                 $objPHPExcel->getActiveSheet()->SetCellValue('L'.$contador$cita['electrico']?"ELÉCTRICO":"COMBUSTIBLE");
  246.                 $objPHPExcel->getActiveSheet()->SetCellValue('M'.$contador$cita['color']);
  247.                 $objPHPExcel->getActiveSheet()->SetCellValue('N'.$contador$cita['precio']." €");
  248.             }
  249.             $objPHPExcel->getActiveSheet()->getStyle('K3:K'.$contador)->applyFromArray($derecha);
  250.             $objPHPExcel->getActiveSheet()->getStyle('H3:H'.$contador)->applyFromArray($centrado);
  251.             //exit;
  252.             //guardamos el archivo.
  253.             $writer = \PHPExcel_IOFactory::createWriter($objPHPExcel'Excel5');  
  254.             header('Content-Type: application/vnd.ms-excel');
  255.             header('Content-Disposition: attachment;filename="Citas_'.date("d-m-Y").'.xls"');
  256.             header('Cache-Control: max-age=0');
  257.             $writer->save('php://output');
  258.             //exit;
  259.         }else{
  260.         
  261.             //renderizamos el listado de usuario
  262.             return $this->render('cita/listado.html.twig',array(
  263.                     'citas'=>$citas,
  264.                     'talleres'=>$talleres,
  265.                     'totalregistros'=>$total,
  266.                     'paginaactual'=>$paginaactual,
  267.                     'numpaginas'=>  $numpaginas,
  268.                     'fechas' => $fechas,
  269.                     'tipovehiculos'=>$tipovehiculos,
  270.                     'postfecha'=>$postfecha,
  271.                     'postcliente'=>$postcliente,
  272.                     'postmatricula'=>$postmatricula,
  273.                     'posttipovehiculo'=>$posttipovehiculo,
  274.                     'posttaller'=>$posttaller,
  275.                     "postfecha"=>$postfecha,
  276.                     "postmatricula"=>$postmatricula,
  277.                     "posttipovehiculo"=>$posttipovehiculo
  278.                 )
  279.             );
  280.         }
  281.     }
  282.     public function listadoHistorico(Request $request,$paginaactual){
  283.         $em=$this->getDoctrine()->getManager();
  284.         $usuario_conectado=$this->getUser();
  285.         
  286.         $tipovehiculos=$em->getRepository("App:Tipovehiculo")->findBy(array("activo"=>1),array('nombre' => 'ASC'));
  287.         $talleres=$em->getRepository("App:Taller")->findBy(array("activo"=>1),array('nombre' => 'ASC'));
  288.         //para mostrar en el historico solo las citas que no estan en la tabla de citas.
  289.         $sql_where="
  290.         
  291.             and (
  292.                 select count(id) from cita  
  293.                 where cita.matricula=c.matricula
  294.  
  295.             )=0
  296.         ";
  297.         if($this->getUser()->getIdrol()->getId()==1){
  298.             
  299.             $sql "select distinct (DATE_FORMAT(fecha,'%d-%m-%Y')) as fecha from cita_historico c where 1=1 ".$sql_where." order by fecha desc";
  300.             $stmt$em->getConnection()->query($sql);
  301.             $fechas=$stmt->fetchAll();
  302.         }else{
  303.             
  304.             $sql "select distinct (DATE_FORMAT(fecha,'%d-%m-%Y')) as fecha from cita_historico c where idtaller =".$this->getUser()->getIdtaller()->getId()." ".$sql_where." order by fecha desc";
  305.             $stmt$em->getConnection()->query($sql);
  306.             $fechas=$stmt->fetchAll();
  307.         }
  308.         //filtros
  309.         $postfecha="";
  310.         $postcliente="";
  311.         $postmatricula="";
  312.         $posttipovehiculo="";
  313.         $posttaller="";
  314.         $filtros "";
  315.         if($request->isMethod('POST')){
  316.             if(isset($_POST["btn_buscar"])){
  317.                 $paginaactual=1;
  318.             }
  319.          
  320.             if($_POST["fecha"]!=""){
  321.                 $filtros.=" and DATE_FORMAT(c.fecha,'%d-%m-%Y')='".$_POST["fecha"]."'";
  322.             }
  323.             $postfecha=$_POST["fecha"];
  324.             if($_POST["matricula"]!=""){
  325.                 $filtros.=" and matricula like '%".$_POST["matricula"]."%'";
  326.             }
  327.             $postmatricula=$_POST["matricula"];
  328.             if($_POST["tipo"]!=""){
  329.                 $filtros.=" and c.idtipovehiculo =".$_POST["tipo"];
  330.             }
  331.             $posttipovehiculo=$_POST["tipo"];
  332.             
  333.             if(isset($_POST["taller"]) && $_POST["taller"]!=""){
  334.                 $filtros.=" and c.idtaller = ".$_POST["taller"];
  335.                 $posttaller=$_POST["taller"];
  336.             }
  337.         }
  338.  
  339.         //total
  340.         $sql "SELECT count(c.id) as total ";
  341.         $sql .= "FROM cita_historico c ";
  342.         $sql .= " inner join usuario on usuario.id=c.idusuario ";
  343.         $sql .= " inner join taller on taller.id=c.idtaller ";
  344.         $sql .= " inner join tipovehiculo on tipovehiculo.id=c.idtipovehiculo ";
  345.         $sql .= " inner join subtipovehiculo on subtipovehiculo.id=c.idsubtipovehiculo ";
  346.         $sql .= "WHERE 1=1 ";
  347.         $sql.=$sql_where;
  348.         if($this->getUser()->getIdrol()->getId()==2){
  349.             $sql .= " and c.idtaller= ".$this->getUser()->getIdtaller()->getId();
  350.         }
  351.      
  352.      
  353.         if($filtros!=""){
  354.             $sql.=$filtros;
  355.         }
  356.        
  357.         $stmt$em->getConnection()->query($sql);
  358.         $total=$stmt->fetchAll()[0]['total'];
  359.         $numpaginas ceil($total/20);
  360.         //citas paginados de 20 en 20
  361.         $sql "SELECT c.*,taller.nombre as taller,taller.id as id_taller, ";
  362.         $sql .= "   concat(usuario.nombre,' ',usuario.apellidos) as cliente, ";
  363.         $sql .= "   usuario.telefono, ";
  364.         $sql .= "   usuario.email, ";
  365.         $sql .= "   tipovehiculo.nombre as tipo, ";
  366.         $sql .= "   tipovehiculo.electrico, ";
  367.         $sql .= "   subtipovehiculo.nombre as modelo, ";
  368.         $sql .= "   subtipovehiculo.color, ";
  369.         $sql .= "   tiempo ";
  370.         $sql .= " from cita_historico c ";
  371.         $sql .= "   inner join usuario on usuario.id=c.idusuario ";
  372.         $sql .= "   inner join taller on taller.id=c.idtaller ";
  373.         $sql .= "   inner join tipovehiculo on tipovehiculo.id=c.idtipovehiculo ";
  374.         $sql .= "   inner join subtipovehiculo on subtipovehiculo.id=c.idsubtipovehiculo ";
  375.         $sql .= "WHERE 1=1 ";
  376.         $sql.=$sql_where;
  377.         if($this->getUser()->getIdrol()->getId()==2){
  378.             $sql .= " and c.idtaller= ".$this->getUser()->getIdtaller()->getId();
  379.         }
  380.         
  381.         if($filtros!=""){
  382.             $sql.=$filtros;
  383.         }
  384.         
  385.         $sql .= " ORDER BY c.fecha ASC";
  386.         $sql .= " LIMIT ".(($paginaactual-1)*20).", 20";
  387.         $stmt$em->getConnection()->query($sql);
  388.         $citas=$stmt->fetchAll();
  389.         
  390.         //renderizamos el listado de usuario
  391.         return $this->render('cita/listado_historico.html.twig',array(
  392.                 'citas'=>$citas,
  393.                 'talleres'=>$talleres,
  394.                 'totalregistros'=>$total,
  395.                 'paginaactual'=>$paginaactual,
  396.                 'numpaginas'=>  $numpaginas,
  397.                 'fechas' => $fechas,
  398.                 'tipovehiculos'=>$tipovehiculos,
  399.                 'postfecha'=>$postfecha,
  400.                 'postcliente'=>$postcliente,
  401.                 'postmatricula'=>$postmatricula,
  402.                 'posttipovehiculo'=>$posttipovehiculo,
  403.                 'posttaller'=>$posttaller,
  404.                 "postfecha"=>$postfecha,
  405.                 "postmatricula"=>$postmatricula,
  406.                 "posttipovehiculo"=>$posttipovehiculo
  407.             )
  408.         );
  409.     }
  410.     public function nuevo(Request $request){
  411.         
  412.         date_default_timezone_set('Europe/Madrid');
  413.         
  414.         $em=$this->getDoctrine()->getManager();
  415.         $tipovehiculos=$em->getRepository("App:Tipovehiculo")->findBy(array("activo"=>1),array('id' => 'ASC'));
  416.         if($this->getUser()->getIdrol()->getId()==2){
  417.             $talleres=$em->getRepository("App:Taller")->findBy(array("activo"=>1,"id"=>$this->getUser()->getIdtaller()->getId()));
  418.         }else{
  419.             $talleres=$em->getRepository("App:Taller")->findBy(array("activo"=>1),array('nombre' => 'ASC'));
  420.         }
  421.         $clientes=$em->getRepository("App:Usuario")->findBy(array("activo"=>1,"idrol"=>3),array('nombre' => 'ASC'));
  422.         //$urlbanco=$_ENV["URL_BANCO"];
  423.         //Si entramos por post, damos de alta la cita
  424.         if($request->isMethod('POST')){
  425.             //Buscamos si existe una cita con la matricula.
  426.             $existe_cita $em->getRepository("App:Cita")->findBy(["matricula"=>$_POST["matricula"]]);
  427.             if(count($existe_cita)>0){
  428.                 $this->get('session')->getFlashBag()->clear();
  429.                 $this->get('session')->getFlashBag()->add(
  430.                     'Error',
  431.                     'Ya existe una cita con estra matrícula'
  432.                 );
  433.                 //volvemos al nuevo.
  434.                 return $this->redirect($this->generateUrl('cita_nuevo'));
  435.             }
  436.             
  437.             $cita=new Cita();
  438.             $cita->setMatricula($_POST["matricula"]);
  439.             $tipovehiculo=$em->getRepository("App:Tipovehiculo")->find($_POST["tipo_vehiculo"]);
  440.             $subtipovehiculo=$em->getRepository("App:Subtipovehiculo")->find($_POST["modelo"]);
  441.          
  442.         
  443.             $taller=$em->getRepository("App:Taller")->find($_POST["taller"]);
  444.             $cita->setIdtipovehiculo($tipovehiculo);
  445.             $cita->setIdsubtipovehiculo($subtipovehiculo);
  446.             $fecha = new \DateTime($_POST["dia"]);
  447.             $cita->setFecha($fecha);
  448.             $hora = new \DateTime($_POST["hora"]);
  449.             $cita->setHorainicio($hora);
  450.     
  451.             $horafin=new \DateTime($_POST["hora"]);
  452.             $horafin->modify("+ ".$tipovehiculo->getTiempo()." minutes");
  453.             $cita->setHorafin($horafin);
  454.             if(isset($_POST["factura"])){
  455.                 $cita->setFactura(1);
  456.             }else{
  457.                 $cita->setFactura(0);
  458.             }
  459.             $cita->setFechaAlta(new \DateTime("now"));
  460.   
  461.             $cita->setActivo(1);
  462.             $cliente $em->getRepository("App:Usuario")->find($_POST["cliente"]);
  463.             $cita->setIdusuario($cliente);
  464.             $cita->setIdtaller($taller);
  465.             $em->persist($cita);
  466.             $em->flush();
  467.             //Si tenemos aceptacion de trabajo.
  468.             if(isset($_POST["aceptatrabajo"])){
  469.                 
  470.                 $cita->setAceptatrabajo(1);
  471.                 $cita->setNombreacepta($_POST["nombreacepta"]);
  472.                 $cita->setApellidosacepta($_POST["apellidosacepta"]);
  473.                 $cita->setDniacepta($_POST["dniacepta"]);
  474.                 $cita->setFechaAcepta(new \DateTime("now"));
  475.                 $data=$_POST["imagen_aceptacion"];
  476.                 list($type$data) = explode(';'$data);
  477.                 list(, $data)      = explode(','$data);
  478.                 $data base64_decode($data);
  479.                 
  480.                 if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId())) {
  481.                     mkdir($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId(), 0777true);
  482.                 }
  483.                 //creamos la carpeta si no existe.
  484.                 file_put_contents($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId().'/firma_aceptacion.png'$data);
  485.                 $cita->setFirmaAcepta('/firmas/cita_'.$cita->getId().'/firma_aceptacion.png');
  486.                 $em->persist($cita);
  487.                 $em->flush();
  488.                 $this->enviarCorreoAceptacion($cita);
  489.                 if(isset($_POST["multisubida_antes"])){
  490.                     foreach($_POST["multisubida_antes"] as $img){
  491.                         $nombre_imagen=explode("|",$img)[0];
  492.   
  493.                         $imagen=explode("|",$img)[1];
  494.                         list($type$imagen) = explode(';'$imagen);
  495.                         list(, $imagen)      = explode(','$imagen);
  496.                         $imagen base64_decode($imagen);
  497.                         if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/imagenes_antes/cita_'.$cita->getId())) {
  498.                             mkdir($_SERVER["DOCUMENT_ROOT"].'/imagenes_antes/cita_'.$cita->getId(), 0777true);
  499.                         }
  500.                         file_put_contents($_SERVER["DOCUMENT_ROOT"].'/imagenes_antes/cita_'.$cita->getId().'/'.$nombre_imagen$imagen);
  501.                         
  502.                         //guardamos en la base de datos.
  503.                         $imagenAntes=new ImagenesAntesCita();
  504.                         $imagenAntes->setIdcita($cita);
  505.                         $imagenAntes->setImagen('/imagenes_antes/cita_'.$cita->getId().'/'.$nombre_imagen);
  506.                         $em->persist($imagenAntes);
  507.                         $em->flush();
  508.                     }                     
  509.                 
  510.                 }
  511.                 if(isset($_POST["multisubida_despues"])){
  512.                     foreach($_POST["multisubida_despues"] as $img){
  513.                         $nombre_imagen=explode("|",$img)[0];
  514.   
  515.                         $imagen=explode("|",$img)[1];
  516.                         list($type$imagen) = explode(';'$imagen);
  517.                         list(, $imagen)      = explode(','$imagen);
  518.                         $imagen base64_decode($imagen);
  519.                         if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/imagenes_despues/cita_'.$cita->getId())) {
  520.                             mkdir($_SERVER["DOCUMENT_ROOT"].'/imagenes_despues/cita_'.$cita->getId(), 0777true);
  521.                         }
  522.                         file_put_contents($_SERVER["DOCUMENT_ROOT"].'/imagenes_despues/cita_'.$cita->getId().'/'.$nombre_imagen$imagen);
  523.                         
  524.                         //guardamos en la base de datos.
  525.                         $imagenDespues=new ImagenesDespuesCita();
  526.                         $imagenDespues->setIdcita($cita);
  527.                         $imagenDespues->setImagen('/imagenes_despues/cita_'.$cita->getId().'/'.$nombre_imagen);
  528.                         $em->persist($imagenDespues);
  529.                         $em->flush();
  530.                     }                   
  531.                 }
  532.             }
  533.             //creamos la parte del pago.
  534.             /*$amount=$tipovehiculo->getPrecio()*100;
  535.            
  536.             $order = str_pad($cita->getId(), 10, "0", STR_PAD_LEFT); //Se calculará con el identificador de la cita 10 posiciones relleno a 0 por la izquierda
  537.             $fuc=$_ENV["FUC"];
  538.             $moneda = $_ENV["MONEDA"];
  539.             $tipotransaccion = $_ENV["TIPO_TRANSACCION"];
  540.             $descripcion = $_POST["matricula"]."-".$taller->getNombre()." - (".$fecha->format("d-m-Y")." ".$hora->format("H:i")." )";
  541.             $terminal = $_ENV["TERMINAL"];
  542.             $clavesecreta=$_ENV["CLAVE_SECRETA"];
  543.     
  544.     
  545.             $urlko = "https://gls.tecnosenyal.com/libs/API_PHP/urlerror.php";
  546.             $urlok = "https://gls.tecnosenyal.com/libs/API_PHP/urlok.php";
  547.     
  548.             $miObj = new RedsysAPI;
  549.     
  550.             $miObj->setParameter("DS_MERCHANT_AMOUNT",$amount);
  551.             $miObj->setParameter("DS_MERCHANT_ORDER",$order);
  552.             $miObj->setParameter("DS_MERCHANT_MERCHANTCODE", $fuc);
  553.             $miObj->setParameter("DS_MERCHANT_CURRENCY", $moneda);
  554.             $miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $tipotransaccion);
  555.             $miObj->setParameter("DS_MERCHANT_PRODUCTDESCRIPTION", $descripcion);
  556.     
  557.             $miObj->setParameter("DS_MERCHANT_URLOK",$urlok);
  558.             $miObj->setParameter("DS_MERCHANT_URLKO",$urlko);
  559.     
  560.             $miObj->setParameter("DS_MERCHANT_TERMINAL", $terminal);
  561.     
  562.             //Calculamos la firma
  563.             $params = $miObj->createMerchantParameters();
  564.           
  565.             $firma = $miObj->createMerchantSignature($clavesecreta);
  566.             return new JsonResponse(["id_cita"=>$cita->getId(),"firma"=>$firma,"params"=>$params]);*/
  567.                  
  568.             $this->get('session')->getFlashBag()->clear();
  569.             $this->get('session')->getFlashBag()->add(
  570.                 'Correcto',
  571.                 'Cita creada correctamente'
  572.             );
  573.             //reedirigmos al listado de citas
  574.             return $this->redirect($this->generateUrl('cita_listado'));
  575.         }
  576.         //renderizamos la plantilla de nueva cita
  577.         return $this->render('cita/nuevo.html.twig',array(
  578.                 'tipovehiculos'=> $tipovehiculos,
  579.                 'talleres'=> $talleres,
  580.                 'clientes'=>$clientes
  581.             )
  582.         );
  583.     }
  584.     public function editar(Request $request,$idcita){
  585.         
  586.         $em=$this->getDoctrine()->getManager();
  587.         $urlbanco=$_ENV["URL_BANCO"];
  588.         date_default_timezone_set('Europe/Madrid');
  589.         $tipovehiculos=$em->getRepository("App:Tipovehiculo")->findBy(array("activo"=>1),array('id' => 'ASC'));
  590.         if($this->getUser()->getIdrol()->getId()==2){
  591.             $talleres=$em->getRepository("App:Taller")->findBy(array("activo"=>1,"id"=>$this->getUser()->getIdtaller()->getId()));
  592.         }else{
  593.             $talleres=$em->getRepository("App:Taller")->findBy(array("activo"=>1),array('nombre' => 'ASC'));
  594.         }
  595.         $clientes=$em->getRepository("App:Usuario")->findBy(array("activo"=>1,"idrol"=>3),array('nombre' => 'ASC'));
  596.         $cita=$em->getRepository("App:Cita")->find($idcita);
  597.         $imagenesAntes=$em->getRepository("App:ImagenesAntesCita")->findBy(array("idcita"=>$idcita));
  598.         $sobrecostes=$em->getRepository("App:Sobrecostes")->findBy(["idcita"=>$idcita]);
  599.         foreach($imagenesAntes as $key=>$imagen){
  600.             if(file_exists($_SERVER['DOCUMENT_ROOT'].$imagen->getImagen())){
  601.             
  602.                 $imagenesAntes[$key]->size=filesize ($_SERVER['DOCUMENT_ROOT'].$imagen->getImagen());
  603.             }else{
  604.                 $imagenesAntes[$key]->size=0;
  605.             }
  606.         }
  607.         $imagenesDespues=$em->getRepository("App:ImagenesDespuesCita")->findBy(array("idcita"=>$idcita));
  608.         foreach($imagenesDespues as $key=>$imagen){
  609.             if(file_exists($_SERVER['DOCUMENT_ROOT'].$imagen->getImagen())){
  610.             
  611.                 $imagenesDespues[$key]->size=filesize ($_SERVER['DOCUMENT_ROOT'].$imagen->getImagen());
  612.             }else{
  613.                 $imagenesDespues[$key]->size=0;
  614.             }
  615.         }
  616.         //Si entramos por post, damos de alta la cita
  617.         if($request->isMethod('POST')){
  618.            
  619.             $cita->setMatricula($_POST["matricula"]);
  620.             $tipovehiculo=$em->getRepository("App:Tipovehiculo")->find($_POST["tipo_vehiculo"]);
  621.             $subtipovehiculo=$em->getRepository("App:Subtipovehiculo")->find($_POST["modelo"]);
  622.         
  623.             $taller=$em->getRepository("App:Taller")->find($_POST["taller"]);
  624.             $cita->setIdtipovehiculo($tipovehiculo);
  625.             $cita->setIdsubtipovehiculo($subtipovehiculo);
  626.             $fecha = new \DateTime($_POST["dia"]);
  627.             $cita->setFecha($fecha);
  628.             $hora = new \DateTime($_POST["hora"]);
  629.             $cita->setHorainicio($hora);
  630.     
  631.             $horafin=new \DateTime($_POST["hora"]);
  632.             $horafin->modify("+ ".$tipovehiculo->getTiempo()." minutes");
  633.             $cita->setHorafin($horafin);
  634.             if(isset($_POST["factura"])){
  635.                 $cita->setFactura(1);
  636.             }else{
  637.                 $cita->setFactura(0);
  638.             }
  639.   
  640.             $cliente $em->getRepository("App:Usuario")->find($_POST["cliente"]);
  641.             $cita->setIdusuario($cliente);
  642.             $cita->setIdtaller($taller);
  643.             $em->persist($cita);
  644.             $em->flush();
  645.             //Si tenemos aceptacion de trabajo.
  646.             if(isset($_POST["aceptatrabajo"])){
  647.                 $aceptaanterior=$cita->getAceptatrabajo();
  648.                 $cita->setAceptatrabajo(1);
  649.                 $cita->setNombreacepta($_POST["nombreacepta"]);
  650.                 $cita->setApellidosacepta($_POST["apellidosacepta"]);
  651.                 $cita->setDniacepta($_POST["dniacepta"]);
  652.                 if(!$aceptaanterior){
  653.                     $cita->setFechaAcepta(new \DateTime("now"));
  654.                 }
  655.                 $data=$_POST["imagen_aceptacion"];
  656.                 list($type$data) = explode(';'$data);
  657.                 list(, $data)      = explode(','$data);
  658.                 $data base64_decode($data);
  659.                 
  660.                 if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId())) {
  661.                     mkdir($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId(), 0777true);
  662.                 }
  663.                 if(file_exists($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId().'/firma_aceptacion.png')){
  664.                     unlink($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId().'/firma_aceptacion.png');
  665.                 }
  666.                 //creamos la carpeta si no existe.
  667.                 file_put_contents($_SERVER["DOCUMENT_ROOT"].'/firmas/cita_'.$cita->getId().'/firma_aceptacion.png'$data);
  668.                 $cita->setFirmaAcepta('/firmas/cita_'.$cita->getId().'/firma_aceptacion.png');
  669.                 $em->persist($cita);
  670.                 $em->flush();
  671.                 if(!$aceptaanterior){
  672.                     $this->enviarCorreoAceptacion($cita);
  673.                 }
  674.             }
  675.         
  676.             
  677.             $this->get('session')->getFlashBag()->clear();
  678.             $this->get('session')->getFlashBag()->add(
  679.                 'Correcto',
  680.                 'Cita editada correctamente'
  681.             );
  682.             return $this->redirect($this->generateUrl('cita_editar',["idcita"=>$idcita]));
  683.         }
  684.         //renderizamos la plantilla de nueva cita
  685.         return $this->render('cita/editar.html.twig',array(
  686.                 'tipovehiculos'=> $tipovehiculos,
  687.                 'talleres'=> $talleres,
  688.                 'clientes'=>$clientes,
  689.                 'cita'=>$cita,
  690.                 'imagenesAntes'=>$imagenesAntes,
  691.                 'imagenesDespues'=>$imagenesDespues,
  692.                 'urlbanco'=>$urlbanco=$_ENV["URL_BANCO"],
  693.                 'sobrecostes'=>$sobrecostes
  694.             )
  695.         );
  696.     }
  697.     public function crearSobreCostes(Request $request){
  698.         $em=$this->getDoctrine()->getManager();
  699.      
  700.             
  701.         $sobrecoste=new Sobrecostes();
  702.         $cita=$em->getRepository("App:Cita")->find($_POST["idcita"]);
  703.         $sobrecoste->setIdcita($cita);
  704.         $sobrecoste->setPrecio($_POST["precio"]);
  705.         $sobrecoste->setDescripcion($_POST["descripcion"]);
  706.         $sobrecoste->setPagado(0);
  707.         
  708.         $em->persist($sobrecoste);
  709.         $em->flush();   
  710.         //configuracion del pago 
  711.         
  712.         //creamos la parte del pago.
  713.         $amount=$_POST["precio"]*100;
  714.         
  715.         $order "S".str_pad($sobrecoste->getId(), 9"0"STR_PAD_LEFT); //Se calculará con el identificador de la cita 10 posiciones relleno a 0 por la izquierda
  716.         $fuc=$_ENV["FUC"];
  717.         $moneda $_ENV["MONEDA"];
  718.         $tipotransaccion $_ENV["TIPO_TRANSACCION"];
  719.         $descripcion $_POST["descripcion"];
  720.         $terminal $_ENV["TERMINAL"];
  721.         $clavesecreta=$_ENV["CLAVE_SECRETA"];
  722.         $urlko "https://gls.tecnosenyal.com/libs/API_PHP/urlerror.php";
  723.         $urlok "https://gls.tecnosenyal.com/libs/API_PHP/urlok.php";
  724.         $miObj = new RedsysAPI;
  725.         $miObj->setParameter("DS_MERCHANT_AMOUNT",$amount);
  726.         $miObj->setParameter("DS_MERCHANT_ORDER",$order);
  727.         $miObj->setParameter("DS_MERCHANT_MERCHANTCODE"$fuc);
  728.         $miObj->setParameter("DS_MERCHANT_CURRENCY"$moneda);
  729.         $miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE"$tipotransaccion);
  730.         $miObj->setParameter("DS_MERCHANT_PRODUCTDESCRIPTION"$descripcion);
  731.         $miObj->setParameter("DS_MERCHANT_URLOK",$urlok);
  732.         $miObj->setParameter("DS_MERCHANT_URLKO",$urlko);
  733.         $miObj->setParameter("DS_MERCHANT_TERMINAL"$terminal);
  734.         //Calculamos la firma
  735.         $params $miObj->createMerchantParameters();
  736.         
  737.         $firma $miObj->createMerchantSignature($clavesecreta);
  738.         return new JsonResponse(["idsobrecoste"=>$sobrecoste->getId(),"firma"=>$firma,"params"=>$params]);
  739.         
  740.     }
  741.     public function solicitarCita(Request $request){
  742.        
  743.         $em=$this->getDoctrine()->getManager();
  744.         date_default_timezone_set('Europe/Madrid');
  745.         //elimianamos las citas no activas que tengan mas de 10 minutos.
  746.         $sql=" delete from cita where TIMESTAMPDIFF(MINUTE,fecha_alta,NOW()) >=60 and (activo = 0 or activo is null)";
  747.         $stmt$em->getConnection()->query($sql);
  748.          
  749.         $urlbanco=$_ENV["URL_BANCO"];
  750.         $citas=$em->getRepository("App:Cita")->findBy(["idusuario"=>$this->getUser()->getId(),"activo"=>1]);
  751.     
  752.         
  753.         //obtenemos los tipos de coches
  754.         //$tipovehiculos = $em->getRepository("App:Tipovehiculo")->findAll(["activo"=>1]);
  755.         //Si entramos por post, damos de alta la cita
  756.         if($request->isMethod('POST')){
  757.         
  758.             //Buscamos si existe una cita con la matricula.
  759.             $existe_cita $em->getRepository("App:Cita")->findBy(["matricula"=>$_POST["matricula"]]);
  760.             if(count($existe_cita)>0){
  761.                 return new JsonResponse(["error"=>"Ya existe una cita con esta matricula."]);
  762.             }
  763.             $cita=new Cita();
  764.             $cita_historico=new CitaHistorico();
  765.             $cita->setMatricula(trim($_POST["matricula"]));
  766.             $cita_historico->setMatricula(trim($_POST["matricula"]));
  767.             $tipovehiculo=$em->getRepository("App:Tipovehiculo")->find($_POST["tipo_vehiculo"]);
  768.             $subtipovehiculo=$em->getRepository("App:Subtipovehiculo")->find($_POST["modelo"]);
  769.          
  770.         
  771.             $taller=$em->getRepository("App:Taller")->find($_POST["taller"]);
  772.             $cita->setIdtipovehiculo($tipovehiculo);
  773.             $cita->setIdsubtipovehiculo($subtipovehiculo);
  774.             $cita_historico->setIdtipovehiculo($tipovehiculo);
  775.             $cita_historico->setIdsubtipovehiculo($subtipovehiculo);
  776.             $fecha = new \DateTime($_POST["dia"]);
  777.             $cita->setFecha($fecha);
  778.             $cita_historico->setFecha($fecha);
  779.             $hora = new \DateTime($_POST["hora"]);
  780.             $cita->setHorainicio($hora);
  781.             $cita_historico->setHorainicio($hora);
  782.             $horafin=new \DateTime($_POST["hora"]);
  783.             $horafin->modify("+ ".$tipovehiculo->getTiempo()." minutes");
  784.             $cita->setHorafin($horafin);
  785.             $cita_historico->setHorafin($horafin);
  786.             //if(isset($_POST["factura"])){
  787.                 $cita->setFactura(1);
  788.                 $cita_historico->setFactura(1);
  789.             //}else{
  790.             //    $cita->setFactura(0);
  791.             //}
  792.             $cita->setFechaAlta(new \DateTime("now"));
  793.             $cita_historico->setFechaAlta(new \DateTime("now"));
  794.             $cita->setActivo(0);
  795.             $cita->setIdusuario($this->getUser());
  796.             $cita_historico->setIdusuario($this->getUser());
  797.             $cita->setIdtaller($taller);
  798.             $cita_historico->setIdtaller($taller);
  799.             $em->persist($cita);
  800.             $em->persist($cita_historico);
  801.             $em->flush();
  802.             //creamos la parte del pago.
  803.             $amount=$tipovehiculo->getPrecio()*100;
  804.            
  805.             $order str_pad($cita->getId(), 10"0"STR_PAD_LEFT); //Se calculará con el identificador de la cita 10 posiciones relleno a 0 por la izquierda
  806.             $fuc=$_ENV["FUC"];
  807.             $moneda $_ENV["MONEDA"];
  808.             $tipotransaccion $_ENV["TIPO_TRANSACCION"];
  809.             $descripcion $_POST["matricula"]."-".$taller->getNombre()." - (".$fecha->format("d-m-Y")." ".$hora->format("H:i")." )";
  810.             $terminal $_ENV["TERMINAL"];
  811.             $clavesecreta=$_ENV["CLAVE_SECRETA"];
  812.     
  813.     
  814.             $urlko "https://gls.tecnosenyal.com/libs/API_PHP/urlerror.php";
  815.             $urlok "https://gls.tecnosenyal.com/libs/API_PHP/urlok.php";
  816.     
  817.             $miObj = new RedsysAPI;
  818.             /*if($_SERVER['REMOTE_ADDR'] == "185.153.16.21"){
  819.             
  820.                 $amount=0.01*100;
  821.             }*/
  822.         
  823.     
  824.             $miObj->setParameter("DS_MERCHANT_AMOUNT",$amount);
  825.             $miObj->setParameter("DS_MERCHANT_ORDER",$order);
  826.             $miObj->setParameter("DS_MERCHANT_MERCHANTCODE"$fuc);
  827.             $miObj->setParameter("DS_MERCHANT_CURRENCY"$moneda);
  828.             $miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE"$tipotransaccion);
  829.             $miObj->setParameter("DS_MERCHANT_PRODUCTDESCRIPTION"$descripcion);
  830.     
  831.             $miObj->setParameter("DS_MERCHANT_URLOK",$urlok);
  832.             $miObj->setParameter("DS_MERCHANT_URLKO",$urlko);
  833.     
  834.             $miObj->setParameter("DS_MERCHANT_TERMINAL"$terminal);
  835.     
  836.             //Calculamos la firma
  837.             $params $miObj->createMerchantParameters();
  838.           
  839.             $firma $miObj->createMerchantSignature($clavesecreta);
  840.             return new JsonResponse(["id_cita"=>$cita->getId(),"firma"=>$firma,"params"=>$params]);
  841.         }
  842.         $sql "select distinct p.* ";
  843.         $sql .= "from provincia p inner join taller t on p.id = t.idprovincia ";
  844.         $sql .= "where p.activo =1 order by p.nombre asc";
  845.         $stmt$em->getConnection()->query($sql);
  846.         $provincias=$stmt->fetchAll();
  847.         $provincias[0]["selected"]=true;
  848.         $talleres $em->getRepository("App:Taller")->findBy(["idprovincia"=>$provincias[0]["id"],"activo"=>1]);
  849.             
  850.         $contador=1;
  851.         while(count($talleres)==0){
  852.             if($provincias[0]["selected"] == true){
  853.                 $provincias[0]["selected"]=false;
  854.             }
  855.             
  856.             if($contador<count($provincias)){
  857.                 $talleres $em->getRepository("App:Taller")->findBy(["idprovincia"=>$provincias[$contador]["id"],"activo"=>1]);
  858.                 $provincias[$contador]["selected"]=true;
  859.             }else{
  860.                 break;
  861.             }
  862.             $contador++;
  863.         }
  864.         return $this->render('cita/registro_cita.html.twig',["provincias"=>$provincias,"talleres"=>$talleres,"urlbanco"=>$urlbanco,"citas"=>$citas]);
  865.     }
  866.     public function terminos(Request $request){
  867.         return $this->render('cita/terminos.html.twig');
  868.     }
  869.     
  870.     public function multisubidaImagenes(){
  871.         return new JsonResponse(['success' => true,"archivo"=>$_FILES["file"]]);
  872.     }
  873.     public function multisubidaImagenesAntesEdicion($idcita){
  874.         $em=$this->getDoctrine()->getManager();
  875.         
  876.         if (!empty($_FILES)) {
  877.            
  878.             try{
  879.                 $cita=$em->getRepository('App:Cita')->find($idcita);
  880.                
  881.                 $rutafichero ="/imagenes_antes/cita_".$cita->getId();
  882.                 $directorio_ficheros=$_SERVER["DOCUMENT_ROOT"].$rutafichero;
  883.                 
  884.                 //si no existe el directorio lo creamos.
  885.                 if (!file_exists($directorio_ficheros)){
  886.                     mkdir($directorio_ficheros0755);
  887.                 }
  888.                 $nombre=$_FILES["file"]["name"];
  889.                 //Tenemos que poner el nombre con la fecha para no duplicar.
  890.                 $fichero=$directorio_ficheros."/".$nombre;
  891.                 $ficheroguardar$rutafichero."/".$nombre;
  892.                 move_uploaded_file($_FILES["file"]["tmp_name"],$fichero);    
  893.     
  894.                 $imagenAntes=new ImagenesAntesCita();
  895.                 $imagenAntes->setIdcita($cita);
  896.                 $imagenAntes->setImagen($ficheroguardar);
  897.                 $em->persist($imagenAntes);
  898.                 $em->flush();
  899.                 
  900.                 return new JsonResponse(['success' => true,"id"=>$imagenAntes->getId(),"nombre"=>$nombre]);
  901.             }catch(\Exception $e){
  902.                 echo $e->getMessage();
  903.             }
  904.         }
  905.         exit;
  906.     }
  907.     public function multisubidaImagenesDespuesEdicion($idcita){
  908.         $em=$this->getDoctrine()->getManager();
  909.         
  910.         if (!empty($_FILES)) {
  911.            
  912.             try{
  913.                 $cita=$em->getRepository('App:Cita')->find($idcita);
  914.                
  915.                 $rutafichero ="/imagenes_despues/cita_".$cita->getId();
  916.                 $directorio_ficheros=$_SERVER["DOCUMENT_ROOT"].$rutafichero;
  917.                 
  918.                 //si no existe el directorio lo creamos.
  919.                 if (!file_exists($directorio_ficheros)){
  920.                     mkdir($directorio_ficheros0755);
  921.                 }
  922.                 $nombre=$_FILES["file"]["name"];
  923.                 //Tenemos que poner el nombre con la fecha para no duplicar.
  924.                 $fichero=$directorio_ficheros."/".$nombre;
  925.                 $ficheroguardar$rutafichero."/".$nombre;
  926.                 move_uploaded_file($_FILES["file"]["tmp_name"],$fichero);    
  927.   
  928.                 $imagenDespues=new ImagenesDespuesCita();
  929.                 $imagenDespues->setIdcita($cita);
  930.                 $imagenDespues->setImagen($ficheroguardar);
  931.                 $em->persist($imagenDespues);
  932.                 $em->flush();
  933.                 
  934.                 return new JsonResponse(['success' => true,"id"=>$imagenDespues->getId(),"nombre"=>$nombre]);
  935.             }catch(\Exception $e){
  936.                 echo $e->getMessage();
  937.             }
  938.         }
  939.         exit;
  940.     }
  941.     public function eliminarImagenAntes($idimagen){
  942.         $em=$this->getDoctrine()->getManager();
  943.         $imagen=$em->getRepository('App:ImagenesAntesCita')->find($idimagen);
  944.         //eliminamos el fichero fisicamente.
  945.         if(file_exists($_SERVER["DOCUMENT_ROOT"].$imagen->getImagen())){
  946.             unlink($_SERVER["DOCUMENT_ROOT"].$imagen->getImagen());
  947.         }
  948.         $em->remove($imagen);
  949.         $em->flush();
  950.         exit;
  951.     }
  952.     public function eliminarImagenDespues($idimagen){
  953.         $em=$this->getDoctrine()->getManager();
  954.         $imagen=$em->getRepository('App:ImagenesDespuesCita')->find($idimagen);
  955.         //eliminamos el fichero fisicamente.
  956.         if(file_exists($_SERVER["DOCUMENT_ROOT"].$imagen->getImagen())){
  957.             unlink($_SERVER["DOCUMENT_ROOT"].$imagen->getImagen());
  958.         }
  959.         $em->remove($imagen);
  960.         $em->flush();
  961.         exit;
  962.     }
  963.     public function eliminarCita($id){
  964.         $em=$this->getDoctrine()->getManager();
  965.         $sql="delete from imagenes_antes_cita where idcita=".$id;
  966.         $em->getConnection()->query($sql);
  967.         $sql="delete from imagenes_despues_cita where idcita=".$id;
  968.         $em->getConnection()->query($sql);
  969.         $cita=$em->getRepository("App:Cita")->find($id);
  970.         $em->remove($cita);
  971.         $em->flush();
  972.         return $this->redirect($this->generateUrl('cita_listado'));
  973.     }
  974.     public function eliminarCitaHistorico($id){
  975.         $em=$this->getDoctrine()->getManager();
  976.         $cita=$em->getRepository("App:CitaHistorico")->find($id);
  977.         $em->remove($cita);
  978.         $em->flush();
  979.         $this->get('session')->getFlashBag()->clear();
  980.         $this->get('session')->getFlashBag()->add(
  981.             'Correcto',
  982.             'La cita ha sido eliminada correctamente.'
  983.         );
  984.         return $this->redirect($this->generateUrl('historico_citas'));
  985.     }
  986.     public function errorPago(Request $request,$idcita,$codigo){
  987.         
  988.         $em=$this->getDoctrine()->getManager();
  989.         //Eliminamos la cita.
  990.         $cita=$em->getRepository("App:Cita")->find($idcita);
  991.         if($cita){
  992.             $em->remove($cita);
  993.             $em->flush();    
  994.         }   
  995.         
  996.         if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  997.             $this->get('session')->getFlashBag()->clear();
  998.             $this->get('session')->getFlashBag()->add(
  999.                 'Error',
  1000.                 'Ocurrio un erro al realizar el pago:'.$codigo
  1001.             );
  1002.         }else{
  1003.             $this->get('session')->getFlashBag()->clear();
  1004.             $this->get('session')->getFlashBag()->add(
  1005.                 'ErrorCita',
  1006.                 'Ocurrio un erro al realizar el pago:'.$codigo
  1007.             );
  1008.         }
  1009.         //Si el usuario es admin o taller nos vamos a nueva cita de la parte privada
  1010.         if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1011.       
  1012.             return $this->redirect($this->generateUrl('cita_nuevo'));
  1013.         }else{
  1014.             
  1015.             return $this->redirect($this->generateUrl('solicitar_cita'));
  1016.         }
  1017.     }
  1018.     public function errorCodigo(Request $request,$idcita,$codigo){
  1019.         $em=$this->getDoctrine()->getManager();
  1020.         //Eliminamos la cita.
  1021.         $cita=$em->getRepository("App:Cita")->find($idcita);
  1022.         if($cita){
  1023.             $em->remove($cita);
  1024.             $em->flush();
  1025.         }
  1026.         
  1027.         if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1028.             $this->get('session')->getFlashBag()->clear();
  1029.             $this->get('session')->getFlashBag()->add(
  1030.                 'Error',
  1031.                 'Código de operación erróneo:'.$codigo
  1032.             );
  1033.         }else{
  1034.             $this->get('session')->getFlashBag()->clear();
  1035.             $this->get('session')->getFlashBag()->add(
  1036.                 'ErrorCita',
  1037.                 'Código de operación erróneo:'.$codigo
  1038.             );
  1039.         }
  1040.         //Si el usuario es admin o taller nos vamos a nueva cita de la parte privada
  1041.         if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1042.             return $this->redirect($this->generateUrl('cita_nuevo'));
  1043.         }else{
  1044.             return $this->redirect($this->generateUrl('solicitar_cita'));
  1045.         }
  1046.     }
  1047.     public function okPago(Request $request,$idcita){
  1048.         
  1049.         $em=$this->getDoctrine()->getManager();
  1050.         //Activamos la cita.
  1051.         $cita=$em->getRepository("App:Cita")->find($idcita);
  1052.         if($cita){
  1053.             $cita->setActivo(1);
  1054.             $em->persist($cita);
  1055.             $em->flush();
  1056.         }else{
  1057.             if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1058.                 $this->get('session')->getFlashBag()->clear();
  1059.                 $this->get('session')->getFlashBag()->add(
  1060.                     'Error',
  1061.                     'Ha expirado el tiempo para solicitar la cita.'
  1062.                 );
  1063.                     
  1064.             }else{
  1065.                 $this->get('session')->getFlashBag()->clear();
  1066.                 $this->get('session')->getFlashBag()->add(
  1067.                     'ErrorCita',
  1068.                     'Ha expirado el tiempo para solicitar la cita.En caso de porblema de pago pongase en contacto con su taller.'
  1069.                 );
  1070.     
  1071.                 
  1072.             }
  1073.         
  1074.             //Si el usuario es admin o taller nos vamos a nueva cita de la parte privada
  1075.             if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1076.         
  1077.                 return $this->redirect($this->generateUrl('cita_nuevo'));
  1078.             }else{
  1079.                 
  1080.                 return $this->redirect($this->generateUrl('solicitar_cita'));
  1081.             }
  1082.         }
  1083.         if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1084.             $this->get('session')->getFlashBag()->clear();
  1085.             $this->get('session')->getFlashBag()->add(
  1086.                 'Correcto',
  1087.                 'La cita se ha creado correctamente. Se le enviará un correo al cliente con los datos de la cita.'
  1088.             );
  1089.         }else{
  1090.             $this->get('session')->getFlashBag()->clear();
  1091.             $this->get('session')->getFlashBag()->add(
  1092.                 'CorrectoCita',
  1093.                 'La cita se ha creado correctamente. Se le enviará un correo con los datos de la cita.'
  1094.             );
  1095.             
  1096.         }
  1097.         //Enviamos el email.
  1098.         // return $this->render("cita/email_cita.html.twig",array("nombre"=>$cita->getIdusuario()->getNombre()." ".$cita->getIdusuario()->getApellidos(),"fecha"=>$cita->getFecha()->format("d-m-Y"),"horainicio"=>$cita->getHorainicio()->format("H:i"),"horafin"=>$cita->getHorafin()->format("H:i"),"taller"=>$cita->getIdtaller()->getNombre(),"enlace"=>$cita->getIdtaller()->getMapaGoogle()));
  1099.         $mail = new \PHPMailer();
  1100.         $mail->isSMTP();
  1101.         $mail->Host $_ENV["EMAIL_HOST"];
  1102.         $mail->Port $_ENV["EMAIL_PORT"];
  1103.         $mail->SMTPSecure $_ENV["EMAIL_SECURE"];
  1104.         //$mail->SMTPAutoTLS = false;
  1105.         //$mail->SMTPSecure = false;
  1106.         $mail->SMTPAuth true;
  1107.         $mail->Username $_ENV["EMAIL_USERNAME"];
  1108.         $mail->Password $_ENV["EMAIL_PASSWORD"];
  1109.         $mail->From=$_ENV["EMAIL_FROM"];
  1110.         $mail->FromName=$_ENV["EMAIL_FROMNAME"];
  1111.         $mail->addAddress($cita->getIdusuario()->getEmail());
  1112.         $mail->Subject 'Cita Cambio Imagen';
  1113.         $mail->IsHTML(true); // El correo se envía como HTML
  1114.         $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false'verify_peer_name' => false'allow_self_signed' => true ) );
  1115.         $plantilla$this->renderView("cita/email_cita.html.twig",
  1116.                                 array("nombre"=>$cita->getIdusuario()->getNombre()." ".$cita->getIdusuario()->getApellidos(),
  1117.                                         "fecha"=>$cita->getFecha()->format("d-m-Y"),
  1118.                                         "horainicio"=>$cita->getHorainicio()->format("H:i"),
  1119.                                         "horafin"=>$cita->getHorafin()->format("H:i"),
  1120.                                         "taller"=>$cita->getIdtaller()->getNombre(),
  1121.                                         "enlace"=>$cita->getIdtaller()->getMapaGoogle(),
  1122.                                         "tipovehiculo"=>$cita->getIdtipovehiculo()->getNombre()
  1123.                                     ));
  1124.         $mail->msgHTML(utf8_decode($plantilla));
  1125.         
  1126.         $mail->SMTPDebug=2;
  1127.         $exito=$mail->send();
  1128.         //Si el usuario es admin o taller nos vamos a nueva cita de la parte privada
  1129.         if(($this->getUser()->getIdrol()->getId() == || $this->getUser()->getIdrol()->getId() == 2)){
  1130.       
  1131.             return $this->redirect($this->generateUrl('cita_nuevo'));
  1132.         }else{
  1133.             
  1134.             return $this->redirect($this->generateUrl('solicitar_cita'));
  1135.         }
  1136.     }
  1137.     public function errorSobrecoste(Request $request,$id,$codigo){
  1138.         
  1139.         $em=$this->getDoctrine()->getManager();
  1140.  
  1141.         //Eliminamos el sobrecoste
  1142.         $sobrecoste=$em->getRepository("App:Sobrecostes")->find($id);
  1143.         if($sobrecoste){
  1144.             $em->remove($sobrecoste);
  1145.             $em->flush();
  1146.         }
  1147.         $this->get('session')->getFlashBag()->add(
  1148.             'Error',
  1149.             'Error al realizar la operación:'.$codigo
  1150.         );
  1151.         return $this->redirect($this->generateUrl('cita_editar',["idcita"=>$sobrecoste->getIdcita()->getId()]));
  1152.     }
  1153.     
  1154.     public function errorCodigoSobrecoste(Request $request,$id,$codigo){
  1155.         
  1156.         $em=$this->getDoctrine()->getManager();
  1157.  
  1158.         //Eliminamos la cita.
  1159.         $sobrecoste=$em->getRepository("App:Sobrecostes")->find($id);
  1160.         if($sobrecoste){
  1161.             $em->remove($sobrecoste);
  1162.             $em->flush();
  1163.         }
  1164.         $this->get('session')->getFlashBag()->add(
  1165.             'Error',
  1166.             'Código de operación erróneo:'.$codigo
  1167.         );
  1168.         return $this->redirect($this->generateUrl('cita_editar',["idcita"=>$sobrecoste->getIdcita()->getId()]));
  1169.     }
  1170.     public function okSobrecoste(Request $request,$id){
  1171.         
  1172.         $em=$this->getDoctrine()->getManager();
  1173.  
  1174.         //Eliminamos la cita.
  1175.         $sobrecoste=$em->getRepository("App:Sobrecostes")->find($id);
  1176.         $sobrecoste->setPagado(1);
  1177.         $em->persist($sobrecoste);
  1178.         $em->flush();
  1179.         $this->get('session')->getFlashBag()->add(
  1180.             'Correcto',
  1181.             'El sobrecoste ha sido abonado correctamente.'
  1182.         );
  1183.         return $this->redirect($this->generateUrl('cita_editar',["idcita"=>$sobrecoste->getIdcita()->getId()]));
  1184.     }
  1185.     function enviarCorreoAceptacion($idcita){
  1186.         $em=$this->getDoctrine()->getManager();
  1187.         $cita=$em->getRepository("App:Cita")->find($idcita);
  1188.         $sobrecoste=$em->getRepository("App:Sobrecostes")->findBy(["idcita"=>$idcita]);
  1189.         //enviamos el correo.
  1190.         $mail = new \PHPMailer();
  1191.         $mail->isSMTP();
  1192.         $mail->Host $_ENV["EMAIL_HOST"];
  1193.         $mail->Port $_ENV["EMAIL_PORT"];
  1194.         $mail->SMTPSecure $_ENV["EMAIL_SECURE"];
  1195.         //$mail->SMTPAutoTLS = false;
  1196.         //$mail->SMTPSecure = false;
  1197.         $mail->SMTPAuth true;
  1198.         $mail->Username $_ENV["EMAIL_USERNAME"];
  1199.         $mail->Password $_ENV["EMAIL_PASSWORD"];
  1200.         $mail->From=$_ENV["EMAIL_FROM"];
  1201.         $mail->FromName=$_ENV["EMAIL_FROMNAME"];
  1202.         $mail->addAddress($cita->getIdusuario()->getEmail());
  1203.         $mail->Subject 'Trabajo Realizado';
  1204.         $mail->IsHTML(true); // El correo se envía como HTML
  1205.         $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false'verify_peer_name' => false'allow_self_signed' => true ) );
  1206.   
  1207.         $plantilla$this->renderView("cita/informe_trabajos.html.twig",array("cita"=>$cita,"sobrecoste"=>$sobrecoste));
  1208.         $mail->msgHTML(utf8_decode($plantilla));
  1209.         
  1210.       //  $mail->SMTPDebug=2;
  1211.         $exito=$mail->send();
  1212.         
  1213.     }
  1214.     public function getEstilos(){
  1215.         
  1216.         return [
  1217.             "titulo"=> array(
  1218.                 'alignment' => array(
  1219.                     'vertical' => \PHPExcel_Style_Alignment::VERTICAL_CENTER,
  1220.                     'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
  1221.                 ),
  1222.                 'font'  => array(
  1223.                     'bold'  => true,
  1224.                     'color' => array('rgb' => 'FFFFFF'),
  1225.                     'size'  => 16,
  1226.                 ),
  1227.                 'fill' => array(
  1228.                     'type' => \PHPExcel_Style_Fill::FILL_SOLID,
  1229.                     'color' => array('rgb' => '0473b8')
  1230.                 )
  1231.             ),
  1232.             "cabecera"=> array(
  1233.                 'alignment' => array(
  1234.                     'vertical' => \PHPExcel_Style_Alignment::VERTICAL_CENTER,
  1235.                     'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
  1236.                 ),
  1237.                 'font'  => array(
  1238.                     'bold'  => true,
  1239.                     'color' => array('rgb' => '000000'),
  1240.                     'size'  => 11,
  1241.                 ),
  1242.                 'fill' => array(
  1243.                     'type' => \PHPExcel_Style_Fill::FILL_SOLID,
  1244.                     'color' => array('rgb' => 'cccccc')
  1245.                 )
  1246.             ),
  1247.             
  1248.             "centrado"=>array(
  1249.                 'alignment' => array(
  1250.                 'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
  1251.             ),
  1252.             "centrado_vertical"=>array(
  1253.                 'alignment' => array(
  1254.                 'vertical' => \PHPExcel_Style_Alignment::VERTICAL_CENTER)
  1255.             ),
  1256.             "izquierda"=>array(
  1257.                 'alignment' => array(
  1258.                 'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_LEFT)
  1259.             ),
  1260.             "borde_izquierda"=>array(
  1261.                 'borders' => array(
  1262.                   'left' => array('style' => \PHPExcel_Style_Border::BORDER_THIN)
  1263.                 ),
  1264.             ),
  1265.             
  1266.             "borde_derecha"=>array(
  1267.                 'borders' => array(
  1268.                   'right' => array('style' => \PHPExcel_Style_Border::BORDER_THIN)
  1269.                 ),
  1270.             ),
  1271.     
  1272.             "borde_abajo" => array(
  1273.                 'borders' => array(
  1274.                   'bottom' => array('style' => \PHPExcel_Style_Border::BORDER_THIN)
  1275.                 ),
  1276.             ),
  1277.             
  1278.             "borde_arriba" => array(
  1279.                 'borders' => array(
  1280.                   'top' => array('style' => \PHPExcel_Style_Border::BORDER_THIN)
  1281.                 ),
  1282.             ),
  1283.             "borde_todos"=>array(
  1284.                 'borders' => array(
  1285.                   'allborders' => array('style' => \PHPExcel_Style_Border::BORDER_THIN)
  1286.                 ),
  1287.             ),
  1288.             "fila"=> array(
  1289.                 'fill' => array(
  1290.                     'type' => \PHPExcel_Style_Fill::FILL_SOLID,
  1291.                     'color' => array('rgb' => "90F39C")
  1292.                 )
  1293.             ),
  1294.             "fila_2"=> array(
  1295.                 'fill' => array(
  1296.                     'type' => \PHPExcel_Style_Fill::FILL_SOLID,
  1297.                     'color' => array('rgb' => "F3F390")
  1298.                 )
  1299.             ),
  1300.             "fondo_gris"=> array(
  1301.                 'fill' => array(
  1302.                     'type' => \PHPExcel_Style_Fill::FILL_SOLID,
  1303.                     'color' => array('rgb' => "F0F0F0")
  1304.                 )
  1305.             )
  1306.         ];
  1307.     }
  1308.     public function traspasarCita(Request $request){
  1309.         $em=$this->getDoctrine()->getManager();
  1310.         //calculamos la hora fin de la cita en base a la hora de inicio y duracion
  1311.         $cita_historico=$em->getRepository("App:CitaHistorico")->find($_POST["id_cita_historico"]);
  1312.         $fecha= new \DateTime($_POST["dia"]);
  1313.         $fecha=$fecha->format("Y-m-d");
  1314.         $horadate($_POST["hora"]);
  1315.         $horafin date('H:i'strtotime($hora.'+'.$cita_historico->getIdtipovehiculo()->getTiempo().' minute'));
  1316.         //realizamos el inserta en la tabla de citas.
  1317.         $sql=" INSERT INTO cita (idusuario,matricula,idtipovehiculo,fecha,horainicio,horafin,idtaller,idsubtipovehiculo,factura,fecha_alta,activo) ";
  1318.         $sql.=" select idusuario,matricula,idtipovehiculo,'".$fecha."','".$hora."','".$horafin."',idtaller,idsubtipovehiculo,factura,NOW(),1 ";
  1319.         $sql.=" from cita_historico where id= ".$cita_historico->getId();
  1320.   
  1321.         $stmt$em->getConnection()->query($sql);
  1322.         //eliminamos la cita del historico.
  1323.         $em->remove($cita_historico);
  1324.         $em->flusH();
  1325.         
  1326.         $this->get('session')->getFlashBag()->clear();
  1327.         $this->get('session')->getFlashBag()->add(
  1328.             'Correcto',
  1329.             'Cita traspasada correctamente'
  1330.         );
  1331.         //reedirigmos al listado de historico de citas.
  1332.         return $this->redirect($this->generateUrl('historico_citas'));
  1333.     }
  1334.     
  1335. }