src/Controller/HomeController.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. class HomeController extends BaseController
  7. {
  8.     const ERROR_INVALID_CUPS 1;
  9.     const ERROR_CUPS_KWHANUAL 2;
  10.     const ERROR_CUPS_TARIFA 3;
  11.     const ERROR_OFERTA_ACTIVA 4;
  12.     const ERROR_CUPS_TARIFA_INVALIDA 5;
  13.     const ERROR_CUPS_SIN_DIRECCION 6;
  14.     const ERROR_CLIENTE_SIN_NUMERO_DOCUMENTO 7;
  15.     /**
  16.      * @Route("/", name="index")
  17.      * @return Response
  18.      */
  19.     public function index(): Response
  20.     {
  21.         return $this->redirectToRoute("login");
  22.     }
  23.     /**
  24.      * @Route("/calculadora", name="calculadora")
  25.      * @param Request $request
  26.      * @return Response
  27.      */
  28.     public function calculadora(Request $request): Response
  29.     {
  30.         if (!$this->checkUser()) {
  31.             return $this->redirectToRoute("login");
  32.         }
  33.         $this->resetSession();
  34.         $this->addRequestData($request);
  35.         $this->addData("sinCups"$request->get("sinCups"false));
  36.         $cupsError $request->get("cupsError"0);
  37.         $this->addData("cupsError", (int)$cupsError);
  38.         return $this->render("calculadora.html.twig"$this->getData());
  39.     }
  40.     /**
  41.      * @Route("/datos", name="datos")
  42.      * @param Request $request
  43.      * @return Response
  44.      */
  45.     public function datos(Request $request): Response
  46.     {
  47.         // Reiniciamos la sesión y recogemos los valores del formulario
  48.         if ($request->get("cups")) {
  49.             $this->resetSession(["cups""tipoFactura"]);
  50.         } else {
  51.             $this->resetSession(["cups""dni""cif""tipoFactura""suministro""kWhAnual""tarifa"]);
  52.         }
  53.         $cups $request->get("cups"$this->session->get("cups"));
  54.         $dni $request->get("dni"$this->session->get("dni"));
  55.         $cif $request->get("cif"$this->session->get("cif"));
  56.         $tipoFactura $request->get("tipoFactura"$this->session->get("tipoFactura"));
  57.         $this->addData("tipoFactura"$tipoFactura);
  58.         $this->addData("tipoHogar"$tipoFactura === self::TIPO_HOGAR);
  59.         $this->addData("tipoEmpresa"$tipoFactura === self::TIPO_EMPRESA);
  60.         $error $request->getSession()->getBag("flashes")->get("error");
  61.         if (!empty($error)) {
  62.             $this->addData("error"end($error));
  63.         }
  64.         if (!$this->checkUser() || !$tipoFactura) {
  65.             return $this->redirectToRoute("login");
  66.         }
  67.         // Comprobamos si tiene oferta activa
  68.         if ($cups && $ofertaActiva $this->service->getOfertaActiva($cups)) {
  69.             $this->session->set("oferta"$ofertaActiva[0]);
  70.             $this->addRequestData($request);
  71.             if($ofertaActiva[0]->tipoClienteEnergia == "EMPRESA"){
  72.                 $this->addData("tipoFactura",self::TIPO_EMPRESA);
  73.             } else {
  74.                 $this->addData("tipoFactura",self::TIPO_HOGAR);
  75.             }
  76.             // Antes de establecer los datos del suministro se verifica que existan en el SIPS
  77.             // De existir se utilizarán esos, ya que están más actualizados.
  78.             $data $this->service->cupsData($cups);
  79.             if($data && isset($data->suministros)){
  80.                 $this->setDataCUPS($data->suministros[0]);
  81.             } else {
  82.                 $this->setDataCUPS(json_decode(json_encode($ofertaActiva[0]->cup), true));
  83.             }
  84.             // Se establece si tiene un estado anterior a la firma otp configurada
  85.             $response $this->service->comprobarEstadoAnteriorAFirmaOTP($ofertaActiva);
  86.             // Decodificación de la respuesta
  87.             $dataEstadoAnterior json_decode($response);
  88.             if($dataEstadoAnterior != null){
  89.                 if ($dataEstadoAnterior->codigo == 200) {
  90.                     // Si la respuesta es correcta se establece el valor (true/false)
  91.                     $this->addData("existeFirmaOTP",!$dataEstadoAnterior->object);
  92.                     $this->addData("cuotadia"$ofertaActiva[0]->cuota);
  93.                     $this->addData("cuota"$ofertaActiva[0]->cuota);
  94.                     $cuotames round(($ofertaActiva[0]->cuota 365) / 122);
  95.                     $this->addData("cuotames"$cuotames);
  96.                     $this->addData("consumo"$ofertaActiva[0]->consumoAnual 1000);
  97.                 } else {
  98.                     // Si no es correcto se muestra el error y se procede a recargar la página
  99.                     return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_OFERTA_ACTIVA,"cupsErrorMessage"=>$dataEstadoAnterior->mensaje]);
  100.                 }
  101.                 if (isset($ofertaActiva[0]->cliente->numDocumentacion)) {
  102.                     $this->addData("client",$ofertaActiva[0]->cliente);
  103.                 } else {
  104.                     // Si el cliente no tiene asignado el número de documento se muestra un error.
  105.                     return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CLIENTE_SIN_NUMERO_DOCUMENTO]);
  106.                 }
  107.                 return $this->redirectToRoute("oferta_activa");
  108.             }
  109.         }
  110.         // Si no tiene oferta activa, recogemos el suministro
  111.         if ($cups) {
  112.             $tarifasValidas = ["2.0TD""3.0TD""6.1TD"];
  113.             // Antes de establecer los datos del suministro se verifica que existan en el SIPS
  114.             // De existir se utilizarán esos, ya que están más actualizados.
  115.             $sipsDataValid false;
  116.             $data $this->service->cupsData($cups);
  117.             if($data && isset($data->suministros)){
  118.                 $suministro $data->suministros[0];
  119.                 // Verifico que estén los datos necesarios del SIPS.
  120.                 // De no estarlo miro si puedo sacarlos de BU.
  121.                 if (!isset($suministro->kWhAnual) && !empty($this->getData("kWhAnual"))) {
  122.                     $suministro->kWhAnual $this->getData('kWhAnual');
  123.                 }
  124.                 if (!isset($suministro->Tarifa) && !empty($this->getData('tarifa'))) {
  125.                     $suministro->Tarifa $this->getData('tarifa');
  126.                 }
  127.                 // Si estan los dos datos necesarios indico que los datos del SIPS son validos.
  128.                 if (isset($suministro->kWhAnual) && isset($suministro->Tarifa)) {
  129.                     // Ante de darlo por valido verifico que el valor de la tarifa sea valido.
  130.                     if (in_array($suministro->Tarifa$tarifasValidas)) {
  131.                         $this->checkCodigoPostal($data);
  132.                         $sipsDataValid true;
  133.                         $this->setDataCUPS($suministro);
  134.                     }
  135.                 }
  136.             }
  137.             // Si lo datos del SIPS no son validos se seleccionan los de BU.
  138.             if (!$sipsDataValid) {
  139.                 $cupsData $this->service->checkCUPS($cups);
  140.                 if ($cupsData) {
  141.                     $this->setDataCUPS($cupsData);
  142.                 }
  143.                 // Verifico que estén los datos necesarios de BU.
  144.                 if (!$this->getData("suministro") || is_array($this->getData("suministro"))
  145.                     && !array_key_exists("direcciones"$this->getData("suministro"))
  146.                     || empty($this->getData("kWhAnual"))
  147.                     || empty($this->getData("tarifa"))) {
  148.                     // Si no están muestro el error correspondiente.
  149.                     if(is_array($this->getData("suministro")) && empty($this->getData("kWhAnual"))){
  150.                         return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_KWHANUAL]);
  151.                     }
  152.                     if(is_array($this->getData("suministro")) && empty($this->getData("tarifa"))){
  153.                         return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_TARIFA]);
  154.                     }
  155.                     if (is_array($this->getData("suministro")) && !in_array($this->getData("tarifa"), $tarifasValidas)) {
  156.                         return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_TARIFA_INVALIDA]);
  157.                     }
  158.                     if(is_array($this->getData("suministro")) && empty($this->getData("direcciones"))){
  159.                         return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_SIN_DIRECCION]);
  160.                     }
  161.                     return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_INVALID_CUPS]);
  162.                 }
  163.             }
  164.             // Procedemos a intentar actualizar los valores del CUPS almacenado en BU (Evolutivo 4)
  165.             if($data && isset($data->suministros)){
  166.                 $this->service->ModifyCupsWithoutDirection($cups$data->suministros[0]);
  167.             }
  168.         }
  169.         // Recogemos los datos del cliente
  170.         if ($dni || $cif) {
  171.             $data $this->service->getClientData($dni$cif);
  172.             $redata false;
  173.             if (!$data) {
  174.                 $redata $this->service->getClientData($cif$dni);
  175.             }
  176.             if ($dni) {
  177.                 $this->addData("dniError"$redata);
  178.             } else {
  179.                 $this->addData("cifError"$redata);
  180.             }
  181.             if (!$data && !$redata) {
  182.                 $this->addData("nuevoCliente"true);
  183.             }
  184.             $clienteJson $data ?: [];
  185.             // Actualizamos la dirección con la del CUPS (Nemon o BU)
  186.             $clienteJson $this->service->updateAddress($this->getData(), $clienteJson);
  187.             // En caso de que el cliente exista, actualizamos su info en sesión
  188.             if ($data) {
  189.                 $this->addData("contacto"$clienteJson);
  190.             }
  191.             // En caso de que el CUPS exista en Nemon y esté cualificado, actualizamos la info en sesión
  192.             if (array_key_exists("cupsCualificado"$clienteJson) && $clienteJson["cupsCualificado"]) {
  193.                 $this->addData("cupsCualificado"$clienteJson);
  194.             }
  195.             if (array_key_exists("tieneDelegacion"$clienteJson) && !$clienteJson["tieneDelegacion"]) {
  196.                 $this->addData("sinDelegacion"true);
  197.             }
  198.             if (array_key_exists("usuarios"$clienteJson) && $clienteJson["usuarios"]) {
  199.                 foreach ($clienteJson["usuarios"] as $contacto) {
  200.                     if($contacto["esFiscal"]){
  201.                         $this->addData("tieneContactoFiscal",true);
  202.                         $this->addData("contactoFiscal",$contacto);
  203.                         if(array_key_exists("numeroDocumento",$contacto)){
  204.                             $this->addData("contactoFiscalTieneDocumento",true);
  205.                         }
  206.                     }
  207.                 }
  208.             } else {
  209.                 $this->addData("sinContactos",true);
  210.             }
  211.         }
  212.         $this->addRequestData($request);
  213.         $this->addData("tiposVia"$this->service->getTiposVia());
  214.         // Si no hay datos del CUPS se traen los datos del sips y se establecen para mostrarlos
  215.         if($this->getData("suministro")){
  216.             $data $this->service->cupsData($cups);
  217.             if($data != null){
  218.                 // Comprobar que esos datos del SIPS existen en BU, ya que si no existen
  219.                 // se crea una dirección incorrecta en BU, con campos de dirección cuyo valor
  220.                 // no existe en la base de datos de BU.
  221.                 $this->checkCodigoPostal($data);
  222.             }
  223.         }
  224.         return $this->render("datos.html.twig"$this->getData());
  225.     }
  226.     /**
  227.      * @Route("/facturas", name="facturas")
  228.      * @param Request $request
  229.      * @return Response
  230.      */
  231.     public function facturas(Request $request): Response
  232.     {
  233.         if (!$this->checkUser() || !$this->checkBasics($this->getData())) {
  234.             return $this->redirectToRoute("login");
  235.         }
  236.         if ($this->getData("contacto")) {
  237.             $dni $this->getData("dni");
  238.             $cif $this->getData("cif");
  239.             $contactoFiscal $this->getData("contactoFiscal");
  240.             if($this->getData("sinContactos")
  241.                 || $contactoFiscal != null
  242.                 && (!array_key_exists("id",$contactoFiscal) || $contactoFiscal["id"] != $request->get('contact-id')
  243.                 || !array_key_exists("nombre",$contactoFiscal) || $contactoFiscal["nombre"] != $request->get('contact-nombre')
  244.                 || !array_key_exists("apellido1",$contactoFiscal) || $contactoFiscal["apellido1"] != $request->get('contact-apellido1')
  245.                 || !array_key_exists("apellido2",$contactoFiscal) || $contactoFiscal["apellido2"] != $request->get('contact-apellido2')
  246.                 || !array_key_exists("email",$contactoFiscal) || $contactoFiscal["email"] != $request->get('contact-email')
  247.                 || !array_key_exists("movil",$contactoFiscal) || $contactoFiscal["movil"] != $request->get('contact-movil')
  248.                 || !array_key_exists("telefono",$contactoFiscal) || $contactoFiscal["telefono"] != $request->get('contact-telefono')
  249.                 || !array_key_exists("numeroDocumento",$contactoFiscal) || $contactoFiscal["numeroDocumento"] != $request->get('contact-documento'))){
  250.                 // Modificamos el contacto fiscal con los nuevos datos
  251.                 $contactoFiscal = [];
  252.                 $contactoFiscal["id"] = $request->get("contact-id");
  253.                 $contactoFiscal["nombre"] = $request->get("contact-nombre");
  254.                 $contactoFiscal["apellido1"] = $request->get("contact-apellido1");
  255.                 $contactoFiscal["apellido2"] = $request->get("contact-apellido2");
  256.                 $contactoFiscal["email"] = $request->get("contact-email");
  257.                 $contactoFiscal["movil"] = $request->get("contact-movil");
  258.                 $contactoFiscal["telefono"] = $request->get("contact-telefono");
  259.                 $contactoFiscal["numeroDocumento"] = $request->get("contact-documento");
  260.                 $this->addData("contactoFiscal"$contactoFiscal);
  261.                 // Se lo añado al contacto
  262.                 $contacto $this->getData("contacto");
  263.                 if (isset($contacto["usuarios"]) && $contacto["usuarios"] != false) {
  264.                     foreach ($contacto["usuarios"] as $key => $usuario) {
  265.                         if ($usuario["id"] == $contactoFiscal["id"]) {
  266.                             $contacto["usuarios"][$key]["nombre"] = $contactoFiscal["nombre"];
  267.                             $contacto["usuarios"][$key]["apellido1"] = $contactoFiscal["apellido1"];
  268.                             $contacto["usuarios"][$key]["apellido2"] = $contactoFiscal["apellido2"];
  269.                             $contacto["usuarios"][$key]["email"] = $contactoFiscal["email"];
  270.                             $contacto["usuarios"][$key]["telefono"] = $contactoFiscal["telefono"];
  271.                             $contacto["usuarios"][$key]["numeroDocumento"] = $contactoFiscal["numeroDocumento"];
  272.                         }
  273.                     }
  274.                 }
  275.                 $this->addData("contacto"$contacto);
  276.                 $this->service->addUpdateContact($request,$this->getData("contacto"));
  277.             }
  278.             $cliente $this->service->updateClient($request$dni$cif);
  279.             if (!empty($cliente)) {
  280.                 $this->addData("contacto"$this->service->getClientData($dni$cif));
  281.             }
  282.             if ($cliente
  283.                 && property_exists($cliente"codigo")
  284.                 && $cliente->codigo != "200") {
  285.                 $this->addFlash("error"$cliente->mensaje);
  286.                 return $this->redirectToRoute("datos");
  287.             }
  288.             // Comprobamos si existe la delegacion y, si no, la creamos
  289.             $this->addRequestData($request);
  290.             $delegacion $this->service->crearDelegacion($this->getData(), true);
  291.             if ($delegacion
  292.                 && array_key_exists("codigo"$delegacion)
  293.                 && $delegacion["codigo"] != "200") {
  294.                 $this->addFlash("error"$delegacion["mensaje"]);
  295.                 return $this->redirectToRoute("datos");
  296.             }
  297.             // Guardamos el id de la delegación que vamos a asociar al CUPS
  298.             $this->addData("id-delegacion-cups"array_key_exists("id"$delegacion)? $delegacion["id"] : null);
  299.             // Creamos y/o actualizamos el cups
  300.             $idCups $this->service->createOrModifyCups($this->getData());
  301.             $this->addData("idCups"$idCups);
  302.             // Actualizamos el contacto y la delegación
  303.             $idContacto $request->get("id-selected-user");
  304.             if ($idContacto) {
  305.                 $this->service->setContactoFiscal($idContacto);
  306.                 $this->service->modificarDelegacionContacto($cliente->id$idContacto$delegacion["id"]);
  307.             }
  308.         }
  309.         $this->addRequestData($request);
  310.         return $this->render("facturas.html.twig"$this->getData());
  311.     }
  312.     /**
  313.      * @Route("/nuevo-cliente", name="nuevo_cliente")
  314.      * @param Request $request
  315.      * @return Response
  316.      */
  317.     public function nuevoCliente(Request $request): Response
  318.     {
  319.         if (!$this->checkUser() || !$this->checkBasics($this->getData())) {
  320.             return $this->redirectToRoute("login");
  321.         }
  322.         $sinDelegacion $this->getData("sinDelegacion");
  323.         $this->addRequestData($request);
  324.         // Recogemos el documento fiscal
  325.         $dni $this->getData("dni");
  326.         $cif $this->getData("cif");
  327.         if ($sinDelegacion) {
  328.             $delegacion $this->service->crearDelegacion($this->getData());
  329.             if ($delegacion
  330.                 && isset($delegacion["codigo"])
  331.                 && $delegacion["codigo"] !== "200") {
  332.                 $this->addFlash("error"$delegacion["mensaje"]);
  333.                 return $this->redirectToRoute("datos");
  334.             }
  335.             $responseNuevoContacto $this->service->nuevoContactoPrincipal($this->getData(), $delegacion["id"]);
  336.             if ($responseNuevoContacto
  337.                 && property_exists($responseNuevoContacto"codigo")
  338.                 && $responseNuevoContacto->codigo != "200") {
  339.                 $this->addFlash("error"$responseNuevoContacto->mensaje);
  340.                 return $this->redirectToRoute("datos");
  341.             } else {
  342.                 $cliente $this->service->updateClient($request$dni$ciftrue);
  343.             }
  344.         } else {
  345.             // Creamos el cliente y el contacto
  346.             $cliente $this->service->crearCliente($this->getData(), $dni$cif);
  347.             if (!$cliente || (property_exists($cliente"codigo") && $cliente->codigo !== "200")) {
  348.                 if(property_exists($cliente"codigo")){
  349.                     $this->addFlash("error"$cliente->mensaje);
  350.                 } else {
  351.                     $this->addFlash("error""Ha ocurrido un error.");
  352.                 }
  353.                 return $this->redirectToRoute("datos");
  354.             }
  355.         }
  356.         $cliente json_decode(json_encode($cliente), true);
  357.         $this->addData("contacto"$cliente);
  358.         $this->addData("sinContactos"false);
  359.         $this->addRequestData($request);
  360.         return $this->redirectToRoute("facturas", ["request" => $request], 307);
  361.     }
  362.     /**
  363.      * Guarda los datos necesarios del CUPS
  364.      * @param mixed $cups
  365.      */
  366.     public function setDataCUPS($cups)
  367.     {
  368.         $this->addData("suministro"$cups);
  369.         if (is_array($cups)) {
  370.             if(array_key_exists("kwhAnual",$cups)){
  371.                 $this->addData("kWhAnual"$cups["kwhAnual"]);
  372.             }
  373.             if(array_key_exists("tarifa",$cups)){
  374.                 $this->addData("tarifa"$cups["tarifa"]);
  375.             }
  376.             if (array_key_exists("direcciones"$cups)) {
  377.                 $direcciones $cups["direcciones"];
  378.                 $cupsCualificado["direccion"] = $direcciones["direccion"] ?? "";
  379.                 $cupsCualificado["numero"] = $direcciones["numero"] ?? "";
  380.                 $cupsCualificado["bloque"] = $direcciones["bloque"] ?? "";
  381.                 $cupsCualificado["piso"] = $direcciones["piso"] ?? "";
  382.                 $cupsCualificado["puerta"] = $direcciones["puerta"] ?? "";
  383.                 $cupsCualificado["acceso"] = $direcciones["acceso"] ?? "";
  384.                 $cupsCualificado["tipoVia"] = $direcciones["via"] ?? "";
  385.                 $cupsCualificado["cp"] = $direcciones["codigoPostal"] ?? "";
  386.                 $cupsCualificado["localidad"] = $direcciones["campoDireccion1"] ?? "";
  387.                 $cupsCualificado["provincia"] = $direcciones["campoDireccion2"] ?? "";
  388.                 $this->addData("cupsCualificado"$cupsCualificado);
  389.             }
  390.         } else {
  391.             $this->addData("kWhAnual"$cups->kWhAnual);
  392.             $this->addData("tarifa"$cups->Tarifa);
  393.         }
  394.     }
  395.     /**
  396.      * @param $data
  397.      * @return void
  398.      */
  399.     public function checkCodigoPostal($data): void
  400.     {
  401.         $codigoPostalSips = array(
  402.             "codigoPostal" => $data->suministros[0]->Cod_Postal_Suministro,
  403.             "campoDireccion1" => $data->suministros[0]->Localidad_Suministro,
  404.             "campoDireccion2" => $data->suministros[0]->Provincia_Suministro
  405.         );
  406.         $codigoPostalBU $this->service->checkCodigoPostal($codigoPostalSips);
  407.         if ($codigoPostalBU != null) {
  408.             $this->addData("codigoPostal"$codigoPostalBU["codigoPostal"]);
  409.             $this->addData("campoDireccion1"$codigoPostalBU["campoDireccion1"]);
  410.             $this->addData("campoDireccion2"$codigoPostalBU["campoDireccion2"]);
  411.         }
  412.     }
  413. }