<?php
namespace App\Controller;
use App\Entity\Canal;
use App\Entity\Cliente;
use App\Entity\Comercial;
use App\Entity\Concepto;
use App\Entity\Contrato;
use App\Entity\Estado;
use App\Entity\EstadoCompraFactura;
use App\Entity\Factura;
use App\Entity\FacturaGenerica;
use App\Entity\Modalidad;
use App\Entity\Producto;
use App\Entity\ProductoProveedor;
use App\Entity\Suministro;
use App\Entity\User;
use App\Entity\TopeGas;
use App\Form\ContratoType;
use App\Form\EditarContratoType;
use App\Form\FacturaFromContratoType;
use App\Form\FacturaGenericaType;
use App\Form\FacturaType;
use App\Form\ImportarContratoType;
use App\Form\NewContratoType;
use App\Form\RegistrarContratoType;
use App\Repository\CanalRepository;
use App\Repository\ClienteRepository;
use App\Repository\ContratoRepository;
use App\Repository\EstadoCompraFacturaRepository;
use App\Repository\EstadoRepository;
use App\Repository\FacturaGenericaRepository;
use App\Repository\FacturaRepository;
use App\Repository\ImpuestoRepository;
use App\Repository\ModalidadRepository;
use App\Repository\ProductoProveedorRepository;
use App\Repository\SuministroRepository;
use App\Repository\TarifaRepository;
use App\Repository\TipoDocumentoRepository;
use App\Repository\TipoImpuestoRepository;
use App\Repository\TipoLecturaRepository;
use App\Repository\TipoTarifaRepository;
use App\Repository\TipoViaRepository;
use App\Repository\TopeGasRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\Expr\Math;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Cache\InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Validator\Constraints\Iban;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* @Route("/contrato")
*/
class ContratoController extends AbstractController
{
/**
* @Route("/", name="contrato_index", methods={"GET"})
* @Route("/bajas", name="contrato_baja", methods={"GET"})
*/
public function index(Request $request, ContratoRepository $contratoRepository): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");
if ( $request->getUri()==$this->generateUrl('contrato_baja',[],UrlGeneratorInterface::ABSOLUTE_URL) ){
$baja=true;
}
$cache=new FilesystemAdapter();
try {
$totalContratos=$cache->getItem('numero_contratos');
if (!$totalContratos->isHit()){
$totalContratos->set( count( $contratoRepository->findAll() ) );
$cache->save($totalContratos);
}
}catch (InvalidArgumentException $e) {
}
return $this->render('contrato/indexAdmin.html.twig', [
'baja'=>($baja??false)
]);
}
/**
* @Route("/nuevo", name="contrato_new", methods={"GET","POST"})
* @Route("/registrar", name="contrato_register", methods={"GET","POST"})
*/
public function new(Request $request, UserPasswordHasherInterface $passwordEncoder, UserRepository $userRepository,
SuministroRepository $suministroRepository, ClienteRepository $clienteRepository,
ContratoRepository $contratoRepository, EntityManagerInterface $entityManager): Response
{
$contrato = new Contrato();
if( $request->getPathInfo()==$this->generateUrl('contrato_register') ){
$this->denyAccessUnlessGranted("ROLE_ADMIN");
$contratoForm = $this->createForm(RegistrarContratoType::class, $contrato);
}
else{
$this->denyAccessUnlessGranted("ROLE_COMERCIAL");
$contratoForm = $this->createForm(NewContratoType::class, $contrato);
}
$contratoForm->handleRequest($request);
if ( $contratoForm->isSubmitted() ) {
$formData=$contratoForm->getData();
//COMPROBACIONES
//Suministro
if( count($contratoRepository->findBy( ['referenciaContrato'=>$contrato->getReferenciaContrato()] ))!==0 ){
$contratoForm->get('referenciaContrato')->addError(new FormError("Este contrato ya ha sido registrado en la base de datos"));
}
//Suministro
if($formData->getSuministro()==null) {
$suministro = $contratoForm['newSuministro']->getData();
if($suministro->getCups()==''){
$contratoForm->get('newSuministro')->get('cups')->addError(new FormError("El CUPS no puede estar vacío"));
}
elseif( count($suministroRepository->findBy( ['cups'=>$suministro->getCups()] ))!==0 ){
$contratoForm->get('newSuministro')->get('cups')->addError(new FormError("Este CUPS ya ha sido registrado en la base de datos"));
}
if($suministro->getNumeroDireccion()==''){
$contratoForm->get('newSuministro')->get('numeroDireccion')->addError(new FormError("El número de dirección no puede estar vacío"));
}
}
//Cliente
if($formData->getCliente()==null){
$cliente=$contratoForm['newCliente']->getData();
if($cliente->getNumeroDireccion()==''){
$contratoForm->get('newCliente')->get('numeroDireccion')->addError(new FormError("El número de dirección no puede estar vacío"));
}
if( count($clienteRepository->findBy( ['nif'=>$cliente->getNif()] ))!==0 ){
$contratoForm->get('newCliente')->get('nif')->addError(new FormError("Este NIF ya ha sido registrado en la base de datos"));
}
}
//PROCESAR DATOS
if( $contratoForm->isValid() ){
//New suministro
if($formData->getSuministro()==null){
$suministro->setNombreVia( strtoupper($suministro->getNombreVia()) );
$suministro->setPuerta( strtoupper($suministro->getPuerta()) );
$suministro->setEscalera( strtoupper($suministro->getEscalera()) );
$suministro->setPoblacion( strtoupper($suministro->getPoblacion()) );
$suministro->setProvincia( strtoupper($suministro->getProvincia()) );
$suministro->setPotenciaP1($contratoForm['potenciaP1']->getData());
$suministro->setPotenciaP2($contratoForm['potenciaP2']->getData());
$suministro->setPotenciaP3($contratoForm['potenciaP3']->getData());
$suministro->setPotenciaP4($contratoForm['potenciaP4']->getData());
$suministro->setPotenciaP5($contratoForm['potenciaP5']->getData());
$suministro->setPotenciaP6($contratoForm['potenciaP6']->getData());
$entityManager->persist($suministro);
$contrato->setSuministro($suministro);
}
else{
$suministro=$contratoForm['suministro']->getData();
$suministro->setPotenciaP1($contratoForm['potenciaP1']->getData());
$suministro->setPotenciaP2($contratoForm['potenciaP2']->getData());
$suministro->setPotenciaP3($contratoForm['potenciaP3']->getData());
$suministro->setPotenciaP4($contratoForm['potenciaP4']->getData());
$suministro->setPotenciaP5($contratoForm['potenciaP5']->getData());
$suministro->setPotenciaP6($contratoForm['potenciaP6']->getData());
$entityManager->persist($suministro);
}
//New producto
if($formData->getProducto()==null){
$producto=$contratoForm['newProducto']->getData();
$producto->setNombre('PERSONALIZADO');
$producto->setTarifa($contratoForm['tarifa']->getData());
$producto->setDuracion( date_interval_create_from_date_string('1 year') );
$producto->setPersonalizado(true);
$entityManager->persist($producto);
$contrato->setProducto($producto);
}
//New productoProveedor
if($formData->getProductoProveedor()==null){
$productoProveedor=new ProductoProveedor();
$productoProveedor->setNombre('PERSONALIZADO');
$productoProveedor->setTarifa($contratoForm['tarifa']->getData());
$productoProveedor->setFacturaElectronica(1);
$productoProveedor->setProveedor($contrato->getProveedor());
$productoProveedor->setDuracion( date_interval_create_from_date_string('1 year') );
$productoProveedor->setPersonalizado(true);
$entityManager->persist($productoProveedor);
$contrato->setProductoProveedor($productoProveedor);
}
//New cliente
if($formData->getCliente()==null){
$cliente->setNombre( strtoupper($cliente->getNombre()) );
$cliente->setApellido( strtoupper($cliente->getApellido()) );
$cliente->setApellido2( strtoupper($cliente->getApellido2()) );
$cliente->setNif( strtoupper($cliente->getNif()) );
$cliente->setNombreRepresentante( strtoupper($cliente->getNombreRepresentante()) );
$cliente->setDniRepresentante( strtoupper($cliente->getDniRepresentante()) );
$cliente->setEmail( strtolower($cliente->getEmail()) );
$cliente->setNombreVia( strtoupper($cliente->getNombreVia()) );
$cliente->setEscalera( strtoupper($cliente->getEscalera()) );
$cliente->setPuerta( strtoupper($cliente->getPuerta()) );
$cliente->setPoblacion( strtoupper($cliente->getPoblacion()) );
$cliente->setProvincia( strtoupper($cliente->getProvincia()) );
$cliente->setNombreNotificaciones( strtoupper($cliente->getNombreNotificaciones()) );
$cliente->setDireccionNotificaciones( strtoupper($cliente->getDireccionNotificaciones()) );
$cliente->setPoblacionNotificaciones( strtoupper($cliente->getPoblacionNotificaciones()) );
$cliente->setProvinciaNotificaciones( strtoupper($cliente->getProvinciaNotificaciones()) );
$user=$userRepository->findOneBy(['username'=>$cliente->getNif()]);
if($user==null){
$user = new User();
$user->setUsername( strtoupper($cliente->getNif()) );
$user->setEmail( strtolower($cliente->getEmail()) );
$user->setPassword(
$passwordEncoder->hashPassword(
$user,
strtoupper($cliente->getNif())
)
);
$user->setRoles(["ROLE_USER"]);
$entityManager->persist($user);
}elseif ($user->getCliente()!==null){
$user=null;
}
$cliente->setUser($user);
$entityManager->persist($cliente);
$contrato->setCliente($cliente);
}
//Fecha fin // Última lectura
if( ($formData->getFechaLectura()??null)!=null ){
$contrato->setFechaFin(date_add( clone $formData->getFechaLectura(), date_interval_create_from_date_string('1 year') ));
$contrato->setUltimaLectura( $formData->getFechaLectura() );
}
$contrato->setReferenciaContrato( strtoupper($contrato->getReferenciaContrato()) );
$cuenta=strtoupper( str_replace(' ', '', $contratoForm['numeroCuenta']->getData()) );
$contrato->setIban( substr($cuenta, 0,4) );
$contrato->setCcc( substr($cuenta, 4) );
$contrato->setFormaPago('DOMICILIACIÓN BANCARIA');
/*$contrato->setEstado($estadoRepository->findOneBy([ 'nombre'=>'BORRADOR' ]));*/
$contrato->setCreatedBy($this->getUser());
if( !($request->getPathInfo()==$this->generateUrl('contrato_register')) ){
$contrato->setFecha(date_create());
}
$entityManager->persist($contrato);
$entityManager->flush();
if( ($contrato->getReferenciaContrato()??null)==null ){
$contrato->setReferenciaContrato( date('Y').$contrato->getId() );
$i=1;
while( $contratoRepository->findBy(['referenciaContrato'=>$contrato->getReferenciaContrato()]) != null ){
$contrato->setReferenciaContrato( date('Y').($contrato->getId()+$i) );
$i++;
}
}
$entityManager->persist($contrato);
$entityManager->flush();
$cache=new FilesystemAdapter();
$numeroContratos = $cache->getItem('numero_contratos');
$numeroContratos->set( count($contratoRepository->findAll()) );
$cache->save($numeroContratos);
return $this->redirectToRoute('contrato_show',['id'=>$contrato->getId()]);
}
}
return $this->render('contrato/new.html.twig', [
'contrato' => $contrato,
'contratoForm' => $contratoForm->createView()
]);
}
/*
* @Route("/import", name="contrato_import", methods={"GET","POST"})
*
public function import(Request $request, FacturaRepository $facturaRepository,
ContratoRepository $contratoRepository, TarifaRepository $tarifaRepository,
ImpuestoRepository $impuestoRepository){
$this->denyAccessUnlessGranted("ROLE_ADMIN");
$form = $this->createForm(ImportarContratoType::class);
$form->handleRequest($request);
if ( $form->isSubmitted() ) {
$data = json_decode($form->get('json')->getData(), true);
if ($data === null) {
$form->get('json')->addError(new FormError("El formato no es válido"));
}
if ($form->isValid()){
$data=$data['Hoja1'];
$entityManager = $this->getDoctrine()->getManager();
foreach ($data as $linea){
if ( $facturaRepository->findOneBy([ 'numeroFactura'=>$linea['numeroFactura'] ])==null ){
set_time_limit(10);
$contrato=$contratoRepository->findOneBy([ 'referenciaContrato'=> $linea['referenciaContrato'] ]);
if($contrato->getLecturaInicialP1()==null){
$contrato->setLecturaInicialP1( $linea['lecturaEnergiaP1'] );
$contrato->setLecturaInicialP2( $linea['lecturaEnergiaP2']??null );
$contrato->setLecturaInicialP3( $linea['lecturaEnergiaP3']??null );
$contrato->setLecturaInicialP4( $linea['lecturaEnergiaP4']??null );
$contrato->setLecturaInicialP5( $linea['lecturaEnergiaP5']??null );
$contrato->setLecturaInicialP6( $linea['lecturaEnergiaP6']??null );
$contrato->setLecturaReactivaP1( $linea['lecturaReactivaP1']??null );
$contrato->setLecturaReactivaP2( $linea['lecturaReactivaP2']??null );
$contrato->setLecturaReactivaP3( $linea['lecturaReactivaP3']??null );
$contrato->setLecturaReactivaP4( $linea['lecturaReactivaP4']??null );
$contrato->setLecturaReactivaP5( $linea['lecturaReactivaP5']??null );
$contrato->setLecturaReactivaP6( $linea['lecturaReactivaP6']??null );
}else{
$factura=new Factura();
$producto=$contrato->getProducto();
$cliente=$contrato->getCliente();
$suministro=$contrato->getSuministro();
$factura->setDevuelta($linea['devuelta']??false);
$factura->setContrato($contrato);
$factura->setTarifa($tarifaRepository->findOneBy([ 'nombre'=>$linea['tarifa'] ])??$producto->getTarifa());
$factura->setPrecioEnergiaP1($linea['precioEnergiaP1']??$producto->getPrecioEnergiaP1());
$factura->setPrecioEnergiaP2($linea['precioEnergiaP2']??$producto->getPrecioEnergiaP2());
$factura->setPrecioEnergiaP3($linea['precioEnergiaP3']??$producto->getPrecioEnergiaP3());
$factura->setPrecioEnergiaP4($linea['precioEnergiaP4']??$producto->getPrecioEnergiaP4());
$factura->setPrecioEnergiaP5($linea['precioEnergiaP5']??$producto->getPrecioEnergiaP5());
$factura->setPrecioEnergiaP6($linea['precioEnergiaP6']??$producto->getPrecioEnergiaP6());
$factura->setPrecioPotenciaP1(($linea['precioPotenciaP1']/365)??($producto->getPrecioPotenciaP1()/365));
$factura->setPrecioPotenciaP2(($linea['precioPotenciaP2']/365)??($producto->getPrecioPotenciaP2()/365));
$factura->setPrecioPotenciaP3(($linea['precioPotenciaP3']/365)??($producto->getPrecioPotenciaP3()/365));
$factura->setPrecioPotenciaP4(($linea['precioPotenciaP4']/365)??($producto->getPrecioPotenciaP4()/365));
$factura->setPrecioPotenciaP5(($linea['precioPotenciaP5']/365)??($producto->getPrecioPotenciaP5()/365));
$factura->setPrecioPotenciaP6(($linea['precioPotenciaP6']/365)??($producto->getPrecioPotenciaP6()/365));
$factura->setPotenciaP1($linea['potenciaP1']??$suministro->getPotenciaP1());
$factura->setPotenciaP2($linea['potenciaP2']??$suministro->getPotenciaP2());
$factura->setPotenciaP3($linea['potenciaP3']??$suministro->getPotenciaP3());
$factura->setPotenciaP4($linea['potenciaP4']??$suministro->getPotenciaP4());
$factura->setPotenciaP5($linea['potenciaP5']??$suministro->getPotenciaP5());
$factura->setPotenciaP6($linea['potenciaP6']??$suministro->getPotenciaP6());
$factura->setNombreCliente($cliente->__toString());
$factura->setNifCliente($cliente->getNif());
$factura->setDireccionCliente($cliente->getDireccion());
$factura->setCpCliente($cliente->getCp());
$factura->setPoblacionCliente($cliente->getPoblacion());
$factura->setProvinciaCliente($cliente->getProvincia());
$factura->setAlquilerEquipos($suministro->getAlquilerContador());
$cuenta=str_replace(' ', '', $linea['numeroCuenta'] ?? ($contrato->getIban().$contrato->getCcc()) );
$factura->setIban( strtoupper( substr($cuenta, 0,4) ));
$factura->setCcc( substr($cuenta, 4) );
$fechaLectura=date_create_from_format('n/j/y',$linea['fechaLectura']);
if($fechaLectura!==false){
$factura->setFechaLectura( $fechaLectura );
}else{
$factura->setFechaLectura( date_create_from_format('d/m/Y', '09/09/9999') );
}
$fechaEmision=date_create_from_format('n/j/y',$linea['fechaEmision']);
if($fechaEmision!==false){
$factura->setFechaEmision( $fechaEmision );
}else{
$factura->setFechaEmision( date_create_from_format('d/m/Y', '09/09/9999') );
}
$factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'electricidad'])->getImporte());
$factura->setIva($impuestoRepository->findOneBy(['nombre'=>'iva'])->getImporte());
if(($linea['nombreNotificaciones']??null)!==null){
$factura->setNotificaciones(true);
$factura->setNombreNotificaciones($linea['nombreNotificaciones']);
$factura->setDireccionNotificaciones($linea['direccionNotificaciones']);
$factura->setCpNotificaciones($linea['cpNotificaciones']);
$factura->setPoblacionNotificaciones($linea['poblacionNotificaciones']);
$factura->setProvinciaNotificaciones($linea['provinciaNotificaciones']);
}
else{
$factura->setNotificaciones(false);
}
}
}
}
}
}
}*/
/*public function import(Request $request, UserPasswordEncoderInterface $passwordEncoder, ValidatorInterface $validator,
SuministroRepository $suministroRepository, ClienteRepository $clienteRepository,
ContratoRepository $contratoRepository, TipoViaRepository $tipoViaRepository,
UserRepository $userRepository, TarifaRepository $tarifaRepository,
ModalidadRepository $modalidadRepository, CanalRepository $canalRepository,
ProductoProveedorRepository $productoProveedorRepository, EstadoRepository $estadoRepository,
TipoDocumentoRepository $tipoDocumentoRepository, TipoImpuestoRepository $tipoImpuestoRepository ): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");
$form = $this->createForm(ImportarContratoType::class);
$form->handleRequest($request);
if ( $form->isSubmitted() ) {
$data=json_decode( $form->get('json')->getData(), true );
if($data===null){
$form->get('json')->addError( new FormError("El formato no es válido") );
}
if( $form->isValid() ){
$data=$data['Hoja1'];
$entityManager = $this->getDoctrine()->getManager();
foreach ($data as $linea){
if ( $contratoRepository->findOneBy([ 'referenciaContrato'=>$linea['referenciaContrato'] ])==null ){
set_time_limit(10);
$contrato=new Contrato();
//Información cliente
//echo $linea['referenciaContrato'].'<br>';
$cliente=$clienteRepository->findOneBy([ 'nif'=>strtoupper( trim($linea['nifCliente']) ) ]);
if($cliente===null){
$cliente= new Cliente();
$cliente->setNombre( strtoupper( trim($linea['nombreCliente']) ) );
$cliente->setApellido( strtoupper( trim($linea['apellidoCliente']??null) ) );
$cliente->setApellido2( strtoupper( trim($linea['apellidoCliente2']??null) ) );
$nif=strtoupper( trim($linea['nifCliente']) );
$nifFirst=substr($nif, 0, 1);
$cliente->setNif($nif);
if( $nifFirst>='A' && $nifFirst<'X'){
$cliente->setTipoDocumento($tipoDocumentoRepository->findOneBy([ 'nombre'=>'CIF' ]));
}elseif ( $nifFirst>='X' && $nifFirst<='Z' ){
$cliente->setTipoDocumento($tipoDocumentoRepository->findOneBy([ 'nombre'=>'NIE' ]));
}else{
$cliente->setTipoDocumento($tipoDocumentoRepository->findOneBy([ 'nombre'=>'DNI' ]));
}
if( ($linea['nombreRepresentante']??null)!==null ){
$cliente->setRepresentante( true );
$cliente->setNombreRepresentante( strtoupper( trim($linea['nombreRepresentante']) ) );
$cliente->setDniRepresentante( strtoupper( trim($linea['dniRepresentante']) ) );
}else{
$cliente->setRepresentante( false );
}
$cliente->setEmail( strtolower( trim($linea['emailCliente']??null) ) );
$cliente->setTelefono( strtolower( trim($linea['telefonoCliente']??null) ) );
$cliente->setTelefono2( strtolower( trim($linea['telefonoCliente2']??null) ) );
$cliente->setTipoVia( $tipoViaRepository->findOneBy([ 'nombre'=>trim($linea['tipoViaCliente']) ]) );
$cliente->setNombreVia( strtoupper( trim($linea['nombreViaCliente']) ) );
$cliente->setNumeroDireccion( strtoupper( trim($linea['numeroDireccionCliente']??null) ) );
$cliente->setEscalera( strtoupper( trim($linea['escaleraCliente']??null) ) );
$cliente->setPiso( strtoupper( trim($linea['pisoCliente']??null) ) );
$cliente->setPuerta( strtoupper( trim($linea['puertaCliente']??null) ) );
$cliente->setCp( trim($linea['cpCliente']) );
$cliente->setPoblacion( strtoupper( trim($linea['poblacionCliente']) ) );
$cliente->setProvincia( strtoupper( trim($linea['provinciaCliente']) ) );
$cliente->setObservaciones( trim($linea['observacionesCliente']??null) );
if( $linea['direccionNotificaciones']!==null ){
$cliente->setNotificaciones( true );
$cliente->setNombreNotificaciones( strtoupper( trim($linea['nombreNotificaciones']??$cliente->__toString()) ) );
$cliente->setDireccionNotificaciones( strtoupper( trim($linea['direccionNotificaciones']) ) );
$cliente->setPoblacionNotificaciones( strtoupper( trim($linea['poblacionNotificaciones']) ) );
$cliente->setCpNotificaciones( strtoupper( trim($linea['cpNotificaciones']) ) );
$cliente->setProvinciaNotificaciones( strtoupper( trim($linea['provinciaNotificaciones']) ) );
}
$user=$userRepository->findOneBy([ 'username'=>strtoupper($cliente->getNif()) ]);
if($user===null){
$user = new User();
$user->setUsername( strtoupper($cliente->getNif()) );
$user->setPassword(
$passwordEncoder->hashPassword(
$user,
strtoupper($cliente->getNif())
)
);
$user->setRoles(["ROLE_USER"]);
$entityManager->persist($user);
}
$cliente->setUser($user);
$entityManager->persist($cliente);
$contrato->setCliente($cliente);
}
else{
$contrato->setCliente($cliente);
}
//Información suministro
$suministro=$suministroRepository->findOneBy([ 'cups'=>$linea['cups'] ]);
if($suministro===null){
$suministro= new Suministro();
$suministro->setCups( strtoupper( trim($linea['cups']) ) );
$suministro->setTipoVia( $tipoViaRepository->findOneBy([ 'nombre'=>$linea['tipoViaSuministro'] ]) );
$suministro->setNombreVia( strtoupper( trim($linea['nombreViaSuministro']) ) );
$suministro->setNumeroDireccion( strtoupper(trim($linea['numeroDireccionSuministro']??null)) );
$suministro->setEscalera( strtoupper( trim($linea['ecaleraSuministro']??null) ) );
$suministro->setPiso( strtoupper( trim($linea['pisoSuministro']??null) ) );
$suministro->setPuerta( strtoupper( trim($linea['puertaSuministro']??null) ) );
$suministro->setCp( trim($linea['cpSuministro']) );
$suministro->setPoblacion( strtoupper( trim($linea['poblacionSuministro']) ) );
$suministro->setProvincia( strtoupper( trim($linea['provinciaSuministro']) ) );
$suministro->setAlquilerContador( strtoupper( trim($linea['alquilerContador']??0) ) );
$suministro->setPotenciaP1( trim($linea['potenciaP1']??null) );
$suministro->setPotenciaP2( trim($linea['potenciaP2']??null) );
$suministro->setPotenciaP3( trim($linea['potenciaP3']??null) );
$suministro->setObservaciones( trim($linea['observacionesSuministro']??null) );
$entityManager->persist($suministro);
$contrato->setSuministro($suministro);
}
else{
$contrato->setSuministro($suministro);
}
//Información producto
$producto= new Producto();
$producto->setNombre('PERSONALIZADO');
$producto->setTarifa($tarifaRepository->findOneBy([ 'nombre'=>$linea['tarifa'] ]));
$producto->setModalidad($modalidadRepository->findOneBy([ 'nombre'=>$linea['modalidad'] ]));
if( $producto->getModalidad()===$modalidadRepository->find(2) ){
$producto->setGastoGestion($linea['gastoGestion']??null);
}else{
$producto->setPrecioEnergiaP1($linea['precioEnergiaP1']??null);
$producto->setPrecioEnergiaP2($linea['precioEnergiaP2']??null);
$producto->setPrecioEnergiaP3($linea['precioEnergiaP3']??null);
}
$producto->setPrecioPotenciaP1($linea['precioPotenciaP1']??null);
$producto->setPrecioPotenciaP2($linea['precioPotenciaP2']??null);
$producto->setPrecioPotenciaP3($linea['precioPotenciaP3']??null);
$producto->setDuracion( date_interval_create_from_date_string('1 year') );
$producto->setPersonalizado(true);
$producto->setFacturaElectronica(false);
$entityManager->persist($producto);
$contrato->setProducto($producto);
//Información contrato
$contrato->setReferenciaContrato($linea['referenciaContrato']);
$fecha=date_create_from_format('n/j/y',$linea['fecha']);
if($fecha!==false){
$contrato->setFecha( $fecha );
}else{
$contrato->setFecha( date_create_from_format('d/m/Y', '09/09/9999') );
}
if( ($linea['fechaLectura']??null)!==null ){
$contrato->setFechaLectura( date_create_from_format('n/j/y',$linea['fechaLectura']) );
}
$contrato->setComercial($linea['comercial']??null);
$contrato->setObservaciones($linea['observacionesContrato']??null);
$contrato->setFechaFin(date_create_from_format('n/j/y',$linea['fechaFin']??null));
if( ($linea['canal']??'')=='ENERGAZE'||($linea['canal']??'')=='MENERGAZE'){
$canal = $canalRepository->findOneBy([ 'nombre'=>$linea['canal'] ]);
if($canal!==null){
$contrato->setCanal($canal);
}else{
$canal=new Canal();
$canal->setNombre($linea['canal']);
$entityManager->persist($canal);
$contrato->setCanal($canal);
}
}else{
$contrato->setCanal($canalRepository->findOneBy([ 'nombre'=>'MENERGAZE' ]));
}
$contrato->setProductoProveedor($productoProveedorRepository->findOneBy([ 'nombre'=>$linea['proveedor']??'MENERGAZE' ]));
$contrato->setEstado($estadoRepository->findOneBy([ 'nombre'=>$linea['estado']??'VERIFICACIÓN' ]));
$contrato->setVisita(false);
$contrato->setReferido(false);
$contrato->setTipoImpuesto( $tipoImpuestoRepository->findOneBy([ 'nombre'=>$linea['tipoImpuesto']??'Sí' ]) );
$errors=$validator->validate($linea['numeroCuenta']??null, [new Iban(), new NotBlank()]);
if( count($errors)===0 ){
$cuenta=str_replace(' ', '', $linea['numeroCuenta']);
$contrato->setIban( strtoupper( substr($cuenta, 0,4) ) );
$contrato->setCcc( substr($cuenta, 4) );
$contrato->setFormaPago('DOMICILIACION BANCARIA');
}else{
$contrato->setFormaPago($linea['numeroCuenta']??'SIN DEFINIR');
}
$entityManager->persist($contrato);
$entityManager->flush();
}
}
return $this->render('test/echo.html.twig', [
'echo' => ''
]);
//return $this->redirectToRoute('contrato_index');
}
}
return $this->render('contrato/importar.html.twig', [
'form' => $form->createView()
]);
}*/
/*
* @Route("/json", name="suministro_json", methods={"GET"})
*
public function jsonList(ContratoRepository $contratoRepository)
{
$contratos=$contratoRepository->findBy([ 'oculto'=>false ]);
foreach ($contratos as $contrato){
$array[]=[
"cups"=>$contrato->getSuministro()->getCups(),
"dni"=>$contrato->getCliente()->getNif()
];
}
echo $this->json($array);
}*/
/**
* @Route("/{id}", name="contrato_show", methods={"GET"})
*/
public function show(Contrato $contrato, ContratoRepository $contratoRepository, FacturaRepository $facturaRepository,
FacturaGenericaRepository $facturaGenericaRepository, EntityManagerInterface $entityManager): Response
{
if( $contrato->getCliente()->getUser()!=$this->getUser() &&
($contrato->getSeller()??new Comercial())->getUser()!=$this->getUser() &&
!$contrato->getSubseller()->contains( $this->getUser()->getComercial() )
){
$this->denyAccessUnlessGranted('ROLE_FACTURACION');
}
$facturas=$facturaRepository->findBy(['contrato'=>$contrato]);
$genericas=$facturaGenericaRepository->findBy(['contrato'=>$contrato]);
$ultimaLectura=$contratoRepository->findUltimaFechaLectura($contrato);
$contrato->setUltimaLectura($ultimaLectura);
$entityManager->flush();
$facturasFinal=array_merge($facturas,$genericas);
usort( $facturasFinal, function ($a,$b){
/*$aClass=$a->getClassName();
$bClass=$b->getClassName();
if($aClass==$bClass){
switch ($aClass){
case 'Factura':
return date_diff($a->getFechaLectura(),$b->getFechaLectura())->days;
case 'FacturaGenerica':
return date_diff($a->getFechaEmision(),$b->getFechaEmision())->days;
}
}else{
switch ($aClass){
case 'Factura':
return date_diff($a->getFechaLectura(),$b->getFechaEmision())->days;
case 'FacturaGenerica':
return date_diff($a->getFechaEmision(),$b->getFechaLectura())->days;
}
}*/
return date_diff($a->getFechaEmision(),$b->getFechaEmision())->days;
} );
return $this->render('contrato/show.html.twig', [
'facturas'=>array_reverse($facturasFinal),
'ultimaLectura'=>$ultimaLectura,
'contrato' => $contrato
]);
}
/**
* @Route("/{id}/pdf", name="contrato_pdf", methods={"GET","POST"})
*/
public function pdf(Contrato $contrato, Pdf $pdf): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");
$html=$this->renderView('contrato/contrato.pdf.twig', [
'contrato' => $contrato
]);
return new PdfResponse(
$pdf->getOutputFromHtml($html),
($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf'
);
/*return $this->render('contrato/contrato.pdf.twig', [
'contrato' => $contrato
]);*/
}
/**
* @Route("/{id}/enviar", name="contrato_enviar", methods={"GET","POST"})
*/
public function enviar(Contrato $contrato, Pdf $pdf): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");
$html=$this->renderView('contrato/contrato.pdf.twig', [
'contrato' => $contrato
]);
$pdf->generateFromHtml(
$this->renderView('contrato/contrato.pdf.twig', [
'contrato' => $contrato
]),
__DIR__.'/../../temp/'.($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf'
);
unlink(__DIR__.'/../../temp/'.($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf');
return $this->render('test/echo.html.twig', [
'echo' => __DIR__.'/../../temp/'.($contrato->getReferenciaContrato()??'contrato_sin_número').'.pdf'
]);
}
/**
* @Route("/{id}/edit", name="contrato_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Contrato $contrato, SuministroRepository $suministroRepository,
EntityManagerInterface $entityManager): Response
{
$this->denyAccessUnlessGranted("ROLE_ALTACOMERCIALES");
$producto=$contrato->getProducto();
if($this->isGranted("ROLE_ALTACOMERCIALES")){
$form = $this->createForm(EditarContratoType::class, $contrato);
}
else{
$form = $this->createForm(RegistrarContratoType::class, $contrato);
}
$form->handleRequest($request);
if ($form->isSubmitted()) {
$formData=$form->getData();
if($formData->getSuministro()==null){
$suministro=$form['newSuministro']->getData();
if( count($suministroRepository->findBy( ['cups'=>$suministro->getCups()] ))!==0 ){
$form->get('newSuministro')->get('cups')->addError(new FormError("Este CUPS ya ha sido registrado en la base de datos"));
}
}
if($form->isValid()){
if($formData->getProducto()==null){
$productoNew=$form['newProducto']->getData();
$producto->setTarifa($form->get('tarifa')->getData());
$producto->setPrecioPotenciaP1( $productoNew->getPrecioPotenciaP1() );
$producto->setPrecioPotenciaP2( $productoNew->getPrecioPotenciaP2() );
$producto->setPrecioPotenciaP3( $productoNew->getPrecioPotenciaP3() );
$producto->setPrecioPotenciaP4( $productoNew->getPrecioPotenciaP4() );
$producto->setPrecioPotenciaP5( $productoNew->getPrecioPotenciaP5() );
$producto->setPrecioPotenciaP6( $productoNew->getPrecioPotenciaP6() );
$producto->setPrecioEnergiaP1( $productoNew->getPrecioEnergiaP1() );
$producto->setPrecioEnergiaP2( $productoNew->getPrecioEnergiaP2() );
$producto->setPrecioEnergiaP3( $productoNew->getPrecioEnergiaP3() );
$producto->setPrecioEnergiaP4( $productoNew->getPrecioEnergiaP4() );
$producto->setPrecioEnergiaP5( $productoNew->getPrecioEnergiaP5() );
$producto->setPrecioEnergiaP6( $productoNew->getPrecioEnergiaP6() );
$producto->setFacturaElectronica( $productoNew->getFacturaElectronica() );
$contrato->setProducto($producto);
}
$suministro=$contrato->getSuministro();
$suministro->setPotenciaP1($form['potenciaP1']->getData());
$suministro->setPotenciaP2($form['potenciaP2']->getData());
$suministro->setPotenciaP3($form['potenciaP3']->getData());
$suministro->setPotenciaP4($form['potenciaP4']->getData());
$suministro->setPotenciaP5($form['potenciaP5']->getData());
$suministro->setPotenciaP6($form['potenciaP6']->getData());
$contrato->setNumeroCuenta( ($form->get('numeroCuenta')->getData())??'' );
//REGISTRAR CAMBIOS
$contrato->setCambios( $contrato->getCambios().$this->getUser()->getUsername().',' );
$entityManager->flush();
return $this->redirectToRoute('contrato_show',['id'=>$contrato->getId()]);
}
}
return $this->render('contrato/edit.html.twig', [
'contrato' => $contrato,
'contratoForm' => $form->createView(),
'env' => $_SERVER['APP_ENV']??'finkaluz',
]);
}
/**
* @Route("/{id}", name="contrato_delete", methods={"POST"})
*/
/*public function delete(Request $request, Contrato $contrato): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");
if ($this->isCsrfTokenValid('delete'.$contrato->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($contrato);
$entityManager->flush();
}
return $this->redirectToRoute('contrato_index');
}*/
public function delete(Request $request, Contrato $contrato, ContratoRepository $contratoRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$contrato->getId(), $request->request->get('_token')))
$contratoRepository->remove($contrato, true);
$cache=new FilesystemAdapter();
$numeroContratos = $cache->getItem('numero_contratos');
$numeroContratos->set( count($contratoRepository->findAll()) );
$cache->save($numeroContratos);
return $this->redirectToRoute('contrato_index');
}
/**
* @Route("/{id}/nuevafactura", name="contrato_facturar", methods={"GET","POST"})
* @Route("/{id}/registrarfactura", name="contrato_registrar_factura", methods={"GET","POST"})
* @param Request $request
* @param Contrato $contrato
* @param ContratoRepository $contratoRepository
* @param ImpuestoRepository $impuestoRepository
* @param TipoLecturaRepository $tipoLecturaRepository
* @param ModalidadRepository $modalidadRepository
* @param EstadoCompraFacturaRepository $estadoCompraFacturaRepository
* @param TopeGasRepository $topeGasRepository
* @param EntityManagerInterface $entityManager
* @param FacturaRepository $facturaRepository
* @param FacturaGenericaRepository $facturaGenericaRepository
* @return Response
*/
public function nuevaFactura(Request $request, Contrato $contrato, ContratoRepository $contratoRepository,
ImpuestoRepository $impuestoRepository, TipoLecturaRepository $tipoLecturaRepository,
ModalidadRepository $modalidadRepository, EstadoCompraFacturaRepository $estadoCompraFacturaRepository,
TopeGasRepository $topeGasRepository, EntityManagerInterface $entityManager,
FacturaRepository $facturaRepository, FacturaGenericaRepository $facturaGenericaRepository): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");;
$logger = new Logger('my_logger');
$logger->pushHandler(new StreamHandler(__DIR__.'/../../logs/facturacion.log', Logger::DEBUG));
$factura = new Factura();
//Datos factura
$producto=$contrato->getProducto();
$productoProveedor=$contrato->getProductoProveedor();
$cliente=$contrato->getCliente();
$suministro=$contrato->getSuministro();
$estadoCompra=$estadoCompraFacturaRepository->findOneBy(['nombre'=>'Pendiente']);
$importeTopeGas=$impuestoRepository->findOneBy(['nombre'=>'topeGas'],['fecha'=>'DESC'])->getImporte();
switch ($_SERVER['APP_ENV']??'finkaluz'){
case 'digitel':
$prefijoFactura='E/'.substr(date('Y'),-2);
$n=$facturaRepository->findNumberByYear(date("Y")) + $facturaGenericaRepository->findNumberByYear(date("Y"));
do{
$n++;
$match=!empty($facturaRepository->findBy(['numeroFactura'=>$prefijoFactura.str_pad($n,4,'0',STR_PAD_LEFT)]));
if(!$match){
$match=!empty($facturaGenericaRepository->findBy(['numeroFactura'=>$n]));
}
}while($match);
$factura->setNumeroFactura($prefijoFactura.str_pad($n, 4, '0', STR_PAD_LEFT));
break;
default:
$factura->setNumeroFactura( 'F-'.$contrato->getReferenciaContrato().date('dmyHi') );
}
$factura->setDevuelta(false);
$factura->setContrato($contrato);
$factura->setLogoHosteleria($contrato->isLogoHosteleria());
$factura->setTarifa($producto->getTarifa());
$factura->setEstadoCompra($estadoCompra);
if( $producto->getModalidad()!==$modalidadRepository->findOneBy(['nombre'=>'Indexado']) ){
$factura->setPrecioEnergiaP1($producto->getPrecioEnergiaP1());
$factura->setPrecioEnergiaP2($producto->getPrecioEnergiaP2());
$factura->setPrecioEnergiaP3($producto->getPrecioEnergiaP3());
$factura->setPrecioEnergiaP4($producto->getPrecioEnergiaP4());
$factura->setPrecioEnergiaP5($producto->getPrecioEnergiaP5());
$factura->setPrecioEnergiaP6($producto->getPrecioEnergiaP6());
}
$factura->setPrecioPotenciaP1($producto->getPrecioPotenciaP1()/365);
$factura->setPrecioPotenciaP2($producto->getPrecioPotenciaP2()/365);
$factura->setPrecioPotenciaP3($producto->getPrecioPotenciaP3()/365);
$factura->setPrecioPotenciaP4($producto->getPrecioPotenciaP4()/365);
$factura->setPrecioPotenciaP5($producto->getPrecioPotenciaP5()/365);
$factura->setPrecioPotenciaP6($producto->getPrecioPotenciaP6()/365);
$factura->setPrecioCompraEnergiaP1($productoProveedor->getPrecioEnergiaP1());
$factura->setPrecioCompraEnergiaP2($productoProveedor->getPrecioEnergiaP2());
$factura->setPrecioCompraEnergiaP3($productoProveedor->getPrecioEnergiaP3());
$factura->setPrecioCompraEnergiaP4($productoProveedor->getPrecioEnergiaP4());
$factura->setPrecioCompraEnergiaP5($productoProveedor->getPrecioEnergiaP5());
$factura->setPrecioCompraEnergiaP6($productoProveedor->getPrecioEnergiaP6());
$factura->setPrecioCompraPotenciaP1($productoProveedor->getPrecioPotenciaP1()/365);
$factura->setPrecioCompraPotenciaP2($productoProveedor->getPrecioPotenciaP2()/365);
$factura->setPrecioCompraPotenciaP3($productoProveedor->getPrecioPotenciaP3()/365);
$factura->setPrecioCompraPotenciaP4($productoProveedor->getPrecioPotenciaP4()/365);
$factura->setPrecioCompraPotenciaP5($productoProveedor->getPrecioPotenciaP5()/365);
$factura->setPrecioCompraPotenciaP6($productoProveedor->getPrecioPotenciaP6()/365);
$factura->setAlquilerEquiposReal($suministro->getAlquilerContadorReal());
$factura->setPrecioReactivaP1(0);
$factura->setPrecioReactivaP2(0);
$factura->setPotenciaP1($suministro->getPotenciaP1());
$factura->setPotenciaP2($suministro->getPotenciaP2());
$factura->setPotenciaP3($suministro->getPotenciaP3());
$factura->setPotenciaP4($suministro->getPotenciaP4());
$factura->setPotenciaP5($suministro->getPotenciaP5());
$factura->setPotenciaP6($suministro->getPotenciaP6());
$factura->setMaximetro($suministro->getMaximetro());
$factura->setNombreCliente($cliente->__toString());
$factura->setNifCliente($cliente->getNif());
$factura->setDireccionCliente($cliente->getDireccion());
$factura->setCpCliente($cliente->getCp());
$factura->setPoblacionCliente($cliente->getPoblacion());
$factura->setProvinciaCliente($cliente->getProvincia());
$factura->setAlquilerEquipos($suministro->getAlquilerContador());
$factura->setIban($contrato->getIban());
$factura->setCcc($contrato->getCcc());
$factura->setFechaEmision(date_create());
$factura->setFactorConversion( $contrato->getFactorConversion() );
/*if( $contrato->getProducto()->getTarifa()->getTipoTarifa()->getNombre()=='Gas' ){
$factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'gas'])->getImporte());
}
else{
if( $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Sí' ]) ||
$contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Reducido (5%)' ]) ){
$factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'electricidad'])->getImporte());
}elseif( $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Reducido' ]) ){
$factura->setImpuesto($impuestoRepository->findOneBy(['nombre'=>'electricidadReducido'])->getImporte());
}else{
$factura->setImpuesto(0);
}
}
if( $contrato->getTipoImpuesto()===$tipoImpuestoRepository->findOneBy([ 'nombre'=>'Reducido (5%)' ]) ){
$factura->setIva($impuestoRepository->findOneBy(['nombre'=>'ivaDiez'])->getImporte());
}else {
$factura->setIva($impuestoRepository->findOneBy(['nombre' => 'iva'])->getImporte());
}*/
$factura->setImpuesto($contrato->getTipoImpuesto()->getImpuesto()->getImporte());
$factura->setIva($contrato->getTipoIva()->getImpuesto()->getImporte());
if($cliente->getNotificaciones()){
$factura->setNotificaciones(true);
$factura->setNombreNotificaciones($cliente->getNombreNotificaciones());
$factura->setDireccionNotificaciones($cliente->getDireccionNotificaciones());
$factura->setCpNotificaciones($cliente->getCpNotificaciones());
$factura->setPoblacionNotificaciones($cliente->getPoblacionNotificaciones());
$factura->setProvinciaNotificaciones($cliente->getProvinciaNotificaciones());
}
else{
$factura->setNotificaciones(false);
}
$ultimaLectura=$contratoRepository->findUltimaLectura($contrato);
if( !empty($ultimaLectura) ){
$factura->setLecturaAnteriorP1($ultimaLectura['P1']);
$factura->setLecturaAnteriorP2($ultimaLectura['P2']);
$factura->setLecturaAnteriorP3($ultimaLectura['P3']);
$factura->setLecturaAnteriorP4($ultimaLectura['P4']);
$factura->setLecturaAnteriorP5($ultimaLectura['P5']);
$factura->setLecturaAnteriorP6($ultimaLectura['P6']);
$factura->setLecturaReactivaAnteriorP1($ultimaLectura['RP1']);
$factura->setLecturaReactivaAnteriorP2($ultimaLectura['RP2']);
$factura->setLecturaReactivaAnteriorP3($ultimaLectura['RP3']);
$factura->setLecturaReactivaAnteriorP4($ultimaLectura['RP4']);
$factura->setLecturaReactivaAnteriorP5($ultimaLectura['RP5']);
$factura->setLecturaReactivaAnteriorP6($ultimaLectura['RP6']);
$factura->setFechaLecturaAnterior( $ultimaLectura['fecha'] );
$factura->setTipoLecturaAnterior($ultimaLectura['tipo']);
}
if( $contrato->getFacturaDevuelta() ){
$concepto=new Concepto();
$concepto->setNombre("Factura devuelta");
$concepto->setImporte( $impuestoRepository->findOneBy(['nombre'=>'facturaDevuelta'])->getImporte() );
$factura->addConcepto($concepto);
}
//Fin datos factura
if( $request->getPathInfo()==$this->generateUrl('contrato_facturar',['id'=>$contrato->getId()]) ){
$form = $this->createForm(FacturaFromContratoType::class, $factura);
}else{
$form = $this->createForm(FacturaType::class, $factura);
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$tarifa=$contrato->getProducto()->getTarifa();
try{
$tarifaFactura=$form->get('tarifa')->getData()??$tarifa;
}catch (\Exception $e){
$tarifaFactura=$tarifa;
}
if($tarifa!==$tarifaFactura){
$factura->setTipoLecturaAnterior($tipoLecturaRepository->findOneBy([ 'nombre'=>'Real' ]));
$producto->setTarifa( $tarifaFactura );
$producto->setPrecioPotenciaP1( $form->get('precioPotenciaP1')->getData()*365 );
$producto->setPrecioPotenciaP2( $form->get('precioPotenciaP2')->getData()*365 );
$producto->setPrecioPotenciaP3( $form->get('precioPotenciaP3')->getData()*365 );
$producto->setPrecioPotenciaP4( $form->get('precioPotenciaP4')->getData()*365 );
$producto->setPrecioPotenciaP5( $form->get('precioPotenciaP5')->getData()*365 );
$producto->setPrecioPotenciaP6( $form->get('precioPotenciaP6')->getData()*365 );
$producto->setPrecioEnergiaP1( $form->get('precioEnergiaP1')->getData() );
$producto->setPrecioEnergiaP2( $form->get('precioEnergiaP2')->getData() );
$producto->setPrecioEnergiaP3( $form->get('precioEnergiaP3')->getData() );
$producto->setPrecioEnergiaP4( $form->get('precioEnergiaP4')->getData() );
$producto->setPrecioEnergiaP5( $form->get('precioEnergiaP5')->getData() );
$producto->setPrecioEnergiaP6( $form->get('precioEnergiaP6')->getData() );
$entityManager->flush();
}else{
/*if( !empty($ultimaLectura) ){
$factura->setLecturaAnteriorP1($ultimaLectura['P1']);
$factura->setLecturaAnteriorP2($ultimaLectura['P2']);
$factura->setLecturaAnteriorP3($ultimaLectura['P3']);
$factura->setLecturaAnteriorP4($ultimaLectura['P4']);
$factura->setLecturaAnteriorP5($ultimaLectura['P5']);
$factura->setLecturaAnteriorP6($ultimaLectura['P6']);
$factura->setFechaLecturaAnterior($ultimaLectura['fecha']);
$factura->setTipoLecturaAnterior($ultimaLectura['tipo']);
}else{*/
$factura->setTipoLecturaAnterior($tipoLecturaRepository->findOneBy([ 'nombre'=>'Real' ]));
//}
}
$factura->setTarifa($tarifaFactura);
$tarifaFinal=$tarifaFactura->getNombre();
if( $tarifaFinal=='3.0A'||$tarifaFinal=='3.1A' ){
$cosFiP1=( $factura->getConsumoP1()+$factura->getConsumoP4() )/sqrt( pow($factura->getConsumoP1()+$factura->getConsumoP4(),2)+pow($factura->getReactivaP1()+$factura->getReactivaP4(),2) );
$cosFiP2=( $factura->getConsumoP2()+$factura->getConsumoP5() )/sqrt( pow($factura->getConsumoP2()+$factura->getConsumoP5(),2)+pow($factura->getReactivaP2()+$factura->getReactivaP5(),2) );
if($cosFiP1<0.8){
$factura->setPrecioReactivaP1($impuestoRepository->findOneBy([ 'nombre'=>'reactivaAlto' ])->getImporte());
}elseif($cosFiP1<=0.95){
$factura->setPrecioReactivaP1($impuestoRepository->findOneBy([ 'nombre'=>'reactivaBajo' ])->getImporte());
}
if($cosFiP2<0.8){
$factura->setPrecioReactivaP2($impuestoRepository->findOneBy([ 'nombre'=>'reactivaAlto' ])->getImporte());
}elseif($cosFiP2<=0.95){
$factura->setPrecioReactivaP2($impuestoRepository->findOneBy([ 'nombre'=>'reactivaBajo' ])->getImporte());
}
$reactivaP1=$factura->getPrecioReactivaP1();
$reactivaP2=$factura->getPrecioReactivaP2();
if ($reactivaP1>$reactivaP2){
$factura->setPrecioReactivaP2($reactivaP1);
}elseif ($reactivaP2>$reactivaP1){
$factura->setPrecioReactivaP1($reactivaP2);
}
}
else{
$precioMax=0;
for($i=1 ; $i<7 ; $i++){
$getReactiva='getReactivaP'.$i;
if( $tarifa->$getReactiva()){
$getConsumo='getConsumoP'.$i;
$setPrecio='setPrecioReactivaP'.$i;
$getPrecio='getPrecioReactivaP'.$i;
try{
$cosFi=$factura->$getConsumo()/sqrt( pow($factura->$getConsumo(),2)+pow($factura->$getReactiva(),2) );
}catch (\Exception $exception){
$cosFi=1;
}
if($cosFi<0.8){
$factura->$setPrecio($impuestoRepository->findOneBy([ 'nombre'=>'reactivaAlto' ])->getImporte());
}elseif($cosFi<=0.95){
$factura->$setPrecio($impuestoRepository->findOneBy([ 'nombre'=>'reactivaBajo' ])->getImporte());
}
$precioMax=max($factura->$getPrecio(), $precioMax);
}
}
for($i=1 ; $i<7 ; $i++){
$getReactiva='getReactivaP'.$i;
if( $tarifa->$getReactiva()){
$setPrecio='setPrecioReactivaP'.$i;
$getPrecio='getPrecioReactivaP'.$i;
if( ($factura->$getPrecio()??0)!=0 ){
$factura->$setPrecio($precioMax);
}
}
}
}
$factura->calcularTotal();
if( $request->getPathInfo()==$this->generateUrl('contrato_facturar',['id'=>$contrato->getId()])){
//Bono social
if( $form->get('bonoSocial')->getData() ){
$bonoSocial=new Concepto();
$importeBonoSocial=$impuestoRepository->findOneBy(['nombre'=>'bonoSocial'],['fecha'=>'DESC'])->getImporte();
$periodoFacturacion=$factura->getPeriodoFacturacion();
$bonoSocial->setNombre('Financiación del Bono Social '.($periodoFacturacion-1).' x '.str_replace('.',',',(float)$importeBonoSocial).' €/día');
$bonoSocial->setImporte(($periodoFacturacion-1)*$importeBonoSocial);
$factura->addConcepto($bonoSocial);
}
//Tope de gas
$hasTopeGas=$form->get('topeGas')->getData();
$hasTopeGasREE=$form->get('topeGasREE')->getData();
if( $hasTopeGas || $hasTopeGasREE ){
$consumoTotal=$factura->getConsumo();
if($consumoTotal!=0){
if ($hasTopeGasREE){
$topeGasREE=new Concepto();
$precioTopeGasREE=$impuestoRepository->findOneBy(['nombre'=>'topeGasREE'])->getImporte();
$topeGasREE->setNombre('Coste tope del gas RDL10/2022 REE '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$precioTopeGasREE).' €/kWh');
$topeGasREE->setImporte($consumoTotal*$precioTopeGasREE);
$factura->addConcepto($topeGasREE);
}
if ($hasTopeGas){
$topeGas=new Concepto();
$topeGasAuto=$form->get('topeGasAuto')->getData();
//Tope de gas auto
if($topeGasAuto){
$porcentajeP=[];
$valorTopeGasP=[];
for ($i=1;$i<=6;$i++){
$valorTopeGasP[$i]=$impuestoRepository->findOneBy(['nombre'=>'valorTopeGasP'.$i])->getImporte();
}
$porcentajeP[1]=$factura->getConsumoP1()/$consumoTotal;
$porcentajeP[2]=$factura->getConsumoP2()/$consumoTotal;
$porcentajeP[3]=$factura->getConsumoP3()/$consumoTotal;
$porcentajeP[4]=$factura->getConsumoP4()/$consumoTotal;
$porcentajeP[5]=$factura->getConsumoP5()/$consumoTotal;
$porcentajeP[6]=$factura->getConsumoP6()/$consumoTotal;
$periodoFacturacion=$factura->getPeriodoFacturacion();
$importesTopeGas=$topeGasRepository->createQueryBuilder('topeGas')
->select('topeGas.importe')
->andWhere('topeGas.fecha>=:lecturaAnterior')
->andWhere('topeGas.fecha<=:fechaLectura')
->setParameter('lecturaAnterior',$factura->getFechaLecturaAnterior())
->setParameter('fechaLectura',$factura->getFechaLectura())
->getQuery()->getArrayResult();
foreach ($importesTopeGas as $key=>$item){
$importesTopeGas[$key]=$item['importe'];
}
while (count($importesTopeGas)<$periodoFacturacion){
$importesTopeGas[]=0;
}
$importeTopeGasTemp=round((array_sum($importesTopeGas) / count($importesTopeGas))+0.018301,5);
$importeTopeGasFinal=0;
for ($i=1;$i<=6;$i++){
$importeTopeGasFinal+=round($importeTopeGasTemp*$porcentajeP[$i]*$valorTopeGasP[$i],5);
}
}
else{
$importeTopeGasFinal=($form->get('topeGasValue')->getData()??$importeTopeGas);
}
$topeGas->setNombre('Coste tope del gas RD 10/2022 '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$importeTopeGasFinal).' €/kWh');
$topeGas->setImporte($consumoTotal*$importeTopeGasFinal);
$factura->addConcepto($topeGas);
}
}
else{
if ($hasTopeGasREE){
$topeGasREE=new Concepto();
$precioTopeGasREE=0;
$topeGasREE->setNombre('Coste tope del gas RDL10/2022 REE '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$precioTopeGasREE).' €/kWh');
$topeGasREE->setImporte($consumoTotal*$precioTopeGasREE);
$factura->addConcepto($topeGasREE);
}
if ($hasTopeGas){
$topeGas=new Concepto();
$precioTopeGas=0;
$topeGas->setNombre('Coste tope del gas RD 10/2022 '.$consumoTotal.' kWh x '.str_replace('.',',',(float)$precioTopeGas).' €/kWh');
$topeGas->setImporte($consumoTotal*$precioTopeGas);
$factura->addConcepto($topeGas);
}
}
}
}
$entityManager->persist($factura);
$entityManager->flush();
$contrato->setUltimaLectura( $contratoRepository->findUltimaLectura($contrato)['fecha'] );
$contrato->setFacturaDevuelta( false );
$entityManager->persist($contrato);
$entityManager->flush();
$logger->info('Factura '.$factura->getId().' creada por usuario '.$this->getUser()->getUserIdentifier());
return $this->redirectToRoute('factura_show',['id'=>$factura->getId()]);
}
return $this->render('factura/new.html.twig', [
'factura' => $factura,
'contrato'=>$contrato,
'form' => $form->createView(),
'devueltaImporte'=>$impuestoRepository->findOneBy(['nombre'=>'facturaDevuelta'])->getImporte(),
'topeGas'=>$importeTopeGas
]);
}
/**
* @Route("/{id}/otrosconceptos", name="contrato_otrosConceptos", methods={"GET","POST"})
*/
public function otrosConceptos(Request $request, Contrato $contrato, ManagerRegistry $doctrine,
FacturaRepository $facturaRepository, FacturaGenericaRepository $facturaGenericaRepository): Response
{
$this->denyAccessUnlessGranted("ROLE_ADMIN");
$factura = new FacturaGenerica();
//Datos factura
$cliente=$contrato->getCliente();
$factura->setContrato($contrato);
$factura->setLogoHosteleria($contrato->isLogoHosteleria());
$factura->setTarifa($contrato->getProducto()->getTarifa());
$factura->setPotenciaP1($contrato->getSuministro()->getPotenciaP1());
$factura->setPotenciaP2($contrato->getSuministro()->getPotenciaP2());
$factura->setPotenciaP3($contrato->getSuministro()->getPotenciaP3());
$factura->setPotenciaP4($contrato->getSuministro()->getPotenciaP4());
$factura->setPotenciaP5($contrato->getSuministro()->getPotenciaP5());
$factura->setPotenciaP6($contrato->getSuministro()->getPotenciaP6());
$factura->setNombreCliente($cliente->__toString());
$factura->setNifCliente($cliente->getNif());
$factura->setDireccionCliente($cliente->getDireccion());
$factura->setCpCliente($cliente->getCp());
$factura->setPoblacionCliente($cliente->getPoblacion());
$factura->setProvinciaCliente($cliente->getProvincia());
$factura->setIban($contrato->getIban());
$factura->setCcc($contrato->getCcc());
$factura->setFechaEmision(date_create());
if($cliente->getNotificaciones()){
$factura->setNotificaciones(true);
$factura->setNombreNotificaciones($cliente->getNombreNotificaciones());
$factura->setDireccionNotificaciones($cliente->getDireccionNotificaciones());
$factura->setCpNotificaciones($cliente->getCpNotificaciones());
$factura->setPoblacionNotificaciones($cliente->getPoblacionNotificaciones());
$factura->setProvinciaNotificaciones($cliente->getProvinciaNotificaciones());
}
else{
$factura->setNotificaciones(false);
}
do{
switch ($_SERVER['APP_ENV']??'finkaluz'){
case 'digitel':
$prefijoFactura='E/'.substr(date('Y'),-2);
$n=$facturaRepository->findNumberByYear(date("Y")) + $facturaGenericaRepository->findNumberByYear(date("Y"));
do{
$n++;
$match=!empty($facturaRepository->findBy(['numeroFactura'=>$prefijoFactura.str_pad($n,4,'0',STR_PAD_LEFT)]));
if(!$match){
$match=!empty($facturaGenericaRepository->findBy(['numeroFactura'=>$n]));
}
}while($match);
$factura->setNumeroFactura($prefijoFactura.str_pad($n, 4, '0', STR_PAD_LEFT));
break;
default:
try{
$factura->setNumeroFactura('F-'.$contrato->getReferenciaContrato().date('dmyHi').random_int(1,999));
}catch (\Exception $exception){
$factura->setNumeroFactura('F-'.$contrato->getReferenciaContrato().date('dmyHi').'8');
}
}
}while( $doctrine->getRepository(FacturaGenerica::class)->findBy(['numeroFactura'=>$factura->getNumeroFactura()]) != null );
//Fin datos factura
$form = $this->createForm(FacturaGenericaType::class, $factura);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $doctrine->getManager();
$factura->calcularTotal();
$entityManager->persist($factura);
$entityManager->flush();
return $this->redirectToRoute('facturaGenerica_show',['id'=>$factura->getId()]);
}
return $this->render('factura_generica/new.html.twig', [
'factura' => $factura,
'contrato'=>$contrato,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/facturas", name="contrato_facturas", methods={"GET","POST"})
*/
public function facturas(Contrato $contrato, FacturaRepository $facturaRepository, FacturaGenericaRepository $facturaGenericaRepository): Response
{
if( !$this->isGranted('ROLE_ADMIN') &&
!$this->getUser()->getCliente()->getContratos()->contains($contrato) &&
!$this->getUser()->getComercial()->getContratos()->contains($contrato) )
{
$this->createAccessDeniedException();
}
return $this->render('factura/index.html.twig', [
'contrato' => $contrato,
'facturas' => array_merge( $facturaRepository->findBy([ 'contrato'=>$contrato ]),$facturaGenericaRepository->findBy(['contrato'=>$contrato]) )
]);
}
/** Comparar fechas factura **/
private function compare($a, $b){
/*$aClass=str_replace('/App/Entity/','',get_class($a));
$bClass=str_replace('/App/Entity/','',get_class($b));
if($aClass==$bClass){
switch ($aClass){
case 'Factura':
return date_diff($a->getFechaEmision(),$b->getFechaEmision());
break;
}
}*/
return date_diff($a->getFechaEmision(),$b->getFechaEmision());
}
}