<?php
namespace App\Controller;
use App\Afiplib\AfipFe;
use App\Entity\AfipEmpresa;
use App\Entity\AfipServicio;
use App\Entity\AfipTicketAcceso;
use App\Entity\Cias;
use App\Entity\ciaMen;
use App\Entity\FacturaAfip;
use App\Entity\PrefacturaCabecera;
use App\Entity\Reports;
use App\Entity\Users;
use App\Kernel;
use App\Service\AwsDownloadService;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;
/**
* Facturaafip controller.
*
* @Route("/factura")
*/
class FacturaAfipController extends AbstractController
{
/**
* Rpt Control AFIP
* @Route ("/control_afip", name = "factura_control_afip")
*/
public function controlAfipAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$options['fechaDesde'] = $request->get('fecha_desde');
$options['fechaHasta'] = $request->get('fecha_hasta');
$options['cpbteDesde'] = $request->get('cpbte_desde');
$options['cpbteHasta'] = $request->get('cpbte_hasta');
$options['cpbteTipo'] = $request->get('cpbte_tipo');
$options['cpbteCae'] = $request->get('cpbte_cae');
$consulta = $request->get('consulta');
$nrosCpbteDB = array();
$facturaAfips = array();
$cpbtesAFipDB = '';
if($consulta)
{
$servicio = 'wsfe';
//Consultamos la tabla Afipservicio para obtener el servicio solicitado, estado, urls, etc
$servicioafip = $em->getRepository('AppBundle:Afipservicio')->findOneBy(array(
'nombreservicio' => $servicio
));
//seteamos en sesion el servicio a utilizar
//$this->get('session')->set('servicioafip', $servicioafip);
//Estado en ProSiS del servicio solicitado, puede ser que por algun motivo se encuentre en "Homologacion" (Modo para pruebas)
$estadoWSFE = $servicioafip->getEstado();
//Cuaquier otro valor pone al servicio en "Homologacion"
if($estadoWSFE != '1'){
$wsdl = $servicioafip -> getWsdlhomo();
$url = $servicioafip -> getUrlhomo();
}else{
$wsdl = $servicioafip -> getWsdl();
$url = $servicioafip -> getUrl();
}
$cuituser = '30714578169'; //veritas
$ticketactivo = $em->getRepository(Afipticketacceso::class)->ticketactivo($cuituser);
$ticketactivo = $em->getRepository(AfipTicketAcceso::class)->ticketactivo($cuituser);
if(!$ticketactivo){
//Se genera un nuevo ticket de acceso en el momento
try {
$ticketactivo = $this->container->get('afip.facturae')->generaTicketAcceso($cuituser, $servicio, $estadoWSFE);
} catch (\Exception $e) {
$error = $e;
}
}
if($ticketactivo)
{
//Consulta a Factura Electronica Dummy, para conocer estado del servicio
$responder = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FEDummy', $wsdl, $url);
$dummyresponse = (array) $responder;
}
if($options['fechaDesde']){
if(!$options['fechaHasta']){
$options['fechaHasta'] = $options['fechaDesde'];
}
$cpbtesAFipDB = $em->getRepository(FacturaAfip::class)->findFacturasPorFechas($options);
}
if($options['cpbteDesde']) {
if (!$options['cpbteHasta']) {
$options['cpbteHasta'] = $options['cpbteDesde'];
}
$cpbtesAFipDB = $em->getRepository(FacturaAfip::class)->findFacturasPorNroCpbte($options);
}
$cpbtesAFipDBArray = new ArrayCollection();
foreach ($cpbtesAFipDB as $cpb){
$cpbtesAFipDBArray[]=$cpb;
}
$consultaAfip = array();
if($cpbtesAFipDBArray) {
$first = $cpbtesAFipDBArray->first();
$consultaAfip['desde'] = $first->getNumeroComprobante();
$last = $cpbtesAFipDBArray->last();
$consultaAfip['hasta'] = $last->getNumeroComprobante();
}
if($cpbtesAFipDBArray)
{
for ($i = $consultaAfip['desde']; $i <= $consultaAfip['hasta']; $i++) {
$controlDB = $em->getRepository(FacturaAfip::class)->findOneBy(array(
'numeroComprobante' => $i,
'tipoId' => $options['cpbteTipo']
));
if(!$controlDB){
//consultar este cpbte que no ecnutro en la DB
$perdido = $this->get('afip.facturae')->FECompConsultarAfip($cuituser, $ticketactivo, $wsdl, $url, '1', $i);
if($perdido){
$facturaAfips[] = $perdido;
}
}
}
}
return $this->render('facturaafip/reporte_control.html.twig', array(
'perdidos' => $facturaAfips
));
}else{
return $this->render('facturaafip/reporte_control_form.html.twig');
}
}
/**
* Export facturas
* @Route ("/export", name = "factura_export_acobrar")
*/
public function exportAction(Request $request, Environment $twig, Kernel $kernel)
{
$em = $this->getDoctrine()->getManager();
$parameters = array(
'estado1' => 'ENVIADA',
'estado2' => 'RECLAMADA',
'estado3' => 'FACTURADA'
);
$dqlSelect = ' SELECT f';
$dqlFrom = ' FROM App:FacturaAfip f';
$dqlWhere = ' WHERE (f.estado =:estado1 OR f.estado=:estado2 OR f.estado=:estado3)';
$dqlOrder = ' ORDER BY f.numeroComprobante ASC, DATE(f.fecha) ASC';
if($request->get('cia')) {
$dqlWhere .= ' AND f.companiaId =:cia';
$parameters['cia'] = $request->get('cia');
}
$dql = $dqlSelect.$dqlFrom.$dqlWhere.$dqlOrder;
$query = $em
->createQuery($dql)
->setParameters($parameters)
;
$facturaAfips = $query->getResult();
$filename = "reporte_facturas_a_cobrar" . date("ymd") . ".csv";
$response = new Response();
$rootdir = $kernel->getProjectDir();
$templateView = file_get_contents("$rootdir/templates/facturaafip/export.csv.twig");
$templateView = str_replace(array("\r", "\n"), '', $templateView);
$templateView = preg_replace('/\s+/', ' ', $templateView);
$renderedTemplateView = $twig->createTemplate($templateView)->render(['facturaAfips' => $facturaAfips]);
$response->setContent(
//$this->renderView($view, array('facturaAfips' => $facturaAfips))
$renderedTemplateView
);
$response->headers->set('Content-Type', 'text/xml');
//return $response;
/*
$response = $this->render('PolizaBundle:Reportes:rpt-solicitud-celular-adm.txt.twig', array(
'entities' => $entities,
'fecha_desde' => $fechainicio,
'fecha_hasta' => $fechafin,
'productos' => $productos
));
*/
//$response->setCharset('ISO-8859-1');
$response->setCharset('UTF-8');
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/txt');
$response->headers->set('Content-Description', 'Submissions Export');
$response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');
return $response;
}
/**
* Interrumpir plazos de facturas
* @Route ("/interrumpir_plazos", name = "factura_interrumpir_plazos")
*/
public function interrumpirPlazosAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository(FacturaAfip::class);
$factura_id = $request->get('factura_id');
$factura = $repository->find($factura_id);
$accion = $request->get('accion');
$procesa = $request->get('procesa');
if($procesa) {
$return = '';
if($accion=='interrumpe') {
$observacion = $request->get('observacion');
$prefacturas = $factura->getPrefacturas();
foreach ($prefacturas as $prefactura) {
$prefactura
->setFechaAutorizacion(null)
->setArchivo($observacion)
->setEstado('INTERRUMPIDA')
;
$em->persist($prefactura);
}
$estadoAnterior = $factura->getEstado();
$factura
->setObservaciones($observacion)
->setEstado('INTERRUMPIDA')
->setGanancias($estadoAnterior)
;
$em->flush();
$return = 'Se interrumpieron los plazos de las prefacturas asociadas ';
}elseif ($accion=='activar') {
$prefacturas = $factura->getPrefacturas();
foreach ($prefacturas as $prefactura) {
$prefactura
->setFechaAutorizacion(new \DateTime('now'))
//@TODO Revisar con estado FACTURADA
->setEstado('FACTURADA')
;
$em->persist($prefactura);
}
$estadoAnterior = $factura->getGanancias();
$factura
->setGanancias(null)
->setEstado($estadoAnterior)
;
$em->flush();
$return = 'Se activaron los plazos de las prefacturas asociadas ';
}
return new JsonResponse([
'success' => true,
'data' => $return,
]);
} else {
if($accion == 'interrumpir') {
return $this->render('facturaafip/interrumpe_plazos.html.twig', array(
'factura' => $factura
));
} else {
return $this->render('facturaafip/activa_plazos.html.twig', array(
'factura' => $factura
));
}
}
}
/**
* Preseleccionar facturas
* @Route ("/preseleccion", name = "factura_preseleccion")
*/
public function preseleccionAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$preseleccion = $request->get('preseleccion');
$session = $request->getSession();
$preseleccion_anterior = $session->get('preseleccion');
$preseleccion .= ','.$preseleccion_anterior;
$session->set('preseleccion', $preseleccion);
$arrayPreseleccion = explode(',', $preseleccion);
$repository = $em->getRepository(FacturaAfip::class);
$query = $repository->createQueryBuilder('f');
$query
->where('f.id IN(:ids)')
->setParameter('ids', $arrayPreseleccion)
->orderBy('f.id', 'ASC');
;
$facturas = $query->getQuery()->getResult();
$facturas_formato = '';
foreach ($facturas as $factura)
{
$facturas_formato .='Fact '.$factura->getNumeroComprobante().' - ';
}
//$facturas_formato .= '</div>';
/*
$return = 'Se preseleccionaron las facturas ' . $facturas_formato ;
return new JsonResponse([
'success' => true,
'data' => $return,
'preseleccion' => $facturas_formato
]);
*/
$session->set('facturas', $facturas_formato);
$return = 'Se preseleccionaron las facturas ' . $facturas_formato ;
return new JsonResponse([
'success' => true,
'data' => $return,
'preseleccion' => $preseleccion,
'facturas' => $facturas_formato
]);
}
/**
* Limpiar preseleccion de facturas
* @Route ("/limpiar_preseleccion", name = "factura_limpiar_preseleccion")
*/
public function limpiarPreseleccionAction(Request $request)
{
$session = $request->getSession();
//$session->clear();
$session->remove('preseleccion');
$session->remove('facturas');
$return = 'Se quitaron las facturas de la preseleccion ';
return new JsonResponse([
'success' => true,
'data' => $return
]);
}
/**
* Recibe una(s) factura(s) para cambiar de estado
* @Route ("/cambia_estado", name = "factura_cambia_estado")
*/
public function cambiaEstadoAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$msj = '';
$estado = $request->get('estado');
$factura_ids = $request->get('enviaFactsIds');
if($factura_ids){
$facturasids = explode(",", $factura_ids);
$facturas = $em->getRepository(FacturaAfip::class)->findById($facturasids);
}
try {
/*if($estado=='AUTORIZADA'){
$this->calculaPrefactura($prefactura_ids);
$this->facturaAfipAction($prefactura_ids);
$msj = 'y se han emitido las facturas afip';
}*/
foreach ($facturas as $factura) {
$this->cambiaEstado($factura, $estado);
}
$return = 'Se ha cambiado el estado a ' . $estado . ' de la(s) factura(s) ' . $factura_ids .' '.$msj;
return new JsonResponse([
'success' => true,
'data' => $return
]);
} catch (\Exception $exception) {
return new JsonResponse([
'success' => false,
'code' => $exception->getCode(),
'message' => $exception->getMessage(),
]);
}
}
/**
* Cambia estado de una prefactura
*/
private function cambiaEstado(FacturaAfip $factura, $estado)
{
$factura->setEstado($estado);
$this->getDoctrine()->getManager()->flush();
return true;
}
/**
* Carga una Orden de Cobro asociada a una o varias facturas
* CUIDADO - FUNCION QUE NO SE USA
* @Route ("/ocform", name = "factura_cias_carga_oc_form")
*/
public function cargaOrdenFormAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$factura_ids = $request->get('ids');
$facturasids = explode(",", $factura_ids);
$facturas = $em->getRepository(FacturaAfip::class)->findById($facturasids);
return $this->render('facturaafip/new_orden_cobro.html.twig', array(
'facturas' => $facturas
));
}
/**
* Displays Cias List
*
* @Route ("/cias_list", name = "factura_cias_list")
*/
public function ciasListAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
//$cias = $em->getRepository('AppBundle:Cias')->findAll();
$cias = $em->getRepository(Cias::class)->getCias();
return $this->render('facturaafip/cias_list.html.twig', array(
'_url_parameters' => $request->get('_url_parameters'),
'cias' => $cias
));
}
/**
* Display form search
*
* @Route ("/form_search", name = "factura_form_search")
*/
public function formSearchAction()
{
$em = $this->getDoctrine()->getManager();
$companias = $em->getRepository(Cias::class)->getCias();
$verificadores = $em->getRepository(Users::class)->getVerificadoresActivos();
$verificadoresInactivos = $em->getRepository(Users::class)->getVerificadoresInactivos();
$tramitadores = $em->getRepository(ciaMen::class)->findBy(array('active' => '1'), array(
'fullname' => 'ASC'
));
return $this->render('facturaafip/form_search.html.twig', array(
'companias' => $companias,
'verificadores' => $verificadores,
'verificadoresInactivos' => $verificadoresInactivos,
'tramitadores' => $tramitadores
));
}
/**
* Lists all facturaAfip entities.
*
* @Route ("/", name = "factura_index")
*/
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$page = $request->query->get('page', '1');
$preseleccion = $request->get('preseleccion');
$factura_id = $request->query->get('factura_id');
$compania = $request->query->get('compania');
$estado = $request->query->get('estado');
$tipo = $request->query->get('tipo');
$sortField = $request->query->get('sortField', 'numeroComprobante');
$sortDirection = $request->query->get('sortDirection', 'DESC');
$q = $request->query->get('q');
$siniestro = $request->query->get('siniestro');
$verificador = $request->query->get('verificador');
$tramitador = $request->query->get('tramitador');
//$cias = $em->getRepository('AppBundle:Cias')->findAll();
$cias = $em->getRepository(Cias::class)->getCias();
$anuladas = $request->get('anuladas');
if($preseleccion)
{
$arrayPreseleccion = explode(',', $preseleccion);
}
if($siniestro)
{
$siniestroObj = $em->getRepository(Reports::class)->findSiniestro($siniestro);
if($siniestroObj){
$prefacturas = $em->getRepository(PrefacturaCabecera::class)->findBy(array(
'siniestroId' => $siniestroObj
));
$q = array();
foreach($prefacturas as $prefactura)
{
$q[]= $prefactura->getFacturaAfipId();
}
}
}
$cuituser = '';
$ivas = '';
$nrotpv = '';
$tiposcbte = '';
$ticketactivo = '';
if($q){
//$facturaAfips = $em->getRepository(FacturaAfip::class)->;
//$qn = null;
$facturaAfips = $em->getRepository(FacturaAfip::class)->getAllFacturas($page, $factura_id, $compania, $q, $estado, $tipo, $sortField, $sortDirection);
}elseif($verificador) {
$facturaAfips = $em->getRepository(FacturaAfip::class)->findFacturasByVerificador($page, $verificador);
}elseif($tramitador) {
$facturaAfips = $em->getRepository(FacturaAfip::class)->findFacturasByTramitador($page, $tramitador);
}
elseif($estado=='para_anular_afip')
{
$facturaAfips = $em->getRepository(FacturaAfip::class)->findFacturasAnuladasAfip($page);
}
else{
$qn = null;
$facturaAfips = $em->getRepository(FacturaAfip::class)->getAllFacturas($page, $factura_id, $compania, $qn, $estado, $tipo, $sortField, $sortDirection);
}
$totalSolicitudes = $facturaAfips->count();
$limit = 25;
$maxPages = ceil($facturaAfips->count() / $limit);
$thisPage = $page;
$limitePageNav = '';
return $this->render('facturaafip/index.html.twig', array(
'preseleccion' => $preseleccion,
'facturaAfips' => $facturaAfips,
'totalSolicitudes' => $totalSolicitudes,
'maxPages' => $maxPages,
'thisPage' => $thisPage,
'limitePageNav' => $limitePageNav,
'cias' => $cias
));
}
/**
* Check health Afip Servers
*
* @Route ("/estado_afip", name = "factura_estado_afip")
*
*/
public function estadoServidoresAfipAction(AfipFe $afipfe)
{
$em = $this->getDoctrine()->getManager();
$empresa = $em->getRepository(AfipEmpresa::class)->findOneBy(array(
'activa' => true
));
$cuit = $empresa->getCuitempresa();
$ticketactivo = $afipfe->getTicketActivo($cuit);
if($ticketactivo)
{
//Consulta a Factura Electronica Dummy, para conocer estado del servicio
$responder = $afipfe->metodoAfip($cuit, $ticketactivo, 'FEDummy');
$dummyresponse = (array) $responder;
if(property_exists($responder, 'FEDummyResult')&&$responder->FEDummyResult->AppServer=='OK') {
$data = $dummyresponse;
$response_code= 200;
$success = true;
}else {
$data = array(
'AppServer'=>'Error',
'DbServer'=>'Error',
'AuthServer'=>'Error',
);
$response_code= 419;
$success = false;
}
return new JsonResponse(array(
'success' => $success,
'data' => $data
), $response_code
);
}else{
return new JsonResponse(array(
'error' => 'error'
), 500
);
}
}
/*
$nrotpv = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FEParamGetPtosVenta', $wsdl, $url);
$tiposcbte = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FEParamGetTiposCbte', $wsdl, $url);
//Se llama a la funcion privada que convierte la respuesta en Array, ideal para pasarlo a Twig y alli
//usar la notacion {{ estadoafip['FEDummyResult']['AppServer'] }}
$dummyresponse = (array) $responder;
//En el controller tambien podemos consultar directamente al objeto que vino en la respuesta
//y almacenar el valor en una variable para consultar o pasarlo a la vista
/*if($responder->FEDummyResult->AppServer=='OK'){
$estadoserver = "OK";
}*/
//$ivas = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FEParamGetTiposIva', $wsdl, $url);
//$ult_aut = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FECompUltimoAutorizado', $wsdl, $url);
//$caes = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FECAEAConsultar', $wsdl, $url);
//$consultadni = $this->get('afip.facturae')->metodoAfip($cuituser, $ticketactivo, 'FECAEAConsultar', $wsdl, $url);
/*
$doscatorce = $this->get('afip.facturae')->FECompConsultarAfip($cuituser, $ticketactivo, $wsdl, $url, 3, 214);
dump($doscatorce);
//public function FECompConsultarAfip($cuit,Afipticketacceso $ticket, $wsdl, $url, $tipo, $cpbte ){
*/
/**
* Creates a new facturaAfip entity.
*
* @Route ("/new", name = "factura_new")
*
*/
public function newAction(Request $request)
{
$facturaAfip = new Facturaafip();
$form = $this->createForm('App\Form\FacturaAfipType', $facturaAfip);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($facturaAfip);
$em->flush();
return $this->redirectToRoute('factura_show', array('id' => $facturaAfip->getId()));
}
return $this->render('facturaafip/new.html.twig', array(
'facturaAfip' => $facturaAfip,
'form' => $form->createView(),
));
}
/**
* Finds and displays a facturaAfip entity.
*
* @Route ("/show", name = "factura_show")
*/
public function showAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$estado = $request->get('estado');
$factura_ids = $request->get('ids');
$facturasids = explode(",", $factura_ids);
$facturaAfips = $em->getRepository(FacturaAfip::class)->findBy(array('id' => $facturasids));
return $this->render('facturaafip/show.html.twig', array(
'factura_ids' => $factura_ids,
'estado' => $estado,
'facturaAfips' => $facturaAfips
));
}
/**
* Displays a form to edit an existing facturaAfip entity.
*
* @Route ("/{id}/edit", name = "factura_edit")
*
*/
public function editAction(Request $request, FacturaAfip $facturaAfip)
{
$em = $this->getDoctrine()->getManager();
$deleteForm = $this->createDeleteForm($facturaAfip);
$editForm = $this->createForm('App\Form\FacturaAfipType', $facturaAfip);
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('factura_edit', array('id' => $facturaAfip->getId()));
}
$prefacturas = $em->getRepository(PrefacturaCabecera::class)->findBy(array(
'facturaAfipId' => $facturaAfip
));
return $this->render('facturaafip/edit.html.twig', array(
'facturaAfip' => $facturaAfip,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
'prefacturas' => $prefacturas
));
}
/**
* Deletes a facturaAfip entity.
*
* @Route ("/{id}/delete", name = "factura_delete")
*
*/
public function deleteAction(Request $request, FacturaAfip $facturaAfip)
{
$form = $this->createDeleteForm($facturaAfip);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->remove($facturaAfip);
$em->flush();
}
return $this->redirectToRoute('factura_index');
}
/**
* Creates a form to delete a facturaAfip entity.
*
* @param FacturaAfip $facturaAfip The facturaAfip entity
*
* @return \Symfony\Component\Form\Form The form
*/
private function createDeleteForm(FacturaAfip $facturaAfip)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('factura_delete', array('id' => $facturaAfip->getId())))
->setMethod('DELETE')
->getForm()
;
}
}