<?php
namespace App\Controller;
use App\Entity\FeCajas;
use App\Entity\FeClientes;
use App\Entity\FeCreDirCuotas;
use App\Entity\FeCreDirecto;
use App\Entity\FeFacCamAdicionales;
use App\Entity\FeFacDetalles;
use App\Entity\FeFacDetImpuestos;
use App\Entity\FeInvMovimientos;
use App\Entity\FeParametros;
use App\Entity\FeTipCreditos;
use App\Entity\FeVenDetalles;
use App\Entity\FeVenDetImpuestos;
use App\Entity\FeVentas;
use App\Entity\Users;
use App\Entity\UtFacturas;
use App\Form\UtFacturasType;
use App\Repository\FeCajasRepository;
use App\Repository\FeClientesRepository;
use App\Repository\FeComerciosRepository;
use App\Repository\FeFacDetallesRepository;
use App\Repository\FeForPagoRepository;
use App\Repository\FeInventariosRepository;
use App\Repository\FeInvMovimientosRepository;
use App\Repository\FeParametrosRepository;
use App\Repository\FeProductosRepository;
use App\Repository\FeSucursalesRepository;
use App\Repository\FeTabIvaRepository;
use App\Repository\FeTipCreditosRepository;
use App\Repository\FeTipIdentificacionesRepository;
use App\Repository\FeVentasRepository;
use App\Repository\UsersRepository;
use App\Repository\UtFacturasRepository;
use Dompdf\Options;
use PHPMailer\PHPMailer\PHPMailer;
use Picqer\Barcode\BarcodeGeneratorPNG;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Dompdf\Dompdf;
/**
* @Route("/ut/facturas")
*/
class UtFacturasController extends AbstractController
{
//prueba templates
/**
* @Route("/test-template", name="ut_facturas_templates", methods={"GET","POST"})
*/
public function template(Request $request, UtFacturasRepository $utFacturasRepository, FeForPagoRepository $feForPagoRepository, FeFacDetallesRepository $feFacDetallesRepository): Response
{
$user = $this->getUser();
$utFactura = $utFacturasRepository->find(950);
$forPago = $feForPagoRepository->getAll();
$facDetalles = $feFacDetallesRepository->findBy(['facturas'=>$utFactura->getId()]);
return $this->render('ut_facturas/'. $utFactura->getComercios()->getComFacTemplate() .'/factura.html.twig',array(
'utFactura' => $utFactura,
'forPago' => $forPago,
'existeLogo' => file_exists("./keys/".$utFactura->getFacRuc()."/logo.png"),
'facDetalles' => $facDetalles,
//'fecAutorizacion' => $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion'],
));
}
//REPORTES
/**
* @Route("/reportes", name="ut_facturas_reportes", methods={"GET","POST"})
*/
public function reportes(Request $request, UtFacturasRepository $utFacturasRepository): Response
{
$user = $this->getUser();
return $this->render('ut_facturas/reportes.html.twig', [
'ut_facturas' => $utFacturasRepository->getAll($user->getComercio()==null?'All':$user->getComercio()->getId()),
]);
}
/**
* @Route("/reportes-comprobantes", name="ut_comprobantes_reportes", methods={"GET","POST"})
*/
public function repComprobamtes(Request $request, UtFacturasRepository $utFacturasRepository): Response
{
$user = $this->getUser();
return $this->render('ut_facturas/repComprobantes.html.twig', [
'ut_comprobantes' => $utFacturasRepository->getComprobantes($user->getComercio()==null?'All':$user->getComercio()->getId()),
]);
}
//FIN REPORTES
//GENERA PDF
/**
* @Route("/genera/pdf/{facId}", name="ut_facturas_genera_pdf", methods={"GET","POST"})
*/
public function generaFacturaPdf($facId, Request $request, UtFacturasRepository $utFacturasRepository, FeFacDetallesRepository $feFacDetallesRepository,
FeForPagoRepository $feForPagoRepository): Response
{
$forPago = $feForPagoRepository->getAll();
$utFactura = $utFacturasRepository->find($facId);
$facDetalles = $feFacDetallesRepository->findBy(['facturas'=>$facId]);
//CREA PDF RIDE
$options = new Options();
$options->set('isRemoteEnabled',TRUE);
$dompdf = new Dompdf($options);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
$dompdf->set_paper('A4');
$html = $this->renderView('ut_facturas/'. $utFactura->getComercios()->getComFacTemplate() .'/factura.html.twig',array(
'utFactura' => $utFactura,
'forPago' => $forPago,
'existeLogo' => file_exists("./keys/".$utFactura->getFacRuc()."/logo.png"),
'facDetalles' => $facDetalles,
//'fecAutorizacion' => $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion'],
));
// Load HTML to Dompdf $dompdf->loadHtml($html); // (Optional) Setup the paper size and orientation 'portrait' or 'portrait' $dompdf->setPaper('A4', 'portrait'); // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser (inline view) $dompdf->stream("mypdf.pdf", [ "Attachment" => false ]); } }
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
file_put_contents("./facturas_ride/".$utFactura->getFacClave().".pdf", $output);
return new Response('ok',200);
}
/**
* @Route("/", name="ut_facturas_index", methods={"GET","POST"})
*/
public function index(Request $request, UtFacturasRepository $utFacturasRepository): Response
{
if($request->isMethod('POST')){
$facId = $_GET['facId'];
}else{
$facId = "0";
}
//dd($facId);
$user = $this->getUser();
return $this->render('ut_facturas/index.html.twig', [
'ut_facturas' => $utFacturasRepository->getAll($user->getComercio()==null?'All':$user->getComercio()->getId()),
'facId'=>$facId
]);
}
/**
* @Route("/new", name="ut_facturas_new", methods={"GET","POST"})
*/
public function new(
Request $request, UserPasswordEncoderInterface $encoder, FeTipIdentificacionesRepository $feTipIdentificacionesRepository,
FeClientesRepository $feClientesRepository, FeProductosRepository $feProductosRepository, FeCajasRepository $feCajasRepository,
UsersRepository $usersRepository, FeSucursalesRepository $feSucursalesRepository, FeInventariosRepository $feInventariosRepository,
FeParametrosRepository $feParametrosRepository, FeTipCreditosRepository $feTipCreditosRepository, FeForPagoRepository $feForPagoRepository,
FeTabIvaRepository $feTabIvaRepository
): Response
{
date_default_timezone_set('America/Guayaquil');
$user = $this->getUser();
$utFactura = new UtFacturas();
$form = $this->createForm(UtFacturasType::class, $utFactura);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
function generacionCodigoNumerico()
{
for( $i = 1; $i <= 8; $i++ ) {
$cod[$i] = rand(0, 9);
}
return implode( $cod );
}
function invertirCadena( $cadena ) {
$cadenaInvertida = "";
for ( $x = strlen( $cadena ) - 1; $x >= 0; $x-- ) {
$cadenaInvertida = $cadenaInvertida . substr( $cadena, $x, 1 );
}
return $cadenaInvertida;
}
function obtenerSumaPorDigitos( $cadena ) {
$pivote = 2;
$longitudCadena = strlen( $cadena );
$cantidadTotal = 0;
$b = 1;
for ( $i = 0; $i < $longitudCadena; $i++ ) {
if ( $pivote == 8 ) {
$pivote = 2;
}
//$temporal = intval(substr($cadena,$i, $b));
$temporal = intval( substr( $cadena, $i, 1 ) );
$b++;
$temporal = $temporal * $pivote;
$pivote++;
$cantidadTotal = $cantidadTotal + $temporal;
}
$cantidadTotal = 11 - $cantidadTotal % 11;
if ( $cantidadTotal == 11 )
$cantidadTotal = 0;
if ( $cantidadTotal == 10 )
$cantidadTotal = 1;
return $cantidadTotal;
}
//INICIO GUARDADO//////////////////////////////////////////////////////////////////////
date_default_timezone_set('America/Guayaquil');
$arreglo = $request->request->all();
//dd($arreglo);
$detalles = json_decode($arreglo['detalles']);
$opcion = $arreglo['opciones'];
//dd($detalles);
$utFactura->setFacTotConImpBase($arreglo['subdoce']);
$utFactura->setFacTotConImpCodigo('2');
$utFactura->setFacTotConImpPorcentaje('2');
$utFactura->setFacTotConImpTarifa('12');
$utFactura->setFacTotConImpValor($arreglo['ivadoce']);
$utFactura->setFacLog('Factura Generada');
//$utFactura->setFacFecEmision(date("Y-m-d"));
$utFactura->setFacFecEnvio(date("Y-m-d"));
$utFactura->setFacFecRespuesta(null);
$utFactura->setFacCajId($arreglo['facCajId']);
//IMPUESTOS
$utFactura->setFacSubCero($arreglo['subcero']);
$utFactura->setFacSubCinco($arreglo['subcinco']);
$utFactura->setFacSubDoce($arreglo['subdoce']);
$utFactura->setFacSubTrece($arreglo['subtrece']);
$utFactura->setFacSubCatorce($arreglo['subcatorce']);
$utFactura->setFacSubQuince($arreglo['subquince']);
$utFactura->setFacSubNoObjeto($arreglo['subnoobjeto']);
$utFactura->setFacSubExento($arreglo['subexento']);
$utFactura->setFacSubDiferenciado($arreglo['subdiferenciado']);
$utFactura->setFacIvaCinco(round($arreglo['ivacinco'],2));
$utFactura->setFacIvaDoce(round($arreglo['ivadoce'],2));
$utFactura->setFacIvaTrece(round($arreglo['ivatrece'],2));
$utFactura->setFacIvaCatorce(round($arreglo['ivacatorce'],2));
$utFactura->setFacIvaQuince(round($arreglo['ivaquince'],2));
//GUARDA INF ADICIONAL
if(isset($arreglo['infAdicional'])){
$utFactura->setFacInfAdicional($arreglo['infAdicional']);
}
//GUARDA DETALLE
foreach ($detalles as $detalle){
//dd($detalle->proCantidad);
$inventario = $feInventariosRepository->find($detalle->invId);
$facDetalle = new FeFacDetalles();
$facDetalle->setFacturas($utFactura);
$facDetalle->setFacDetSubtotal($detalle->proSubTotal);
$facDetalle->setFacDetPvp($detalle->proPvp);
$facDetalle->setFacDetNomProducto($detalle->proNombre);
$facDetalle->setFacDetDescuento($detalle->proDescuento);
$facDetalle->setFacDetCodProducto($detalle->proCodigo);
$facDetalle->setFacDetCantidad($detalle->proCantidad);
$facDetalle->setInventarios($inventario);
$em->persist($facDetalle);
//GUARDA IMPUESTO
$facDetImpuesto = new FeFacDetImpuestos();
$facDetImpuesto->setFacDetImpValor($detalle->proIva);
$facDetImpuesto->setFacDetImpTarifa($detalle->proPorcentaje);
$facDetImpuesto->setFacDetImpCodPorcentaje($detalle->proPorCodigo);
$facDetImpuesto->setFacDetImpCodigo(2);
$facDetImpuesto->setFacDetImpBase($detalle->proSubTotal);
$facDetImpuesto->setFacdetalles($facDetalle);
$facDetImpuesto->setFacDetImpValor($detalle->proIva);
$em->persist($facDetImpuesto);
}
//$em->flush();
$subtot = round($arreglo['ut_facturas']['facTotSinImpuestos'],2);
$total = round($arreglo['ut_facturas']['facTotal'],2);
$tipDoc = "".$arreglo['ut_facturas']['facTipIdeConprador']."";
$numero = "".$arreglo['ut_facturas']['facIdeComprador']."";
$nombre = "".$arreglo['ut_facturas']['facRazSocComprador']."";
$direccion = "".$arreglo['ut_facturas']['facCamAdiDireccion']."";
$email = "".$arreglo['ut_facturas']['facCamAdiEmail']."";
if($email == ''){
$email = "info-e@e-digital.ec";
}
$caja = $feCajasRepository->find($arreglo['facCajId']);
$ticNum = intval($caja->getCajNumFactura()) + 1;
$caja->setCajNumFactura($ticNum);
$em->persist($caja);
//CREA CLIENTE
$clientes = $feClientesRepository->findBy(['cliDocumento'=>$utFactura->getFacIdeComprador(), 'comercios'=>$user->getComercio()->getId()]);
$tipIdentificacion = $feTipIdentificacionesRepository->findBy(['tipIdeCodigo'=>$utFactura->getFacTipIdeConprador()])[0];
if(count($clientes) == 0){
$cliente = new FeClientes();
$cliente->setIdentificaciones($tipIdentificacion);
$cliente->setCliTelefono($utFactura->getFacCamAdiTelefono());
$cliente->setCliNombre($utFactura->getFacRazSocComprador());
$cliente->setCliEstado(1);
$cliente->setCliEmail($utFactura->getFacCamAdiEmail());
$cliente->setCliDocumento($utFactura->getFacIdeComprador());
$cliente->setCliDireccion($utFactura->getFacCamAdiDireccion());
$cliente->setComercios($user->getComercio());
$em->persist($cliente);
//$em->flush();
}else{
$cliente = $clientes[0];
$cliente->setIdentificaciones($tipIdentificacion);
$cliente->setCliTelefono($utFactura->getFacCamAdiTelefono());
$cliente->setCliNombre($nombre);
$cliente->setCliEstado(1);
$cliente->setCliEmail($email);
$cliente->setCliDocumento($numero);
$cliente->setCliDireccion($direccion);
$cliente->setComercios($user->getComercio());
$em->persist($cliente);
}
//CREA USUARTIO PARA CLIENTE
$usuario = $usersRepository->findBy(['username'=>$numero]);
if(count($usuario) == 0){
$user = new Users();
$encoded = $encoder->encodePassword($user, $numero);
$user->addRole('CLIENTE');
$user->setUsername($numero);
$user->setUsernameCanonical($numero);
$user->setEnabled(1);
$user->setEmail($numero."@".$utFactura->getComercios()->getComEcoDominio());
$user->setEmailCanonical($email);
$user->setPassword($encoded);
$user->setUsuNombres($nombre);
$user->setUsuApellidos("");
$user->setMenu(1);
$em->persist($user);
//$em->flush();
}
//GUARDA VENTA
$sucursal = $feSucursalesRepository->find($arreglo['facSucId']);
$venta = new FeVentas();
$venta->setVenUsuario($user->getUsuApellidos()." ".$user->getUsuNombres());
$venta->setVenTotSinImpuestos($arreglo['ut_facturas']['facTotSinImpuestos']);
$venta->setVenTotImpuestos($arreglo['ivadoce']);
$venta->setVenTotDescuentos($arreglo['ut_facturas']['facTotDescuentos']);
$venta->setVenTotConImpuestos($arreglo['ut_facturas']['facTotal']);
$venta->setVenFecVenta(new \DateTime('now'));
if($opcion == 'facturar'){
$venta->setVenEstado('PROCESANDO');
}else {
$venta->setVenEstado('REGISTRADA');
}
$venta->setVenCajId($arreglo['facCajId']);
$venta->setSucursales($sucursal);
$venta->setVenPagCon($arreglo['pagacon']);
$venta->setVenCambio($arreglo['cambio']);
$venta->setVenForPago($arreglo['venforpago']);
$venta->setVenDetPago($arreglo['vendetalle']);
$venta->setVenSubTot0($arreglo['subcero']);
$venta->setVenSubTot12($arreglo['subdoce']);
if(count($clientes) == 0) {
$venta->setClientes($cliente);
}else{
$venta->setClientes($clientes[0]);
}
$em->persist($venta);
//GUARDA DETALLE VENTA
foreach ($detalles as $detalle) {
//dd($detalle->proId);
$inventario = $feInventariosRepository->find($detalle->invId);
$venDetalle = new FeVenDetalles();
$venDetalle->setVenDetSubtotal($detalle->proSubTotal);
$venDetalle->setVenDetPvp($detalle->proPvp);
$venDetalle->setVenDetNomProducto($detalle->proNombre);
$venDetalle->setVenDetDescuento($detalle->proDescuento);
$venDetalle->setVenDetCodProducto($detalle->proCodigo);
$venDetalle->setVenDetCantidad($detalle->proCantidad);
$venDetalle->setVentas($venta);
$venDetalle->setInventarios($inventario);
$em->persist($venDetalle);
//GUARDA IMPUESTOS
$venDetImpuesto = new FeVenDetImpuestos();
$venDetImpuesto->setVenDetImpValor($detalle->proIva);
if ($detalle->proIva == 0) {
$codPor = 0;
$tarifa = 0;
} else {
$codPor = 2;
$tarifa = 12;
}
$venDetImpuesto->setVenDetImpTarifa($tarifa);
$venDetImpuesto->setVenDetImpCodPorcentaje($codPor);
$venDetImpuesto->setVenDetImpCodigo(2);
$venDetImpuesto->setVenDetImpBase($detalle->proSubTotal);
$venDetImpuesto->setVendetalles($venDetalle);
$venDetImpuesto->setVenDetImpValor($detalle->proIva);
$em->persist($venDetImpuesto);
if( $inventario->getProductos()->getProTipInventario() == 'Almacenable'){
//DESCUENTA DE INVENTARIO
//$feInventario = $feInventariosRepository->findBy(["productos" => $detalle->proId])[0];
$feInvMovimiento = new FeInvMovimientos();
$feInvMovimiento->setInvMovCantidad(($inventario->getInvCanDisponible() - $detalle->proCantidad) - $inventario->getInvCanDisponible());
$feInvMovimiento->setInvMovUsuario($user->getUsuApellidos() . " " . $user->getUsuNombres());
$feInvMovimiento->setInvMovTipo("EGRESO");
$feInvMovimiento->setInvMovCanNueva($inventario->getInvCanDisponible() - $detalle->proCantidad);
$feInvMovimiento->setInvMovCanAnterior($inventario->getInvCanDisponible());
$feInvMovimiento->setInvMovObservacion("VENTA REALIZADA");
$feInvMovimiento->setInventarios($inventario);
$feInvMovimiento->setInvMovFecMovimiento(new \DateTime('now'));
$em->persist($feInvMovimiento);
//GUARDA NUEVA CANTIDAD
$inventario->setInvCanDisponible($inventario->getInvCanDisponible() - $detalle->proCantidad);
$em->persist($inventario);
}
}
$utFactura->setVentas($venta);
$em->flush();
//GUARDA CREDITO DIRECTO DE SER EL CASO
if($arreglo['venforpago'] == 'CREDITO DIRECTO'){
$tipCredito = $feTipCreditosRepository->find($arreglo['tipCredito']);
$credito = new FeCreDirecto();
$credito->setCreDirEstado('ACTIVO');
$credito->setCreDirFecha(new \DateTime( "now", new \DateTimeZone( 'America/Guayaquil' )));
$credito->setCreDirIdeCliente($utFactura->getFacIdeComprador());
$credito->setCreDirNomCliente($utFactura->getFacRazSocComprador());
$totIntereses = $arreglo['ut_facturas']['facTotal'] * (($tipCredito->getTipCrePorcentaje() / 100) + 1);
$credito->setCreDirTotal($totIntereses);
$credito->setTipcreditos($tipCredito);
$credito->setVentas($venta);
$em->persist($credito);
$em->flush();
$date = new \DateTime( "now", new \DateTimeZone( 'America/Guayaquil' ));
$time = $date;
//GUARDA CUOTAS CREDITO DIRECTO
for($i=0; $i<$tipCredito->getTipCreMeses(); $i++){
$time = $time->add(new \DateInterval('P1M'));
$cuota = new FeCreDirCuotas();
$cuota->setCreDirCuoEstado('PENDIENTE');
$cuota->setCreDirCuoFecPago(null);
$cuota->setCreDirCuoFecRegistro($date);
$cuota->setCreDirCuoFecVencimiento($time);
$cuota->setCreDirCuoObservacion(null);
$cuoValor = round($credito->getCreDirTotal() / $tipCredito->getTipCreMeses(),2);
$cuota->setCreDirCuoValor($cuoValor);
$cuota->setCreDirCuoAbono(0);
$cuota->setCreDirCuoSaldo($cuoValor);
$cuota->setCredirecto($credito);
$em->persist($cuota);
$em->flush();
}
}
//GENERA CLAVE
$tipoAmbiente = $utFactura->getComercios()->getComAmbiente();
$comRegimen = $utFactura->getComercios()->getComRegimen();
$codigoNumerico = generacionCodigoNumerico();
$fecha = new \DateTime($utFactura->getFacFecEmision());
$fecha = $fecha->format('dmY');
$tipoComprobante = $utFactura->getFacCodDoc();
$numRuc = $utFactura->getFacRuc();
$serie = $utFactura->getFacEstablecimiento().$utFactura->getFacPunEmision();
$numeroComprobante = str_pad($ticNum, 9, "0", STR_PAD_LEFT);
$TipoEmision = $utFactura->getFacTipEmision();
$codigoNume = "$fecha$tipoComprobante$numRuc$tipoAmbiente$serie$numeroComprobante$codigoNumerico$TipoEmision";
$claveautorizacion = "$codigoNume" . obtenerSumaPorDigitos( invertirCadena( $codigoNume ) );
//GUARDA LA FACTURA +
$utFactura->setFacClave($claveautorizacion);
$utFactura->setFacSecuencial($numeroComprobante);
$em->persist($utFactura);
$em->flush();
//genera xml
$fecha = new \DateTime($utFactura->getFacFecEmision());
$fecha = $fecha->format('d/m/Y');
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<factura id="comprobante" version="2.1.0">
<infoTributaria>
<ambiente>'.$tipoAmbiente.'</ambiente>
<tipoEmision>1</tipoEmision>
<razonSocial>'.$utFactura->getFacRazSocial().'</razonSocial>
<nombreComercial>'.$utFactura->getFacNomComercial().'</nombreComercial>
<ruc>'.$utFactura->getFacRuc().'</ruc>
<claveAcceso>'.$claveautorizacion.'</claveAcceso>
<codDoc>'.$utFactura->getFacCodDoc().'</codDoc>
<estab>'.$utFactura->getFacEstablecimiento().'</estab>
<ptoEmi>'.$utFactura->getFacPunEmision().'</ptoEmi>
<secuencial>'.$numeroComprobante.'</secuencial>
<dirMatriz>'.$utFactura->getFacDirMatriz().'</dirMatriz>';
if($utFactura->getComercios()->getComRimpe() == 'R') {
$xml .= '
<contribuyenteRimpe>CONTRIBUYENTE RÉGIMEN RIMPE</contribuyenteRimpe>';
}
if($utFactura->getComercios()->getComRimpe() == 'N') {
$xml .= '
<contribuyenteRimpe>CONTRIBUYENTE NEGOCIO POPULAR - RÉGIMEN RIMPE</contribuyenteRimpe>';
}
$xml .='
</infoTributaria>
<infoFactura>
<fechaEmision>'. $fecha .'</fechaEmision>
<dirEstablecimiento>'.$utFactura->getFacDirEstablecimiento().'</dirEstablecimiento>
<obligadoContabilidad>'.$utFactura->getFacObligado().'</obligadoContabilidad>
<tipoIdentificacionComprador>'.$tipDoc.'</tipoIdentificacionComprador>
<razonSocialComprador>'.$nombre.'</razonSocialComprador>
<identificacionComprador>'.$numero.'</identificacionComprador>
<direccionComprador>'.$direccion.'</direccionComprador>
<totalSinImpuestos>'.$subtot.'</totalSinImpuestos>
<totalDescuento>'.$utFactura->getFacTotDescuentos().'</totalDescuento>
<totalConImpuestos>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>0</codigoPorcentaje>
<baseImponible>'.$utFactura->getFacSubCero().'</baseImponible>
<tarifa>0</tarifa>
<valor>0</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>5</codigoPorcentaje>
<baseImponible>'.$utFactura->getFacSubCinco().'</baseImponible>
<tarifa>5</tarifa>
<valor>' . $utFactura->getFacIvaCinco() . '</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<baseImponible>'.$utFactura->getFacSubDoce().'</baseImponible>
<tarifa>12</tarifa>
<valor>'.$utFactura->getFacIvaDoce().'</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>10</codigoPorcentaje>
<baseImponible>'.$utFactura->getFacSubTrece().'</baseImponible>
<tarifa>13</tarifa>
<valor>'.$utFactura->getFacIvaTrece().'</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>3</codigoPorcentaje>
<baseImponible>'.$utFactura->getFacSubCatorce().'</baseImponible>
<tarifa>14</tarifa>
<valor>'.$utFactura->getFacIvaCatorce().'</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>4</codigoPorcentaje>
<baseImponible>'.$utFactura->getFacSubQuince().'</baseImponible>
<tarifa>15</tarifa>
<valor>'.$utFactura->getFacIvaQuince().'</valor>
</totalImpuesto>
</totalConImpuestos>
<propina>0.00</propina>
<importeTotal>'.$total.'</importeTotal>
<moneda>DOLAR</moneda>
<pagos>
<pago>
<formaPago>'.strval($utFactura->getFacForPago()).'</formaPago>
<total>'.$total.'</total>
</pago>
</pagos>
</infoFactura>
<detalles>';
for($i=0; $i<count($detalles); $i++){
$detalle = (array)$detalles[$i];
$atributos = json_decode($detalle['invAtributos']);
//GENERA ETIQUETAS Y VALORES
$etiquetas = "";
$valores = "";
if( is_array($atributos)){
for($j=0; $j<count($atributos); $j++){
//var_dump($atributos[$i]->name);
$etiquetas .= $atributos[$j]->name . "|";
$valores .= $atributos[$j]->value . "|";
}
}
if($detalle['proIva'] == 0){
$codPor = 0;
$tarifa = 0;
}else{
$codPor = 2;
$tarifa = 12;
}
$xml .='
<detalle>
<codigoPrincipal>'.$detalle['invId'].'</codigoPrincipal>
<descripcion>'.$detalle['proNombre'].'</descripcion>
<cantidad>'.round($detalle['proCantidad'],2).'</cantidad>
<precioUnitario>'.round($detalle['proPvp'],4).'</precioUnitario>
<descuento>'.round($detalle['proDescuento'],2).'</descuento>
<precioTotalSinImpuesto>'.round($detalle['proSubTotal'],2).'</precioTotalSinImpuesto>
<detallesAdicionales>
<detAdicional nombre="ETIQUETAS" valor="'. ($etiquetas!=""?$etiquetas:"none") . '"/>
<detAdicional nombre="VALORES" valor="'. ($valores!=""?$valores:"none") . '"/>
</detallesAdicionales>
<impuestos>
<impuesto>
<codigo>2</codigo>
<codigoPorcentaje>'.$detalle['proPorCodigo'].'</codigoPorcentaje>
<tarifa>'.$detalle['proPorcentaje'].'</tarifa>
<baseImponible>'.round($detalle['proSubTotal'],2).'</baseImponible>
<valor>'.round($detalle['proIva'],2).'</valor>
</impuesto>
</impuestos>
</detalle>';
}
$xml .='
</detalles>
<infoAdicional>
<campoAdicional nombre="Dirección">'.$direccion.'</campoAdicional>
<campoAdicional nombre="Email">'.$email.'</campoAdicional>
</infoAdicional>
</factura>';
$doc = new \DOMDocument(1.0);
$nombre_archivo = "logscron.txt";
//file_exists($nombre_archivo);
$log = fopen($nombre_archivo, "a+");
$mensaje = $xml;
fwrite($log, "------XML-----". $mensaje. "\n");
$doc->loadXML($xml);
$doc->saveXML();
$doc->save('facturas_generadas/'.$claveautorizacion.'.xml');
////////////////////////////////////////////////////////////////////////////////// //FIRMA XML
function hex_to_base64( $hex ) {
$return = '';
foreach ( str_split( $hex, 2 ) as $pair ) {
$return .= chr( hexdec( $pair ) );
}
return base64_encode( $return );
}
function getModulo($utFactura) {
//$numRuc = $_SESSION[ 'rucempresa' ];
$data = openssl_pkey_get_details( openssl_pkey_get_private( file_get_contents( "keys/".$utFactura->getFacRuc()."/key.pem" ) ) );
$modulus = base64_encode( $data[ 'rsa' ][ 'n' ] );
return $modulus;
}
function getPublicKey($utFactura) {
//$numRuc = $_SESSION[ 'rucempresa' ];
$data = file_get_contents( "keys/".$utFactura->getFacRuc()."/cert.pem" );
$begin = "CERTIFICATE-----";
$end = "-----END";
$pem_data = substr( $data, strpos( $data, $begin ) + strlen( $begin ), strpos( $data, $end ) - ( strpos( $data, $begin ) + strlen( $begin ) ) );
return str_replace( "\n", "", $pem_data );
}
function pem2der( $pem_data ) {
$begin = "CERTIFICATE-----";
$end = "-----END";
$pem_data = substr( $pem_data, strpos( $pem_data, $begin ) + strlen( $begin ) );
$pem_data = substr( $pem_data, 0, strpos( $pem_data, $end ) );
$der = base64_decode( $pem_data );
return $der;
}
$pem_data = file_get_contents( "keys/".$utFactura->getFacRuc()."/cert.pem" );
$pem2der = pem2der( $pem_data );
$ruta = 'facturas_generadas/'.$claveautorizacion.'.xml';
$doc = new \DOMDocument(1.0);
$doc->load( $ruta, LIBXML_NOEMPTYTAG );
$root = $doc->getElementsByTagName( "factura" )->item( 0 );
$x = $doc->getElementsByTagName( "factura" )->item( 0 )->C14N();
$digestRef3 = hex_to_base64( sha1( $x ) );
$llavepublica = wordwrap( getPublicKey($utFactura), 76, "\n", true );
$modulo = wordwrap( getModulo($utFactura), 76, "\n", true );
$DigestValueCert = hex_to_base64( sha1( $pem2der ) );
$certdata = array();
$certdata = openssl_x509_parse( file_get_contents( "keys/".$utFactura->getFacRuc()."/cert.pem" ), 0 );
//dd($certdata);
$ds = "ds:";
$etsi = "etsi:";
function generateRandomNumber( $digits ) {
if ( $digits > 9 ) {
return generateRandomNumber( $digits - 9 ) . generateRandomNumber( 9 );
}
return "" . rand( pow( 10, $digits - 1 ), pow( 10, $digits ) - 1 );
}
$nombreIssuer = "CN=" . $certdata[ 'issuer' ][ 'commonName' ];
if(isset($certdata[ 'issuer' ][ 'localityName' ])){
$nombreIssuer .= ",L=".$certdata[ 'issuer' ][ 'localityName' ];
}
$nombreIssuer .= ",OU=". $certdata[ 'issuer' ][ 'organizationalUnitName' ] . ",O=" . $certdata[ 'issuer' ][ 'organizationName' ] . ",C=" . $certdata[ 'issuer' ][ 'countryName' ];
$pos = strpos($certdata['issuer']['commonName'], 'ANF');
if($pos !== false) {
$nombreIssuer .= ",2.5.4.5=#130d31373932363031323135303031";
}
$pos = strpos($certdata['issuer']['commonName'], 'UANATACA');
if($pos !== false) {
$nombreIssuer .= ",2.5.4.97=#0c0f56415445532d413636373231343939";
}
$numerodeserie = $certdata[ 'serialNumber' ];
$CertificateNumber = generateRandomNumber( 7 );
$SignatureNumber = generateRandomNumber( 6 );
$SignedPropertiesNumber = generateRandomNumber( 5 );
$SignedInfoNumber = generateRandomNumber( 6 );
$SignedPropertiesIDNumber = generateRandomNumber( 6 );
$ReferenceIDNumber = generateRandomNumber( 6 );
$SignatureValueNumber = generateRandomNumber( 6 );
$ObjectNumber = generateRandomNumber( 6 );
$signature = $doc->createElement( $ds . "Signature" );
$signature->setAttribute( 'xmlns:ds', 'http://www.w3.org/2000/09/xmldsig#' );
$signature->setAttribute( 'xmlns:etsi', 'http://uri.etsi.org/01903/v1.3.2#' );
$signature->setAttribute( 'Id', 'Signature' . $SignatureNumber );
$root->appendChild( $signature );
$SignedInfo = $doc->createElement( $ds . "SignedInfo" );
$SignedInfo->setAttribute( 'Id', 'Signature-SignedInfo' . $SignedInfoNumber );
$signature->appendChild( $SignedInfo );
$CanonicalizationMethod = $doc->createElement( $ds . "CanonicalizationMethod" );
$CanonicalizationMethod->setAttribute( 'Algorithm', 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315' );
$SignedInfo->appendChild( $CanonicalizationMethod );
$SignatureMethod = $doc->createElement( $ds . "SignatureMethod" );
$SignatureMethod->setAttribute( 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#rsa-sha1' );
$SignedInfo->appendChild( $SignatureMethod );
$Reference1 = $doc->createElement( $ds . "Reference" );
$Reference1->setAttribute( 'Id', 'SignedPropertiesID' . $SignedPropertiesIDNumber );
$Reference1->setAttribute( 'Type', 'http://uri.etsi.org/01903#SignedProperties' );
$Reference1->setAttribute( 'URI', '#Signature' . $SignatureNumber . '-SignedProperties' . $SignedPropertiesNumber );
$SignedInfo->appendChild( $Reference1 );
$DigestMethod = $doc->createElement( $ds . "DigestMethod", '' );
$Reference1->appendChild( $DigestMethod );
$DigestMethod->setAttribute( 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1' );
$DigestValue1 = $doc->createElement( $ds . "DigestValue" );
$Reference1->appendChild( $DigestValue1 );
$Reference2 = $doc->createElement( $ds . "Reference" );
$Reference2->setAttribute( 'URI', '#Certificate' . $CertificateNumber );
$SignedInfo->appendChild( $Reference2 );
$DigestMethod = $doc->createElement( $ds . "DigestMethod", '' );
$DigestMethod->setAttribute( 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1' );
$Reference2->appendChild( $DigestMethod );
$DigestValue2 = $doc->createElement( $ds . "DigestValue" );
$Reference2->appendChild( $DigestValue2 );
$Reference3 = $doc->createElement( $ds . "Reference" );
$Reference3->setAttribute( 'Id', 'Reference-ID-' . $ReferenceIDNumber );
$Reference3->setAttribute( 'URI', '#comprobante' );
$SignedInfo->appendChild( $Reference3 );
$Transforms = $doc->createElement( $ds . "Transforms" );
$Reference3->appendChild( $Transforms );
$Transform = $doc->createElement( $ds . "Transform" );
$Transform->setAttribute( 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#enveloped-signature' );
$Transforms->appendChild( $Transform );
$DigestMethod = $doc->createElement( $ds . "DigestMethod" );
$DigestMethod->setAttribute( 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1' );
$Reference3->appendChild( $DigestMethod );
$DigestValue3 = $doc->createElement( $ds . "DigestValue", $digestRef3 );
$Reference3->appendChild( $DigestValue3 );
//se acaba el signed info
$SignatureValue = $doc->createElement( $ds . "SignatureValue" );
$SignatureValue->setAttribute( 'Id', 'SignatureValue' . $SignatureValueNumber );
$signature->appendChild( $SignatureValue );
//SE acaba el valor de la firma
$KeyInfo = $doc->createElement( $ds . "KeyInfo" );
$KeyInfo->setAttribute( 'Id', 'Certificate' . $CertificateNumber );
$signature->appendChild( $KeyInfo );
$X509Data = $doc->createElement( $ds . "X509Data" );
$KeyInfo->appendChild( $X509Data );
$X509Certificate = $doc->createElement( $ds . "X509Certificate", "\n" . $llavepublica . "\n" );
$X509Data->appendChild( $X509Certificate );
$KeyValue = $doc->createElement( $ds . "KeyValue" );
$KeyInfo->appendChild( $KeyValue );
$RSAKeyValue = $doc->createElement( $ds . "RSAKeyValue" );
$KeyValue->appendChild( $RSAKeyValue );
$Modulus = $doc->createElement( $ds . "Modulus", "\n" . $modulo . "\n" );
$RSAKeyValue->appendChild( $Modulus );
$Exponent = $doc->createElement( $ds . "Exponent", "AQAB" );
$RSAKeyValue->appendChild( $Exponent );
$SignatureValue = $doc->getElementsByTagName( "SignatureValue" )->item( 0 );
//COMIENZA OBJECT
$doc->save( $ruta, LIBXML_NOEMPTYTAG );
$doc->load( $ruta, LIBXML_NOEMPTYTAG );
$Object = $doc->createElement( $ds . "Object" );
$Object->setAttribute( 'Id', 'Signature' . $SignatureNumber . '-Object' . $ObjectNumber );
$signature = $doc->getElementsByTagName( 'Signature' )->item( 0 );
$signature->appendChild( $Object );
$QualifyingProperties = $doc->createElement( $etsi . "QualifyingProperties" );
$QualifyingProperties->setAttribute( 'Target', '#Signature' . $SignatureNumber );
$Object->appendChild( $QualifyingProperties );
$SignedProperties = $doc->createElement( $etsi . "SignedProperties" );
$SignedProperties->setAttribute( 'Id', 'Signature' . $SignatureNumber . "-SignedProperties" . $SignedPropertiesNumber );
$QualifyingProperties->appendChild( $SignedProperties );
$SignedSignatureProperties = $doc->createElement( $etsi . "SignedSignatureProperties" );
$SignedProperties->appendChild( $SignedSignatureProperties );
$date = new \DateTime( "now", new \DateTimeZone( 'America/Guayaquil' ) );
$SigningTime = $doc->createElement( $etsi . "SigningTime", $date->format( 'c' ) );
$SignedSignatureProperties->appendChild( $SigningTime );
$SigningCertificate = $doc->createElement( $etsi . "SigningCertificate" );
$SignedSignatureProperties->appendChild( $SigningCertificate );
$Cert = $doc->createElement( $etsi . "Cert" );
$SigningCertificate->appendChild( $Cert );
$CertDigest = $doc->createElement( $etsi . "CertDigest" );
$Cert->appendChild( $CertDigest );
$DigestMethod = $doc->createElement( $ds . "DigestMethod" );
$DigestMethod->setAttribute( 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1' );
$CertDigest->appendChild( $DigestMethod );
$DigestValue = $doc->createElement( $ds . "DigestValue", $DigestValueCert );
$CertDigest->appendChild( $DigestValue );
$IssuerSerial = $doc->createElement( $etsi . "IssuerSerial" );
$Cert->appendChild( $IssuerSerial );
$X509IssuerName = $doc->createElement( $ds . "X509IssuerName", $nombreIssuer ); //CAMBIAR RAZON ESTATIOCOS
$IssuerSerial->appendChild( $X509IssuerName );
$X509SerialNumber = $doc->createElement( $ds . "X509SerialNumber", $numerodeserie ); //CAMBIAR RAZON ESTATIOCOS
$IssuerSerial->appendChild( $X509SerialNumber );
$SignedDataObjectProperties = $doc->createElement( $etsi . "SignedDataObjectProperties" );
$SignedProperties->appendChild( $SignedDataObjectProperties );
$DataObjectFormat = $doc->createElement( $etsi . "DataObjectFormat" );
$DataObjectFormat->setAttribute( "ObjectReference", "#Reference-ID-" . $ReferenceIDNumber );
$SignedDataObjectProperties->appendChild( $DataObjectFormat );
$SignedDataObjectProperties = $doc->createElement( $etsi . "Description", 'contenido comprobante' );
$DataObjectFormat->appendChild( $SignedDataObjectProperties );
$SignedDataObjectProperties = $doc->createElement( $etsi . "MimeType", 'text/xml' );
$DataObjectFormat->appendChild( $SignedDataObjectProperties );
if ( $doc->save( $ruta, LIBXML_NOEMPTYTAG ) ) {
$doc->preserveWhiteSpace = true;
$doc->formatOutput = false;
$doc->load( $ruta );
$primerDigestRef = hex_to_base64( sha1( $doc->getElementsByTagName( "SignedProperties" )->item( 0 )->C14N() ) );
$segundoDigestRef = hex_to_base64( sha1( $doc->getElementsByTagName( "KeyInfo" )->item( 0 )->C14N() ) );
$reference1 = $doc->getElementsByTagName( "Reference" )->item( 0 );
$DigestValue1 = $reference1->getElementsByTagName( "DigestValue" )->item( 0 );
$text = $doc->createTextNode( $primerDigestRef );
$text = $DigestValue1->appendChild( $text );
$reference2 = $doc->getElementsByTagName( "Reference" )->item( 1 );
$DigestValue2 = $reference2->getElementsByTagName( "DigestValue" )->item( 0 );
$text = $doc->createTextNode( $segundoDigestRef );
$text = $DigestValue2->appendChild( $text );
$doc->save( $ruta, LIBXML_NOEMPTYTAG );
$doc->load( $ruta );
// VALOR DE SignatureValue
$pkey = file_get_contents( "keys/".$utFactura->getFacRuc()."/key.pem" );
openssl_sign( $doc->getElementsByTagName( "SignedInfo" )->item( 0 )->C14N(), $sigval, $pkey );
$valorFirma = wordwrap( base64_encode( $sigval ), 76, "\n", true );
$SignatureValue = $doc->getElementsByTagName( "SignatureValue" )->item( 0 );
$text = $doc->createTextNode( "\n" . $valorFirma . "\n" );
$text = $SignatureValue->appendChild( $text );
if ( $doc->save( $ruta, LIBXML_NOEMPTYTAG ) ) {
//GUARDA XML EN BD
if($opcion == 'facturar'){
$utFactura->setFacEstado("FIRMADA");
}else{
$utFactura->setFacEstado("REGISTRADA");
}
$utFactura->setFacXml(strval($doc->saveXML()));
$em->persist($utFactura);
$em->flush();
}
}
////////////////////////////////////////////////////////////////////////////////// //FIN FIRMA XML
////////////////////////////////////////////////////////////////////////////////// //GENERA PDF COMPROBANTE
//$url = "http://localhost/jm/billingplus/public/ut/facturas/comprobante/pdf/".$utFactura->getId();
//header( 'Location: http://www.yoursite.com/new_page.html' );
if($opcion == 'facturar') {
return $this->redirectToRoute('ut_facturas_index', ['facId' => $utFactura->getId()], 307);
}else{
return $this->redirectToRoute('fe_ventas_index', ['facId' => $utFactura->getId()], 307);
}
////////////////////////////////////////////////////////////////////////////////// //FIN GENERA PDF COMPROBANTE
}
$parametros = $feParametrosRepository->getParametrosByComercio($user->getComercio()->getId());
$forPago = $feForPagoRepository->getAll();
foreach ($parametros as $parametro ){
if($parametro['parNombre'] == 'automotores' && $parametro['parValor'] == 'S'){
return $this->render('ut_facturas/new_automotores.html.twig', [
'user'=>$user,
'comId' => $user->getComercio()==null?'All':$user->getComercio()->getId(),
'parametros' => $parametros,
'forpago' => $forPago,
'fe_clientes' => $feClientesRepository->getAll($user->getComercio()==null?'All':$user->getComercio()->getId()),
'fe_productos' => $feProductosRepository->getAllByEstado($user->getComercio()==null?'All':$user->getComercio()->getId(),1,$user->getSucursal()->getId()),
'ut_factura' => $utFactura,
'tipos_credito' => $feTipCreditosRepository->getAllByEstado($user->getComercio()==null?'All':$user->getComercio()->getId(), 1),
'form' => $form->createView(),
'ivas' => $feTabIvaRepository->getActivas()
]);
}
}
return $this->render('ut_facturas/new.html.twig', [
'user'=>$user,
'comId' => $user->getComercio()==null?'All':$user->getComercio()->getId(),
'parametros' => $parametros,
'forpago' => $forPago,
'fe_clientes' => $feClientesRepository->getAll($user->getComercio()==null?'All':$user->getComercio()->getId()),
'fe_productos' => $feProductosRepository->getAllByEstado($user->getComercio()==null?'All':$user->getComercio()->getId(),1,$user->getSucursal()->getId()),
'ut_factura' => $utFactura,
'ivas' => $feTabIvaRepository->getActivas(),
'tipos_credito' => $feTipCreditosRepository->getAllByEstado($user->getComercio()==null?'All':$user->getComercio()->getId(), 1),
'form' => $form->createView(),
]);
}
/**
* Genera Comprobante en PDF para impresion
*
* @Route("/comprobante/pdf/{facId}", name="utfacturas_comprobante", methods={"POST","GET"})
*/
public function comprobanteAction($facId, UtFacturasRepository $utFacturasRepository, FeFacDetallesRepository $feFacDetallesRepository,
UsersRepository $usersRepository, FeForPagoRepository $feForPagoRepository)
{
if(isset($_GET['tickets'])){
$tickets = json_decode($_GET['tickets']);
}else{
$tickets = null;
}
$em = $this->getDoctrine()->getManager();
$forPago = $feForPagoRepository->getAll();
$utFacturas = $utFacturasRepository->find($facId);
$productos = $feFacDetallesRepository->findBy(['facturas'=>$facId]);
$vendedor = $usersRepository->find($utFacturas->getFacUsuario());
// Introducimos HTML de prueba
$options = new Options();
$options->set('isRemoteEnabled',TRUE);
$dompdf = new Dompdf($options);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
$paper_size = array(0,0,215.4334,600);
$dompdf->set_paper($paper_size);
$dompdf->set_option('defaultMediaType', 'all');
$dompdf->set_option('isFontSubsettingEnabled', true);
$html = $this->renderView('ut_facturas/comprobante.html.twig',array(
'forPago' => $forPago,
'utFacturas' => $utFacturas,
'productos' => $productos,
'tickets' => $tickets,
'vendedor' => $vendedor
));
// Load HTML to Dompdf $dompdf->loadHtml($html); // (Optional) Setup the paper size and orientation 'portrait' or 'portrait' $dompdf->setPaper('A4', 'portrait'); // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser (inline view) $dompdf->stream("mypdf.pdf", [ "Attachment" => false ]); } }
$dompdf->load_html($html);
$dompdf->render();
/*$page_count = $dompdf->get_canvas( )->get_page_number( );
unset( $dompdf );
$dompdf = new Dompdf($options);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
$paper_size = array(0,0,215.4334, 215.4334 * $page_count + 20);
$dompdf->set_paper($paper_size);
$html = $this->renderView('ut_facturas/comprobante.html.twig',array(
'utFacturas' => $utFacturas,
'productos' => $productos,
'tickets' => $tickets,
'vendedor' => $vendedor
));
// Load HTML to Dompdf $dompdf->loadHtml($html); // (Optional) Setup the paper size and orientation 'portrait' or 'portrait' $dompdf->setPaper('A4', 'portrait'); // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser (inline view) $dompdf->stream("mypdf.pdf", [ "Attachment" => false ]); } }
$dompdf->load_html($html);
$dompdf->render();*/
$dompdf->stream($utFacturas->getFacClave().'.pdf', array("Attachment" => false));
exit;
}
/**
* CRON proceso de autorizacion de facturas
*
* @Route("/autorizacion/cron/", name="utfacturas_autorizacion_cron", methods={"GET"})
* @throws \SoapFault
*/
public function cronAction(UtFacturasRepository $utFacturasRepository, FeFacDetallesRepository $feFacDetallesRepository,
FeVentasRepository $feVentasRepository, FeComerciosRepository $feComerciosRepository, FeForPagoRepository $feForPagoRepository)
{
date_default_timezone_set('America/Guayaquil');
$em = $this->getDoctrine()->getManager();
$forPago = $feForPagoRepository->getAll();
$utFacturas = $utFacturasRepository->getFacPendientes();
if(count($utFacturas) < 1){
$mensaje = "No existen facturas pendientes o recibidas";
$response = json_encode($mensaje);
return new Response($response, 200, array('Content-Type' => 'application/json'));
}
$nombre_archivo = "logscron.txt";
file_exists($nombre_archivo);
$log = fopen($nombre_archivo, "a+");
$mensaje = "inicio ";
fwrite($log, "-------------". $mensaje. "\n");
fwrite($log, date("d-m-Y H:m:s"). "\n");
foreach ($utFacturas as $factura) {
$facId = $factura['id'];
$utFactura = $utFacturasRepository->find($facId);
fwrite($log, "\n factura con estado -> ". $utFactura->getFacEstado() . " \n");
$facDetalles = $feFacDetallesRepository->findBy(['facturas'=>$facId]);
fwrite($log, "\n id de factura: ". $facId. "\n");
$tipoAmbiente = $utFactura->getComercios()->getComAmbiente();
fwrite($log, "\n Ambiente: ". $tipoAmbiente. "\n");
$claveautorizacion = $factura['facClave'];
$ruta = 'facturas_generadas/' . $claveautorizacion . '.xml';
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
ini_set('default_socket_timeout', 600);
if($factura['facEstado'] != 'RECIBIDA'){
if ($tipoAmbiente == "1") {
$url = "https://celcer.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl";
} else if ($tipoAmbiente == "2") {
$url = "https://cel.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl"; // AMBIENTE PRODUCCION ACTIVAR AL ESTAR SEGUROS
}
$stream_context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$options = array(
'exceptions' => true,
'trace' => 1,
'stream_context' => $stream_context,
);
$client = new \SoapClient($url, $options);
$x = array();
$x['xml'] = file_get_contents($ruta);
$result = "";
$result = $client->validarComprobante($x);
fwrite($log, "\n Result ValidarComprovante: ". json_encode($result). "\n");
$array = json_decode(json_encode($result), True);
//$em->flush();
if (@$array['RespuestaRecepcionComprobante']['estado'] == "RECIBIDA") {
$mensaje = "El comprobante ha sido RECIBIDO";
$utFactura->setFacEstado('RECIBIDA');
$utFactura->setFacLog($mensaje);
$em->persist($utFactura);
$em->flush();
fwrite($log, "\n Factura Recibida \n");
} else {
if (@$array['RespuestaRecepcionComprobante']['estado'] == "DEVUELTA") {
if (@$array['RespuestaRecepcionComprobante']['comprobantes']['comprobante']['mensajes']['mensaje']['mensaje'] == "CLAVE ACCESO REGISTRADA") {
$mensaje = "Este comprobante ya ha sido enviado.";
} else {
$mensaje = json_encode($array['RespuestaRecepcionComprobante']['comprobantes']['comprobante']) ;
}
$utFactura->setFacEstado('DEVUELTA');
$utFactura->setFacLog($mensaje);
$em->persist($utFactura);
$em->flush();
fwrite($log, "\n Factura Devuelta: ".$mensaje." \n");
} else {
$mensaje = $array['RespuestaRecepcionComprobante']['estado'];
$utFactura->setFacEstado('ERROR');
$utFactura->setFacLog($mensaje);
$em->persist($utFactura);
$em->flush();
fwrite($log, "\n Factura Con Errores: ".$mensaje." \n");
}
$response = json_encode($mensaje);
return new Response($response, 200, array('Content-Type' => 'application/json'));
}
}
//VALIDAR LA AUTORIZACION DE LA FACTURA
if ($tipoAmbiente == "1") {
$urlAutorizacion = "https://celcer.sri.gob.ec/comprobantes-electronicos-ws/AutorizacionComprobantesOffline?wsdl";
} else if ($tipoAmbiente == "2") {
$urlAutorizacion = "https://cel.sri.gob.ec/comprobantes-electronicos-ws/AutorizacionComprobantesOffline?wsdl"; // AMBIENTE PRODUCCION ACTIVAR AL ESTAR SEGUROS
}
$stream_context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]);
$options = array(
'exceptions' => true,
'trace' => 1,
'stream_context' => $stream_context
);
$client = new \SoapClient($urlAutorizacion, $options);
$peticion = array(
"autorizacionComprobante" => array(
"claveAccesoComprobante" => $claveautorizacion,
)
);
$resultAutorizacion = $client->__soapCall("autorizacionComprobante", $peticion);
$array = json_decode(json_encode($resultAutorizacion), True);
if(count($array['RespuestaAutorizacionComprobante']['autorizaciones']) > 0) {
fwrite($log, "\n Despues de RECIBIDA -> " . $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['estado'] . "\n");
if ($array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['estado'] == "AUTORIZADO") {
$mensaje = "El Comprobante ha sido AUTORIZADO";
$doc = new \DOMDocument('1.0', 'UTF-8');
$root = $doc->createElement("autorizacion");
$doc->appendChild($root);
$estado = $doc->createElement("estado", $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['estado']);
$root->appendChild($estado);
$numeroAutorizacion = $doc->createElement("numeroAutorizacion", $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['numeroAutorizacion']);
$root->appendChild($numeroAutorizacion);
$fechaAutorizacion = $doc->createElement("fechaAutorizacion", $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion']);
$root->appendChild($fechaAutorizacion);
$ambiente = $doc->createElement("ambiente", $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['ambiente']);
$root->appendChild($ambiente);
$prefijo = "<";
$posfijo = ">";
$comprobanteconcdata = htmlspecialchars_decode($array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['comprobante']);
$comprobante = $doc->createElement("comprobante", $comprobanteconcdata);
$root->appendChild($comprobante);
if (!file_exists('facturas_autorizadas')) {
mkdir('facturas_autorizadas', 0755, true);
}
$doc->save("./facturas_autorizadas/" . $claveautorizacion . ".xml");
$utFactura->setFacEstado('AUTORIZADA');
$utFactura->setFacLog($mensaje);
$utFactura->setFacFecRespuesta($array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion']);
$em->persist($utFactura);
$comercio = $feComerciosRepository->find($utFactura->getComercios()->getId());
if ($comercio->getPlanes()->getPlaNumDocumentos())
$comercio->setComNumDocDisponibles($comercio->getComNumDocDisponibles() - 1);
$em->persist($comercio);
fwrite($log, "\n Factura Autorizada \n");
$em->flush();
//CREA CODEBAR
$generator = new BarcodeGeneratorPNG();
$barcode = $generator->getBarcode($claveautorizacion, $generator::TYPE_CODE_128);
file_put_contents("./codigos_barra/" . $claveautorizacion . '.png', $barcode);
fwrite($log, "\n Código de Barras generado \n");
//CREA PDF RIDE
$options = new Options();
$options->set('isRemoteEnabled', TRUE);
$dompdf = new Dompdf($options);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed' => TRUE
]
]);
$dompdf->setHttpContext($contxt);
$dompdf->set_paper('A4');
$html = $this->renderView('ut_facturas/' . $utFactura->getComercios()->getComFacTemplate() . '/factura.html.twig', array(
'forPago' => $forPago,
'utFactura' => $utFactura,
'existeLogo' => file_exists("./keys/" . $utFactura->getFacRuc() . "/logo.png"),
'facDetalles' => $facDetalles,
));
// Load HTML to Dompdf $dompdf->loadHtml($html); // (Optional) Setup the paper size and orientation 'portrait' or 'portrait' $dompdf->setPaper('A4', 'portrait'); // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser (inline view) $dompdf->stream("mypdf.pdf", [ "Attachment" => false ]); } }
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
file_put_contents("./facturas_ride/" . $claveautorizacion . ".pdf", $output);
fwrite($log, "\n PDF RIDE Generado \n");
//CAMBIA ESTADO AL REGISTRO DE VENTA
$venta = $feVentasRepository->find($utFactura->getVentas()->getId());
$venta->setVenEstado('FACTURADA');
$em->persist($venta);
$em->flush();
fwrite($log, "\n Cambia estado de la venta \n");
//ENVIO DE CORREO
$mail = new PHPMailer(true);
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
//$mail->SMTPDebug = 2;
//Luego tenemos que iniciar la validación por SMTP:
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = $_ENV['mailer_secure'];
$mail->Host = $_ENV['mailer_host'];
$mail->Username = $_ENV['mailer_user'];
$mail->Password = $_ENV['mailer_password'];
$mail->Port = $_ENV['mailer_port'];
$mail->SMTPKeepAlive = true;
$mail->Mailer = $_ENV['mailer_transport'];
$mail->From = $_ENV['mailer_from'];
$mail->FromName = $utFactura->getFacNomComercial(); //A RELLENAR Nombre a mostrar del remitente.
$mail->AddAddress("jaimemejiar1980@gmail.com");
$mail->AddAddress($comercio->getComEmail());
if ($factura['facCamAdiEmail'] != '' and $tipoAmbiente == 2) {
$mail->AddAddress($utFactura->getComercios()->getComEmail());
if (filter_var($factura['facCamAdiEmail'], FILTER_VALIDATE_EMAIL)) {
$mail->AddAddress($factura['facCamAdiEmail']);
} else {
fwrite($log, "\n mail mo válido \n");
}
} else {
fwrite($log, "\n Ambiente de pruebas o correo no válido \n");
}
$archivoPDF = "./facturas_ride/" . $claveautorizacion . ".pdf";
$archivoXML = "./facturas_autorizadas/" . $claveautorizacion . ".xml";
$mail->AddAttachment($archivoXML);
$mail->AddAttachment($archivoPDF);
$mail->IsHTML(true); // El correo se envía como HTML
$fecha = new \DateTime('now');
$mail->Subject = utf8_decode("FACTURAS ELECTRONICAS - DOCUMENTO GENERADO"); // Este es el titulo del email.
$body = $this->renderView('emails/factura.html.twig', array(
'utFactura' => $utFactura,
'facDetalles' => $facDetalles,
'existeLogo' => file_exists("./keys/" . $utFactura->getFacRuc() . "/logo.png"),
//'fecAutorizacion' => $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion'],
));
$body .= utf8_decode("<br><br><h3>Este correo es enviado automaticamente, favor no responder</h3>");
$mail->Body = $body; // Mensaje a enviar.
$exito = $mail->Send(); // Envía el correo.
//var_dump($mail);
if ($exito) {
$mensaje = "El correo fue enviado correctamente.";
} else {
$mensaje = "Hubo un problema. Contacta a un administrador.";
}
fwrite($log, "\n PDF: -> " . $mensaje . " \n");
} else {
$mensaje = json_encode($array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje']);
/*if(is_array($array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje'])){
dd($array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje']);
$mensaje = $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje'][0]['mensaje'] . " -> " . $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje'][0]['informacionAdicional'];
}else{
$mensaje = $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje']['mensaje'] . " -> " . $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['mensajes']['mensaje']['informacionAdicional'];
}*/
$utFactura->setFacEstado('ERROR-AUT');
$utFactura->setFacLog($mensaje);
$em->persist($utFactura);
fwrite($log, "\n Factura Con Errores en la Autorización \n");
}
fwrite($log, $mensaje);
}else{
$utFactura->setFacEstado('DEVUELTA');
$utFactura->setFacLog("Servicio SRI con intermitencias");
$em->persist($utFactura);
fwrite($log, "\n Servicios SRI con errore \n");
}
}
$mensaje = "fin";
fwrite($log, "\n-------------". $mensaje. "\n");
fclose($log);
$response = json_encode($mensaje);
return new Response($response, 200, array('Content-Type' => 'application/json'));
}
/**
* @Route("/{id}/show", name="ut_facturas_show", methods={"GET"})
*/
public function show(UtFacturas $utFactura, FeFacDetallesRepository $feFacDetallesRepository, FeForPagoRepository $feForPagoRepository): Response
{
$forPago = $feForPagoRepository->getAll();
$productos = $feFacDetallesRepository->findBy(['facturas'=>$utFactura->getId()]);
//CREA PDF RIDE
$options = new Options();
$options->set('isRemoteEnabled',TRUE);
$dompdf = new Dompdf($options);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
$dompdf->set_paper('A4');
$html = $this->renderView('ut_facturas/'. $utFactura->getComercios()->getComFacTemplate() .'/factura.html.twig',array(
'forPago' => $forPago,
'utFactura' => $utFactura,
'existeLogo' => file_exists("./keys/".$utFactura->getFacRuc()."/logo.png"),
'productos' => $productos,
//'fecAutorizacion' => $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion'],
));
// Load HTML to Dompdf $dompdf->loadHtml($html); // (Optional) Setup the paper size and orientation 'portrait' or 'portrait' $dompdf->setPaper('A4', 'portrait'); // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser (inline view) $dompdf->stream("mypdf.pdf", [ "Attachment" => false ]); } }
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->stream($utFactura->getFacClave().'.pdf', array("Attachment" => false));
exit;
}
/**
* @Route("/{id}/edit", name="ut_facturas_edit", methods={"GET","POST"})
*/
public function edit(Request $request, UtFacturas $utFactura): Response
{
$form = $this->createForm(UtFacturasType::class, $utFactura);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('ut_facturas_index');
}
return $this->render('ut_facturas/edit.html.twig', [
'ut_factura' => $utFactura,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="ut_facturas_delete", methods={"DELETE"})
*/
public function delete(Request $request, UtFacturas $utFactura): Response
{
if ($this->isCsrfTokenValid('delete'.$utFactura->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($utFactura);
$entityManager->flush();
}
return $this->redirectToRoute('ut_facturas_index');
}
/**
* re envía PDF de la facturas
*
* @Route("/reenviar-pdf/{id}", name="utfacturas_reenviar_pdf", methods={"GET"})
* @throws \SoapFault
*/
public function reenviarPdf(UtFacturas $utFactura, FeFacDetallesRepository $feFacDetallesRepository, FeForPagoRepository $feForPagoRepository)
{
$forPago = $feForPagoRepository->getAll();
date_default_timezone_set('America/Guayaquil');
$em = $this->getDoctrine()->getManager();
$facDetalles = $feFacDetallesRepository->findBy(['facturas'=>$utFactura->getId()]);
$tipoAmbiente = $utFactura->getComercios()->getComAmbiente();
$claveautorizacion = $utFactura->getFacClave();
//ENVIO DE CORREO
$mail = new PHPMailer(true);
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
//$mail->SMTPDebug = 2;
//Luego tenemos que iniciar la validación por SMTP:
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = $_ENV['mailer_secure'];
$mail->Host = $_ENV['mailer_host'];
$mail->Username = $_ENV['mailer_user'];
$mail->Password = $_ENV['mailer_password'];
$mail->Port = $_ENV['mailer_port'];
$mail->SMTPKeepAlive = true;
$mail->Mailer = $_ENV['mailer_transport'];
$mail->From = $_ENV['mailer_from'];
$mail->FromName = $utFactura->getFacNomComercial(); //A RELLENAR Nombre a mostrar del remitente.
$mail->AddAddress("jaimemejiar1980@gmail.com");
$mail->AddAddress($utFactura->getComercios()->getComEmail());
if($utFactura->getFacCamAdiEmail() != '' and $tipoAmbiente == 2) {
$mail->AddAddress($utFactura->getComercios()->getComEmail());
if (filter_var($utFactura->getFacCamAdiEmail(), FILTER_VALIDATE_EMAIL)) {
$mail->AddAddress($utFactura->getFacCamAdiEmail());
}
}
$archivoPDF = "./facturas_ride/".$claveautorizacion.".pdf";
$archivoXML = "./facturas_autorizadas/".$claveautorizacion.".xml";
$mail->AddAttachment($archivoXML);
$mail->AddAttachment($archivoPDF);
$mail->IsHTML(true); // El correo se envía como HTML
$fecha = new \DateTime('now');
$mail->Subject = utf8_decode("FACTURAS ELECTRONICAS - DOCUMENTO GENERADO"); // Este es el titulo del email.
$body = $this->renderView('emails/factura.html.twig',array(
'forPago' => $forPago,
'utFactura' => $utFactura,
'facDetalles' => $facDetalles,
'existeLogo' => file_exists("./keys/".$utFactura->getFacRuc()."/logo.png"),
//'fecAutorizacion' => $array['RespuestaAutorizacionComprobante']['autorizaciones']['autorizacion']['fechaAutorizacion'],
));
$body .= utf8_decode("<br><br><h3>Este correo es enviado automaticamente, favor no responder</h3>");
$mail->Body = $body; // Mensaje a enviar.
$exito = $mail->Send(); // Envía el correo.
//var_dump($mail);
if ($exito) {
$mensaje = "El correo fue enviado correctamente.";
} else {
$mensaje = "Hubo un problema. Contacta a un administrador.";
}
return $this->redirectToRoute('ut_facturas_index');
//$response = json_encode($mensaje);
//return new Response($mensaje, 200, array('Content-Type' => 'application/json'));
}
}