<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class HomeController extends BaseController
{
const ERROR_INVALID_CUPS = 1;
const ERROR_CUPS_KWHANUAL = 2;
const ERROR_CUPS_TARIFA = 3;
const ERROR_OFERTA_ACTIVA = 4;
const ERROR_CUPS_TARIFA_INVALIDA = 5;
const ERROR_CUPS_SIN_DIRECCION = 6;
const ERROR_CLIENTE_SIN_NUMERO_DOCUMENTO = 7;
/**
* @Route("/", name="index")
* @return Response
*/
public function index(): Response
{
return $this->redirectToRoute("login");
}
/**
* @Route("/calculadora", name="calculadora")
* @param Request $request
* @return Response
*/
public function calculadora(Request $request): Response
{
if (!$this->checkUser()) {
return $this->redirectToRoute("login");
}
$this->resetSession();
$this->addRequestData($request);
$this->addData("sinCups", $request->get("sinCups", false));
$cupsError = $request->get("cupsError", 0);
$this->addData("cupsError", (int)$cupsError);
return $this->render("calculadora.html.twig", $this->getData());
}
/**
* @Route("/datos", name="datos")
* @param Request $request
* @return Response
*/
public function datos(Request $request): Response
{
// Reiniciamos la sesión y recogemos los valores del formulario
if ($request->get("cups")) {
$this->resetSession(["cups", "tipoFactura"]);
} else {
$this->resetSession(["cups", "dni", "cif", "tipoFactura", "suministro", "kWhAnual", "tarifa"]);
}
$cups = $request->get("cups", $this->session->get("cups"));
$dni = $request->get("dni", $this->session->get("dni"));
$cif = $request->get("cif", $this->session->get("cif"));
$tipoFactura = $request->get("tipoFactura", $this->session->get("tipoFactura"));
$this->addData("tipoFactura", $tipoFactura);
$this->addData("tipoHogar", $tipoFactura === self::TIPO_HOGAR);
$this->addData("tipoEmpresa", $tipoFactura === self::TIPO_EMPRESA);
$error = $request->getSession()->getBag("flashes")->get("error");
if (!empty($error)) {
$this->addData("error", end($error));
}
if (!$this->checkUser() || !$tipoFactura) {
return $this->redirectToRoute("login");
}
// Comprobamos si tiene oferta activa
if ($cups && $ofertaActiva = $this->service->getOfertaActiva($cups)) {
$this->session->set("oferta", $ofertaActiva[0]);
$this->addRequestData($request);
if($ofertaActiva[0]->tipoClienteEnergia == "EMPRESA"){
$this->addData("tipoFactura",self::TIPO_EMPRESA);
} else {
$this->addData("tipoFactura",self::TIPO_HOGAR);
}
// Antes de establecer los datos del suministro se verifica que existan en el SIPS
// De existir se utilizarán esos, ya que están más actualizados.
$data = $this->service->cupsData($cups);
if($data && isset($data->suministros)){
$this->setDataCUPS($data->suministros[0]);
} else {
$this->setDataCUPS(json_decode(json_encode($ofertaActiva[0]->cup), true));
}
// Se establece si tiene un estado anterior a la firma otp configurada
$response = $this->service->comprobarEstadoAnteriorAFirmaOTP($ofertaActiva);
// Decodificación de la respuesta
$dataEstadoAnterior = json_decode($response);
if($dataEstadoAnterior != null){
if ($dataEstadoAnterior->codigo == 200) {
// Si la respuesta es correcta se establece el valor (true/false)
$this->addData("existeFirmaOTP",!$dataEstadoAnterior->object);
$this->addData("cuotadia", $ofertaActiva[0]->cuota);
$this->addData("cuota", $ofertaActiva[0]->cuota);
$cuotames = round(($ofertaActiva[0]->cuota * 365) / 12, 2);
$this->addData("cuotames", $cuotames);
$this->addData("consumo", $ofertaActiva[0]->consumoAnual / 1000);
} else {
// Si no es correcto se muestra el error y se procede a recargar la página
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_OFERTA_ACTIVA,"cupsErrorMessage"=>$dataEstadoAnterior->mensaje]);
}
if (isset($ofertaActiva[0]->cliente->numDocumentacion)) {
$this->addData("client",$ofertaActiva[0]->cliente);
} else {
// Si el cliente no tiene asignado el número de documento se muestra un error.
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CLIENTE_SIN_NUMERO_DOCUMENTO]);
}
return $this->redirectToRoute("oferta_activa");
}
}
// Si no tiene oferta activa, recogemos el suministro
if ($cups) {
$tarifasValidas = ["2.0TD", "3.0TD", "6.1TD"];
// Antes de establecer los datos del suministro se verifica que existan en el SIPS
// De existir se utilizarán esos, ya que están más actualizados.
$sipsDataValid = false;
$data = $this->service->cupsData($cups);
if($data && isset($data->suministros)){
$suministro = $data->suministros[0];
// Verifico que estén los datos necesarios del SIPS.
// De no estarlo miro si puedo sacarlos de BU.
if (!isset($suministro->kWhAnual) && !empty($this->getData("kWhAnual"))) {
$suministro->kWhAnual = $this->getData('kWhAnual');
}
if (!isset($suministro->Tarifa) && !empty($this->getData('tarifa'))) {
$suministro->Tarifa = $this->getData('tarifa');
}
// Si estan los dos datos necesarios indico que los datos del SIPS son validos.
if (isset($suministro->kWhAnual) && isset($suministro->Tarifa)) {
// Ante de darlo por valido verifico que el valor de la tarifa sea valido.
if (in_array($suministro->Tarifa, $tarifasValidas)) {
$this->checkCodigoPostal($data);
$sipsDataValid = true;
$this->setDataCUPS($suministro);
}
}
}
// Si lo datos del SIPS no son validos se seleccionan los de BU.
if (!$sipsDataValid) {
$cupsData = $this->service->checkCUPS($cups);
if ($cupsData) {
$this->setDataCUPS($cupsData);
}
// Verifico que estén los datos necesarios de BU.
if (!$this->getData("suministro") || is_array($this->getData("suministro"))
&& !array_key_exists("direcciones", $this->getData("suministro"))
|| empty($this->getData("kWhAnual"))
|| empty($this->getData("tarifa"))) {
// Si no están muestro el error correspondiente.
if(is_array($this->getData("suministro")) && empty($this->getData("kWhAnual"))){
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_KWHANUAL]);
}
if(is_array($this->getData("suministro")) && empty($this->getData("tarifa"))){
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_TARIFA]);
}
if (is_array($this->getData("suministro")) && !in_array($this->getData("tarifa"), $tarifasValidas)) {
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_TARIFA_INVALIDA]);
}
if(is_array($this->getData("suministro")) && empty($this->getData("direcciones"))){
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_CUPS_SIN_DIRECCION]);
}
return $this->redirectToRoute("calculadora", ["cupsError" => self::ERROR_INVALID_CUPS]);
}
}
// Procedemos a intentar actualizar los valores del CUPS almacenado en BU (Evolutivo 4)
if($data && isset($data->suministros)){
$this->service->ModifyCupsWithoutDirection($cups, $data->suministros[0]);
}
}
// Recogemos los datos del cliente
if ($dni || $cif) {
$data = $this->service->getClientData($dni, $cif);
$redata = false;
if (!$data) {
$redata = $this->service->getClientData($cif, $dni);
}
if ($dni) {
$this->addData("dniError", $redata);
} else {
$this->addData("cifError", $redata);
}
if (!$data && !$redata) {
$this->addData("nuevoCliente", true);
}
$clienteJson = $data ?: [];
// Actualizamos la dirección con la del CUPS (Nemon o BU)
$clienteJson = $this->service->updateAddress($this->getData(), $clienteJson);
// En caso de que el cliente exista, actualizamos su info en sesión
if ($data) {
$this->addData("contacto", $clienteJson);
}
// En caso de que el CUPS exista en Nemon y esté cualificado, actualizamos la info en sesión
if (array_key_exists("cupsCualificado", $clienteJson) && $clienteJson["cupsCualificado"]) {
$this->addData("cupsCualificado", $clienteJson);
}
if (array_key_exists("tieneDelegacion", $clienteJson) && !$clienteJson["tieneDelegacion"]) {
$this->addData("sinDelegacion", true);
}
if (array_key_exists("usuarios", $clienteJson) && $clienteJson["usuarios"]) {
foreach ($clienteJson["usuarios"] as $contacto) {
if($contacto["esFiscal"]){
$this->addData("tieneContactoFiscal",true);
$this->addData("contactoFiscal",$contacto);
if(array_key_exists("numeroDocumento",$contacto)){
$this->addData("contactoFiscalTieneDocumento",true);
}
}
}
} else {
$this->addData("sinContactos",true);
}
}
$this->addRequestData($request);
$this->addData("tiposVia", $this->service->getTiposVia());
// Si no hay datos del CUPS se traen los datos del sips y se establecen para mostrarlos
if($this->getData("suministro")){
$data = $this->service->cupsData($cups);
if($data != null){
// Comprobar que esos datos del SIPS existen en BU, ya que si no existen
// se crea una dirección incorrecta en BU, con campos de dirección cuyo valor
// no existe en la base de datos de BU.
$this->checkCodigoPostal($data);
}
}
return $this->render("datos.html.twig", $this->getData());
}
/**
* @Route("/facturas", name="facturas")
* @param Request $request
* @return Response
*/
public function facturas(Request $request): Response
{
if (!$this->checkUser() || !$this->checkBasics($this->getData())) {
return $this->redirectToRoute("login");
}
if ($this->getData("contacto")) {
$dni = $this->getData("dni");
$cif = $this->getData("cif");
$contactoFiscal = $this->getData("contactoFiscal");
if($this->getData("sinContactos")
|| $contactoFiscal != null
&& (!array_key_exists("id",$contactoFiscal) || $contactoFiscal["id"] != $request->get('contact-id')
|| !array_key_exists("nombre",$contactoFiscal) || $contactoFiscal["nombre"] != $request->get('contact-nombre')
|| !array_key_exists("apellido1",$contactoFiscal) || $contactoFiscal["apellido1"] != $request->get('contact-apellido1')
|| !array_key_exists("apellido2",$contactoFiscal) || $contactoFiscal["apellido2"] != $request->get('contact-apellido2')
|| !array_key_exists("email",$contactoFiscal) || $contactoFiscal["email"] != $request->get('contact-email')
|| !array_key_exists("movil",$contactoFiscal) || $contactoFiscal["movil"] != $request->get('contact-movil')
|| !array_key_exists("telefono",$contactoFiscal) || $contactoFiscal["telefono"] != $request->get('contact-telefono')
|| !array_key_exists("numeroDocumento",$contactoFiscal) || $contactoFiscal["numeroDocumento"] != $request->get('contact-documento'))){
// Modificamos el contacto fiscal con los nuevos datos
$contactoFiscal = [];
$contactoFiscal["id"] = $request->get("contact-id");
$contactoFiscal["nombre"] = $request->get("contact-nombre");
$contactoFiscal["apellido1"] = $request->get("contact-apellido1");
$contactoFiscal["apellido2"] = $request->get("contact-apellido2");
$contactoFiscal["email"] = $request->get("contact-email");
$contactoFiscal["movil"] = $request->get("contact-movil");
$contactoFiscal["telefono"] = $request->get("contact-telefono");
$contactoFiscal["numeroDocumento"] = $request->get("contact-documento");
$this->addData("contactoFiscal", $contactoFiscal);
// Se lo añado al contacto
$contacto = $this->getData("contacto");
if (isset($contacto["usuarios"]) && $contacto["usuarios"] != false) {
foreach ($contacto["usuarios"] as $key => $usuario) {
if ($usuario["id"] == $contactoFiscal["id"]) {
$contacto["usuarios"][$key]["nombre"] = $contactoFiscal["nombre"];
$contacto["usuarios"][$key]["apellido1"] = $contactoFiscal["apellido1"];
$contacto["usuarios"][$key]["apellido2"] = $contactoFiscal["apellido2"];
$contacto["usuarios"][$key]["email"] = $contactoFiscal["email"];
$contacto["usuarios"][$key]["telefono"] = $contactoFiscal["telefono"];
$contacto["usuarios"][$key]["numeroDocumento"] = $contactoFiscal["numeroDocumento"];
}
}
}
$this->addData("contacto", $contacto);
$this->service->addUpdateContact($request,$this->getData("contacto"));
}
$cliente = $this->service->updateClient($request, $dni, $cif);
if (!empty($cliente)) {
$this->addData("contacto", $this->service->getClientData($dni, $cif));
}
if ($cliente
&& property_exists($cliente, "codigo")
&& $cliente->codigo != "200") {
$this->addFlash("error", $cliente->mensaje);
return $this->redirectToRoute("datos");
}
// Comprobamos si existe la delegacion y, si no, la creamos
$this->addRequestData($request);
$delegacion = $this->service->crearDelegacion($this->getData(), true);
if ($delegacion
&& array_key_exists("codigo", $delegacion)
&& $delegacion["codigo"] != "200") {
$this->addFlash("error", $delegacion["mensaje"]);
return $this->redirectToRoute("datos");
}
// Guardamos el id de la delegación que vamos a asociar al CUPS
$this->addData("id-delegacion-cups", array_key_exists("id", $delegacion)? $delegacion["id"] : null);
// Creamos y/o actualizamos el cups
$idCups = $this->service->createOrModifyCups($this->getData());
$this->addData("idCups", $idCups);
// Actualizamos el contacto y la delegación
$idContacto = $request->get("id-selected-user");
if ($idContacto) {
$this->service->setContactoFiscal($idContacto);
$this->service->modificarDelegacionContacto($cliente->id, $idContacto, $delegacion["id"]);
}
}
$this->addRequestData($request);
return $this->render("facturas.html.twig", $this->getData());
}
/**
* @Route("/nuevo-cliente", name="nuevo_cliente")
* @param Request $request
* @return Response
*/
public function nuevoCliente(Request $request): Response
{
if (!$this->checkUser() || !$this->checkBasics($this->getData())) {
return $this->redirectToRoute("login");
}
$sinDelegacion = $this->getData("sinDelegacion");
$this->addRequestData($request);
// Recogemos el documento fiscal
$dni = $this->getData("dni");
$cif = $this->getData("cif");
if ($sinDelegacion) {
$delegacion = $this->service->crearDelegacion($this->getData());
if ($delegacion
&& isset($delegacion["codigo"])
&& $delegacion["codigo"] !== "200") {
$this->addFlash("error", $delegacion["mensaje"]);
return $this->redirectToRoute("datos");
}
$responseNuevoContacto = $this->service->nuevoContactoPrincipal($this->getData(), $delegacion["id"]);
if ($responseNuevoContacto
&& property_exists($responseNuevoContacto, "codigo")
&& $responseNuevoContacto->codigo != "200") {
$this->addFlash("error", $responseNuevoContacto->mensaje);
return $this->redirectToRoute("datos");
} else {
$cliente = $this->service->updateClient($request, $dni, $cif, true);
}
} else {
// Creamos el cliente y el contacto
$cliente = $this->service->crearCliente($this->getData(), $dni, $cif);
if (!$cliente || (property_exists($cliente, "codigo") && $cliente->codigo !== "200")) {
if(property_exists($cliente, "codigo")){
$this->addFlash("error", $cliente->mensaje);
} else {
$this->addFlash("error", "Ha ocurrido un error.");
}
return $this->redirectToRoute("datos");
}
}
$cliente = json_decode(json_encode($cliente), true);
$this->addData("contacto", $cliente);
$this->addData("sinContactos", false);
$this->addRequestData($request);
return $this->redirectToRoute("facturas", ["request" => $request], 307);
}
/**
* Guarda los datos necesarios del CUPS
* @param mixed $cups
*/
public function setDataCUPS($cups)
{
$this->addData("suministro", $cups);
if (is_array($cups)) {
if(array_key_exists("kwhAnual",$cups)){
$this->addData("kWhAnual", $cups["kwhAnual"]);
}
if(array_key_exists("tarifa",$cups)){
$this->addData("tarifa", $cups["tarifa"]);
}
if (array_key_exists("direcciones", $cups)) {
$direcciones = $cups["direcciones"];
$cupsCualificado["direccion"] = $direcciones["direccion"] ?? "";
$cupsCualificado["numero"] = $direcciones["numero"] ?? "";
$cupsCualificado["bloque"] = $direcciones["bloque"] ?? "";
$cupsCualificado["piso"] = $direcciones["piso"] ?? "";
$cupsCualificado["puerta"] = $direcciones["puerta"] ?? "";
$cupsCualificado["acceso"] = $direcciones["acceso"] ?? "";
$cupsCualificado["tipoVia"] = $direcciones["via"] ?? "";
$cupsCualificado["cp"] = $direcciones["codigoPostal"] ?? "";
$cupsCualificado["localidad"] = $direcciones["campoDireccion1"] ?? "";
$cupsCualificado["provincia"] = $direcciones["campoDireccion2"] ?? "";
$this->addData("cupsCualificado", $cupsCualificado);
}
} else {
$this->addData("kWhAnual", $cups->kWhAnual);
$this->addData("tarifa", $cups->Tarifa);
}
}
/**
* @param $data
* @return void
*/
public function checkCodigoPostal($data): void
{
$codigoPostalSips = array(
"codigoPostal" => $data->suministros[0]->Cod_Postal_Suministro,
"campoDireccion1" => $data->suministros[0]->Localidad_Suministro,
"campoDireccion2" => $data->suministros[0]->Provincia_Suministro
);
$codigoPostalBU = $this->service->checkCodigoPostal($codigoPostalSips);
if ($codigoPostalBU != null) {
$this->addData("codigoPostal", $codigoPostalBU["codigoPostal"]);
$this->addData("campoDireccion1", $codigoPostalBU["campoDireccion1"]);
$this->addData("campoDireccion2", $codigoPostalBU["campoDireccion2"]);
}
}
}