src/Controller/ContratoController.php line 858

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Canal;
  4. use App\Entity\Cliente;
  5. use App\Entity\Comercial;
  6. use App\Entity\Concepto;
  7. use App\Entity\Contrato;
  8. use App\Entity\Estado;
  9. use App\Entity\EstadoCompraFactura;
  10. use App\Entity\Factura;
  11. use App\Entity\FacturaGenerica;
  12. use App\Entity\Modalidad;
  13. use App\Entity\Producto;
  14. use App\Entity\ProductoProveedor;
  15. use App\Entity\Suministro;
  16. use App\Entity\User;
  17. use App\Entity\TopeGas;
  18. use App\Form\ContratoType;
  19. use App\Form\EditarContratoType;
  20. use App\Form\FacturaFromContratoType;
  21. use App\Form\FacturaGenericaType;
  22. use App\Form\FacturaType;
  23. use App\Form\ImportarContratoType;
  24. use App\Form\NewContratoType;
  25. use App\Form\RegistrarContratoType;
  26. use App\Repository\CanalRepository;
  27. use App\Repository\ClienteRepository;
  28. use App\Repository\ContratoRepository;
  29. use App\Repository\EstadoCompraFacturaRepository;
  30. use App\Repository\EstadoRepository;
  31. use App\Repository\FacturaGenericaRepository;
  32. use App\Repository\FacturaRepository;
  33. use App\Repository\ImpuestoRepository;
  34. use App\Repository\ModalidadRepository;
  35. use App\Repository\ProductoProveedorRepository;
  36. use App\Repository\SuministroRepository;
  37. use App\Repository\TarifaRepository;
  38. use App\Repository\TipoDocumentoRepository;
  39. use App\Repository\TipoImpuestoRepository;
  40. use App\Repository\TipoLecturaRepository;
  41. use App\Repository\TipoTarifaRepository;
  42. use App\Repository\TipoViaRepository;
  43. use App\Repository\TopeGasRepository;
  44. use App\Repository\UserRepository;
  45. use Doctrine\ORM\EntityManagerInterface;
  46. use Doctrine\ORM\Query\Expr\Math;
  47. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  48. use Knp\Snappy\Pdf;
  49. use Monolog\Handler\StreamHandler;
  50. use Monolog\Logger;
  51. use Doctrine\Persistence\ManagerRegistry;
  52. use Psr\Cache\InvalidArgumentException;
  53. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  54. use Symfony\Component\Cache\Adapter\FilesystemAdapter;
  55. use Symfony\Component\Form\FormError;
  56. use Symfony\Component\HttpFoundation\Request;
  57. use Symfony\Component\HttpFoundation\Response;
  58. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  59. use Symfony\Component\Routing\Annotation\Route;
  60. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  61. use Symfony\Component\Validator\Constraints\Iban;
  62. use Symfony\Component\Validator\Constraints\NotBlank;
  63. use Symfony\Component\Validator\Validator\ValidatorInterface;
  64. /**
  65.  * @Route("/contrato")
  66.  */
  67. class ContratoController extends AbstractController
  68. {
  69.     /**
  70.      * @Route("/", name="contrato_index", methods={"GET"})
  71.      * @Route("/bajas", name="contrato_baja", methods={"GET"})
  72.      */
  73.     public function index(Request $requestContratoRepository $contratoRepository): Response
  74.     {
  75.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  76.         if ( $request->getUri()==$this->generateUrl('contrato_baja',[],UrlGeneratorInterface::ABSOLUTE_URL) ){
  77.             $baja=true;
  78.         }
  79.         $cache=new FilesystemAdapter();
  80.         try {
  81.             $totalContratos=$cache->getItem('numero_contratos');
  82.             if (!$totalContratos->isHit()){
  83.                 $totalContratos->setcount$contratoRepository->findAll() ) );
  84.                 $cache->save($totalContratos);
  85.             }
  86.         }catch (InvalidArgumentException $e) {
  87.         }
  88.         return $this->render('contrato/indexAdmin.html.twig', [
  89.             'baja'=>($baja??false)
  90.         ]);
  91.     }
  92.     /**
  93.      * @Route("/nuevo", name="contrato_new", methods={"GET","POST"})
  94.      * @Route("/registrar", name="contrato_register", methods={"GET","POST"})
  95.      */
  96.     public function new(Request $requestUserPasswordHasherInterface $passwordEncoderUserRepository $userRepository,
  97.                         SuministroRepository $suministroRepositoryClienteRepository $clienteRepository,
  98.                         ContratoRepository $contratoRepositoryEntityManagerInterface $entityManager): Response
  99.     {
  100.         $contrato = new Contrato();
  101.         if( $request->getPathInfo()==$this->generateUrl('contrato_register') ){
  102.             $this->denyAccessUnlessGranted("ROLE_ADMIN");
  103.             $contratoForm $this->createForm(RegistrarContratoType::class, $contrato);
  104.         }
  105.         else{
  106.             $this->denyAccessUnlessGranted("ROLE_COMERCIAL");
  107.             $contratoForm $this->createForm(NewContratoType::class, $contrato);
  108.         }
  109.         $contratoForm->handleRequest($request);
  110.         if ( $contratoForm->isSubmitted() ) {
  111.             $formData=$contratoForm->getData();
  112.             //COMPROBACIONES
  113.             //Suministro
  114.             if( count($contratoRepository->findBy( ['referenciaContrato'=>$contrato->getReferenciaContrato()] ))!==){
  115.                     $contratoForm->get('referenciaContrato')->addError(new FormError("Este contrato ya ha sido registrado en la base de datos"));
  116.             }
  117.             //Suministro
  118.             if($formData->getSuministro()==null) {
  119.                 $suministro $contratoForm['newSuministro']->getData();
  120.                 if($suministro->getCups()==''){
  121.                     $contratoForm->get('newSuministro')->get('cups')->addError(new FormError("El CUPS no puede estar vacío"));
  122.                 }
  123.                 elseif( count($suministroRepository->findBy( ['cups'=>$suministro->getCups()] ))!==){
  124.                     $contratoForm->get('newSuministro')->get('cups')->addError(new FormError("Este CUPS ya ha sido registrado en la base de datos"));
  125.                 }
  126.                 if($suministro->getNumeroDireccion()==''){
  127.                     $contratoForm->get('newSuministro')->get('numeroDireccion')->addError(new FormError("El número de dirección no puede estar vacío"));
  128.                 }
  129.             }
  130.             //Cliente
  131.             if($formData->getCliente()==null){
  132.                 $cliente=$contratoForm['newCliente']->getData();
  133.                 if($cliente->getNumeroDireccion()==''){
  134.                     $contratoForm->get('newCliente')->get('numeroDireccion')->addError(new FormError("El número de dirección no puede estar vacío"));
  135.                 }
  136.                 if( count($clienteRepository->findBy( ['nif'=>$cliente->getNif()] ))!==){
  137.                     $contratoForm->get('newCliente')->get('nif')->addError(new FormError("Este NIF ya ha sido registrado en la base de datos"));
  138.                 }
  139.             }
  140.             //PROCESAR DATOS
  141.             if( $contratoForm->isValid() ){
  142.                 //New suministro
  143.                 if($formData->getSuministro()==null){
  144.                     $suministro->setNombreViastrtoupper($suministro->getNombreVia()) );
  145.                     $suministro->setPuertastrtoupper($suministro->getPuerta()) );
  146.                     $suministro->setEscalerastrtoupper($suministro->getEscalera()) );
  147.                     $suministro->setPoblacionstrtoupper($suministro->getPoblacion()) );
  148.                     $suministro->setProvinciastrtoupper($suministro->getProvincia()) );
  149.                     $suministro->setPotenciaP1($contratoForm['potenciaP1']->getData());
  150.                     $suministro->setPotenciaP2($contratoForm['potenciaP2']->getData());
  151.                     $suministro->setPotenciaP3($contratoForm['potenciaP3']->getData());
  152.                     $suministro->setPotenciaP4($contratoForm['potenciaP4']->getData());
  153.                     $suministro->setPotenciaP5($contratoForm['potenciaP5']->getData());
  154.                     $suministro->setPotenciaP6($contratoForm['potenciaP6']->getData());
  155.                     $entityManager->persist($suministro);
  156.                     $contrato->setSuministro($suministro);
  157.                 }
  158.                 else{
  159.                     $suministro=$contratoForm['suministro']->getData();
  160.                     $suministro->setPotenciaP1($contratoForm['potenciaP1']->getData());
  161.                     $suministro->setPotenciaP2($contratoForm['potenciaP2']->getData());
  162.                     $suministro->setPotenciaP3($contratoForm['potenciaP3']->getData());
  163.                     $suministro->setPotenciaP4($contratoForm['potenciaP4']->getData());
  164.                     $suministro->setPotenciaP5($contratoForm['potenciaP5']->getData());
  165.                     $suministro->setPotenciaP6($contratoForm['potenciaP6']->getData());
  166.                     $entityManager->persist($suministro);
  167.                 }
  168.                 //New producto
  169.                 if($formData->getProducto()==null){
  170.                     $producto=$contratoForm['newProducto']->getData();
  171.                     $producto->setNombre('PERSONALIZADO');
  172.                     $producto->setTarifa($contratoForm['tarifa']->getData());
  173.                     $producto->setDuraciondate_interval_create_from_date_string('1 year') );
  174.                     $producto->setPersonalizado(true);
  175.                     $entityManager->persist($producto);
  176.                     $contrato->setProducto($producto);
  177.                 }
  178.                 //New productoProveedor
  179.                 if($formData->getProductoProveedor()==null){
  180.                     $productoProveedor=new ProductoProveedor();
  181.                     $productoProveedor->setNombre('PERSONALIZADO');
  182.                     $productoProveedor->setTarifa($contratoForm['tarifa']->getData());
  183.                     $productoProveedor->setFacturaElectronica(1);
  184.                     $productoProveedor->setProveedor($contrato->getProveedor());
  185.                     $productoProveedor->setDuraciondate_interval_create_from_date_string('1 year') );
  186.                     $productoProveedor->setPersonalizado(true);
  187.                     $entityManager->persist($productoProveedor);
  188.                     $contrato->setProductoProveedor($productoProveedor);
  189.                 }
  190.                 //New cliente
  191.                 if($formData->getCliente()==null){
  192.                     $cliente->setNombrestrtoupper($cliente->getNombre()) );
  193.                     $cliente->setApellidostrtoupper($cliente->getApellido()) );
  194.                     $cliente->setApellido2strtoupper($cliente->getApellido2()) );
  195.                     $cliente->setNifstrtoupper($cliente->getNif()) );
  196.                     $cliente->setNombreRepresentantestrtoupper($cliente->getNombreRepresentante()) );
  197.                     $cliente->setDniRepresentantestrtoupper($cliente->getDniRepresentante()) );
  198.                     $cliente->setEmailstrtolower($cliente->getEmail()) );
  199.                     $cliente->setNombreViastrtoupper($cliente->getNombreVia()) );
  200.                     $cliente->setEscalerastrtoupper($cliente->getEscalera()) );
  201.                     $cliente->setPuertastrtoupper($cliente->getPuerta()) );
  202.                     $cliente->setPoblacionstrtoupper($cliente->getPoblacion()) );
  203.                     $cliente->setProvinciastrtoupper($cliente->getProvincia()) );
  204.                     $cliente->setNombreNotificacionesstrtoupper($cliente->getNombreNotificaciones()) );
  205.                     $cliente->setDireccionNotificacionesstrtoupper($cliente->getDireccionNotificaciones()) );
  206.                     $cliente->setPoblacionNotificacionesstrtoupper($cliente->getPoblacionNotificaciones()) );
  207.                     $cliente->setProvinciaNotificacionesstrtoupper($cliente->getProvinciaNotificaciones()) );
  208.                     $user=$userRepository->findOneBy(['username'=>$cliente->getNif()]);
  209.                     if($user==null){
  210.                         $user = new User();
  211.                         $user->setUsernamestrtoupper($cliente->getNif()) );
  212.                         $user->setEmailstrtolower($cliente->getEmail()) );
  213.                         $user->setPassword(
  214.                             $passwordEncoder->hashPassword(
  215.                                 $user,
  216.                                 strtoupper($cliente->getNif())
  217.                             )
  218.                         );
  219.                         $user->setRoles(["ROLE_USER"]);
  220.                         $entityManager->persist($user);
  221.                     }elseif ($user->getCliente()!==null){
  222.                         $user=null;
  223.                     }
  224.                     $cliente->setUser($user);
  225.                     $entityManager->persist($cliente);
  226.                     $contrato->setCliente($cliente);
  227.                 }
  228.                 //Fecha fin  //  Última lectura
  229.                 if( ($formData->getFechaLectura()??null)!=null ){
  230.                     $contrato->setFechaFin(date_add( clone $formData->getFechaLectura(), date_interval_create_from_date_string('1 year') ));
  231.                     $contrato->setUltimaLectura$formData->getFechaLectura() );
  232.                 }
  233.                 $contrato->setReferenciaContratostrtoupper($contrato->getReferenciaContrato()) );
  234.                 $cuenta=strtoupperstr_replace(' '''$contratoForm['numeroCuenta']->getData()) );
  235.                 $contrato->setIbansubstr($cuenta0,4) );
  236.                 $contrato->setCccsubstr($cuenta4) );
  237.                 $contrato->setFormaPago('DOMICILIACIÓN BANCARIA');
  238.                 /*$contrato->setEstado($estadoRepository->findOneBy([ 'nombre'=>'BORRADOR' ]));*/
  239.                 $contrato->setCreatedBy($this->getUser());
  240.                 if( !($request->getPathInfo()==$this->generateUrl('contrato_register')) ){
  241.                     $contrato->setFecha(date_create());
  242.                 }
  243.                 $entityManager->persist($contrato);
  244.                 $entityManager->flush();
  245.                 if( ($contrato->getReferenciaContrato()??null)==null ){
  246.                     $contrato->setReferenciaContratodate('Y').$contrato->getId() );
  247.                     $i=1;
  248.                     while( $contratoRepository->findBy(['referenciaContrato'=>$contrato->getReferenciaContrato()])  !=  null ){
  249.                         $contrato->setReferenciaContratodate('Y').($contrato->getId()+$i) );
  250.                         $i++;
  251.                     }
  252.                 }
  253.                 $entityManager->persist($contrato);
  254.                 $entityManager->flush();
  255.                 $cache=new FilesystemAdapter();
  256.                 $numeroContratos $cache->getItem('numero_contratos');
  257.                 $numeroContratos->setcount($contratoRepository->findAll()) );
  258.                 $cache->save($numeroContratos);
  259.                 return $this->redirectToRoute('contrato_show',['id'=>$contrato->getId()]);
  260.             }
  261.         }
  262.         return $this->render('contrato/new.html.twig', [
  263.             'contrato' => $contrato,
  264.             'contratoForm' => $contratoForm->createView()
  265.         ]);
  266.     }
  267.     /*
  268.      * @Route("/import", name="contrato_import", methods={"GET","POST"})
  269.      *
  270.     public function import(Request $request, FacturaRepository $facturaRepository,
  271.                            ContratoRepository $contratoRepository, TarifaRepository $tarifaRepository,
  272.                            ImpuestoRepository $impuestoRepository){
  273.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  274.         $form = $this->createForm(ImportarContratoType::class);
  275.         $form->handleRequest($request);
  276.         if ( $form->isSubmitted() ) {
  277.             $data = json_decode($form->get('json')->getData(), true);
  278.             if ($data === null) {
  279.                 $form->get('json')->addError(new FormError("El formato no es válido"));
  280.             }
  281.             if ($form->isValid()){
  282.                 $data=$data['Hoja1'];
  283.                 $entityManager = $this->getDoctrine()->getManager();
  284.                 foreach ($data as $linea){
  285.                     if ( $facturaRepository->findOneBy([ 'numeroFactura'=>$linea['numeroFactura'] ])==null ){
  286.                         set_time_limit(10);
  287.                         $contrato=$contratoRepository->findOneBy([ 'referenciaContrato'=> $linea['referenciaContrato'] ]);
  288.                         if($contrato->getLecturaInicialP1()==null){
  289.                             $contrato->setLecturaInicialP1( $linea['lecturaEnergiaP1'] );
  290.                             $contrato->setLecturaInicialP2( $linea['lecturaEnergiaP2']??null );
  291.                             $contrato->setLecturaInicialP3( $linea['lecturaEnergiaP3']??null );
  292.                             $contrato->setLecturaInicialP4( $linea['lecturaEnergiaP4']??null );
  293.                             $contrato->setLecturaInicialP5( $linea['lecturaEnergiaP5']??null );
  294.                             $contrato->setLecturaInicialP6( $linea['lecturaEnergiaP6']??null );
  295.                             $contrato->setLecturaReactivaP1( $linea['lecturaReactivaP1']??null );
  296.                             $contrato->setLecturaReactivaP2( $linea['lecturaReactivaP2']??null );
  297.                             $contrato->setLecturaReactivaP3( $linea['lecturaReactivaP3']??null );
  298.                             $contrato->setLecturaReactivaP4( $linea['lecturaReactivaP4']??null );
  299.                             $contrato->setLecturaReactivaP5( $linea['lecturaReactivaP5']??null );
  300.                             $contrato->setLecturaReactivaP6( $linea['lecturaReactivaP6']??null );
  301.                         }else{
  302.                             $factura=new Factura();
  303.                             $producto=$contrato->getProducto();
  304.                             $cliente=$contrato->getCliente();
  305.                             $suministro=$contrato->getSuministro();
  306.                             $factura->setDevuelta($linea['devuelta']??false);
  307.                             $factura->setContrato($contrato);
  308.                             $factura->setTarifa($tarifaRepository->findOneBy([ 'nombre'=>$linea['tarifa'] ])??$producto->getTarifa());
  309.                             $factura->setPrecioEnergiaP1($linea['precioEnergiaP1']??$producto->getPrecioEnergiaP1());
  310.                             $factura->setPrecioEnergiaP2($linea['precioEnergiaP2']??$producto->getPrecioEnergiaP2());
  311.                             $factura->setPrecioEnergiaP3($linea['precioEnergiaP3']??$producto->getPrecioEnergiaP3());
  312.                             $factura->setPrecioEnergiaP4($linea['precioEnergiaP4']??$producto->getPrecioEnergiaP4());
  313.                             $factura->setPrecioEnergiaP5($linea['precioEnergiaP5']??$producto->getPrecioEnergiaP5());
  314.                             $factura->setPrecioEnergiaP6($linea['precioEnergiaP6']??$producto->getPrecioEnergiaP6());
  315.                             $factura->setPrecioPotenciaP1(($linea['precioPotenciaP1']/365)??($producto->getPrecioPotenciaP1()/365));
  316.                             $factura->setPrecioPotenciaP2(($linea['precioPotenciaP2']/365)??($producto->getPrecioPotenciaP2()/365));
  317.                             $factura->setPrecioPotenciaP3(($linea['precioPotenciaP3']/365)??($producto->getPrecioPotenciaP3()/365));
  318.                             $factura->setPrecioPotenciaP4(($linea['precioPotenciaP4']/365)??($producto->getPrecioPotenciaP4()/365));
  319.                             $factura->setPrecioPotenciaP5(($linea['precioPotenciaP5']/365)??($producto->getPrecioPotenciaP5()/365));
  320.                             $factura->setPrecioPotenciaP6(($linea['precioPotenciaP6']/365)??($producto->getPrecioPotenciaP6()/365));
  321.                             $factura->setPotenciaP1($linea['potenciaP1']??$suministro->getPotenciaP1());
  322.                             $factura->setPotenciaP2($linea['potenciaP2']??$suministro->getPotenciaP2());
  323.                             $factura->setPotenciaP3($linea['potenciaP3']??$suministro->getPotenciaP3());
  324.                             $factura->setPotenciaP4($linea['potenciaP4']??$suministro->getPotenciaP4());
  325.                             $factura->setPotenciaP5($linea['potenciaP5']??$suministro->getPotenciaP5());
  326.                             $factura->setPotenciaP6($linea['potenciaP6']??$suministro->getPotenciaP6());
  327.                             $factura->setNombreCliente($cliente->__toString());
  328.                             $factura->setNifCliente($cliente->getNif());
  329.                             $factura->setDireccionCliente($cliente->getDireccion());
  330.                             $factura->setCpCliente($cliente->getCp());
  331.                             $factura->setPoblacionCliente($cliente->getPoblacion());
  332.                             $factura->setProvinciaCliente($cliente->getProvincia());
  333.                             $factura->setAlquilerEquipos($suministro->getAlquilerContador());
  334.                             $cuenta=str_replace(' ', '', $linea['numeroCuenta'] ?? ($contrato->getIban().$contrato->getCcc()) );
  335.                             $factura->setIban( strtoupper( substr($cuenta, 0,4) ));
  336.                             $factura->setCcc( substr($cuenta, 4) );
  337.                             $fechaLectura=date_create_from_format('n/j/y',$linea['fechaLectura']);
  338.                             if($fechaLectura!==false){
  339.                                 $factura->setFechaLectura( $fechaLectura );
  340.                             }else{
  341.                                 $factura->setFechaLectura( date_create_from_format('d/m/Y', '09/09/9999') );
  342.                             }
  343.                             $fechaEmision=date_create_from_format('n/j/y',$linea['fechaEmision']);
  344.                             if($fechaEmision!==false){
  345.                                 $factura->setFechaEmision( $fechaEmision );
  346.                             }else{
  347.                                 $factura->setFechaEmision( date_create_from_format('d/m/Y', '09/09/9999') );
  348.                             }
  349.                             $factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'electricidad'])->getImporte());
  350.                             $factura->setIva($impuestoRepository->findOneBy(['nombre'=>'iva'])->getImporte());
  351.                             if(($linea['nombreNotificaciones']??null)!==null){
  352.                                 $factura->setNotificaciones(true);
  353.                                 $factura->setNombreNotificaciones($linea['nombreNotificaciones']);
  354.                                 $factura->setDireccionNotificaciones($linea['direccionNotificaciones']);
  355.                                 $factura->setCpNotificaciones($linea['cpNotificaciones']);
  356.                                 $factura->setPoblacionNotificaciones($linea['poblacionNotificaciones']);
  357.                                 $factura->setProvinciaNotificaciones($linea['provinciaNotificaciones']);
  358.                             }
  359.                             else{
  360.                                 $factura->setNotificaciones(false);
  361.                             }
  362.                         }
  363.                     }
  364.                 }
  365.             }
  366.         }
  367.     }*/
  368.     /*public function import(Request $request, UserPasswordEncoderInterface $passwordEncoder, ValidatorInterface $validator,
  369.                              SuministroRepository $suministroRepository, ClienteRepository $clienteRepository,
  370.                              ContratoRepository $contratoRepository, TipoViaRepository $tipoViaRepository,
  371.                              UserRepository $userRepository, TarifaRepository $tarifaRepository,
  372.                              ModalidadRepository $modalidadRepository, CanalRepository $canalRepository,
  373.                              ProductoProveedorRepository $productoProveedorRepository, EstadoRepository $estadoRepository,
  374.                              TipoDocumentoRepository $tipoDocumentoRepository, TipoImpuestoRepository $tipoImpuestoRepository ): Response
  375.     {
  376.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  377.         $form = $this->createForm(ImportarContratoType::class);
  378.         $form->handleRequest($request);
  379.         if ( $form->isSubmitted() ) {
  380.             $data=json_decode( $form->get('json')->getData(), true );
  381.             if($data===null){
  382.                 $form->get('json')->addError( new FormError("El formato no es válido") );
  383.             }
  384.             if( $form->isValid() ){
  385.                 $data=$data['Hoja1'];
  386.                 $entityManager = $this->getDoctrine()->getManager();
  387.                 foreach ($data as $linea){
  388.                     if ( $contratoRepository->findOneBy([ 'referenciaContrato'=>$linea['referenciaContrato'] ])==null ){
  389.                         set_time_limit(10);
  390.                         $contrato=new Contrato();
  391.                         //Información cliente
  392.                         //echo $linea['referenciaContrato'].'<br>';
  393.                         $cliente=$clienteRepository->findOneBy([ 'nif'=>strtoupper( trim($linea['nifCliente']) ) ]);
  394.                         if($cliente===null){
  395.                             $cliente= new Cliente();
  396.                             $cliente->setNombre( strtoupper( trim($linea['nombreCliente']) ) );
  397.                             $cliente->setApellido( strtoupper( trim($linea['apellidoCliente']??null) ) );
  398.                             $cliente->setApellido2( strtoupper( trim($linea['apellidoCliente2']??null) ) );
  399.                             $nif=strtoupper( trim($linea['nifCliente']) );
  400.                             $nifFirst=substr($nif, 0, 1);
  401.                             $cliente->setNif($nif);
  402.                             if( $nifFirst>='A' && $nifFirst<'X'){
  403.                                 $cliente->setTipoDocumento($tipoDocumentoRepository->findOneBy([ 'nombre'=>'CIF' ]));
  404.                             }elseif ( $nifFirst>='X' && $nifFirst<='Z' ){
  405.                                 $cliente->setTipoDocumento($tipoDocumentoRepository->findOneBy([ 'nombre'=>'NIE' ]));
  406.                             }else{
  407.                                 $cliente->setTipoDocumento($tipoDocumentoRepository->findOneBy([ 'nombre'=>'DNI' ]));
  408.                             }
  409.                             if( ($linea['nombreRepresentante']??null)!==null ){
  410.                                 $cliente->setRepresentante( true );
  411.                                 $cliente->setNombreRepresentante( strtoupper( trim($linea['nombreRepresentante']) ) );
  412.                                 $cliente->setDniRepresentante( strtoupper( trim($linea['dniRepresentante']) ) );
  413.                             }else{
  414.                                 $cliente->setRepresentante( false );
  415.                             }
  416.                             $cliente->setEmail( strtolower( trim($linea['emailCliente']??null) ) );
  417.                             $cliente->setTelefono( strtolower( trim($linea['telefonoCliente']??null) ) );
  418.                             $cliente->setTelefono2( strtolower( trim($linea['telefonoCliente2']??null) ) );
  419.                             $cliente->setTipoVia( $tipoViaRepository->findOneBy([ 'nombre'=>trim($linea['tipoViaCliente']) ]) );
  420.                             $cliente->setNombreVia( strtoupper( trim($linea['nombreViaCliente']) ) );
  421.                             $cliente->setNumeroDireccion( strtoupper( trim($linea['numeroDireccionCliente']??null) ) );
  422.                             $cliente->setEscalera( strtoupper( trim($linea['escaleraCliente']??null) ) );
  423.                             $cliente->setPiso( strtoupper( trim($linea['pisoCliente']??null) ) );
  424.                             $cliente->setPuerta( strtoupper( trim($linea['puertaCliente']??null) ) );
  425.                             $cliente->setCp( trim($linea['cpCliente']) );
  426.                             $cliente->setPoblacion( strtoupper( trim($linea['poblacionCliente']) ) );
  427.                             $cliente->setProvincia( strtoupper( trim($linea['provinciaCliente']) ) );
  428.                             $cliente->setObservaciones( trim($linea['observacionesCliente']??null) );
  429.                             if( $linea['direccionNotificaciones']!==null ){
  430.                                 $cliente->setNotificaciones( true );
  431.                                 $cliente->setNombreNotificaciones( strtoupper( trim($linea['nombreNotificaciones']??$cliente->__toString()) ) );
  432.                                 $cliente->setDireccionNotificaciones( strtoupper( trim($linea['direccionNotificaciones']) ) );
  433.                                 $cliente->setPoblacionNotificaciones( strtoupper( trim($linea['poblacionNotificaciones']) ) );
  434.                                 $cliente->setCpNotificaciones( strtoupper( trim($linea['cpNotificaciones']) ) );
  435.                                 $cliente->setProvinciaNotificaciones( strtoupper( trim($linea['provinciaNotificaciones']) ) );
  436.                             }
  437.                             $user=$userRepository->findOneBy([ 'username'=>strtoupper($cliente->getNif()) ]);
  438.                             if($user===null){
  439.                                 $user = new User();
  440.                                 $user->setUsername( strtoupper($cliente->getNif()) );
  441.                                 $user->setPassword(
  442.                                     $passwordEncoder->hashPassword(
  443.                                         $user,
  444.                                         strtoupper($cliente->getNif())
  445.                                     )
  446.                                 );
  447.                                 $user->setRoles(["ROLE_USER"]);
  448.                                 $entityManager->persist($user);
  449.                             }
  450.                             $cliente->setUser($user);
  451.                             $entityManager->persist($cliente);
  452.                             $contrato->setCliente($cliente);
  453.                         }
  454.                         else{
  455.                             $contrato->setCliente($cliente);
  456.                         }
  457.                         //Información suministro
  458.                         $suministro=$suministroRepository->findOneBy([ 'cups'=>$linea['cups'] ]);
  459.                         if($suministro===null){
  460.                             $suministro= new Suministro();
  461.                             $suministro->setCups( strtoupper( trim($linea['cups']) ) );
  462.                             $suministro->setTipoVia( $tipoViaRepository->findOneBy([ 'nombre'=>$linea['tipoViaSuministro'] ]) );
  463.                             $suministro->setNombreVia( strtoupper( trim($linea['nombreViaSuministro']) ) );
  464.                             $suministro->setNumeroDireccion( strtoupper(trim($linea['numeroDireccionSuministro']??null)) );
  465.                             $suministro->setEscalera( strtoupper( trim($linea['ecaleraSuministro']??null) ) );
  466.                             $suministro->setPiso( strtoupper( trim($linea['pisoSuministro']??null) ) );
  467.                             $suministro->setPuerta( strtoupper( trim($linea['puertaSuministro']??null) ) );
  468.                             $suministro->setCp( trim($linea['cpSuministro']) );
  469.                             $suministro->setPoblacion( strtoupper( trim($linea['poblacionSuministro']) ) );
  470.                             $suministro->setProvincia( strtoupper( trim($linea['provinciaSuministro']) ) );
  471.                             $suministro->setAlquilerContador( strtoupper( trim($linea['alquilerContador']??0) ) );
  472.                             $suministro->setPotenciaP1( trim($linea['potenciaP1']??null) );
  473.                             $suministro->setPotenciaP2( trim($linea['potenciaP2']??null) );
  474.                             $suministro->setPotenciaP3( trim($linea['potenciaP3']??null) );
  475.                             $suministro->setObservaciones( trim($linea['observacionesSuministro']??null) );
  476.                             $entityManager->persist($suministro);
  477.                             $contrato->setSuministro($suministro);
  478.                         }
  479.                         else{
  480.                             $contrato->setSuministro($suministro);
  481.                         }
  482.                         //Información producto
  483.                         $producto= new Producto();
  484.                         $producto->setNombre('PERSONALIZADO');
  485.                         $producto->setTarifa($tarifaRepository->findOneBy([ 'nombre'=>$linea['tarifa'] ]));
  486.                         $producto->setModalidad($modalidadRepository->findOneBy([ 'nombre'=>$linea['modalidad'] ]));
  487.                         if( $producto->getModalidad()===$modalidadRepository->find(2) ){
  488.                             $producto->setGastoGestion($linea['gastoGestion']??null);
  489.                         }else{
  490.                             $producto->setPrecioEnergiaP1($linea['precioEnergiaP1']??null);
  491.                             $producto->setPrecioEnergiaP2($linea['precioEnergiaP2']??null);
  492.                             $producto->setPrecioEnergiaP3($linea['precioEnergiaP3']??null);
  493.                         }
  494.                         $producto->setPrecioPotenciaP1($linea['precioPotenciaP1']??null);
  495.                         $producto->setPrecioPotenciaP2($linea['precioPotenciaP2']??null);
  496.                         $producto->setPrecioPotenciaP3($linea['precioPotenciaP3']??null);
  497.                         $producto->setDuracion( date_interval_create_from_date_string('1 year') );
  498.                         $producto->setPersonalizado(true);
  499.                         $producto->setFacturaElectronica(false);
  500.                         $entityManager->persist($producto);
  501.                         $contrato->setProducto($producto);
  502.                         //Información contrato
  503.                         $contrato->setReferenciaContrato($linea['referenciaContrato']);
  504.                         $fecha=date_create_from_format('n/j/y',$linea['fecha']);
  505.                         if($fecha!==false){
  506.                             $contrato->setFecha( $fecha );
  507.                         }else{
  508.                             $contrato->setFecha( date_create_from_format('d/m/Y', '09/09/9999') );
  509.                         }
  510.                         if( ($linea['fechaLectura']??null)!==null ){
  511.                             $contrato->setFechaLectura( date_create_from_format('n/j/y',$linea['fechaLectura']) );
  512.                         }
  513.                         $contrato->setComercial($linea['comercial']??null);
  514.                         $contrato->setObservaciones($linea['observacionesContrato']??null);
  515.                         $contrato->setFechaFin(date_create_from_format('n/j/y',$linea['fechaFin']??null));
  516.                         if( ($linea['canal']??'')=='ENERGAZE'||($linea['canal']??'')=='MENERGAZE'){
  517.                             $canal = $canalRepository->findOneBy([ 'nombre'=>$linea['canal'] ]);
  518.                             if($canal!==null){
  519.                                 $contrato->setCanal($canal);
  520.                             }else{
  521.                                 $canal=new Canal();
  522.                                 $canal->setNombre($linea['canal']);
  523.                                 $entityManager->persist($canal);
  524.                                 $contrato->setCanal($canal);
  525.                             }
  526.                         }else{
  527.                             $contrato->setCanal($canalRepository->findOneBy([ 'nombre'=>'MENERGAZE' ]));
  528.                         }
  529.                         $contrato->setProductoProveedor($productoProveedorRepository->findOneBy([ 'nombre'=>$linea['proveedor']??'MENERGAZE' ]));
  530.                         $contrato->setEstado($estadoRepository->findOneBy([ 'nombre'=>$linea['estado']??'VERIFICACIÓN' ]));
  531.                         $contrato->setVisita(false);
  532.                         $contrato->setReferido(false);
  533.                         $contrato->setTipoImpuesto( $tipoImpuestoRepository->findOneBy([ 'nombre'=>$linea['tipoImpuesto']??'Sí' ]) );
  534.                         $errors=$validator->validate($linea['numeroCuenta']??null, [new Iban(), new NotBlank()]);
  535.                         if( count($errors)===0 ){
  536.                             $cuenta=str_replace(' ', '', $linea['numeroCuenta']);
  537.                             $contrato->setIban( strtoupper( substr($cuenta, 0,4) ) );
  538.                             $contrato->setCcc( substr($cuenta, 4) );
  539.                             $contrato->setFormaPago('DOMICILIACION BANCARIA');
  540.                         }else{
  541.                             $contrato->setFormaPago($linea['numeroCuenta']??'SIN DEFINIR');
  542.                         }
  543.                         $entityManager->persist($contrato);
  544.                         $entityManager->flush();
  545.                     }
  546.                 }
  547.                 return $this->render('test/echo.html.twig', [
  548.                     'echo' => ''
  549.                 ]);
  550.                 //return $this->redirectToRoute('contrato_index');
  551.             }
  552.         }
  553.         return $this->render('contrato/importar.html.twig', [
  554.             'form' => $form->createView()
  555.         ]);
  556.     }*/
  557.     /*
  558.      * @Route("/json", name="suministro_json", methods={"GET"})
  559.      *
  560.     public function jsonList(ContratoRepository $contratoRepository)
  561.     {
  562.         $contratos=$contratoRepository->findBy([ 'oculto'=>false ]);
  563.         foreach ($contratos as $contrato){
  564.             $array[]=[
  565.                 "cups"=>$contrato->getSuministro()->getCups(),
  566.                 "dni"=>$contrato->getCliente()->getNif()
  567.             ];
  568.         }
  569.         echo $this->json($array);
  570.     }*/
  571.     /**
  572.      * @Route("/{id}", name="contrato_show", methods={"GET"})
  573.      */
  574.     public function show(Contrato $contratoContratoRepository $contratoRepositoryFacturaRepository $facturaRepository,
  575.                          FacturaGenericaRepository $facturaGenericaRepositoryEntityManagerInterface $entityManager): Response
  576.     {
  577.         if( $contrato->getCliente()->getUser()!=$this->getUser() &&
  578.             ($contrato->getSeller()??new Comercial())->getUser()!=$this->getUser() &&
  579.             !$contrato->getSubseller()->contains$this->getUser()->getComercial() )
  580.         ){
  581.             $this->denyAccessUnlessGranted('ROLE_FACTURACION');
  582.         }
  583.         $facturas=$facturaRepository->findBy(['contrato'=>$contrato]);
  584.         $genericas=$facturaGenericaRepository->findBy(['contrato'=>$contrato]);
  585.         $ultimaLectura=$contratoRepository->findUltimaFechaLectura($contrato);
  586.         $contrato->setUltimaLectura($ultimaLectura);
  587.         $entityManager->flush();
  588.         $facturasFinal=array_merge($facturas,$genericas);
  589.         usort$facturasFinal, function ($a,$b){
  590.             /*$aClass=$a->getClassName();
  591.             $bClass=$b->getClassName();
  592.             if($aClass==$bClass){
  593.                 switch ($aClass){
  594.                     case 'Factura':
  595.                         return date_diff($a->getFechaLectura(),$b->getFechaLectura())->days;
  596.                     case 'FacturaGenerica':
  597.                         return date_diff($a->getFechaEmision(),$b->getFechaEmision())->days;
  598.                 }
  599.             }else{
  600.                 switch ($aClass){
  601.                     case 'Factura':
  602.                         return date_diff($a->getFechaLectura(),$b->getFechaEmision())->days;
  603.                     case 'FacturaGenerica':
  604.                         return date_diff($a->getFechaEmision(),$b->getFechaLectura())->days;
  605.                 }
  606.             }*/
  607.             return date_diff($a->getFechaEmision(),$b->getFechaEmision())->days;
  608.         } );
  609.         return $this->render('contrato/show.html.twig', [
  610.             'facturas'=>array_reverse($facturasFinal),
  611.             'ultimaLectura'=>$ultimaLectura,
  612.             'contrato' => $contrato
  613.         ]);
  614.     }
  615.     /**
  616.      * @Route("/{id}/pdf", name="contrato_pdf", methods={"GET","POST"})
  617.      */
  618.     public function pdf(Contrato $contratoPdf $pdf): Response
  619.     {
  620.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  621.         
  622.         $html=$this->renderView('contrato/contrato.pdf.twig', [
  623.             'contrato' => $contrato
  624.         ]);
  625.        return new PdfResponse(
  626.             $pdf->getOutputFromHtml($html),
  627.             ($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf'
  628.         );
  629.         /*return $this->render('contrato/contrato.pdf.twig', [
  630.             'contrato' => $contrato
  631.         ]);*/
  632.     }
  633.     /**
  634.      * @Route("/{id}/enviar", name="contrato_enviar", methods={"GET","POST"})
  635.      */
  636.     public function enviar(Contrato $contratoPdf $pdf): Response
  637.     {
  638.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  639.         $html=$this->renderView('contrato/contrato.pdf.twig', [
  640.             'contrato' => $contrato
  641.         ]);
  642.         $pdf->generateFromHtml(
  643.             $this->renderView('contrato/contrato.pdf.twig', [
  644.                 'contrato' => $contrato
  645.             ]),
  646.             __DIR__.'/../../temp/'.($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf'
  647.         );
  648.         unlink(__DIR__.'/../../temp/'.($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf');
  649.         return $this->render('test/echo.html.twig', [
  650.             'echo' => __DIR__.'/../../temp/'.($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf'
  651.         ]);
  652.     }
  653.     /**
  654.      * @Route("/{id}/edit", name="contrato_edit", methods={"GET","POST"})
  655.      */
  656.     public function edit(Request $requestContrato $contratoSuministroRepository $suministroRepository,
  657.                          EntityManagerInterface $entityManager): Response
  658.     {
  659.         $this->denyAccessUnlessGranted("ROLE_ALTACOMERCIALES");
  660.         $producto=$contrato->getProducto();
  661.         if($this->isGranted("ROLE_ALTACOMERCIALES")){
  662.             $form $this->createForm(EditarContratoType::class, $contrato);
  663.         }
  664.         else{
  665.             $form $this->createForm(RegistrarContratoType::class, $contrato);
  666.         }
  667.         $form->handleRequest($request);
  668.         if ($form->isSubmitted()) {
  669.             $formData=$form->getData();
  670.             if($formData->getSuministro()==null){
  671.                 $suministro=$form['newSuministro']->getData();
  672.                 if( count($suministroRepository->findBy( ['cups'=>$suministro->getCups()] ))!==){
  673.                     $form->get('newSuministro')->get('cups')->addError(new FormError("Este CUPS ya ha sido registrado en la base de datos"));
  674.                 }
  675.             }
  676.             if($form->isValid()){
  677.                 if($formData->getProducto()==null){
  678.                     $productoNew=$form['newProducto']->getData();
  679.                     $producto->setTarifa($form->get('tarifa')->getData());
  680.                     $producto->setPrecioPotenciaP1$productoNew->getPrecioPotenciaP1() );
  681.                     $producto->setPrecioPotenciaP2$productoNew->getPrecioPotenciaP2() );
  682.                     $producto->setPrecioPotenciaP3$productoNew->getPrecioPotenciaP3() );
  683.                     $producto->setPrecioPotenciaP4$productoNew->getPrecioPotenciaP4() );
  684.                     $producto->setPrecioPotenciaP5$productoNew->getPrecioPotenciaP5() );
  685.                     $producto->setPrecioPotenciaP6$productoNew->getPrecioPotenciaP6() );
  686.                     $producto->setPrecioEnergiaP1$productoNew->getPrecioEnergiaP1() );
  687.                     $producto->setPrecioEnergiaP2$productoNew->getPrecioEnergiaP2() );
  688.                     $producto->setPrecioEnergiaP3$productoNew->getPrecioEnergiaP3() );
  689.                     $producto->setPrecioEnergiaP4$productoNew->getPrecioEnergiaP4() );
  690.                     $producto->setPrecioEnergiaP5$productoNew->getPrecioEnergiaP5() );
  691.                     $producto->setPrecioEnergiaP6$productoNew->getPrecioEnergiaP6() );
  692.                     $producto->setFacturaElectronica$productoNew->getFacturaElectronica() );
  693.                     $contrato->setProducto($producto);
  694.                 }
  695.                 $suministro=$contrato->getSuministro();
  696.                 $suministro->setPotenciaP1($form['potenciaP1']->getData());
  697.                 $suministro->setPotenciaP2($form['potenciaP2']->getData());
  698.                 $suministro->setPotenciaP3($form['potenciaP3']->getData());
  699.                 $suministro->setPotenciaP4($form['potenciaP4']->getData());
  700.                 $suministro->setPotenciaP5($form['potenciaP5']->getData());
  701.                 $suministro->setPotenciaP6($form['potenciaP6']->getData());
  702.                 $contrato->setNumeroCuenta( ($form->get('numeroCuenta')->getData())??'' );
  703.                 //REGISTRAR CAMBIOS
  704.                 $contrato->setCambios$contrato->getCambios().$this->getUser()->getUsername().',' );
  705.                 $entityManager->flush();
  706.                 return $this->redirectToRoute('contrato_show',['id'=>$contrato->getId()]);
  707.             }
  708.         }
  709.         return $this->render('contrato/edit.html.twig', [
  710.             'contrato' => $contrato,
  711.             'contratoForm' => $form->createView(),
  712.             'env' => $_SERVER['APP_ENV']??'finkaluz',
  713.         ]);
  714.     }
  715.     /**
  716.      * @Route("/{id}", name="contrato_delete", methods={"POST"})
  717.      */
  718.     /*public function delete(Request $request, Contrato $contrato): Response
  719.     {
  720.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  721.         if ($this->isCsrfTokenValid('delete'.$contrato->getId(), $request->request->get('_token'))) {
  722.             $entityManager = $this->getDoctrine()->getManager();
  723.             $entityManager->remove($contrato);
  724.             $entityManager->flush();
  725.         }
  726.         return $this->redirectToRoute('contrato_index');
  727.     }*/
  728.     public function delete(Request $requestContrato $contratoContratoRepository $contratoRepository): Response
  729.     {
  730.         if ($this->isCsrfTokenValid('delete'.$contrato->getId(), $request->request->get('_token')))
  731.             $contratoRepository->remove($contratotrue);
  732.         $cache=new FilesystemAdapter();
  733.         $numeroContratos $cache->getItem('numero_contratos');
  734.         $numeroContratos->setcount($contratoRepository->findAll()) );
  735.         $cache->save($numeroContratos);
  736.         return $this->redirectToRoute('contrato_index');
  737.     }
  738.     /**
  739.      * @Route("/{id}/nuevafactura", name="contrato_facturar", methods={"GET","POST"})
  740.      * @Route("/{id}/registrarfactura", name="contrato_registrar_factura", methods={"GET","POST"})
  741.      * @param Request $request
  742.      * @param Contrato $contrato
  743.      * @param ContratoRepository $contratoRepository
  744.      * @param ImpuestoRepository $impuestoRepository
  745.      * @param TipoLecturaRepository $tipoLecturaRepository
  746.      * @param ModalidadRepository $modalidadRepository
  747.      * @param EstadoCompraFacturaRepository $estadoCompraFacturaRepository
  748.      * @param TopeGasRepository $topeGasRepository
  749.      * @param EntityManagerInterface $entityManager
  750.      * @param FacturaRepository $facturaRepository
  751.      * @param FacturaGenericaRepository $facturaGenericaRepository
  752.      * @return Response
  753.      */
  754.     public function nuevaFactura(Request $requestContrato $contratoContratoRepository $contratoRepository,
  755.                                  ImpuestoRepository $impuestoRepositoryTipoLecturaRepository $tipoLecturaRepository,
  756.                                  ModalidadRepository $modalidadRepositoryEstadoCompraFacturaRepository $estadoCompraFacturaRepository,
  757.                                  TopeGasRepository $topeGasRepositoryEntityManagerInterface $entityManager,
  758.                                  FacturaRepository $facturaRepositoryFacturaGenericaRepository $facturaGenericaRepository): Response
  759.     {
  760.         $this->denyAccessUnlessGranted("ROLE_ADMIN");;
  761.         $logger = new Logger('my_logger');
  762.         $logger->pushHandler(new StreamHandler(__DIR__.'/../../logs/facturacion.log'Logger::DEBUG));
  763.         $factura = new Factura();
  764.         //Datos factura
  765.         $producto=$contrato->getProducto();
  766.         $productoProveedor=$contrato->getProductoProveedor();
  767.         $cliente=$contrato->getCliente();
  768.         $suministro=$contrato->getSuministro();
  769.         $estadoCompra=$estadoCompraFacturaRepository->findOneBy(['nombre'=>'Pendiente']);
  770.         $importeTopeGas=$impuestoRepository->findOneBy(['nombre'=>'topeGas'],['fecha'=>'DESC'])->getImporte();
  771.         switch ($_SERVER['APP_ENV']??'finkaluz'){
  772.             case 'digitel':
  773.                 $prefijoFactura='E/'.substr(date('Y'),-2);
  774.                 $n=$facturaRepository->findNumberByYear(date("Y")) + $facturaGenericaRepository->findNumberByYear(date("Y"));
  775.                 do{
  776.                     $n++;
  777.                     $match=!empty($facturaRepository->findBy(['numeroFactura'=>$prefijoFactura.str_pad($n,4,'0',STR_PAD_LEFT)]));
  778.                     if(!$match){
  779.                         $match=!empty($facturaGenericaRepository->findBy(['numeroFactura'=>$n]));
  780.                     }
  781.                 }while($match);
  782.                 $factura->setNumeroFactura($prefijoFactura.str_pad($n4'0'STR_PAD_LEFT));
  783.                 break;
  784.             default:
  785.                 $factura->setNumeroFactura'F-'.$contrato->getReferenciaContrato().date('dmyHi') );
  786.         }
  787.         $factura->setDevuelta(false);
  788.         $factura->setContrato($contrato);
  789.         $factura->setLogoHosteleria($contrato->isLogoHosteleria());
  790.         $factura->setTarifa($producto->getTarifa());
  791.         $factura->setEstadoCompra($estadoCompra);
  792.         if( $producto->getModalidad()!==$modalidadRepository->findOneBy(['nombre'=>'Indexado']) ){
  793.             $factura->setPrecioEnergiaP1($producto->getPrecioEnergiaP1());
  794.             $factura->setPrecioEnergiaP2($producto->getPrecioEnergiaP2());
  795.             $factura->setPrecioEnergiaP3($producto->getPrecioEnergiaP3());
  796.             $factura->setPrecioEnergiaP4($producto->getPrecioEnergiaP4());
  797.             $factura->setPrecioEnergiaP5($producto->getPrecioEnergiaP5());
  798.             $factura->setPrecioEnergiaP6($producto->getPrecioEnergiaP6());
  799.         }
  800.         $factura->setPrecioPotenciaP1($producto->getPrecioPotenciaP1()/365);
  801.         $factura->setPrecioPotenciaP2($producto->getPrecioPotenciaP2()/365);
  802.         $factura->setPrecioPotenciaP3($producto->getPrecioPotenciaP3()/365);
  803.         $factura->setPrecioPotenciaP4($producto->getPrecioPotenciaP4()/365);
  804.         $factura->setPrecioPotenciaP5($producto->getPrecioPotenciaP5()/365);
  805.         $factura->setPrecioPotenciaP6($producto->getPrecioPotenciaP6()/365);
  806.         $factura->setPrecioCompraEnergiaP1($productoProveedor->getPrecioEnergiaP1());
  807.         $factura->setPrecioCompraEnergiaP2($productoProveedor->getPrecioEnergiaP2());
  808.         $factura->setPrecioCompraEnergiaP3($productoProveedor->getPrecioEnergiaP3());
  809.         $factura->setPrecioCompraEnergiaP4($productoProveedor->getPrecioEnergiaP4());
  810.         $factura->setPrecioCompraEnergiaP5($productoProveedor->getPrecioEnergiaP5());
  811.         $factura->setPrecioCompraEnergiaP6($productoProveedor->getPrecioEnergiaP6());
  812.         $factura->setPrecioCompraPotenciaP1($productoProveedor->getPrecioPotenciaP1()/365);
  813.         $factura->setPrecioCompraPotenciaP2($productoProveedor->getPrecioPotenciaP2()/365);
  814.         $factura->setPrecioCompraPotenciaP3($productoProveedor->getPrecioPotenciaP3()/365);
  815.         $factura->setPrecioCompraPotenciaP4($productoProveedor->getPrecioPotenciaP4()/365);
  816.         $factura->setPrecioCompraPotenciaP5($productoProveedor->getPrecioPotenciaP5()/365);
  817.         $factura->setPrecioCompraPotenciaP6($productoProveedor->getPrecioPotenciaP6()/365);
  818.         $factura->setAlquilerEquiposReal($suministro->getAlquilerContadorReal());
  819.         $factura->setPrecioReactivaP1(0);
  820.         $factura->setPrecioReactivaP2(0);
  821.         $factura->setPotenciaP1($suministro->getPotenciaP1());
  822.         $factura->setPotenciaP2($suministro->getPotenciaP2());
  823.         $factura->setPotenciaP3($suministro->getPotenciaP3());
  824.         $factura->setPotenciaP4($suministro->getPotenciaP4());
  825.         $factura->setPotenciaP5($suministro->getPotenciaP5());
  826.         $factura->setPotenciaP6($suministro->getPotenciaP6());
  827.         $factura->setMaximetro($suministro->getMaximetro());
  828.         $factura->setNombreCliente($cliente->__toString());
  829.         $factura->setNifCliente($cliente->getNif());
  830.         $factura->setDireccionCliente($cliente->getDireccion());
  831.         $factura->setCpCliente($cliente->getCp());
  832.         $factura->setPoblacionCliente($cliente->getPoblacion());
  833.         $factura->setProvinciaCliente($cliente->getProvincia());
  834.         $factura->setAlquilerEquipos($suministro->getAlquilerContador());
  835.         $factura->setIban($contrato->getIban());
  836.         $factura->setCcc($contrato->getCcc());
  837.         $factura->setFechaEmision(date_create());
  838.         $factura->setFactorConversion$contrato->getFactorConversion() );
  839.         /*if( $contrato->getProducto()->getTarifa()->getTipoTarifa()->getNombre()=='Gas' ){
  840.             $factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'gas'])->getImporte());
  841.         }
  842.         else{
  843.             if( $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Sí' ]) ||
  844.                 $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Reducido (5%)' ]) ){
  845.                 $factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'electricidad'])->getImporte());
  846.             }elseif( $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Reducido' ]) ){
  847.                 $factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'electricidadReducido'])->getImporte());
  848.             }else{
  849.                 $factura->setImpuesto(0);
  850.             }
  851.         }
  852.         if( $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Reducido (5%)' ]) ){
  853.             $factura->setIva($impuestoRepository->findOneBy(['nombre'=>'ivaDiez'])->getImporte());
  854.         }else {
  855.             $factura->setIva($impuestoRepository->findOneBy(['nombre' => 'iva'])->getImporte());
  856.         }*/
  857.         $factura->setImpuesto($contrato->getTipoImpuesto()->getImpuesto()->getImporte());
  858.         $factura->setIva($contrato->getTipoIva()->getImpuesto()->getImporte());
  859.         if($cliente->getNotificaciones()){
  860.             $factura->setNotificaciones(true);
  861.             $factura->setNombreNotificaciones($cliente->getNombreNotificaciones());
  862.             $factura->setDireccionNotificaciones($cliente->getDireccionNotificaciones());
  863.             $factura->setCpNotificaciones($cliente->getCpNotificaciones());
  864.             $factura->setPoblacionNotificaciones($cliente->getPoblacionNotificaciones());
  865.             $factura->setProvinciaNotificaciones($cliente->getProvinciaNotificaciones());
  866.         }
  867.         else{
  868.             $factura->setNotificaciones(false);
  869.         }
  870.         $ultimaLectura=$contratoRepository->findUltimaLectura($contrato);
  871.         if( !empty($ultimaLectura) ){
  872.             $factura->setLecturaAnteriorP1($ultimaLectura['P1']);
  873.             $factura->setLecturaAnteriorP2($ultimaLectura['P2']);
  874.             $factura->setLecturaAnteriorP3($ultimaLectura['P3']);
  875.             $factura->setLecturaAnteriorP4($ultimaLectura['P4']);
  876.             $factura->setLecturaAnteriorP5($ultimaLectura['P5']);
  877.             $factura->setLecturaAnteriorP6($ultimaLectura['P6']);
  878.             $factura->setLecturaReactivaAnteriorP1($ultimaLectura['RP1']);
  879.             $factura->setLecturaReactivaAnteriorP2($ultimaLectura['RP2']);
  880.             $factura->setLecturaReactivaAnteriorP3($ultimaLectura['RP3']);
  881.             $factura->setLecturaReactivaAnteriorP4($ultimaLectura['RP4']);
  882.             $factura->setLecturaReactivaAnteriorP5($ultimaLectura['RP5']);
  883.             $factura->setLecturaReactivaAnteriorP6($ultimaLectura['RP6']);
  884.             $factura->setFechaLecturaAnterior$ultimaLectura['fecha'] );
  885.             $factura->setTipoLecturaAnterior($ultimaLectura['tipo']);
  886.         }
  887.         if( $contrato->getFacturaDevuelta() ){
  888.             $concepto=new Concepto();
  889.             $concepto->setNombre("Factura devuelta");
  890.             $concepto->setImporte$impuestoRepository->findOneBy(['nombre'=>'facturaDevuelta'])->getImporte() );
  891.             $factura->addConcepto($concepto);
  892.         }
  893.         //Fin datos factura
  894.         if( $request->getPathInfo()==$this->generateUrl('contrato_facturar',['id'=>$contrato->getId()]) ){
  895.             $form $this->createForm(FacturaFromContratoType::class, $factura);
  896.         }else{
  897.             $form $this->createForm(FacturaType::class, $factura);
  898.         }
  899.         $form->handleRequest($request);
  900.         if ($form->isSubmitted() && $form->isValid()) {
  901.             $tarifa=$contrato->getProducto()->getTarifa();
  902.             try{
  903.                 $tarifaFactura=$form->get('tarifa')->getData()??$tarifa;
  904.             }catch (\Exception $e){
  905.                 $tarifaFactura=$tarifa;
  906.             }
  907.             if($tarifa!==$tarifaFactura){
  908.                 $factura->setTipoLecturaAnterior($tipoLecturaRepository->findOneBy([ 'nombre'=>'Real' ]));
  909.                 $producto->setTarifa$tarifaFactura );
  910.                 $producto->setPrecioPotenciaP1$form->get('precioPotenciaP1')->getData()*365 );
  911.                 $producto->setPrecioPotenciaP2$form->get('precioPotenciaP2')->getData()*365 );
  912.                 $producto->setPrecioPotenciaP3$form->get('precioPotenciaP3')->getData()*365 );
  913.                 $producto->setPrecioPotenciaP4$form->get('precioPotenciaP4')->getData()*365 );
  914.                 $producto->setPrecioPotenciaP5$form->get('precioPotenciaP5')->getData()*365 );
  915.                 $producto->setPrecioPotenciaP6$form->get('precioPotenciaP6')->getData()*365 );
  916.                 $producto->setPrecioEnergiaP1$form->get('precioEnergiaP1')->getData() );
  917.                 $producto->setPrecioEnergiaP2$form->get('precioEnergiaP2')->getData() );
  918.                 $producto->setPrecioEnergiaP3$form->get('precioEnergiaP3')->getData() );
  919.                 $producto->setPrecioEnergiaP4$form->get('precioEnergiaP4')->getData() );
  920.                 $producto->setPrecioEnergiaP5$form->get('precioEnergiaP5')->getData() );
  921.                 $producto->setPrecioEnergiaP6$form->get('precioEnergiaP6')->getData() );
  922.                 $entityManager->flush();
  923.             }else{
  924.                 /*if( !empty($ultimaLectura) ){
  925.                     $factura->setLecturaAnteriorP1($ultimaLectura['P1']);
  926.                     $factura->setLecturaAnteriorP2($ultimaLectura['P2']);
  927.                     $factura->setLecturaAnteriorP3($ultimaLectura['P3']);
  928.                     $factura->setLecturaAnteriorP4($ultimaLectura['P4']);
  929.                     $factura->setLecturaAnteriorP5($ultimaLectura['P5']);
  930.                     $factura->setLecturaAnteriorP6($ultimaLectura['P6']);
  931.                     $factura->setFechaLecturaAnterior($ultimaLectura['fecha']);
  932.                     $factura->setTipoLecturaAnterior($ultimaLectura['tipo']);
  933.                 }else{*/
  934.                     $factura->setTipoLecturaAnterior($tipoLecturaRepository->findOneBy([ 'nombre'=>'Real' ]));
  935.                 //}
  936.             }
  937.             $factura->setTarifa($tarifaFactura);
  938.             $tarifaFinal=$tarifaFactura->getNombre();
  939.             if( $tarifaFinal=='3.0A'||$tarifaFinal=='3.1A' ){
  940.                 $cosFiP1=( $factura->getConsumoP1()+$factura->getConsumoP4() )/sqrtpow($factura->getConsumoP1()+$factura->getConsumoP4(),2)+pow($factura->getReactivaP1()+$factura->getReactivaP4(),2) );
  941.                 $cosFiP2=( $factura->getConsumoP2()+$factura->getConsumoP5() )/sqrtpow($factura->getConsumoP2()+$factura->getConsumoP5(),2)+pow($factura->getReactivaP2()+$factura->getReactivaP5(),2) );
  942.                 if($cosFiP1<0.8){
  943.                     $factura->setPrecioReactivaP1($impuestoRepository->findOneBy([ 'nombre'=>'reactivaAlto' ])->getImporte());
  944.                 }elseif($cosFiP1<=0.95){
  945.                     $factura->setPrecioReactivaP1($impuestoRepository->findOneBy([ 'nombre'=>'reactivaBajo' ])->getImporte());
  946.                 }
  947.                 if($cosFiP2<0.8){
  948.                     $factura->setPrecioReactivaP2($impuestoRepository->findOneBy([ 'nombre'=>'reactivaAlto' ])->getImporte());
  949.                 }elseif($cosFiP2<=0.95){
  950.                     $factura->setPrecioReactivaP2($impuestoRepository->findOneBy([ 'nombre'=>'reactivaBajo' ])->getImporte());
  951.                 }
  952.                 $reactivaP1=$factura->getPrecioReactivaP1();
  953.                 $reactivaP2=$factura->getPrecioReactivaP2();
  954.                 if ($reactivaP1>$reactivaP2){
  955.                     $factura->setPrecioReactivaP2($reactivaP1);
  956.                 }elseif ($reactivaP2>$reactivaP1){
  957.                     $factura->setPrecioReactivaP1($reactivaP2);
  958.                 }
  959.             }
  960.             else{
  961.                 $precioMax=0;
  962.                 for($i=$i<$i++){
  963.                     $getReactiva='getReactivaP'.$i;
  964.                     if( $tarifa->$getReactiva()){
  965.                         $getConsumo='getConsumoP'.$i;
  966.                         $setPrecio='setPrecioReactivaP'.$i;
  967.                         $getPrecio='getPrecioReactivaP'.$i;
  968.                         try{
  969.                             $cosFi=$factura->$getConsumo()/sqrtpow($factura->$getConsumo(),2)+pow($factura->$getReactiva(),2) );
  970.                         }catch (\Exception $exception){
  971.                             $cosFi=1;
  972.                         }
  973.                         if($cosFi<0.8){
  974.                             $factura->$setPrecio($impuestoRepository->findOneBy([ 'nombre'=>'reactivaAlto' ])->getImporte());
  975.                         }elseif($cosFi<=0.95){
  976.                             $factura->$setPrecio($impuestoRepository->findOneBy([ 'nombre'=>'reactivaBajo' ])->getImporte());
  977.                         }
  978.                         $precioMax=max($factura->$getPrecio(), $precioMax);
  979.                     }
  980.                 }
  981.                 for($i=$i<$i++){
  982.                     $getReactiva='getReactivaP'.$i;
  983.                     if( $tarifa->$getReactiva()){
  984.                         $setPrecio='setPrecioReactivaP'.$i;
  985.                         $getPrecio='getPrecioReactivaP'.$i;
  986.                         if( ($factura->$getPrecio()??0)!=){
  987.                             $factura->$setPrecio($precioMax);
  988.                         }
  989.                     }
  990.                 }
  991.             }
  992.             $factura->calcularTotal();
  993.             if( $request->getPathInfo()==$this->generateUrl('contrato_facturar',['id'=>$contrato->getId()])){
  994.                 //Bono social
  995.                 if( $form->get('bonoSocial')->getData() ){
  996.                     $bonoSocial=new Concepto();
  997.                     $importeBonoSocial=$impuestoRepository->findOneBy(['nombre'=>'bonoSocial'],['fecha'=>'DESC'])->getImporte();
  998.                     $periodoFacturacion=$factura->getPeriodoFacturacion();
  999.                     $bonoSocial->setNombre('Financiación del Bono Social  '.($periodoFacturacion-1).' x '.str_replace('.',',',(float)$importeBonoSocial).' €/día');
  1000.                     $bonoSocial->setImporte(($periodoFacturacion-1)*$importeBonoSocial);
  1001.                     $factura->addConcepto($bonoSocial);
  1002.                 }
  1003.                 //Tope de gas
  1004.                 $hasTopeGas=$form->get('topeGas')->getData();
  1005.                 $hasTopeGasREE=$form->get('topeGasREE')->getData();
  1006.                 if( $hasTopeGas || $hasTopeGasREE ){
  1007.                     $consumoTotal=$factura->getConsumo();
  1008.                     if($consumoTotal!=0){
  1009.                         if ($hasTopeGasREE){
  1010.                             $topeGasREE=new Concepto();
  1011.                             $precioTopeGasREE=$impuestoRepository->findOneBy(['nombre'=>'topeGasREE'])->getImporte();
  1012.                             $topeGasREE->setNombre('Coste tope del gas RDL10/2022 REE '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$precioTopeGasREE).' €/kWh');
  1013.                             $topeGasREE->setImporte($consumoTotal*$precioTopeGasREE);
  1014.                             $factura->addConcepto($topeGasREE);
  1015.                         }
  1016.                         if ($hasTopeGas){
  1017.                             $topeGas=new Concepto();
  1018.                             $topeGasAuto=$form->get('topeGasAuto')->getData();
  1019.                             //Tope de gas auto
  1020.                             if($topeGasAuto){
  1021.                                 $porcentajeP=[];
  1022.                                 $valorTopeGasP=[];
  1023.                                 for ($i=1;$i<=6;$i++){
  1024.                                     $valorTopeGasP[$i]=$impuestoRepository->findOneBy(['nombre'=>'valorTopeGasP'.$i])->getImporte();
  1025.                                 }
  1026.                                 $porcentajeP[1]=$factura->getConsumoP1()/$consumoTotal;
  1027.                                 $porcentajeP[2]=$factura->getConsumoP2()/$consumoTotal;
  1028.                                 $porcentajeP[3]=$factura->getConsumoP3()/$consumoTotal;
  1029.                                 $porcentajeP[4]=$factura->getConsumoP4()/$consumoTotal;
  1030.                                 $porcentajeP[5]=$factura->getConsumoP5()/$consumoTotal;
  1031.                                 $porcentajeP[6]=$factura->getConsumoP6()/$consumoTotal;
  1032.                                 $periodoFacturacion=$factura->getPeriodoFacturacion();
  1033.                                 $importesTopeGas=$topeGasRepository->createQueryBuilder('topeGas')
  1034.                                     ->select('topeGas.importe')
  1035.                                     ->andWhere('topeGas.fecha>=:lecturaAnterior')
  1036.                                     ->andWhere('topeGas.fecha<=:fechaLectura')
  1037.                                     ->setParameter('lecturaAnterior',$factura->getFechaLecturaAnterior())
  1038.                                     ->setParameter('fechaLectura',$factura->getFechaLectura())
  1039.                                     ->getQuery()->getArrayResult();
  1040.                                 foreach ($importesTopeGas as $key=>$item){
  1041.                                     $importesTopeGas[$key]=$item['importe'];
  1042.                                 }
  1043.                                 while (count($importesTopeGas)<$periodoFacturacion){
  1044.                                     $importesTopeGas[]=0;
  1045.                                 }
  1046.                                 $importeTopeGasTemp=round((array_sum($importesTopeGas) / count($importesTopeGas))+0.018301,5);
  1047.                                 $importeTopeGasFinal=0;
  1048.                                 for ($i=1;$i<=6;$i++){
  1049.                                     $importeTopeGasFinal+=round($importeTopeGasTemp*$porcentajeP[$i]*$valorTopeGasP[$i],5);
  1050.                                 }
  1051.                             }
  1052.                             else{
  1053.                                 $importeTopeGasFinal=($form->get('topeGasValue')->getData()??$importeTopeGas);
  1054.                             }
  1055.                             $topeGas->setNombre('Coste tope del gas RD 10/2022  '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$importeTopeGasFinal).' €/kWh');
  1056.                             $topeGas->setImporte($consumoTotal*$importeTopeGasFinal);
  1057.                             $factura->addConcepto($topeGas);
  1058.                         }
  1059.                     }
  1060.                     else{
  1061.                         if ($hasTopeGasREE){
  1062.                             $topeGasREE=new Concepto();
  1063.                             $precioTopeGasREE=0;
  1064.                             $topeGasREE->setNombre('Coste tope del gas RDL10/2022 REE '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$precioTopeGasREE).' €/kWh');
  1065.                             $topeGasREE->setImporte($consumoTotal*$precioTopeGasREE);
  1066.                             $factura->addConcepto($topeGasREE);
  1067.                         }
  1068.                         if ($hasTopeGas){
  1069.                             $topeGas=new Concepto();
  1070.                             $precioTopeGas=0;
  1071.                             $topeGas->setNombre('Coste tope del gas RD 10/2022 '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$precioTopeGas).' €/kWh');
  1072.                             $topeGas->setImporte($consumoTotal*$precioTopeGas);
  1073.                             $factura->addConcepto($topeGas);
  1074.                         }
  1075.                     }
  1076.                 }
  1077.             }
  1078.             $entityManager->persist($factura);
  1079.             $entityManager->flush();
  1080.             $contrato->setUltimaLectura$contratoRepository->findUltimaLectura($contrato)['fecha'] );
  1081.             $contrato->setFacturaDevueltafalse );
  1082.             $entityManager->persist($contrato);
  1083.             $entityManager->flush();
  1084.             $logger->info('Factura '.$factura->getId().' creada por usuario '.$this->getUser()->getUserIdentifier());
  1085.             return $this->redirectToRoute('factura_show',['id'=>$factura->getId()]);
  1086.         }
  1087.         return $this->render('factura/new.html.twig', [
  1088.             'factura' => $factura,
  1089.             'contrato'=>$contrato,
  1090.             'form' => $form->createView(),
  1091.             'devueltaImporte'=>$impuestoRepository->findOneBy(['nombre'=>'facturaDevuelta'])->getImporte(),
  1092.             'topeGas'=>$importeTopeGas
  1093.         ]);
  1094.     }
  1095.     /**
  1096.      * @Route("/{id}/otrosconceptos", name="contrato_otrosConceptos", methods={"GET","POST"})
  1097.      */
  1098.     public function otrosConceptos(Request $requestContrato $contratoManagerRegistry $doctrine,
  1099.                                    FacturaRepository $facturaRepositoryFacturaGenericaRepository $facturaGenericaRepository): Response
  1100.     {
  1101.         $this->denyAccessUnlessGranted("ROLE_ADMIN");
  1102.         $factura = new FacturaGenerica();
  1103.         //Datos factura
  1104.         $cliente=$contrato->getCliente();
  1105.         $factura->setContrato($contrato);
  1106.         $factura->setLogoHosteleria($contrato->isLogoHosteleria());
  1107.         $factura->setTarifa($contrato->getProducto()->getTarifa());
  1108.         $factura->setPotenciaP1($contrato->getSuministro()->getPotenciaP1());
  1109.         $factura->setPotenciaP2($contrato->getSuministro()->getPotenciaP2());
  1110.         $factura->setPotenciaP3($contrato->getSuministro()->getPotenciaP3());
  1111.         $factura->setPotenciaP4($contrato->getSuministro()->getPotenciaP4());
  1112.         $factura->setPotenciaP5($contrato->getSuministro()->getPotenciaP5());
  1113.         $factura->setPotenciaP6($contrato->getSuministro()->getPotenciaP6());
  1114.         $factura->setNombreCliente($cliente->__toString());
  1115.         $factura->setNifCliente($cliente->getNif());
  1116.         $factura->setDireccionCliente($cliente->getDireccion());
  1117.         $factura->setCpCliente($cliente->getCp());
  1118.         $factura->setPoblacionCliente($cliente->getPoblacion());
  1119.         $factura->setProvinciaCliente($cliente->getProvincia());
  1120.         $factura->setIban($contrato->getIban());
  1121.         $factura->setCcc($contrato->getCcc());
  1122.         $factura->setFechaEmision(date_create());
  1123.         if($cliente->getNotificaciones()){
  1124.             $factura->setNotificaciones(true);
  1125.             $factura->setNombreNotificaciones($cliente->getNombreNotificaciones());
  1126.             $factura->setDireccionNotificaciones($cliente->getDireccionNotificaciones());
  1127.             $factura->setCpNotificaciones($cliente->getCpNotificaciones());
  1128.             $factura->setPoblacionNotificaciones($cliente->getPoblacionNotificaciones());
  1129.             $factura->setProvinciaNotificaciones($cliente->getProvinciaNotificaciones());
  1130.         }
  1131.         else{
  1132.             $factura->setNotificaciones(false);
  1133.         }
  1134.         do{
  1135.                 switch ($_SERVER['APP_ENV']??'finkaluz'){
  1136.                     case 'digitel':
  1137.                         $prefijoFactura='E/'.substr(date('Y'),-2);
  1138.                         $n=$facturaRepository->findNumberByYear(date("Y")) + $facturaGenericaRepository->findNumberByYear(date("Y"));
  1139.                         do{
  1140.                             $n++;
  1141.                             $match=!empty($facturaRepository->findBy(['numeroFactura'=>$prefijoFactura.str_pad($n,4,'0',STR_PAD_LEFT)]));
  1142.                             if(!$match){
  1143.                                 $match=!empty($facturaGenericaRepository->findBy(['numeroFactura'=>$n]));
  1144.                             }
  1145.                         }while($match);
  1146.                         $factura->setNumeroFactura($prefijoFactura.str_pad($n4'0'STR_PAD_LEFT));
  1147.                         break;
  1148.                     default:
  1149.                         try{
  1150.                         $factura->setNumeroFactura('F-'.$contrato->getReferenciaContrato().date('dmyHi').random_int(1,999));
  1151.                         }catch (\Exception $exception){
  1152.                             $factura->setNumeroFactura('F-'.$contrato->getReferenciaContrato().date('dmyHi').'8');
  1153.                         }
  1154.                 }
  1155.         }while( $doctrine->getRepository(FacturaGenerica::class)->findBy(['numeroFactura'=>$factura->getNumeroFactura()])  !=  null );
  1156.         //Fin datos factura
  1157.         $form $this->createForm(FacturaGenericaType::class, $factura);
  1158.         $form->handleRequest($request);
  1159.         if ($form->isSubmitted() && $form->isValid()) {
  1160.             $entityManager $doctrine->getManager();
  1161.             $factura->calcularTotal();
  1162.             $entityManager->persist($factura);
  1163.             $entityManager->flush();
  1164.             return $this->redirectToRoute('facturaGenerica_show',['id'=>$factura->getId()]);
  1165.         }
  1166.         return $this->render('factura_generica/new.html.twig', [
  1167.             'factura' => $factura,
  1168.             'contrato'=>$contrato,
  1169.             'form' => $form->createView(),
  1170.         ]);
  1171.     }
  1172.     /**
  1173.      * @Route("/{id}/facturas", name="contrato_facturas", methods={"GET","POST"})
  1174.      */
  1175.     public function facturas(Contrato $contratoFacturaRepository $facturaRepositoryFacturaGenericaRepository $facturaGenericaRepository): Response
  1176.     {
  1177.         if( !$this->isGranted('ROLE_ADMIN') &&
  1178.             !$this->getUser()->getCliente()->getContratos()->contains($contrato) &&
  1179.             !$this->getUser()->getComercial()->getContratos()->contains($contrato) )
  1180.         {
  1181.             $this->createAccessDeniedException();
  1182.         }
  1183.         return $this->render('factura/index.html.twig', [
  1184.             'contrato' => $contrato,
  1185.             'facturas' => array_merge$facturaRepository->findBy([ 'contrato'=>$contrato ]),$facturaGenericaRepository->findBy(['contrato'=>$contrato]) )
  1186.         ]);
  1187.     }
  1188.     /** Comparar fechas factura **/
  1189.     private function compare($a$b){
  1190.         /*$aClass=str_replace('/App/Entity/','',get_class($a));
  1191.         $bClass=str_replace('/App/Entity/','',get_class($b));
  1192.         if($aClass==$bClass){
  1193.             switch ($aClass){
  1194.                 case 'Factura':
  1195.                     return date_diff($a->getFechaEmision(),$b->getFechaEmision());
  1196.                     break;
  1197.             }
  1198.         }*/
  1199.         return date_diff($a->getFechaEmision(),$b->getFechaEmision());
  1200.     }
  1201. }