/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.fp.armas.rules.query.solicitud;

import com.fp.armas.mail.ScheduleNotificacionCliente;
import com.fp.common.logger.APPLogger;
import com.fp.persistence.commondb.data.SessionData;
import com.fp.persistence.commondb.data.ThreadFacade;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonPhone;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneCity;
import com.fp.persistence.pgeneral.gene.TgeneCityKey;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.gene.TgeneParametersKey;
import com.fp.persistence.pgeneral.gene.TgeneSolicitude;
import com.fp.sessionbeans.helper.Sequence;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import javax.annotation.PostConstruct;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.jboss.logging.Logger;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 *
 * @author developer2
 */
@Singleton
@Startup
public class ScheduleXMLSolicitud {

    private final Logger LOG = Logger.getLogger(ScheduleNotificacionCliente.class.getName());
    private EntityManagerFactory emf;

   
    @PostConstruct
    private final void crearManager() {
        try {
            if (emf == null) {
                Map<String, Object> configOverrides = new HashMap<String, Object>();
                configOverrides.put("hibernate.ejb.cfgfile", "hibernateFlipMapping.cfg.xml");
                emf = Persistence.createEntityManagerFactory("local1", configOverrides);
            }
            SessionData sessionData = new SessionData();
            sessionData.setCompany(1);
            sessionData.setIsEjb(Boolean.FALSE);
            ThreadFacade.setSaveRequest(sessionData);
        } catch (Exception e) {
            APPLogger.getLogger().error(e);
        }
    }

    /**
     * ======================== GENERAR EL XML ==============================
     */
    public void crearAgregarHijo(Document doc, Element padre, String nombreElemento, String textoElemento) {
        Element hijo = crearElemento(doc, nombreElemento, textoElemento);
        agregarHijoPadre(doc, padre, hijo);
    }

    public void crearAtributo(Document doc, Element elemento, String nombreAtributo, String valorAtributo) {
        Attr attr = doc.createAttribute(nombreAtributo);
        attr.setValue(valorAtributo);
        elemento.setAttributeNode(attr);
    }

    public void crearAgregarHijoAtributo(Document doc, Element padre, String nombreElemento, String textoElemento, String nombreAtributo, String textoAtributo) {
        Element hijo = crearElemento(doc, nombreElemento, textoElemento);
        crearAtributo(doc, hijo, nombreAtributo, textoAtributo);
        agregarHijoPadre(doc, padre, hijo);
    }

    public Element crearElemento(Document doc, String nombreElemento, String textoElemento) {
        Element elemento1 = doc.createElement(nombreElemento);
        elemento1.setTextContent(textoElemento);
        return elemento1;
    }

    public Element crearElementoSinTexto(Document doc, String nombreElemento) {
        Element elemento1 = doc.createElement(nombreElemento);
        return elemento1;
    }

    public void agregarHijoPadre(Document doc, Element padre, Element hijo) {
        padre.appendChild(hijo);

    }

    /**
     * ======================================== GENERAR ESTRUCTURA XML ===========
     */
    public String sacarFactura(Object[] facturaObj, String rucComaco, String sequ, 
            File carpetaBase, TgeneParameters custodio) throws Exception {
        String noDisponible = "";
        /**
         * ============================ NO ESTATICAS ===============0
         */
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
       
        //Elemento raíz
        Document doc = docBuilder.newDocument();
        Element factura = doc.createElement("factura");
        doc.appendChild(factura);
        crearAgregarHijo(doc, factura, "ruc", rucComaco);
        crearAgregarHijo(doc, factura, "secuencia", sequ);
        String serie = facturaObj[25] != null ? facturaObj[25].toString().replace("-", "") : noDisponible;

        crearAgregarHijo(doc, factura, "serie", serie);
        //Fecha de emision
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        String fechaEmision = sdf.format(Calendar.getInstance().getTime());
        crearAgregarHijo(doc, factura, "fecha", fechaEmision);
        /**
         * ============================= DATOS DE PERSONA
         */
        String tipoDocumento = facturaObj[7] != null ? facturaObj[7].toString() : noDisponible;
        String nombre = facturaObj[9] != null ? facturaObj[9].toString() : noDisponible;
        String identificacion = facturaObj[10] != null ? facturaObj[10].toString() : noDisponible;
        crearAgregarHijo(doc, factura, "tipoIdComprador", tipoDocumento);
        crearAgregarHijo(doc, factura, "razonSocialComprador", nombre);
        crearAgregarHijo(doc, factura, "identificacionComprador", identificacion);
        /**
         * Direccion
         */
        String direccionDomicilio = facturaObj[11] != null ? facturaObj[11].toString() : noDisponible;
        String mail = facturaObj[12] != null ? 
                facturaObj[12].toString().contains(",")
                ? facturaObj[12].toString().split(",")[0].trim()
                : facturaObj[12].toString().trim() : noDisponible;
        String valorAPagar = facturaObj[6] != null ? facturaObj[6].toString() : noDisponible;
        crearAgregarHijo(doc, factura, "direccionComprador", direccionDomicilio);
        crearAgregarHijo(doc, factura, "totalSinImpuestos", valorAPagar.toString());
        crearAgregarHijo(doc, factura, "totalDescuento", "0.00");
        /**
         * ================== impuestoTotal ================
         */
        String impuesto = "IVA";
        int porcentajeDescuento = 0;

        Double descuento = 0.00;
        Element impuestoTotal = crearElementoSinTexto(doc, "impuestoTotal");
        Element totalImpuesto1 = crearElementoSinTexto(doc, "totalImpuesto");
        Element totalImpuesto2 = crearElementoSinTexto(doc, "totalImpuesto");

        crearAgregarHijo(doc, totalImpuesto1, "codigo", impuesto);
        crearAgregarHijo(doc, totalImpuesto1, "Porcentaje", porcentajeDescuento + "");
        crearAgregarHijo(doc, totalImpuesto1, "baseImponible", valorAPagar);


        crearAgregarHijo(doc, totalImpuesto2, "codigo", impuesto);
        crearAgregarHijo(doc, totalImpuesto2, "Porcentaje", "12");
        crearAgregarHijo(doc, totalImpuesto2, "baseImponible", "0.00");
        agregarHijoPadre(doc, impuestoTotal, totalImpuesto1);
        agregarHijoPadre(doc, impuestoTotal, totalImpuesto2);
        agregarHijoPadre(doc, factura, impuestoTotal);
        crearAgregarHijo(doc, factura, "totalFactura", valorAPagar);
        /**
         * ========================= Detalles ================================
         */
        String []servicio = facturaObj[23] != null ? facturaObj[23].toString().split("-"): null;
        String codigoPrincipal = servicio != null ? servicio[0].toString() : ""; /**===> IMPORTANTE REVISAR*/
        String descripcion = servicio != null ? servicio[1].toString() : "";/**===> IMPORTANTE REVISAR*/
        int cantidad = 1;
        Double precioUnitario = Double.isNaN(Double.valueOf(facturaObj[4].toString()))? 0.00 : Double.valueOf(facturaObj[4].toString());
        Double precioTotalSinImpuestos = precioUnitario * cantidad;
        Element detalles = crearElementoSinTexto(doc, "detalles");
        Element detalle1 = crearElementoSinTexto(doc, "detalle");
        crearAgregarHijo(doc, detalle1, "codigoPrincipal", codigoPrincipal);
        crearAgregarHijo(doc, detalle1, "descripcion", descripcion);
        crearAgregarHijo(doc, detalle1, "cantidad", cantidad + "");
        crearAgregarHijo(doc, detalle1, "precioUnitario", precioUnitario.toString());
        crearAgregarHijo(doc, detalle1, "descuento", "0.00");
        crearAgregarHijo(doc, detalle1, "precioTotalSinImpuesto", precioTotalSinImpuestos.toString());

        Element impuestoItem = crearElementoSinTexto(doc, "impuestoItem");
        Element impueste = crearElementoSinTexto(doc, "impuesto");

        /**
         * ==== impuesto item ==
         */
        crearAgregarHijo(doc, impueste, "impuesto", impuesto);
        crearAgregarHijo(doc, impueste, "Porcentaje", porcentajeDescuento + "");
        crearAgregarHijo(doc, impueste, "baseImponible", precioTotalSinImpuestos + "");
        agregarHijoPadre(doc, impuestoItem, impueste);
        agregarHijoPadre(doc, detalle1, impuestoItem);
        agregarHijoPadre(doc, detalles, detalle1);

        /**
         * custodios
         */
        if (facturaObj[5] != null &&  !Double.isNaN(Double.valueOf(facturaObj[5].toString())) && Double.valueOf(facturaObj[5].toString())>0) {
            Element detalle2 = crearElementoSinTexto(doc, "detalle");
            String codigoPrincipal2 = custodio.getNumbervalue().toString().contains(".") 
                    ? custodio.getNumbervalue().toString().split("\\.")[0] : custodio.getNumbervalue().toString() ;
            int numeroDias = facturaObj[26] != null ? Integer.parseInt(facturaObj[26].toString()): 1; 
            int numeroCustodios = facturaObj[24] != null ? Integer.parseInt(facturaObj[24].toString()): 1;
            String descripcion2 = String.format(custodio.getTextvalue(), numeroDias);
            Double precioUnitario2 = Double.parseDouble(facturaObj[5].toString()) / numeroCustodios; /**debido a que en la base antes no se detallaba el numero de custodios*/
            Double precioTotalSinImpuestos2 = Double.parseDouble(facturaObj[5].toString());

            crearAgregarHijo(doc, detalle2, "codigoPrincipal", codigoPrincipal2);
            crearAgregarHijo(doc, detalle2, "descripcion", descripcion2);
            crearAgregarHijo(doc, detalle2, "cantidad", numeroCustodios + "");
            crearAgregarHijo(doc, detalle2, "precioUnitario", precioUnitario2.toString());
            crearAgregarHijo(doc, detalle2, "descuento", "0.00");
            crearAgregarHijo(doc, detalle2, "precioTotalSinImpuesto", precioTotalSinImpuestos2.toString());

            Element impuestoItem2 = crearElementoSinTexto(doc, "impuestoItem");
            Element impueste2 = crearElementoSinTexto(doc, "impuesto");
            crearAgregarHijo(doc, impueste2, "impuesto", impuesto);
            crearAgregarHijo(doc, impueste2, "Porcentaje", porcentajeDescuento + "");
            crearAgregarHijo(doc, impueste2, "baseImponible", precioTotalSinImpuestos2.toString());
            agregarHijoPadre(doc, impuestoItem2, impueste2);
            agregarHijoPadre(doc, detalle2, impuestoItem2);
            agregarHijoPadre(doc, detalles, detalle2);
        }
        agregarHijoPadre(doc, factura, detalles);

        /**
         * ========================= Pagos ================================
         */
        Element pagos = crearElementoSinTexto(doc, "pagos");

        Element pago = crearElementoSinTexto(doc, "pago");
        String formaPago = "EF";
        /**
         * de momento, tocaria ver los nemonicos a futuro para pago con tarjeta
         */
        String totalPagar = valorAPagar;
        crearAgregarHijo(doc, pago, "formaPago", formaPago);
        crearAgregarHijo(doc, pago, "total", totalPagar);
        agregarHijoPadre(doc, pagos, pago);
        agregarHijoPadre(doc, factura, pagos);
        /**
         * ========================= INFOAdicional ========================
         */
        String telefonoFijo = facturaObj[22] != null ? facturaObj[22].toString() : noDisponible;
        if (telefonoFijo.contains("-")) {
            telefonoFijo = telefonoFijo.split("-")[1];
        }

        String ciudad = facturaObj[21] != null ? facturaObj[21].toString() : noDisponible;

        Element infoAdicional = crearElementoSinTexto(doc, "infoAdicional");
        crearAgregarHijoAtributo(doc, infoAdicional, "campoAdicional", mail, "nombre", "Mail");
        crearAgregarHijoAtributo(doc, infoAdicional, "campoAdicional", telefonoFijo, "nombre", "Telefono");
        crearAgregarHijoAtributo(doc, infoAdicional, "campoAdicional", ciudad, "nombre", "Ciudad");
        agregarHijoPadre(doc, factura, infoAdicional);

        //Se escribe el contenido del XML en un archivo
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        /**
         * String path = carpetaBase.getAbsolutePath(); if(!path.endsWith("/")){
         * path = path.concat("/");
      }
         */
        //path=path.concat(String.format("Factura-%s.xml", solicitud.getNumerosolicitud()));
        File facturaFile = new File(carpetaBase, String.format("%s.xml", facturaObj[1].toString()));
        StreamResult result = new StreamResult(facturaFile);
        transformer.transform(source, result);
        return facturaFile.getAbsolutePath();
    }
    
    /**Leer el archivo de la factura */
    
    public String obtenerContenidoArchivo(String archivo) throws FileNotFoundException, IOException { 
        StringBuilder sb = new StringBuilder(); 
	FileReader f = new FileReader(archivo); 
    	String cadena; 
	BufferedReader b = new BufferedReader(f); 
	while((cadena = b.readLine())!=null) { 
		sb.append(cadena.concat("\n"));
	} 
	b.close(); 
        return sb.toString();
   }
    
    public TgeneParameters obtenerParametroSQL(String code, StringBuilder sql, EntityManager entityManager){
         List<TgeneParameters> lstPath = entityManager.createQuery(sql.toString(), TgeneParameters.class)
                    .setParameter("code", code)
                    .setParameter("companycode", 1)
                    .getResultList();
         return lstPath.get(0);
    }
    public TgeneParameters obtenerParametro(String code,  EntityManager entityManager) throws Exception{
        return TgeneParameters.find(entityManager, new TgeneParametersKey(code, 1));
    }
    
    @Schedule( dayOfWeek = "4", hour = "10",second = "0", minute = "1", persistent = false)
    public void generarXMLs() {
        try {

            EntityManager entityManager = emf.createEntityManager();
            
            TgeneParameters ejecucion = obtenerParametro("EJECUCIONXML", entityManager);
            
            if(ejecucion.getNumbervalue().compareTo(BigDecimal.ZERO) == 0){
                throw new Exception(new Date().toString().concat(": Ejecucion de la facturacion desactivada"));
            }
            
            TgeneParameters tParameter = obtenerParametro("PATHFACTURASXML", entityManager);

            String folderPath = tParameter.getTextvalue();
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HHmmss");
            String fechaActual = sdf.format(Calendar.getInstance().getTime()).replace(" ", "_");
            folderPath = folderPath.concat(fechaActual).concat("/");

            TgeneParameters rucComaco = obtenerParametro("RUCCOMACO",  entityManager);
            TgeneParameters custodio = obtenerParametro("CUSTODIOSFACTURA",entityManager);
            StringBuilder strSolicitud = new StringBuilder(
                    "SELECT t.CSOLICITUD, t.NUMEROSOLICITUD, p.PERSONCODE FROM TARMSOLICITUD t\n"
                    + "LEFT JOIN TARMSOLICITUDTRAMITE t2 \n"
                    + "ON t.CSOLICITUD = t2.CSOLICITUD \n"
                    + "LEFT JOIN TCUSTPERSONDETAIL p \n"
                    + "ON t.PERSONCODE = p.PERSONCODE \n"
                    + "AND p.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') \n"
                    + "WHERE t2.ESTADOTRAMITE = 'APBDEP' and\n"
                    + "t2.valorapagar is not null and t2.valorapagar > 0\n"
                    + "limit 105 \n"

            );
            List<Object[]> lstSolicitudesPersona = entityManager.createNativeQuery(strSolicitud.toString())
                    .getResultList();
            //Sequence sequencia = new Sequence();
            //Integer nextValue = sequence.getNumbervalue().intValue(); //Integer.valueOf(sequencia.getNextValue("FACTSEQ").toString());
            //Integer acum = Integer.parseInt(sequence.getTextvalue());
            Integer perCodigo = null;
            String cSolicitud = null;
            List<BigDecimal> lstNumAdd = null;
            List<BigDecimal> lstNumAddC = null;
            /**
             * ================================ query para cada ves que saca una
             * factura
             */
            StringBuilder queryAddNumTel = new StringBuilder("SELECT MIN(pho.ADDRESSNUMBER) AS menor FROM TCUSTPERSONPHONE pho \n"
                    + "WHERE pho.PHONETYPECATALOG = :phonetype \n"
                    + "AND pho.PERSONCODE = :pcode \n"
                    + "AND pho.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD')"
            );
            StringBuilder queryAddNumAddres = new StringBuilder(
                    "SELECT MIN(t.ADDRESSNUMBER) FROM TCUSTPERSONADDRESS t WHERE t.ADDRESSTYPECATALOG = :type\n"
                    + "AND t.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD')\n"
                    + "AND t.PERSONCODE = :pcode"
            );
            Integer minAddTel = null;
            Integer minadddir = null;
            BigDecimal bg = null;
            BigDecimal bg2 = null;
            String pTel = "\n";
            String ddir = "\n";
            File carpetaBase = new File(folderPath);
            carpetaBase.mkdirs();
            Query q = null;
                    StringBuilder insertAuditoria = new StringBuilder("INSERT INTO TARMINVOICEHISTORY\n" +
                        "(USERCODE, REGISTRATIONDATE, CSOLICITUD, SOLICITUDNUMBER, TRAMITENUMBER, PATHFILE, CONTENTFILE)\n" +
                        "VALUES (:usercode, now(), :csolicitud, :solicitudnumber, :tramitenumber, :pathfile, :content)"
                    );
                    
            List<Object[]> lstFilaId = new ArrayList<>();
            String pathFactura = null;
            for (Object[] solicitudesPers : lstSolicitudesPersona) {
                cSolicitud = solicitudesPers[0].toString();
                if (solicitudesPers[2] != null) {
                    perCodigo = Integer.parseInt(solicitudesPers[2].toString());

                    bg = (BigDecimal) entityManager.createNativeQuery(queryAddNumTel.toString())
                            .setParameter("phonetype", "1")
                            .setParameter("pcode", perCodigo)
                            .getSingleResult();
                    //String n = lstNumAdd.get(0)[0].toString();
                    if (bg != null) {
                        pTel = "AND ph.ADDRESSNUMBER = :teladdnum \n";
                        minAddTel = bg.intValue();
                    }

                    /**
                     * para las direcciones
                     */
                    bg2 = (BigDecimal) entityManager.createNativeQuery(queryAddNumAddres.toString())
                            .setParameter("type", "3")
                            .setParameter("pcode", perCodigo)
                            .getSingleResult();
                    if (bg2 != null) {
                        ddir = "AND pc.ADDRESSNUMBER=:diraddnum \n";
                        minadddir = bg2.intValue();
                    }

                    StringBuilder strFacturas = new StringBuilder("SELECT s.CSOLICITUD, s.NUMEROSOLICITUD, st.ESTADOTRAMITE,\n"
                            + "s.CCENTROCONTROL, st.VALORTRAMITEARMAS,st.VALORCUSTODIOS, st.VALORAPAGAR,p.IDENTIFICATIONCATALOG, \n"
                            + "p.PERSONCODE,p.NAME, p.IDENTIFICATION,pd.ADDRESS AS DIRECCION,pc.ADDRESS AS CORREO, t.CTRAMITE,\n"
                            + "c.\"catalog\" AS AUTORIZACIONID, c.CATALOGCODE AS AUTORIZACIONCODE,c.DESCRIPTION AS AUTORIZACION, \n"
                            + "ca.\"catalog\" AS CATEGORIAID, ca.CATALOGCODE AS CATEGORIACODE, ca.DESCRIPTION AS CATEGORIA, \n"
                            + "ci.CITYCODE, ci.DESCRIPTION AS CIUDAD, ph.PHONENUMBER, t.SERVICIO, s.NUMEROCUSTODIOS, \n"
                            + "cc.PUNTOFACTURACION, s.NUMERODIASCUSTODIOS, cc.SECUENCIAFACTURACION \n"
                            + "FROM TARMSOLICITUDTRAMITE st \n"
                            + "LEFT JOIN TARMSOLICITUD s \n"
                            + "ON s.CSOLICITUD = st.CSOLICITUD \n"
                            + "LEFT JOIN TCUSTPERSONDETAIL p \n"
                            + "ON p.PERSONCODE = s.PERSONCODE\n"
                            + "AND p.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') \n"
                            + "LEFT JOIN TCUSTPERSONADDRESS pc\n"
                            + "ON p.PERSONCODE = pc.PERSONCODE\n"
                            + "AND pc.ADDRESSTYPECATALOG = '3' \n"
                            + ddir
                            + "AND pc.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') \n"
                            + "LEFT JOIN TCUSTPERSONADDRESS pd \n"
                            + "ON p.PERSONCODE = pd.PERSONCODE \n"
                            + "AND pd.ADDRESSTYPECATALOG = '1' \n"
                            + "AND pd.PRINCIPAL = 'Y' \n"
                            + "AND pd.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') \n"
                            + "LEFT JOIN TARMTRAMITE t \n"
                            + "ON s.CTRAMITE = t.CTRAMITE \n"
                            + "LEFT JOIN TGENECATALOGDETAIL c \n"
                            + "ON t.TIPOAUTORIZACION  = c.\"catalog\" AND c.CATALOGCODE = 'TIPOAUTORIZACION'\n"
                            + "LEFT JOIN TGENECATALOGDETAIL ca\n"
                            + "ON t.CATEGORIA = ca.\"catalog\" AND ca.CATALOGCODE = 'CATEGORIA'\n"
                            + "LEFT JOIN TGENECITY ci\n"
                            + "ON pd.CITYCODE = ci.CITYCODE\n"
                            + "LEFT JOIN TCUSTPERSONPHONE ph \n"
                            + "ON p.PERSONCODE = ph.PERSONCODE AND ph.PHONETYPECATALOG = '1'\n "
                            + pTel
                            + "AND ph.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') \n"+
                              "LEFT JOIN TARMCENTROCONTROL cc ON \n" +
                                "cc.CCENTROCONTROL = s.CCENTROCONTROL \n" +
                                "AND cc.DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') \n"
                            + "WHERE \n"
                            + "s.CSOLICITUD = :csolicitud "
                    );

                    //List<Object[]> lstFacts = entityManager.createNativeQuery(strFacturas.toString(),Object[].class).getResultList();
                    List<Object[]> lstFacturas = entityManager.createNativeQuery(strFacturas.toString())
                            .setParameter("diraddnum", minadddir)
                            .setParameter("teladdnum", minAddTel)
                            .setParameter("csolicitud", cSolicitud)
                            .getResultList();

                    String numeroSec = null;
                    String formato = "%09d";
                    //Sequence sequencia = new Sequence();
                    Integer secFacturacion = null;
                    StringBuilder sUpdate = new StringBuilder("UPDATE TARMCENTROCONTROL SET SECUENCIAFACTURACION=:numero WHERE CCENTROCONTROL=:ccentro AND DATETO = TO_DATE('2999-12-31','YYYY-MM-DD') ");
                    String codigoCentro = null;
                    
                    for (Object[] factura : lstFacturas) {
                        codigoCentro= factura[3].toString();
                        secFacturacion = Integer.parseInt(factura[27].toString());
                        numeroSec = String.format(formato, secFacturacion);
                        pathFactura = sacarFactura(factura, rucComaco.getTextvalue(), numeroSec, carpetaBase, custodio);
                        secFacturacion++;
                        q = entityManager.createNativeQuery(sUpdate.toString())
                                .setParameter("numero", secFacturacion)
                                .setParameter("ccentro", codigoCentro);
                        q.executeUpdate();
                        try {
                            guardarAuditoriaXML(q, entityManager, insertAuditoria.toString(),  "BATCH", cSolicitud, 
                                factura[1]!= null ? factura[1].toString() : null, 
                                null, pathFactura, obtenerContenidoArchivo(pathFactura));
                        } catch (Exception e) {
                            System.out.println("Error al insertar auditoria de xml "+e.toString());
                        }
                        
                    }
                }

            }

            
        } catch (Exception ex) {
            System.out.println("Error de ejecucion de facturacion automatica >>>> " + ex.toString());
            ex.printStackTrace();
        }

    }
    
    public int obtenerIdAuditoria(EntityManager entityManager, List<Object[]> fila, int id){
        fila = entityManager.createNativeQuery("SELECT COUNT(t.ID) AS CANTIDAD,MAX(t.ID) AS MAXIMO FROM TARMINVOICEHISTORY t ").getResultList();
        for (Object[] objects : fila) {
            if(Integer.parseInt(objects[0].toString()) > 0){
                id = Integer.parseInt(objects[1].toString()) + 1;
            }
        }
        return id;
    }
    
    public void guardarAuditoriaXML(Query q, EntityManager entityManager, String sUpdate,
     String usercode, String csolicitud, String solicitudnumber, String tramitenumber, String pathfile,
    String content){
            q = entityManager.createNativeQuery(sUpdate)
                                .setParameter("usercode", usercode)
                                .setParameter("csolicitud", csolicitud)
                                .setParameter("solicitudnumber", solicitudnumber)
                                .setParameter("tramitenumber", tramitenumber)
                                .setParameter("pathfile", pathfile)
                                .setParameter("content", content);
                        q.executeUpdate();
        
       
     
    }
}
