com.iqtb.validacion.managedbean.MbCfdisRecibidos.java Source code

Java tutorial

Introduction

Here is the source code for com.iqtb.validacion.managedbean.MbCfdisRecibidos.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.iqtb.validacion.managedbean;

import com.iqtb.validacion.dao.DaoCfdisRecibidos;
import com.iqtb.validacion.dao.DaoConfiguracionEmpresa;
import com.iqtb.validacion.dao.DaoEmpresa;
import com.iqtb.validacion.dao.DaoOrdenCompra;
import com.iqtb.validacion.dao.DaoPlantilla;
import com.iqtb.validacion.dao.DaoRoles;
import com.iqtb.validacion.dao.DaoSociosComerciales;
import com.iqtb.validacion.dao.DaoUsuario;
import com.iqtb.validacion.dto.HibernateUtil;
import com.iqtb.validacion.emun.BitacoraTipo;
import com.iqtb.validacion.emun.ConfigEmpresa;
import com.iqtb.validacion.emun.EstadoCfdiR;
import com.iqtb.validacion.emun.NotificacionCfdiR;
import com.iqtb.validacion.emun.RolTipo;
import static com.iqtb.validacion.encrypt.Encrypt.decrypt;
import com.iqtb.validacion.jasper.JasperUtils;
import com.iqtb.validacion.mail.ConexionSMTP;
import com.iqtb.validacion.pojo.CfdisRecibidos;
import com.iqtb.validacion.pojo.ConfiguracionesEmpresas;
import com.iqtb.validacion.pojo.Empresas;
import com.iqtb.validacion.pojo.OrdenesCompra;
import com.iqtb.validacion.pojo.Plantillas;
import com.iqtb.validacion.pojo.Roles;
import com.iqtb.validacion.pojo.SociosComerciales;
import com.iqtb.validacion.pojo.Usuarios;
import static com.iqtb.validacion.util.ArchivoBaseDatos.getBytesFromFile;
import com.iqtb.validacion.util.AuxCfdiRecibido;
import static com.iqtb.validacion.util.Bitacoras.registrarBitacora;
import com.iqtb.validacion.util.CompararXML;
import com.iqtb.validacion.util.GenerarArchivo;
import com.iqtb.validacion.util.LeerPDF;
import com.iqtb.validacion.util.ManejoArchivos;
import com.iqtb.validacion.util.RevisarXML;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author danielromero
 */
@ManagedBean
@ViewScoped
public class MbCfdisRecibidos implements Serializable {

    private static final long serialVersionUID = 1L;
    private CfdisRecibidos cfdiRecibido;
    private List<AuxCfdiRecibido> cfdisSeleccionados;
    private List<CfdisRecibidos> listaCFDIs;
    private Empresas empresa;
    private SociosComerciales socioComercial;
    private List<SociosComerciales> listaSocios;
    private Usuarios usuario;
    private String descBitacora;
    private List<String> estadosCFDI;
    private SelectItem[] estadoSelectItems;
    private SelectItem[] cfdiSelectItems;
    private final String sessionUsuario;
    private String empresaSeleccionada;
    private boolean reportarTodos;
    private Integer intIdSocio;
    private List<SelectItem> selectOneItemsSocio;
    private Date fechaMin;
    private Date fechaMax;
    private FacesMessage msg;
    private LazyDataModel<AuxCfdiRecibido> lazyCfdisEliminados;
    private LazyDataModel<AuxCfdiRecibido> cfdiDataList;
    private Roles rolUsuario;
    private List<AuxCfdiRecibido> lista;
    private List<Integer> rfcByIdSocio;
    private List<AuxCfdiRecibido> listaE;
    private List<CfdisRecibidos> listaCFDIsE;
    private Session session;
    private Transaction tx;
    private String queryCount;
    private String query;
    private String filterProperty;
    private String filterValue;
    private Iterator it;
    private DaoSociosComerciales daoSociosComerciales;
    private DaoRoles daoRol;
    private DaoCfdisRecibidos daoCfdiRecibido;
    private AuxCfdiRecibido auxCfdiR;
    private SelectItem selectItem;
    private String strNombre;
    private DaoConfiguracionEmpresa daoConfigEmpresa;
    private ConfiguracionesEmpresas configEmail;
    private ConfiguracionesEmpresas configUser;
    private ConfiguracionesEmpresas configPass;
    private ConfiguracionesEmpresas configHost;
    private ConfiguracionesEmpresas configPort;
    private ConfiguracionesEmpresas configSSL;
    private ConfiguracionesEmpresas emailRecepcion;
    private ConfiguracionesEmpresas listaNotificacion;
    private List<SelectItem> itemsOrdenCompra;
    private OrdenesCompra ordenCompra;
    private List<OrdenesCompra> listaOrdenCompra;
    private Integer idOrdenCompra;
    private List<Integer> listaIds;
    private DaoOrdenCompra daoOrdenCompra;
    private boolean tieneAddenda;
    private boolean crearOrden;
    private DaoUsuario daoUsuario;
    private DaoEmpresa daoEmpresa;
    private ManejoArchivos manejorArchivos;
    private ConfiguracionesEmpresas congifEmpresa;
    private RevisarXML revisarXml;
    private List<Integer> idsCfdisR;
    private GenerarArchivo generarArchivo;
    private List<Plantillas> plantillas;
    private DaoPlantilla daoPlantilla;
    private List<String> listError;
    private static final Logger logger = Logger.getLogger("MbCfdisRecibidos");

    public MbCfdisRecibidos() {
        cfdiRecibido = new CfdisRecibidos();
        cfdisSeleccionados = new ArrayList<AuxCfdiRecibido>();
        empresa = new Empresas();
        socioComercial = new SociosComerciales();
        usuario = new Usuarios();
        reportarTodos = false;
        daoSociosComerciales = new DaoSociosComerciales();
        daoRol = new DaoRoles();
        daoCfdiRecibido = new DaoCfdisRecibidos();
        daoConfigEmpresa = new DaoConfiguracionEmpresa();
        listaOrdenCompra = new ArrayList<OrdenesCompra>();
        daoOrdenCompra = new DaoOrdenCompra();
        ordenCompra = new OrdenesCompra();
        tieneAddenda = false;
        crearOrden = false;
        idOrdenCompra = null;
        listaIds = null;
        configEmail = null;
        configUser = null;
        configPass = null;
        configHost = null;
        configPort = null;
        configSSL = null;
        daoUsuario = new DaoUsuario();
        daoEmpresa = new DaoEmpresa();
        manejorArchivos = new ManejoArchivos();
        congifEmpresa = new ConfiguracionesEmpresas();
        idsCfdisR = null;
        generarArchivo = new GenerarArchivo();
        plantillas = null;
        daoPlantilla = new DaoPlantilla();
        listError = new ArrayList<String>();

        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpServletRequest httpServletRequest = (HttpServletRequest) facesContext.getExternalContext().getRequest();
        empresaSeleccionada = (String) httpServletRequest.getSession().getAttribute("empresaSeleccionada");
        sessionUsuario = ((Usuarios) FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
                .get("usuario")).getUserid();
        try {
            usuario = daoUsuario.getByUserid(this.sessionUsuario);
            if (httpServletRequest.getSession().getAttribute("empresaSeleccionada") != null) {
                empresa = daoEmpresa.getEmpresaByRFC(this.empresaSeleccionada);
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - MbCfdisRecibidos] Error al obtener USUARIO EMPRESA SERVICIO. ERROR: "
                    + e.getMessage();
            registrarBitacora(null, null, null, descBitacora, BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }

        try {
            rolUsuario = daoRol.getRolById(usuario.getIdRol());
            if (rolUsuario.getTipo().equals(RolTipo.SOCIO_COMERCIAL.name())) {
                estadosCFDI = daoCfdiRecibido.listaEstadosCFDIsByIdEmpresaIdSocio(empresa.getIdEmpresa(),
                        usuario.getIdSocioComercial());
            } else {
                estadosCFDI = daoCfdiRecibido.listaEstadosCFDIsByIdEmpresa(empresa.getIdEmpresa());
            }
            estadosCFDI.remove(EstadoCfdiR.ELIMINADO.name());
            estadosCFDI.remove(EstadoCfdiR.CANCELADO.name());
            int numE = estadosCFDI.size() + 1;
            estadoSelectItems = new SelectItem[numE];
            estadoSelectItems[0] = new SelectItem("", "TODOS");
            for (int i = 1; i < numE; i++) {
                estadoSelectItems[i] = new SelectItem(estadosCFDI.get(i - 1), estadosCFDI.get(i - 1));
            }
        } catch (Exception ex) {
            descBitacora = "[CFDI_RECIBIDO - MbCfdisRecibidos] " + usuario.getUserid()
                    + " Error al obtener la lista de Estados de CFDIs. ERROR " + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        cfdiSelectItems = new SelectItem[3];
        cfdiSelectItems[0] = new SelectItem("", "TODOS");
        cfdiSelectItems[1] = new SelectItem(EstadoCfdiR.ELIMINADO.name(), EstadoCfdiR.ELIMINADO.name());
        cfdiSelectItems[2] = new SelectItem(EstadoCfdiR.CANCELADO.name(), EstadoCfdiR.CANCELADO.name());

    }

    @PostConstruct
    public void init() {
        cfdiDataList = new LazyDataModel<AuxCfdiRecibido>() {

            @Override
            public List<AuxCfdiRecibido> load(int first, int pageSize, String sortField, SortOrder sortOrder,
                    Map<String, String> filters) {
                session = HibernateUtil.getSessionFactory().openSession();
                tx = session.beginTransaction();
                lista = new ArrayList<AuxCfdiRecibido>();
                rfcByIdSocio = null;
                try {
                    queryCount = "select count(idCfdiRecibido) ";
                    query = "from CfdisRecibidos where idEmpresa = " + empresa.getIdEmpresa()
                            + " and (estado != 'ELIMINADO' and estado != 'CANCELADO')";
                    if (rolUsuario.getTipo().equals(RolTipo.SOCIO_COMERCIAL.name())) {
                        query = query + " and idSocioComercial = " + usuario.getIdSocioComercial();
                    }

                    if (!filters.isEmpty()) {
                        it = filters.keySet().iterator();
                        while (it.hasNext()) {
                            filterProperty = (String) it.next();
                            filterValue = filters.get(filterProperty);
                            if (filterProperty.equals("folio")) {
                                query = query + " and " + filterProperty + " = " + filterValue;
                            }
                            if (filterProperty.equals("serie") || filterProperty.equals("estado")) {
                                query = query + " and " + filterProperty + " = '" + filterValue + "'";
                            }
                            if (filterProperty.equals("fecha") || filterProperty.equals("fechaRecepcion")) {
                                query = query + " and " + filterProperty + " like '" + filterValue + "%'";
                            }
                            if (filterProperty.equals("rfcSocioComercial")) {
                                rfcByIdSocio = daoSociosComerciales
                                        .filtroSocioComercialByRFC(empresa.getIdEmpresa(), filterValue);
                                if (rfcByIdSocio != null) {
                                    boolean isFirst = true;
                                    for (Integer idSocio : rfcByIdSocio) {
                                        if (isFirst) {
                                            query = query + " and (idSocioComercial = " + idSocio;
                                            isFirst = false;
                                        } else {
                                            query = query + " or idSocioComercial = " + idSocio;
                                        }
                                    }
                                    query = query + ")";
                                }
                                rfcByIdSocio = null;
                            }
                            if (filterProperty.equals("nombreSocioComercial")) {
                                rfcByIdSocio = daoSociosComerciales
                                        .filtroSocioComercialByNombre(empresa.getIdEmpresa(), filterValue);
                                if (rfcByIdSocio != null) {
                                    boolean isFirst = true;
                                    for (Integer idSocio : rfcByIdSocio) {
                                        if (isFirst) {
                                            query = query + " and (idSocioComercial = " + idSocio;
                                            isFirst = false;
                                        } else {
                                            query = query + " or idSocioComercial = " + idSocio;
                                        }
                                    }
                                    query = query + ")";
                                }
                                rfcByIdSocio = null;
                            }
                        }
                    }

                    if (sortField != null && !sortField.isEmpty()) {
                        if (sortOrder.equals(SortOrder.ASCENDING)) {
                            query = query + " ORDER BY " + sortField + " ASC";
                        } else {
                            query = query + " ORDER BY " + sortField + " DESC";
                        }
                    } else {
                        query = query + " ORDER BY fechaRecepcion DESC";
                    }

                    queryCount = queryCount + query;
                    Query result = session.createQuery(
                            "select new CfdisRecibidos(idCfdiRecibido, idSocioComercial, serie, folio, fecha, fechaRecepcion, estado, tiposWarn) "
                                    + query);
                    result.setFirstResult(first);
                    result.setMaxResults(pageSize + first);
                    this.setRowCount(((Long) session.createQuery(queryCount).uniqueResult()).intValue());
                    listaCFDIs = result.list();
                    tx.commit();
                    if (listaCFDIs == null || listaCFDIs.size() <= 0) {
                        logger.info("listaCfdisCriteria - No existen CfdisRecibidos para mostrar");
                        return lista;
                    }
                    for (CfdisRecibidos item : listaCFDIs) {
                        auxCfdiR = new AuxCfdiRecibido();
                        auxCfdiR.setIdCfdiRecibido(item.getIdCfdiRecibido());
                        auxCfdiR.setIdSocioComercial(item.getIdSocioComercial());
                        auxCfdiR.setSerie(item.getSerie());
                        auxCfdiR.setFolio(item.getFolio());
                        auxCfdiR.setFecha(item.getFecha());
                        auxCfdiR.setFechaRecepcion(item.getFechaRecepcion());
                        auxCfdiR.setEstado(item.getEstado());
                        auxCfdiR.setTiposWarn(item.getTiposWarn());
                        auxCfdiR.setRfcSocioComercial(
                                daoSociosComerciales.getRFCSociobyIdSocio(item.getIdSocioComercial()));
                        auxCfdiR.setNombreSocioComercial(
                                daoSociosComerciales.getNombreSociobyIdSocio(item.getIdSocioComercial()));
                        lista.add(auxCfdiR);
                    }
                } catch (HibernateException he) {
                    descBitacora = "[CFDI_RECIBIDO - init] " + usuario.getUserid()
                            + " cfdiDataList HibernateException ERROR " + he.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                    tx.rollback();
                } catch (Exception ex) {
                    descBitacora = "[CFDI_RECIBIDO - init] " + usuario.getUserid() + " cfdiDataList ERROR "
                            + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                } finally {
                    listaCFDIs = null;
                    if (session.isOpen()) {
                        session.clear();
                        session.close();
                    }
                }
                return lista;
            }
        };

        lazyCfdisEliminados = new LazyDataModel<AuxCfdiRecibido>() {

            @Override
            public List<AuxCfdiRecibido> load(int first, int pageSize, String sortField, SortOrder sortOrder,
                    Map<String, String> filters) {
                session = HibernateUtil.getSessionFactory().openSession();
                tx = session.beginTransaction();
                listaE = new ArrayList<AuxCfdiRecibido>();
                rfcByIdSocio = null;
                try {
                    queryCount = "select count(idCfdiRecibido) ";
                    query = "from CfdisRecibidos where idEmpresa = " + empresa.getIdEmpresa()
                            + " and (estado ='ELIMINADO' or estado ='CANCELADO')";
                    if (rolUsuario.getTipo().equals(RolTipo.SOCIO_COMERCIAL.name())) {
                        query = query + " and idSocioComercial = " + usuario.getIdSocioComercial();
                    }

                    if (!filters.isEmpty()) {
                        it = filters.keySet().iterator();
                        while (it.hasNext()) {
                            filterProperty = (String) it.next();
                            filterValue = filters.get(filterProperty);
                            if (filterProperty.equals("folio")) {
                                query = query + " and " + filterProperty + " = " + filterValue;
                            }
                            if (filterProperty.equals("serie") || filterProperty.equals("estado")) {
                                query = query + " and " + filterProperty + " = '" + filterValue + "'";
                            }
                            if (filterProperty.equals("fecha") || filterProperty.equals("fechaRecepcion")) {
                                query = query + " and " + filterProperty + " like '" + filterValue + "%'";
                            }
                            if (filterProperty.equals("rfcSocioComercial")) {
                                rfcByIdSocio = daoSociosComerciales
                                        .filtroSocioComercialByRFC(empresa.getIdEmpresa(), filterValue);
                                if (rfcByIdSocio != null) {
                                    boolean isFirst = true;
                                    for (Integer idSocio : rfcByIdSocio) {
                                        if (isFirst) {
                                            query = query + " and (idSocioComercial = " + idSocio;
                                            isFirst = false;
                                        } else {
                                            query = query + " or idSocioComercial = " + idSocio;
                                        }
                                    }
                                    query = query + ")";
                                }
                                rfcByIdSocio = null;
                            }
                            if (filterProperty.equals("nombreSocioComercial")) {
                                rfcByIdSocio = daoSociosComerciales
                                        .filtroSocioComercialByNombre(empresa.getIdEmpresa(), filterValue);
                                if (rfcByIdSocio != null) {
                                    boolean isFirst = true;
                                    for (Integer idSocio : rfcByIdSocio) {
                                        if (isFirst) {
                                            query = query + " and (idSocioComercial = " + idSocio;
                                            isFirst = false;
                                        } else {
                                            query = query + " or idSocioComercial = " + idSocio;
                                        }
                                    }
                                    query = query + ")";
                                }
                                rfcByIdSocio = null;
                            }
                        }
                    }

                    if (sortField != null && !sortField.isEmpty()) {
                        if (sortOrder.equals(SortOrder.ASCENDING)) {
                            query = query + " ORDER BY " + sortField + " ASC";
                        } else {
                            query = query + " ORDER BY " + sortField + " DESC";
                        }
                    } else {
                        query = query + " ORDER BY fechaRecepcion DESC";
                    }

                    queryCount = queryCount + query;
                    Query result = session.createQuery(
                            "select new CfdisRecibidos(idCfdiRecibido, idSocioComercial, serie, folio, fecha, fechaRecepcion, estado, tiposWarn) "
                                    + query);
                    result.setFirstResult(first);
                    result.setMaxResults(pageSize + first);
                    this.setRowCount(((Long) session.createQuery(queryCount).uniqueResult()).intValue());
                    listaCFDIsE = result.list();
                    tx.commit();
                    if (listaCFDIsE == null || listaCFDIsE.size() <= 0) {
                        logger.info("listaCfdisCriteriaE - No existen CfdisRecibidos para mostrar");
                        return listaE;
                    }
                    for (CfdisRecibidos item : listaCFDIsE) {
                        auxCfdiR = new AuxCfdiRecibido();
                        auxCfdiR.setIdCfdiRecibido(item.getIdCfdiRecibido());
                        auxCfdiR.setIdSocioComercial(item.getIdSocioComercial());
                        auxCfdiR.setSerie(item.getSerie());
                        auxCfdiR.setFolio(item.getFolio());
                        auxCfdiR.setFecha(item.getFecha());
                        auxCfdiR.setFechaRecepcion(item.getFechaRecepcion());
                        auxCfdiR.setEstado(item.getEstado());
                        auxCfdiR.setError(item.getError());
                        auxCfdiR.setRfcSocioComercial(
                                daoSociosComerciales.getRFCSociobyIdSocio(item.getIdSocioComercial()));
                        auxCfdiR.setNombreSocioComercial(
                                daoSociosComerciales.getNombreSociobyIdSocio(item.getIdSocioComercial()));
                        listaE.add(auxCfdiR);
                    }
                } catch (HibernateException he) {
                    descBitacora = "[CFDI_RECIBIDO - init] " + usuario.getUserid()
                            + " lazyCfdisEliminados HibernateException ERROR " + he.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                    tx.rollback();
                } catch (Exception ex) {
                    descBitacora = "[CFDI_RECIBIDO - init] " + usuario.getUserid() + " lazyCfdisEliminados ERROR "
                            + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                } finally {
                    listaCFDIsE = null;
                    if (session.isOpen()) {
                        session.clear();
                        session.close();
                    }
                }
                return listaE;
            }
        };
    }

    public LazyDataModel<AuxCfdiRecibido> getCfdiDataList() {
        return cfdiDataList;
    }

    public LazyDataModel<AuxCfdiRecibido> getLazyCfdisEliminados() {
        return lazyCfdisEliminados;
    }

    public Empresas getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresas empresa) {
        this.empresa = empresa;
    }

    public List<AuxCfdiRecibido> getCfdisSeleccionados() {
        return cfdisSeleccionados;
    }

    public void setCfdisSeleccionados(List<AuxCfdiRecibido> cfdisSeleccionados) {
        this.cfdisSeleccionados = cfdisSeleccionados;
    }

    public CfdisRecibidos getCfdiRecibido() {
        return cfdiRecibido;
    }

    public void setCfdiRecibido(CfdisRecibidos cfdiRecibido) {
        this.cfdiRecibido = cfdiRecibido;
    }

    public SelectItem[] getEstadoSelectItems() {
        return estadoSelectItems;
    }

    public Date getFechaMin() {
        return fechaMin;
    }

    public void setFechaMin(Date fechaMin) {
        this.fechaMin = fechaMin;
    }

    public Date getFechaMax() {
        return fechaMax;
    }

    public void setFechaMax(Date fechaMax) {
        this.fechaMax = fechaMax;
    }

    public Integer getIntIdSocio() {
        return intIdSocio;
    }

    public void setIntIdSocio(Integer intIdSocio) {
        this.intIdSocio = intIdSocio;
    }

    public List<SelectItem> getSelectOneItemsSocio() {
        return selectOneItemsSocio;
    }

    public void setSelectOneItemsSocio(List<SelectItem> selectOneItemsSocio) {
        this.selectOneItemsSocio = selectOneItemsSocio;
    }

    public boolean isReportarTodos() {
        return reportarTodos;
    }

    public void setReportarTodos(boolean reportarTodos) {
        this.reportarTodos = reportarTodos;
    }

    public SelectItem[] getCfdiSelectItems() {
        return cfdiSelectItems;
    }

    public void setCfdiSelectItems(SelectItem[] cfdiSelectItems) {
        this.cfdiSelectItems = cfdiSelectItems;
    }

    public List<SelectItem> getItemsOrdenCompra() {
        return itemsOrdenCompra;
    }

    public void setItemsOrdenCompra(List<SelectItem> itemsOrdenCompra) {
        this.itemsOrdenCompra = itemsOrdenCompra;
    }

    public OrdenesCompra getOrdenCompra() {
        return ordenCompra;
    }

    public void setOrdenCompra(OrdenesCompra ordenCompra) {
        this.ordenCompra = ordenCompra;
    }

    public boolean isCrearOrden() {
        return crearOrden;
    }

    public void setCrearOrden(boolean crearOrden) {
        this.crearOrden = crearOrden;
    }

    public Integer getIdOrdenCompra() {
        return idOrdenCompra;
    }

    public void setIdOrdenCompra(Integer idOrdenCompra) {
        this.idOrdenCompra = idOrdenCompra;
    }

    public AuxCfdiRecibido getAuxCfdiR() {
        return auxCfdiR;
    }

    public void setAuxCfdiR(AuxCfdiRecibido auxCfdiR) {
        this.auxCfdiR = auxCfdiR;
    }

    public List<String> getListError() {
        return listError;
    }

    public void obtenerRfcSocios() {
        intIdSocio = 0;
        logger.info("Inicia obtenerRfcSocios");
        try {
            selectOneItemsSocio = new ArrayList<SelectItem>();
            listaSocios = null;
            selectItem = null;
            listaSocios = daoSociosComerciales.listaSociosHQL(
                    "select new SociosComerciales(idSocioComercial, rfc) from SociosComerciales where idEmpresa = "
                            + empresa.getIdEmpresa());
            if (listaSocios.isEmpty()) {
                logger.info(
                        "[CFDI_RECIBIDO - obtenerRfcSocios] - No se han encontrado resultados para Socios Comerciales");
            } else {
                for (SociosComerciales var : listaSocios) {
                    selectItem = new SelectItem(var.getIdSocioComercial(), var.getRfc());
                    selectOneItemsSocio.add(selectItem);
                }
            }
        } catch (Exception ex) {
            descBitacora = "[CFDI_RECIBIDO - obtenerRfcSocios] " + usuario.getUserid() + " ERROR "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void resetOneItemSocio() {
        selectOneItemsSocio = null;
    }

    public String deleteCFDIs() {
        int num = 0;

        if (cfdisSeleccionados == null || cfdisSeleccionados.isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                    "Por favor, Seleccione al menos un CFDI");
            logger.warn("deleteCFDIs - no existen CFDIs seleccionados");
        } else {

            for (AuxCfdiRecibido imprimirCFDI : cfdisSeleccionados) {
                cfdiRecibido = new CfdisRecibidos();
                try {
                    cfdiRecibido = daoCfdiRecibido.getCfdiByID(imprimirCFDI.getIdCfdiRecibido());
                    if (daoCfdiRecibido.delete(cfdiRecibido)) {
                        num++;
                        descBitacora = "[CFDI_RECIBIDO - deleteCFDIs] " + usuario.getUserid()
                                + " elimino permanentemente el CFDI con id " + cfdiRecibido.getIdCfdiRecibido()
                                + " uuid " + cfdiRecibido.getUuid() + " Serie " + cfdiRecibido.getSerie()
                                + " Folio " + cfdiRecibido.getFolio();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Eliminar",
                                num + " CFDI(s) eliminado(s)");
                    } else {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error al eliminar el CFDI");
                        descBitacora = "[CFDI_RECIBIDO - deleteCFDIs] " + usuario.getUserid()
                                + " Error al elimnar el CFDI con id " + cfdiRecibido.getIdCfdiRecibido() + "  uuid "
                                + cfdiRecibido.getUuid() + " Serie " + cfdiRecibido.getSerie() + " Folio "
                                + cfdiRecibido.getFolio();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                } catch (Exception e) {
                    descBitacora = "[CFDI_RECIBIDO - deleteCFDIs] " + usuario.getUserid() + " deleteCFDIs ERROR "
                            + e.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                            "Ocurrio un error al eliminar los CFDIs.");
                    logger.error(descBitacora);
                }
            }
        }
        FacesContext.getCurrentInstance().addMessage(null, this.msg);
        return "/CFDI/eliminados";
    }

    //ESTE METODO COLOCA LOS CFDIS EN ESTADO ELIMINADO
    public String eliminarCFDIs() {
        int num = 0;

        if (cfdisSeleccionados == null || cfdisSeleccionados.isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                    "Por favor, Seleccione al menos un CFDI");
            logger.info("eliminarCFDIs - no existen CFDIs seleccionados");
        } else {

            for (AuxCfdiRecibido imprimirCFDI : cfdisSeleccionados) {
                cfdiRecibido = new CfdisRecibidos();
                try {
                    cfdiRecibido = daoCfdiRecibido.getCfdiByID(imprimirCFDI.getIdCfdiRecibido());
                    if (!(cfdiRecibido.getEstado().equals(EstadoCfdiR.SIN_VALIDAR.name())
                            || cfdiRecibido.getEstado().equals(EstadoCfdiR.NUEVO.name()))) {
                        cfdiRecibido.setEstado(EstadoCfdiR.ELIMINADO.name());
                        if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                            num++;
                            descBitacora = "[CFDI_RECIBIDO - eliminarCFDIs] " + usuario.getUserid()
                                    + " coloco en estado eliminado el CFDI con id "
                                    + cfdiRecibido.getIdCfdiRecibido() + " uuid " + cfdiRecibido.getUuid()
                                    + " Serie " + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio();
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.INFO.name());
                            logger.info(descBitacora);
                            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Eliminar",
                                    num + " CFDI(s) eliminado(s).");
                        } else {
                            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                                    "Error al eliminar el CFDI");
                            descBitacora = "[CFDI_RECIBIDO - eliminarCFDIs] " + usuario.getUserid()
                                    + " Error al colocar en estado eliminado el CFDI con id "
                                    + cfdiRecibido.getIdCfdiRecibido() + " uuid " + cfdiRecibido.getUuid()
                                    + " Serie " + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio();
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.ERROR.name());
                            logger.error(descBitacora);
                        }
                    } else {
                        msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                                "No es posible eliminar CFDI(s) en estado " + cfdiRecibido.getEstado());
                        descBitacora = "[CFDI_RECIBIDO - eliminarCFDIs] " + usuario.getUserid()
                                + " Intento colocar en estado eliminado el CFDI con id "
                                + cfdiRecibido.getIdCfdiRecibido() + " no es posible su estado es "
                                + cfdiRecibido.getEstado();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                } catch (Exception e) {
                    descBitacora = "[CFDI_RECIBIDO - eliminarCFDIs] " + usuario.getUserid() + " ERROR "
                            + e.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error al eliminar los CFDIs");
                    logger.error(descBitacora);
                }
            }
        }
        FacesContext.getCurrentInstance().addMessage(null, this.msg);
        return "/CFDI/recibidos";
    }

    public void existeSeleccionCFDI() {
        boolean estadoCFDI = false;
        if (cfdisSeleccionados.isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                    "Por favor, seleccione al menos un CFDI");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            estadoCFDI = true;
        }
        RequestContext context = RequestContext.getCurrentInstance();
        context.addCallbackParam("estadoCFDI", estadoCFDI);
    }

    public void verCFDI() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map params = facesContext.getExternalContext().getRequestParameterMap();

        int id = Integer.valueOf((String) params.get("idCfdi"));
        boolean estadoCFDI = false;
        try {
            cfdiRecibido = null;
            cfdiRecibido = daoCfdiRecibido.getCfdiByID(id);
            if (cfdiRecibido != null) {
                auxCfdiR = new AuxCfdiRecibido();
                auxCfdiR.setSerie(cfdiRecibido.getSerie());
                auxCfdiR.setFolio(cfdiRecibido.getFolio());
                auxCfdiR.setUuid(cfdiRecibido.getUuid());
                auxCfdiR.setFecha(cfdiRecibido.getFecha());
                auxCfdiR.setTotal(cfdiRecibido.getTotal());
                auxCfdiR.setFechaRecepcion(cfdiRecibido.getFechaRecepcion());
                auxCfdiR.setEstado(cfdiRecibido.getEstado());
                auxCfdiR.setError(cfdiRecibido.getError());
                listaErrores(cfdiRecibido.getError());
                auxCfdiR.setTotalOc(cfdiRecibido.getTotalOc());
                auxCfdiR.setTipoMoneda(cfdiRecibido.getTipoMoneda());
                auxCfdiR.setTipoCambio(cfdiRecibido.getTipoCambio());
                auxCfdiR.setEntradaAlmacen(cfdiRecibido.getEntradaAlmacen());
                auxCfdiR.setControlCalidad(cfdiRecibido.getControlCalidad());
                auxCfdiR.setAutorizacion(cfdiRecibido.getAutorizacion());
                auxCfdiR.setTiposWarn(cfdiRecibido.getTiposWarn());
                auxCfdiR.setRfcSocioComercial(
                        daoSociosComerciales.getRFCSociobyIdSocio(cfdiRecibido.getIdSocioComercial()));
                auxCfdiR.setNombreSocioComercial(
                        daoSociosComerciales.getNombreSociobyIdSocio(cfdiRecibido.getIdSocioComercial()));
                if (cfdiRecibido.getIdOrdenCompra() != null) {
                    auxCfdiR.setNumeroOrdenCompra(
                            daoOrdenCompra.numOrdenCompraById(cfdiRecibido.getIdOrdenCompra()));
                }
                cfdiRecibido = null;
                estadoCFDI = true;
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - verCFDI] ERROR: " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }

        RequestContext context = RequestContext.getCurrentInstance();
        context.addCallbackParam("estadoCFDI", estadoCFDI);
    }

    public void listaErrores(String error) {
        String[] numerosComoArray = error.split("\n");
        int size = numerosComoArray.length;
        for (int i = 0; i < size; i++) {
            listError.add(numerosComoArray[i]);
        }
        numerosComoArray = null;
    }

    public void downloadXML() {
        logger.info(usuario.getUserid() + " inicia descarga de XML");
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map params = facesContext.getExternalContext().getRequestParameterMap();

        int id = Integer.valueOf((String) params.get("idCfdi"));
        try {
            cfdiRecibido = new CfdisRecibidos();
            cfdiRecibido = daoCfdiRecibido.getCfdiByID(id);
            if (cfdiRecibido.getEstado().equals(EstadoCfdiR.CANCELADO.name())) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                        "No es posible descargar el archivo XML. El CFDI se encuentra Cancelado.");
                FacesContext.getCurrentInstance().addMessage(null, this.msg);
                descBitacora = "[CFDI_RECIBIDO - downloadXML] " + usuario.getUserid()
                        + " No es posible descargar el XML del CFDI id " + cfdiRecibido.getIdCfdiRecibido()
                        + " uuid " + cfdiRecibido.getUuid() + " su estado es: " + cfdiRecibido.getEstado();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.INFO.name());
                logger.info(descBitacora);
                return;
            }
            strNombre = cfdiRecibido.getNombreArchivo();
            if (strNombre != null && !strNombre.trim().isEmpty()) {
                strNombre = strNombre.replace(" ", "") + ".xml";
            } else {
                strNombre = cfdiRecibido.getIdCfdiRecibido() + ".xml";
            }

            logger.info(usuario.getUserid() + " Nombre del XML: " + strNombre);
            FacesContext ctx = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
            response.setContentType("application/force-download");
            String disposition = "attachment; fileName=" + strNombre;
            response.setHeader("Content-Disposition", disposition);
            ServletOutputStream out = response.getOutputStream();
            InputStream ascii;

            String texto = cfdiRecibido.getXmlSat();
            logger.debug("xml " + texto);

            ascii = new ByteArrayInputStream(texto.getBytes("UTF-8"));

            byte[] buf = new byte[5 * 1000 * 1024];
            int bytesRead;
            while ((bytesRead = ascii.read(buf)) != -1) {
                out.write(buf, 0, bytesRead);
            }

            out.flush();
            out.close();
            ctx.responseComplete();
            descBitacora = "[CFDI_RECIBIDO - downloadXML] " + usuario.getUserid() + " Descargo XML de CFDI id "
                    + cfdiRecibido.getIdCfdiRecibido() + " uuid " + cfdiRecibido.getUuid() + " Serie "
                    + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.INFO.name());
            logger.info(descBitacora);
            logger.info(usuario.getUserid() + ". downloadXML- XML: " + strNombre + " Generado.");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Error", "Ocurrio un error al descargar el archivo XML."));
            descBitacora = "[CFDI_RECIBIDO - downloadXML] " + usuario.getUserid() + " ERROR: " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void downloadPDF() {
        logger.info(usuario.getUserid() + " downloadPDF - inicia descarga de PDF");
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map params = facesContext.getExternalContext().getRequestParameterMap();

        int id = Integer.valueOf((String) params.get("idCfdi"));

        try {
            cfdiRecibido = new CfdisRecibidos();
            cfdiRecibido = daoCfdiRecibido.getCfdiByID(id);
            if (cfdiRecibido.getEstado().equals(EstadoCfdiR.CANCELADO.name())) {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                        "No es posible descargar el archivo PDF. El CFDI se encuentra Cancelado.");
                FacesContext.getCurrentInstance().addMessage(null, this.msg);
                descBitacora = "[CFDI_RECIBIDO - downloadPDF] " + usuario.getUserid()
                        + " No es posible descargar el PFD del CFDI id " + cfdiRecibido.getIdCfdiRecibido()
                        + " uuid " + cfdiRecibido.getUuid() + " su estado es: " + cfdiRecibido.getEstado();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.INFO.name());
                logger.info(descBitacora);
                return;
            }

            strNombre = cfdiRecibido.getNombreArchivo();
            if (strNombre != null && !strNombre.trim().isEmpty()) {
                strNombre = strNombre.replace(" ", "") + ".pdf";
            } else {
                strNombre = cfdiRecibido.getIdCfdiRecibido() + ".pdf";
            }
            plantillas = daoPlantilla.listaPlantillasByIdEmpresa(empresa.getIdEmpresa());
            if (plantillas.size() <= 0) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "No existen Plantillas almcenadas.");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                descBitacora = "[CFDI_RECIBIDO - downloadPDF] " + usuario.getUserid()
                        + " No existen Plantillas almcenadas";
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.INFO.name());
                logger.info(descBitacora);
                return;
            }
            JasperUtils jasperUtils = new JasperUtils();
            JasperPrint jasperPrint = jasperUtils.fill(cfdiRecibido.getXmlSat(), plantillas.get(0).getRuta());
            byte[] jas = jasperUtils.getPdfAsBytesArray(jasperPrint);
            logger.debug("colocando nombre al achivo: " + strNombre);
            FacesContext ctx = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
            response.setContentType("application/force-download");
            String disposition = "attachment; fileName=" + strNombre;
            response.setHeader("Content-Disposition", disposition);
            ServletOutputStream out = response.getOutputStream();
            InputStream ascii;

            ascii = new ByteArrayInputStream(jas);

            byte[] buf = new byte[5 * 1000 * 1024];
            int bytesRead;
            while ((bytesRead = ascii.read(buf)) != -1) {
                out.write(buf, 0, bytesRead);
            }

            out.flush();
            out.close();
            ctx.responseComplete();
            descBitacora = "[CFDI_RECIBIDO - downloadPDF] " + usuario.getUserid() + " descargo PDF de CFDI id "
                    + cfdiRecibido.getIdCfdiRecibido() + " uuid " + cfdiRecibido.getUuid() + " Serie "
                    + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.INFO.name());
            logger.info(descBitacora);
            logger.info(usuario.getUserid() + ". downloadPDF- PDF: " + strNombre + " Generado.");
        } catch (JRException ex) {
            descBitacora = "[CFDI_RECIBIDO - downloadPDF] " + usuario.getUserid() + " JRException ERROR "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Error", "Ocurrio un error al descargar el archivo PDF."));
            logger.error(descBitacora);
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - downloadPDF] " + usuario.getUserid() + " Exception ERROR: "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Error", "Ocurrio un error al descargar el archivo PDF."));
            logger.error(descBitacora);
        }
    }

    public String validar() {
        logger.info(usuario.getUserid() + " Inicia Validar CFDIs");
        int numCfdis = 0;
        if (cfdisSeleccionados.isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                    "Por favor, seleccione al menos un CFDI");
        } else {
            for (AuxCfdiRecibido imprimirCFDI : cfdisSeleccionados) {
                cfdiRecibido = new CfdisRecibidos();
                try {
                    cfdiRecibido = daoCfdiRecibido.getCfdiByID(imprimirCFDI.getIdCfdiRecibido());
                    if (!imprimirCFDI.getEstado().equals(EstadoCfdiR.CANCELADO.name())) {
                        cfdiRecibido.setEstado("NUEVO");
                        cfdiRecibido.setReportado(null);
                        cfdiRecibido.setReportadoXsa(null);
                        if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                            numCfdis++;
                            descBitacora = "[CFDI_RECIBIDO - validar] " + usuario.getUserid() + " CFDI id "
                                    + cfdiRecibido.getIdCfdiRecibido() + " uuid: " + cfdiRecibido.getUuid()
                                    + " Serie " + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio()
                                    + " se le ha colocado estado: " + cfdiRecibido.getEstado()
                                    + " para ser Validado";
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.INFO.name());
                            logger.info(descBitacora);

                        } else {
                            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                                    " Ocurrio un error al validar el CFDI");
                            FacesContext.getCurrentInstance().addMessage(null, msg);
                            descBitacora = "[CFDI_RECIBIDO - validar] " + usuario.getUserid()
                                    + " Error al modificar el CFDI id " + cfdiRecibido.getIdCfdiRecibido()
                                    + "  uuid: " + cfdiRecibido.getUuid() + " Serie " + cfdiRecibido.getSerie()
                                    + " Folio " + cfdiRecibido.getFolio();
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.ERROR.name());
                            logger.error(descBitacora);
                        }
                    } else {
                        msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                                "No es posible validar CFDIs Cancelados");
                        descBitacora = "[CFDI_RECIBIDO - validar] " + usuario.getUserid() + " CFDI id "
                                + cfdiRecibido.getIdCfdiRecibido() + " uuid: " + cfdiRecibido.getUuid() + " Serie "
                                + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio()
                                + " No se puede colocar en estado NUEVO, ya que se encuentra "
                                + imprimirCFDI.getEstado();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                    }
                } catch (Exception ex) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                            " Ocurrio un error al validar el CFDI");
                    descBitacora = "[CFDI_RECIBIDO - validar] " + usuario.getUserid() + " ERROR " + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
            logger.info(usuario.getUserid() + " Validacion " + numCfdis + " CFDIs seran validados nuevamente.");
            if (numCfdis > 0) {
                if (numCfdis == 1) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Validacin",
                            numCfdis + " CFDI ser validado nuevamente en unos minutos.");
                } else {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Validacin",
                            numCfdis + " CFDIs sern validados nuevamente en unos minutos.");
                }
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin", " Ningun CFDI ser validado.");
            }
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return "/CFDI/recibidos";
    }

    public String restaurar() {
        logger.info(usuario.getUserid() + ". Inicia restaurar CFDIs");
        int numCfdis = 0;
        if (cfdisSeleccionados.isEmpty()) {
            this.msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                    "Por favor, seleccione al menos un CFDI");
            FacesContext.getCurrentInstance().addMessage(null, this.msg);
            return "/CFDI/eliminados";
        }
        for (AuxCfdiRecibido imprimirCFDI : cfdisSeleccionados) {
            cfdiRecibido = new CfdisRecibidos();
            try {
                cfdiRecibido = daoCfdiRecibido.getCfdiByID(imprimirCFDI.getIdCfdiRecibido());
                if (!imprimirCFDI.getEstado().equals(EstadoCfdiR.CANCELADO.name())) {
                    cfdiRecibido.setEstado(EstadoCfdiR.NUEVO.name());
                    cfdiRecibido.setEstadoNotificacion(NotificacionCfdiR.SIN_NOTIFICAR.name());
                    if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                        numCfdis++;
                        descBitacora = "[CFDI_RECIBIDO - restaurar] " + usuario.getUserid() + " CFDI id "
                                + cfdiRecibido.getIdCfdiRecibido() + " uuid: " + cfdiRecibido.getUuid()
                                + " se le ha colocado estado: " + cfdiRecibido.getEstado()
                                + ". Ha sido restablecido.";
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                    } else {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                                " Ocurrio un error al restaurar el CFDI");
                        descBitacora = "[CFDI_RECIBIDO - restaurar] " + usuario.getUserid()
                                + " Error al modificar el CFDI id " + cfdiRecibido.getIdCfdiRecibido() + " uuid: "
                                + cfdiRecibido.getUuid();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                } else {
                    msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                            " No es posible restaurar el CFDI se encuentra Cancelado");
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                    descBitacora = "[CFDI_RECIBIDO - restaurar] " + usuario.getUserid() + " CFDI id "
                            + cfdiRecibido.getIdCfdiRecibido() + " uuid: " + cfdiRecibido.getUuid()
                            + " No se puede colocar en Estado NUEVO ya que se encuenta " + imprimirCFDI.getEstado();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.info(descBitacora);
                }

            } catch (Exception ex) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                        " Ocurrio un error al restaurar el CFDI");
                descBitacora = "[CFDI_RECIBIDO - restaurar] " + usuario.getUserid() + " ERROR " + ex.getMessage();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.error(descBitacora);
            }
        }
        logger.info("restaurar " + numCfdis + " CFDIs se ha restaurado.");
        if (numCfdis > 0) {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Correcto",
                    numCfdis + " CFDI(s) han sido restaurado(s).");
        } else {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                    "Ningn documento ha sido Restaurado.");
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return "/CFDI/eliminados";
    }

    public void handleFileUpload(FileUploadEvent event) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        congifEmpresa = new ConfiguracionesEmpresas();
        String nombreArchivo = event.getFile().getFileName().toLowerCase();
        String ruta = "/work/ftp/" + empresa.getRfc() + "/VALIDACION";

        if (!(nombreArchivo.endsWith(".xml") || nombreArchivo.endsWith(".zip") || nombreArchivo.endsWith(".pdf"))) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Error",
                    "El archivo debe ser con extensin \".xml\" , \".zip\"  \".pdf\""));
            return;
        }
        try {
            congifEmpresa = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.VAL_USER_FTP.name());
            if (!congifEmpresa.getValor().trim().isEmpty()) {
                File folder = new File(ruta);
                if (!folder.exists()) {
                    logger.info("no se encontro el directorio " + ruta);
                    folder.mkdirs();
                    logger.info(ruta + " creado");
                }
                outputStream = new FileOutputStream(
                        new File(ruta + System.getProperty("file.separator") + event.getFile().getFileName()));
                inputStream = event.getFile().getInputstream();
                int read = 0;
                byte[] bytes = new byte[1024];

                while ((read = inputStream.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, read);
                }
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Correcto", "Archivo " + event.getFile().getFileName() + " cargado"));
                descBitacora = "[CFDI_RECIBIDO - handleFileUpload] " + usuario.getUserid() + " Archivo "
                        + event.getFile().getFileName() + " cargado para validacion";
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.INFO.name());
                logger.info(descBitacora);
                if (nombreArchivo.endsWith(".zip")) {
                    if (manejorArchivos.extractZipTo(
                            ruta + System.getProperty("file.separator") + event.getFile().getFileName(), ruta)) {
                        manejorArchivos.eliminar(
                                ruta + System.getProperty("file.separator") + event.getFile().getFileName());
                    }
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Precaucin", "Por favor, Configure un Usuario FTP para archvios de Validacin."));
                descBitacora = "[CFDI_RECIBIDO - handleFileUpload] " + usuario.getUserid()
                        + " No existe Configuracion Usuario FTP para archvios de Validacin.";
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.WARNING.name());
                logger.warn(descBitacora);
            }
        } catch (IOException e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Nuevo", "Ocurrio un error cargando los archivos."));
            descBitacora = "[CFDI_RECIBIDO - handleFileUpload] " + usuario.getUserid() + " IOException ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Nuevo", "Ocurrio un error cargando los archivos."));
            descBitacora = "[CFDI_RECIBIDO - handleFileUpload] " + usuario.getUserid() + " Exception ERROR "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException ex) {
                    descBitacora = "[CFDI_RECIBIDO - handleFileUpload] " + usuario.getUserid()
                            + " Error cerrando inputStream ERROR " + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException ex) {
                    descBitacora = "[CFDI_RECIBIDO - handleFileUpload] " + usuario.getUserid()
                            + " Error cerrando outputStream ERROR " + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
        }
    }

    public void fileUploadSocio(FileUploadEvent event) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        socioComercial = null;
        boolean writeFile = true;
        String rfc = null;
        congifEmpresa = new ConfiguracionesEmpresas();
        String nombreArchivo = event.getFile().getFileName().toLowerCase();
        String ruta = "/work/ftp/" + empresa.getRfc() + "/VALIDACION";

        if (!(nombreArchivo.endsWith(".xml") || nombreArchivo.endsWith(".zip") || nombreArchivo.endsWith(".pdf"))) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Error",
                    "El archivo debe ser con extensin \".xml\" , \".zip\"  \".pdf\""));
            return;
        }
        try {
            socioComercial = daoSociosComerciales.getSocioComercialByID(usuario.getIdSocioComercial());
            congifEmpresa = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.VAL_USER_FTP.name());
            if (!congifEmpresa.getValor().trim().isEmpty()) {
                File folder = new File(ruta);
                if (!folder.exists()) {
                    logger.info("no se encontro el directorio " + ruta);
                    folder.mkdirs();
                    logger.info(ruta + " creado");
                }
                if (nombreArchivo.endsWith(".xml")) {
                    writeFile = false;
                    revisarXml = new RevisarXML(event.getFile().getInputstream());
                    rfc = revisarXml.revisaNodos("rfc", "cfdi:Comprobante", "Emisor");
                    if (socioComercial.getRfc().equals(rfc)) {
                        writeFile = true;
                        logger.info("[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid()
                                + " El rfc del socio comercial " + socioComercial.getRfc()
                                + " coincide con el rfc del nodo emisor del xml " + rfc);
                    } else {
                        logger.info("[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid()
                                + " El rfc del socio comercial " + socioComercial.getRfc()
                                + " no coincide con el rfc del nodo emisor del xml " + rfc);
                        FacesContext.getCurrentInstance().addMessage(null,
                                new FacesMessage(FacesMessage.SEVERITY_WARN, "Atencin",
                                        "Archivo " + event.getFile().getFileName() + " no corresponde al RFC "
                                                + socioComercial.getRfc()));
                    }
                }
                if (writeFile) {
                    outputStream = new FileOutputStream(
                            new File(ruta + System.getProperty("file.separator") + event.getFile().getFileName()));
                    inputStream = event.getFile().getInputstream();
                    int read = 0;
                    byte[] bytes = new byte[1024];
                    while ((read = inputStream.read(bytes)) != -1) {
                        outputStream.write(bytes, 0, read);
                    }
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                            "Correcto", "Archivo " + event.getFile().getFileName() + " cargado"));
                    descBitacora = "[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid() + " Archivo "
                            + event.getFile().getFileName() + " cargado para validacion";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                    if (nombreArchivo.endsWith(".zip")) {
                        if (manejorArchivos.extractZipSocio(
                                ruta + System.getProperty("file.separator") + event.getFile().getFileName(), ruta,
                                socioComercial.getRfc())) {
                            manejorArchivos.eliminar(
                                    ruta + System.getProperty("file.separator") + event.getFile().getFileName());
                        }
                    }
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Precaucin", "Por favor, Configure un Usuario FTP para archvios de Validacin."));
                descBitacora = "[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid()
                        + " No existe Configuracion Usuario FTP para archvios de Validacin.";
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.WARNING.name());
                logger.warn(descBitacora);
            }
        } catch (IOException e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Nuevo", "Ocurrio un error cargando los archivos."));
            descBitacora = "[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid() + " IOException ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Nuevo", "Ocurrio un error cargando los archivos."));
            descBitacora = "[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid() + " Exception ERROR "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException ex) {
                    descBitacora = "[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid()
                            + " Error cerrando inputStream ERROR " + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException ex) {
                    descBitacora = "[CFDI_RECIBIDO - fileUploadSocio] " + usuario.getUserid()
                            + " Error cerrando outputStream ERROR " + ex.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
        }
    }

    public void descargarReporte() {
        logger.info(usuario.getUserid() + ". Inicia descargar reporte");
        boolean donwload;
        String hql = "select new CfdisRecibidos(idCfdiRecibido, idSocioComercial, serie, folio, uuid, fecha, total, fechaRecepcion, estado, error, totalOc, tipoMoneda, tipoCambio, entradaAlmacen, controlCalidad, autorizacion, tiposWarn) from CfdisRecibidos where idEmpresa = "
                + empresa.getIdEmpresa() + " and (estado != 'ELIMINADO' and estado != 'CANCELADO')";
        try {
            List<CfdisRecibidos> listCfdis;
            if (!reportarTodos) {
                if (intIdSocio != 0) {
                    hql = hql + " and idSocioComercial = " + intIdSocio;
                }
                if (fechaMin != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String minFecha = df.format(fechaMin);
                    hql = hql + " and fecha > '" + minFecha + "'";
                }
                if (fechaMax != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String maxFecha = df.format(fechaMax);
                    maxFecha = maxFecha + " 23:59:59";
                    hql = hql + " and fecha < '" + maxFecha + "'";
                }
            }
            hql = hql + " ORDER BY fechaRecepcion DESC";
            logger.debug("hql " + hql);
            listCfdis = daoCfdiRecibido.listaCfdisByHql(hql);
            if (!listCfdis.isEmpty()) {
                donwload = generarReporte(listCfdis);
                if (donwload) {
                    FacesContext.getCurrentInstance().addMessage(null,
                            new FacesMessage(FacesMessage.SEVERITY_INFO, "Correcto", "Generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporte] " + usuario.getUserid()
                            + " Reporte Generado Corectamente";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Error", "Ha ocurrido un error generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporte] " + usuario.getUserid()
                            + " Error generando Reporte";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "", "No se han encontrado resultados."));
                logger.warn(usuario.getUserid() + " .La cosulta no devuleve ningun registro");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarReporte] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void descargarReporteSocio() {
        logger.info(usuario.getUserid() + ". Inicia descargar reporte Socio Comercial");
        boolean donwload;
        String hql = "select new CfdisRecibidos(idCfdiRecibido, idSocioComercial, serie, folio, uuid, fecha, total, fechaRecepcion, estado, error, totalOc, tipoMoneda, tipoCambio, entradaAlmacen, controlCalidad, autorizacion, tiposWarn) from CfdisRecibidos where idEmpresa = "
                + empresa.getIdEmpresa() + "and idSocioComercial = " + usuario.getIdSocioComercial()
                + " and (estado != 'ELIMINADO' and estado != 'CANCELADO')";
        try {
            List<CfdisRecibidos> listCfdis;
            if (!reportarTodos) {
                if (fechaMin != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String minFecha = df.format(fechaMin);
                    hql = hql + " and fecha > '" + minFecha + "'";
                }
                if (fechaMax != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String maxFecha = df.format(fechaMax);
                    maxFecha = maxFecha + " 23:59:59";
                    hql = hql + " and fecha < '" + maxFecha + "'";
                }
            }
            hql = hql + " ORDER BY fechaRecepcion DESC";
            logger.debug("hql " + hql);
            listCfdis = daoCfdiRecibido.listaCfdisByHql(hql);
            if (!listCfdis.isEmpty()) {
                donwload = generarReporte(listCfdis);
                if (donwload) {
                    FacesContext.getCurrentInstance().addMessage(null,
                            new FacesMessage(FacesMessage.SEVERITY_INFO, "Correcto", "Generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporteSocio] " + usuario.getUserid()
                            + " Reporte Socio Comercial Generado Corectamente";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Error", "Ha ocurrido un error generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporteSocio] " + usuario.getUserid()
                            + " Error generando Reporte Socio Comercial";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "", "No se han encontrado resultados."));
                logger.warn(usuario.getUserid() + " .La cosulta no devuleve ningun registro");
            }

        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarReporteSocio] " + usuario.getUserid() + " ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void descargarReporteEliminados() {
        logger.info(usuario.getUserid() + ". Inicia descargar reporte Eliminados");
        boolean donwload;
        String hql = "select new CfdisRecibidos(idCfdiRecibido, idSocioComercial, serie, folio, uuid, fecha, total, fechaRecepcion, estado, error, totalOc, tipoMoneda, tipoCambio, entradaAlmacen, controlCalidad, autorizacion, tiposWarn) from CfdisRecibidos where idEmpresa = "
                + empresa.getIdEmpresa() + " and (estado ='ELIMINADO' or estado ='CANCELADO')";
        try {
            List<CfdisRecibidos> listCfdis;
            if (!reportarTodos) {
                if (intIdSocio != 0) {
                    hql = hql + " and idSocioComercial = " + intIdSocio;
                }
                if (fechaMin != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String minFecha = df.format(fechaMin);
                    hql = hql + " and fecha > '" + minFecha + "'";
                }
                if (fechaMax != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String maxFecha = df.format(fechaMax);
                    maxFecha = maxFecha + " 23:59:59";
                    hql = hql + " and fecha < '" + maxFecha + "'";
                }
            }
            hql = hql + " ORDER BY fechaRecepcion DESC";
            logger.debug("hql " + hql);
            listCfdis = daoCfdiRecibido.listaCfdisByHql(hql);
            if (!listCfdis.isEmpty()) {
                donwload = generarReporte(listCfdis);
                if (donwload) {
                    FacesContext.getCurrentInstance().addMessage(null,
                            new FacesMessage(FacesMessage.SEVERITY_INFO, "Correcto", "Generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporteEliminados] " + usuario.getUserid()
                            + " Reporte Eliminados Generado Corectamente";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Error", "Ha ocurrido un error generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporteEliminados] " + usuario.getUserid()
                            + " Error generando Reporte Eliminados";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "", "No se han encontrado resultados."));
                logger.warn(usuario.getUserid() + " .La cosulta no devuleve ningun registro");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarReporteEliminados] " + usuario.getUserid() + " ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void descargarReporteEliminadosSocio() {
        logger.info(usuario.getUserid() + ". Inicia descargar reporte Eliminados Socio Comercial");
        boolean donwload;
        String hql = "select new CfdisRecibidos(idCfdiRecibido, idSocioComercial, serie, folio, uuid, fecha, total, fechaRecepcion, estado, error, totalOc, tipoMoneda, tipoCambio, entradaAlmacen, controlCalidad, autorizacion, tiposWarn) from CfdisRecibidos where idEmpresa = "
                + empresa.getIdEmpresa() + "and idSocioComercial = " + usuario.getIdSocioComercial()
                + " and (estado ='ELIMINADO' or estado ='CANCELADO')";
        try {
            List<CfdisRecibidos> listCfdis;
            if (!reportarTodos) {
                if (fechaMin != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String minFecha = df.format(fechaMin);
                    hql = hql + " and fecha > '" + minFecha + "'";
                }
                if (fechaMax != null) {
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                    String maxFecha = df.format(fechaMax);
                    maxFecha = maxFecha + " 23:59:59";
                    hql = hql + " and fecha < '" + maxFecha + "'";
                }
            }
            hql = hql + " ORDER BY fechaRecepcion DESC";
            logger.debug("hql " + hql);
            listCfdis = daoCfdiRecibido.listaCfdisByHql(hql);
            if (!listCfdis.isEmpty()) {
                donwload = generarReporte(listCfdis);
                if (donwload) {
                    FacesContext.getCurrentInstance().addMessage(null,
                            new FacesMessage(FacesMessage.SEVERITY_INFO, "Correcto", "Generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporteEliminadosSocio] " + usuario.getUserid()
                            + " Reporte Eliminados Socio Comercial Generado Corectamente";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Error", "Ha ocurrido un error generando Reporte."));
                    descBitacora = "[CFDI_RECIBIDO - descargarReporteEliminadosSocio] " + usuario.getUserid()
                            + " Error generando Reporte Elimindados Socio Comercial";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null,
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "", "No se han encontrado resultados."));
                logger.warn(usuario.getUserid() + " .La cosulta no devuleve ningun registro");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarReporteEliminadosSocio] " + usuario.getUserid() + " ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void descargarZip() {
        logger.info(usuario.getUserid() + ". Inicia descargarZip");
        String ruta = "/work/iqtb/validacionfiles/zip/" + empresa.getRfc() + "/" + usuario.getUserid() + "/";

        try {
            idsCfdisR = daoCfdiRecibido.listaIdsCfdisRByHQL("select idCfdiRecibido " + query);
            logger.debug("QUERY: select idCfdiRecibido " + query);
            if (idsCfdisR != null) {
                plantillas = null;
                File archivoZip = null;
                plantillas = daoPlantilla.listaPlantillasByIdEmpresa(empresa.getIdEmpresa());
                if (plantillas.size() <= 0) {
                    descBitacora = "[CFDI_RECIBIDO - descargarZip] " + usuario.getUserid()
                            + " No existen Plantillas almcenadas para crear PDF. Se generara el ZIP solo con XML.";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.WARNING.name());
                    logger.warn(descBitacora);
                    archivoZip = new GenerarArchivo().getArchivoAMBOS(idsCfdisR, ruta, "");
                } else {
                    logger.info(usuario.getUserid() + ". Inicia generar ZIP con PDF y XML");
                    archivoZip = new GenerarArchivo().getArchivoAMBOS(idsCfdisR, ruta, plantillas.get(0).getRuta());
                }
                logger.info("[CFDI_RECIBIDO - descargarZip] " + usuario.getUserid() + " Inicia generacion de PDF.");
                if (archivoZip != null) {
                    FacesContext ctx = FacesContext.getCurrentInstance();
                    HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
                    response.setContentType("application/force-download");
                    String disposition = "attachment; fileName=" + archivoZip.getName();
                    response.setHeader("Content-Disposition", disposition);
                    ServletOutputStream out = response.getOutputStream();
                    InputStream ascii;
                    ascii = new FileInputStream(archivoZip);
                    byte[] buf = new byte[5 * 1000 * 1024];
                    int bytesRead;
                    while ((bytesRead = ascii.read(buf)) != -1) {
                        out.write(buf, 0, bytesRead);
                    }
                    out.flush();
                    out.close();
                    ctx.responseComplete();
                    descBitacora = "[CFDI_RECIBIDO - descargarZip] " + usuario.getUserid()
                            + " genero/descargo PDF/XML en formato zip.";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                    manejorArchivos.eliminar(archivoZip.getAbsolutePath());
                    logger.info(usuario.getUserid() + ". Termina descargarZip");
                } else {
                    descBitacora = "[CFDI_RECIBIDO - descargarZip] " + usuario.getUserid()
                            + " Archivo ZIP es nulo, no se genero correctamente.";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Descargar PDF/XML", "No se han encontrado resultados"));
                logger.info("[CFDI_RECIBIDO - descargarZip] " + usuario.getUserid()
                        + " no se han encontrado resultados.");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarZip] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void descargarPDF() {
        logger.info(usuario.getUserid() + ". Inicia descargarPDF");
        String ruta = "/work/iqtb/validacionfiles/zip/" + empresa.getRfc() + "/" + usuario.getUserid() + "/";

        try {
            idsCfdisR = daoCfdiRecibido.listaIdsCfdisRByHQL("select idCfdiRecibido " + query);
            logger.info("QUERY: select idCfdiRecibido " + query);
            if (idsCfdisR != null) {
                plantillas = null;
                File archivoXml = null;
                plantillas = daoPlantilla.listaPlantillasByIdEmpresa(empresa.getIdEmpresa());
                if (plantillas.size() <= 0) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Descargar PDF", "No existe Plantilla almacenada para generar PDF."));
                    logger.info("[CFDI_RECIBIDO - descargarPDF] " + usuario.getUserid()
                            + " no existe plantilla para generar PDF.");
                } else {
                    logger.info(
                            "[CFDI_RECIBIDO - descargarPDF] " + usuario.getUserid() + " Inicia generacion de PDF.");
                    archivoXml = generarArchivo.getArchivoPDF(idsCfdisR, ruta, plantillas.get(0).getRuta());
                    if (archivoXml != null) {
                        FacesContext ctx = FacesContext.getCurrentInstance();
                        HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
                        response.setContentType("application/force-download");
                        String disposition = "attachment; fileName=" + archivoXml.getName();
                        response.setHeader("Content-Disposition", disposition);
                        ServletOutputStream out = response.getOutputStream();
                        InputStream ascii;
                        ascii = new FileInputStream(archivoXml);
                        byte[] buf = new byte[5 * 1000 * 1024];
                        int bytesRead;
                        while ((bytesRead = ascii.read(buf)) != -1) {
                            out.write(buf, 0, bytesRead);
                        }
                        out.flush();
                        out.close();
                        ctx.responseComplete();
                        descBitacora = "[CFDI_RECIBIDO - descargarPDF] " + usuario.getUserid()
                                + " genero/descargo archivos PDF(s)";
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                        manejorArchivos.eliminar(archivoXml.getAbsolutePath());
                        logger.info(usuario.getUserid() + ". Termina descargarPDF");
                    } else {
                        descBitacora = "[CFDI_RECIBIDO - descargarPDF] " + usuario.getUserid()
                                + " Archivo PDF es nulo, no se genero correctamente.";
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Descargar PDF", "No se han encontrado resultados"));
                logger.info("[CFDI_RECIBIDO - descargarPDF] " + usuario.getUserid()
                        + " no se han encontrado resultados.");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarPDF] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void descargarXML() {
        logger.info(usuario.getUserid() + ". Inicia descargarXML");
        String ruta = "/work/iqtb/validacionfiles/zip/" + empresa.getRfc() + "/" + usuario.getUserid() + "/";
        try {
            idsCfdisR = daoCfdiRecibido.listaIdsCfdisRByHQL("select idCfdiRecibido " + query);
            logger.info("QUERY: select idCfdiRecibido " + query);
            if (idsCfdisR != null) {
                File archivoXml = null;
                logger.info("[CFDI_RECIBIDO - descargarXML] " + usuario.getUserid() + " Inicia generacion de XML.");
                archivoXml = generarArchivo.getArchivoXML(idsCfdisR, ruta);
                if (archivoXml != null) {
                    FacesContext ctx = FacesContext.getCurrentInstance();
                    HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
                    response.setContentType("application/force-download");
                    String disposition = "attachment; fileName=" + archivoXml.getName();
                    response.setHeader("Content-Disposition", disposition);
                    ServletOutputStream out = response.getOutputStream();
                    InputStream ascii;
                    ascii = new FileInputStream(archivoXml);
                    byte[] buf = new byte[5 * 1000 * 1024];
                    int bytesRead;
                    while ((bytesRead = ascii.read(buf)) != -1) {
                        out.write(buf, 0, bytesRead);
                    }
                    out.flush();
                    out.close();
                    ctx.responseComplete();
                    descBitacora = "[CFDI_RECIBIDO - descargarXML] " + usuario.getUserid()
                            + " genero/descargo archivos XML(s)";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                    manejorArchivos.eliminar(archivoXml.getAbsolutePath());
                    logger.info(usuario.getUserid() + ". Termina descargarXML");

                } else {
                    descBitacora = "[CFDI_RECIBIDO - descargarXML] " + usuario.getUserid()
                            + " Archivo XML es nulo, no se genero correctamente.";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Descargar XML", "No se han encontrado resultados"));
                logger.info("[CFDI_RECIBIDO - descargarXML] " + usuario.getUserid()
                        + " no se han encontrado resultados.");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarXML] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public String cancelarCfdi() {
        logger.info(usuario.getUserid() + ". Inicia Notificacion de Cancelacion CFDIs");
        int cancelados = 0;
        int notificados = 0;
        for (AuxCfdiRecibido imprimirCFDI : cfdisSeleccionados) {
            cfdiRecibido = null;
            try {
                cfdiRecibido = daoCfdiRecibido.getCfdiByID(imprimirCFDI.getIdCfdiRecibido());
                cfdiRecibido.setEstado(EstadoCfdiR.CANCELADO.name());
                cfdiRecibido.setReportado(null);
                if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                    descBitacora = "[CFDI_RECIBIDO - cancelarCfdi] " + usuario.getUserid() + " CFDI con uuid: "
                            + cfdiRecibido.getUuid() + " serie " + cfdiRecibido.getSerie() + " folio "
                            + cfdiRecibido.getFolio() + " se le ha colocado estado: " + cfdiRecibido.getEstado();
                    logger.info(descBitacora);
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    cancelados++;
                    if (notificarCancelacion(imprimirCFDI)) {
                        descBitacora = "[CFDI_RECIBIDO - cancelarCfdi] " + usuario.getUserid()
                                + " realizo correctamente la notificacion de cancelacion del cfdi con uuid: "
                                + cfdiRecibido.getUuid() + " serie " + cfdiRecibido.getSerie() + " folio "
                                + cfdiRecibido.getFolio();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                        notificados++;
                    } else {
                        descBitacora = "[CFDI_RECIBIDO - cancelarCfdi] " + usuario.getUserid()
                                + " Error al intentar notificacion de cancelacion del cfdi con uuid: "
                                + cfdiRecibido.getUuid() + " serie " + cfdiRecibido.getSerie() + " folio "
                                + cfdiRecibido.getFolio();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                } else {
                    descBitacora = "[CFDI_RECIBIDO - cancelarCfdi] " + usuario.getUserid()
                            + " Error al actualizar CFDI con id: " + cfdiRecibido.getIdCfdiRecibido();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } catch (Exception ex) {
                descBitacora = "[CFDI_RECIBIDO - cancelarCfdi] " + usuario.getUserid() + " ERROR "
                        + ex.getMessage();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.error(descBitacora);
            }
        }
        logger.info(usuario.getUserid() + ". Cancelacion " + cancelados
                + " CFDIs se han colocado en estado Cancelado. Se ha realizado " + notificados
                + " notificacion(es) con exito");
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Notificacion de Cancelacin",
                cancelados + " documentos se han colocado en estado CANCELADO. Se ha realizado " + notificados
                        + " notificacion(es) con exito");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return "/CFDI/recibidos";
    }

    public void descargarPDFSocio() {
        logger.info(usuario.getUserid() + " descargarPDFSocio - inicia descarga de PDF");
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Map params = facesContext.getExternalContext().getRequestParameterMap();

        int id = Integer.valueOf((String) params.get("idCfdi"));
        CfdisRecibidos cr;
        String strNombrePDF;
        String dir = "/work/iqtb/validacionfiles/pdfRecibidos/" + empresa.getRfc() + "/";
        try {
            cr = daoCfdiRecibido.getCfdiByID(id);
            strNombrePDF = cr.getNombreArchivo().replace(" ", "") + ".pdf";
            if (cr.getPdf() == null) {
                logger.info(usuario.getUserid() + ". cfdi con id " + cr.getIdCfdiRecibido()
                        + " no tiene PDF socio comercial asignado. Inicia busqueda en " + dir);
                if (buscarArchivo(dir, cr)) {
                    validarPDFSocio(cr);
                    servletDescarga(cr.getPdf(), strNombrePDF);
                } else {
                    descBitacora = "[CFDI_RECIBIDO - descargarPDFSocio] " + usuario.getUserid()
                            + " No se encontro PDF con nombre " + cr.getNombreArchivo() + " en la ruta " + dir;
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.WARNING.name());
                    FacesContext.getCurrentInstance().addMessage(null,
                            new FacesMessage(FacesMessage.SEVERITY_INFO, "PDF no encontrado",
                                    "Si desea puede cargar el archivo PDF con nombre: " + cr.getNombreArchivo()
                                            + " desde el botn Nuevo."));
                    logger.info(descBitacora);
                }
            } else {
                if (cr.getStatusPdf() == null) {
                    logger.info(usuario.getUserid() + ". CFDI id " + cr.getIdCfdiRecibido() + " tiene PDF status "
                            + cr.getStatusPdf() + " Iniciara validacion.");
                    validarPDFSocio(cr);
                    servletDescarga(cr.getPdf(), strNombrePDF);
                } else {
                    if (!cr.getStatusPdf()) {
                        logger.warn(usuario.getUserid() + ". CFDI id " + cr.getIdCfdiRecibido()
                                + " tiene PDF status " + cr.getStatusPdf() + " Iniciara descarga servlet.");
                        servletDescarga(cr.getPdf(), strNombrePDF);
                        FacesContext.getCurrentInstance().addMessage(null,
                                new FacesMessage(FacesMessage.SEVERITY_WARN, "Precaucin",
                                        "El PDF entregado podria no coinicir con el XML."));
                        descBitacora = "[CFDI_RECIBIDO - descargarPDFSocio] " + usuario.getUserid() + " CFDI id "
                                + cr.getIdCfdiRecibido() + " El PDF entregado podria no coincidir con el XML";
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.WARNING.name());
                        logger.warn(descBitacora);
                    } else {
                        logger.info(usuario.getUserid() + ". CFDI id " + cr.getIdCfdiRecibido()
                                + " tiene PDF status " + cr.getStatusPdf() + " Iniciara descarga servlet.");
                        servletDescarga(cr.getPdf(), strNombrePDF);
                    }
                }
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - descargarPDFSocio] " + usuario.getUserid() + " ERROR: "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ha ocurrido un error al descargar PDF.");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            logger.error(descBitacora);
        }
    }

    public void updateCfdiOrdenCompra() {
        logger.info("Lista de id de cfdis para actualizar y relacionar con el id Orden de compra " + idOrdenCompra);
        int num = 0;
        try {
            for (Integer idCfdi : listaIds) {
                logger.info("idCfdi " + idCfdi);
                cfdiRecibido = null;
                cfdiRecibido = daoCfdiRecibido.getCfdiByID(idCfdi);
                if (cfdiRecibido != null) {
                    cfdiRecibido.setIdOrdenCompra(idOrdenCompra);
                    if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                        descBitacora = "[CFDI_RECIBIDO - updateCfdiOrdenCompra] " + usuario.getUserid()
                                + " cfdi id " + cfdiRecibido.getIdCfdiRecibido() + " uuid " + cfdiRecibido.getUuid()
                                + ". se ha asignala la orden de compra id " + idOrdenCompra;
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                        num++;
                    } else {
                        //                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Asignar Orden de Compra", "Ocurrio un error asignando la orden de compra " + ordenCompra.getNumeroOc() + " con el CFDI con Serie " + cfdiRecibido.getSerie() + " Folio " + cfdiRecibido.getFolio() + "."));
                        descBitacora = "[CFDI_RECIBIDO - updateCfdiOrdenCompra] " + usuario.getUserid()
                                + " ocurrio un error al actualizar el idOrdenCompra " + idOrdenCompra
                                + " del cfdi id " + cfdiRecibido.getIdCfdiRecibido() + " uuid "
                                + cfdiRecibido.getUuid();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.info(descBitacora);
                    }
                } else {
                    FacesContext.getCurrentInstance()
                            .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                    "Asignar Orden de Compra",
                                    "Ocurrio un error en el proceso de asignar una Orden de Compra al CFDI."));
                    descBitacora = "[CFDI_RECIBIDO - updateCfdiOrdenCompra] " + usuario.getUserid()
                            + " Error obteniendo cfdi con id " + idCfdi;
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Asignar Orden de Compra",
                            "Ocurrio un error en el proceso de asignar una Orden de Compra al CFDI."));
            descBitacora = "[CFDI_RECIBIDO - updateCfdiOrdenCompra] " + usuario.getUserid() + " ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Asignar Orden de Compra", num + " CFDI(s) asignado(s) con su Orden de Compra."));

        listaIds = null;
    }

    public void asignarOrdenCompra() {
        boolean asignarOrden = false;
        if (cfdisSeleccionados.isEmpty()) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Precaucin", "Por favor, seleccione al menos un CFDI."));
        } else {
            logger.info(usuario.getUserid() + " Inicia asignarOrdenCompra");
            listaIds = new ArrayList<Integer>();
            for (AuxCfdiRecibido auxCfdi : cfdisSeleccionados) {
                cfdiRecibido = null;
                byte[] XmlBytes;
                InputStream entrada = null;
                String xml = null;
                try {
                    logger.info(usuario.getUserid() + " Obteniendo cfdi con id " + auxCfdi.getIdCfdiRecibido());
                    cfdiRecibido = daoCfdiRecibido.getCfdiByID(auxCfdi.getIdCfdiRecibido());
                    if (cfdiRecibido != null) {
                        if (!cfdiRecibido.getEstado().equals(EstadoCfdiR.NUEVO.name())
                                && !cfdiRecibido.getEstado().equals(EstadoCfdiR.SIN_VALIDAR.name())) {
                            if (cfdiRecibido.getIdOrdenCompra() == null) {
                                xml = cfdiRecibido.getXmlSat();
                                XmlBytes = xml.getBytes("UTF-8");
                                entrada = new ByteArrayInputStream(XmlBytes);
                                if (procesarAddenda(entrada, cfdiRecibido.getIdSocioComercial())) {
                                    cfdiRecibido.setEstado(EstadoCfdiR.NUEVO.name());
                                    if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                                        FacesContext.getCurrentInstance().addMessage(null,
                                                new FacesMessage(FacesMessage.SEVERITY_INFO,
                                                        "Asignar Orden de Compra",
                                                        "CFDI con Serie " + cfdiRecibido.getSerie() + " Folio "
                                                                + cfdiRecibido.getFolio()
                                                                + ", se asignar con la orden de compra "
                                                                + ordenCompra.getNumeroOc() + "."));
                                        descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid()
                                                + " cfdi id " + cfdiRecibido.getIdCfdiRecibido() + " uuid "
                                                + cfdiRecibido.getUuid() + ". tiene asignada la orden de compra id "
                                                + ordenCompra.getIdOrdenCompra() + " numero "
                                                + ordenCompra.getNumeroOc() + ". CFDI en estado "
                                                + cfdiRecibido.getEstado() + " para la asignacion automatica.";
                                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(),
                                                descBitacora, BitacoraTipo.INFO.name());
                                        logger.info(descBitacora);
                                    } else {
                                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                                                FacesMessage.SEVERITY_ERROR, "Asignar Orden de Compra",
                                                "Ocurrio un error asignando la orden de compra "
                                                        + ordenCompra.getNumeroOc() + " con el CFDI con Serie "
                                                        + cfdiRecibido.getSerie() + " Folio "
                                                        + cfdiRecibido.getFolio() + "."));
                                        descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid()
                                                + " ocurrio un error al actualizar cfdi id "
                                                + cfdiRecibido.getIdCfdiRecibido() + " uuid "
                                                + cfdiRecibido.getUuid()
                                                + ". para asignalo manualmente a la orden de compra id "
                                                + ordenCompra.getIdOrdenCompra() + " numero "
                                                + ordenCompra.getNumeroOc() + ".";
                                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(),
                                                descBitacora, BitacoraTipo.ERROR.name());
                                        logger.info(descBitacora);
                                    }
                                } else {
                                    if (tieneAddenda) {
                                        if (ordenCompra == null) {
                                            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                                                    FacesMessage.SEVERITY_WARN, "Asignar Orden de Compra",
                                                    "CFDI con Serie " + cfdiRecibido.getSerie() + " Folio "
                                                            + cfdiRecibido.getFolio()
                                                            + ". No se encontr la Orden de Compra. Por favor, asigne manualmente la Orden de Compra correspondiente."));
                                            descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] "
                                                    + usuario.getUserid() + " cfdi id "
                                                    + cfdiRecibido.getIdCfdiRecibido() + " uuid "
                                                    + cfdiRecibido.getUuid()
                                                    + ". No se encontro Orden de Compra en base de datos. El usuario podra asignarla manuelmente.";
                                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(),
                                                    descBitacora, BitacoraTipo.WARNING.name());
                                            logger.info(descBitacora);
                                            asignarOrden = true;
                                            logger.info("obtenerOrdenesCompra idSocio "
                                                    + cfdiRecibido.getIdSocioComercial());
                                            obtenerOrdenesCompra(cfdiRecibido.getIdSocioComercial());
                                            listaIds.add(cfdiRecibido.getIdCfdiRecibido());
                                        }
                                    } else {
                                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                                                FacesMessage.SEVERITY_WARN, "Asignar Orden de Compra",
                                                "CFDI con Serie " + cfdiRecibido.getSerie() + " Folio "
                                                        + cfdiRecibido.getFolio()
                                                        + ". No cuenta con addenda. Por favor, asigne manualmente la orden de compra correspondiente."));
                                        descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid()
                                                + " cfdi id " + cfdiRecibido.getIdCfdiRecibido() + " uuid "
                                                + cfdiRecibido.getUuid()
                                                + ". No cuenta con addenda para asignarlo automaticamente a su orden de compra. El usuario podra asignarla manualmente";
                                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(),
                                                descBitacora, BitacoraTipo.WARNING.name());
                                        logger.info(descBitacora);
                                        asignarOrden = true;
                                        logger.info("obtenerOrdenesCompra idSocio "
                                                + cfdiRecibido.getIdSocioComercial());
                                        obtenerOrdenesCompra(cfdiRecibido.getIdSocioComercial());
                                        listaIds.add(cfdiRecibido.getIdCfdiRecibido());
                                    }
                                }
                            } else {
                                FacesContext.getCurrentInstance().addMessage(null,
                                        new FacesMessage(FacesMessage.SEVERITY_WARN, "Asignar Orden de Compra",
                                                "CFDI con Serie " + cfdiRecibido.getSerie() + " Folio "
                                                        + cfdiRecibido.getFolio()
                                                        + ", se encuntra asignado a una Orden de Compra."));
                                descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid()
                                        + " cfdi id " + cfdiRecibido.getIdCfdiRecibido() + " uuid "
                                        + cfdiRecibido.getUuid()
                                        + ". Ya tiene asignada una orden de compra idOrdenCompra "
                                        + cfdiRecibido.getIdOrdenCompra();
                                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(),
                                        descBitacora, BitacoraTipo.INFO.name());
                                logger.info(descBitacora);
                            }
                        } else {
                            FacesContext.getCurrentInstance().addMessage(null,
                                    new FacesMessage(FacesMessage.SEVERITY_WARN,
                                            "No es posible Asignar Orden de Compra",
                                            "CFDI con Serie " + cfdiRecibido.getSerie() + " Folio "
                                                    + cfdiRecibido.getFolio() + ", su estado es "
                                                    + cfdiRecibido.getEstado()));
                            logger.info("[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid() + " cfdi id "
                                    + cfdiRecibido.getIdCfdiRecibido() + " uuid " + cfdiRecibido.getUuid()
                                    + ". no es posible asignar orden de compra se encuntra en estado "
                                    + cfdiRecibido.getEstado());
                        }
                    } else {
                        FacesContext.getCurrentInstance()
                                .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                        "Asignar Orden de Compra",
                                        "Ocurrio un error en el proceso de asignar una Orden de Compra al CFDI."));
                        descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid()
                                + " Error obteniendo cfdi con id " + auxCfdi.getIdCfdiRecibido();
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                } catch (Exception e) {
                    FacesContext.getCurrentInstance()
                            .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                    "Asignar Orden de Compra",
                                    "Ocurrio un error en el proceso de asignar una Orden de Compra al CFDI."));
                    descBitacora = "[CFDI_RECIBIDO - asignarOrdenCompra] " + usuario.getUserid() + " ERROR "
                            + e.getMessage();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            }
            RequestContext context = RequestContext.getCurrentInstance();
            context.addCallbackParam("asignarOrden", asignarOrden);
        }
    }

    private boolean procesarAddenda(InputStream xml, int idSocio) {
        boolean respuesta = false;
        ordenCompra = null;
        tieneAddenda = false;
        if (xml != null) {
            logger.debug("No es nulo");
        } else {
            logger.info("XML Es nulo");
        }
        logger.info("Procesando CFDI con id: " + cfdiRecibido.getIdCfdiRecibido());
        SAXBuilder buider = new SAXBuilder();
        try {
            Document document = buider.build(xml);
            //logger.info("Documento: " + document.toString());
            XMLOutputter xMLOutputter = new XMLOutputter(Format.getPrettyFormat());
            //Buscando mediante NS
            Namespace nsiqtb = Namespace.getNamespace("iqtb", "iqtb.com/ContabilidadE/1_1/iqtbAddenda");
            Namespace nscfdi = Namespace.getNamespace("cfdi", "http://www.sat.gob.mx/cfd/3");
            Element nodoAddenda = document.getRootElement().getChild("Addenda", nscfdi);
            if (nodoAddenda != null) {
                logger.info("nodoAddenda: " + xMLOutputter.outputString(nodoAddenda));
                Element infoComercial = nodoAddenda.getChild("InfoComercial", nsiqtb);
                if (infoComercial != null) {
                    tieneAddenda = true;
                    logger.info("InfoComercial: " + xMLOutputter.outputString(infoComercial));
                    logger.info("Validando conta XSD");
                    if (validarXmlvsXsd(xMLOutputter.outputString(infoComercial))) {
                        logger.info("Correcto");
                        logger.info("******Atributos*****");

                        String ordenDeCompra = infoComercial.getAttributeValue("ordenCompra");
                        logger.info("ordenCompra: " + ordenDeCompra);
                        ordenCompra = daoOrdenCompra.obtenerOrden(ordenDeCompra, empresa.getIdEmpresa(), idSocio);
                        logger.info("Obteniendo orden");
                        if (ordenCompra != null) {
                            descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid()
                                    + " Se encontro la orden de compra: " + ordenDeCompra + " con el id: "
                                    + ordenCompra.getIdOrdenCompra();
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.INFO.name());
                            logger.info(descBitacora);
                            respuesta = true;
                        } else {
                            descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid()
                                    + " No se encontro almacenada la orden de compra: " + ordenDeCompra
                                    + " idEmpresa " + empresa.getIdEmpresa() + " idSocioComercial " + idSocio;
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.WARNING.name());
                            logger.warn(descBitacora);
                        }
                    } else {
                        descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid()
                                + " Invalido contra el XSD";
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                } else {
                    descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid()
                            + " No se encontro el nodo Addenda/InfoComercial";
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } else {
                descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid()
                        + " No se encontro el nodo Addenda";
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.error(descBitacora);
            }
        } catch (IOException e) {
            descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid() + " IOException ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (JDOMException e) {
            descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid() + " JDOMException ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (Exception ex) {
            descBitacora = "[CFDI_RECIBIDO - procesarAddenda] " + usuario.getUserid() + " Exception ERROR "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        return respuesta;
    }

    private Boolean validarXmlvsXsd(String stringXml) {
        //    String YES = "yes";
        //    String NO = "no";
        //    String CHAR_ENCODING = "UTF8";
        String separadorArchivo = System.getProperty("file.separator");
        SAXParserFactory factory;
        boolean NAME_SPACE_AWARE = true;
        boolean VALIDATING = true;
        String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
        String SCHEMA_LANGUAGE_VAL = "http://www.w3.org/2001/XMLSchema";
        String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
        Boolean esCorrecto = false;
        try {
            Reader xmlReader;
            Reader xsdReader;
            xmlReader = new StringReader(stringXml); // FileReader(stringXml);
            xsdReader = new FileReader(new File("/work/iqtb/validacionfiles/recursos/xsd/addendaIqtb.xsd"));
            factory = SAXParserFactory.newInstance();
            // Configure SAXParserFactory to provide parsers that are namespace aware.
            factory.setNamespaceAware(NAME_SPACE_AWARE);
            // Configure SAXParserFactory to provide parsers that are validating. This property
            // must have the value true for any of the property strings defined below to take
            // effect.
            factory.setValidating(VALIDATING);
            SAXParser parser = factory.newSAXParser();
            // Setting the schema language for xml schema validation
            parser.setProperty(SCHEMA_LANGUAGE, SCHEMA_LANGUAGE_VAL);
            // Setting the schema source for xml schema validation
            parser.setProperty(SCHEMA_SOURCE, new InputSource(xsdReader));
            DefaultHandler handler = new CompararXML.XmlDefaultHandler();
            parser.parse(new InputSource(xmlReader), handler);
            esCorrecto = true;
            logger.info("Es correcto");
        } catch (FactoryConfigurationError e) {
            descBitacora = "[CFDI_RECIBIDO - validarXmlvsXsd] " + usuario.getUserid()
                    + " Error al crear la configuracion: " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (ParserConfigurationException e) {
            descBitacora = "[CFDI_RECIBIDO - validarXmlvsXsd] " + usuario.getUserid()
                    + " Error al convertir la configuracion: " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (FileNotFoundException ex) {
            descBitacora = "[CFDI_RECIBIDO - validarXmlvsXsd] " + usuario.getUserid()
                    + " Error, no se encontro el archivo /work/iqtb/validacionfiles/recursos/xsd/addendaIqtb.xsd, FileNotFoundException: "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (SAXException ex) {
            descBitacora = "[CFDI_RECIBIDO - validarXmlvsXsd] " + usuario.getUserid() + " Error, SAXException: "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (IOException ex) {
            descBitacora = "[CFDI_RECIBIDO - validarXmlvsXsd] " + usuario.getUserid() + " Error, IOException: "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (Exception ex) {
            descBitacora = "[CFDI_RECIBIDO - validarXmlvsXsd] " + usuario.getUserid() + " Error, Exception: "
                    + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        return esCorrecto;
    }

    private void obtenerOrdenesCompra(int idSocio) {
        logger.info(usuario.getUserid() + " Inicia obtenerOrdenesCompra idSocio " + idSocio);
        listaOrdenCompra = new ArrayList<OrdenesCompra>();
        try {
            itemsOrdenCompra = new ArrayList<SelectItem>();
            selectItem = null;
            listaOrdenCompra = daoOrdenCompra.listaOrdenByHql(
                    "select new OrdenesCompra (idOrdenCompra, numeroOc) from OrdenesCompra where idEmpresa = "
                            + empresa.getIdEmpresa() + " and idSocioComercial = " + idSocio);
            intIdSocio = idSocio;
            if (listaOrdenCompra.isEmpty()) {
                logger.info(
                        "[CFDI_RECIBIDO - obtenerOrdenesCompra] - No se han encontrado resultados para Ordenes de compra");
            } else {
                for (OrdenesCompra var : listaOrdenCompra) {
                    selectItem = new SelectItem(var.getIdOrdenCompra(), var.getNumeroOc());
                    itemsOrdenCompra.add(selectItem);
                }
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - obtenerOrdenesCompra] " + usuario.getUserid()
                    + " Error obteniendo lista de ordenes de compra. ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    public void crearOrdenCompra() {
        ordenCompra = new OrdenesCompra();
        crearOrden = true;
    }

    public void cancelarOrdenCompra() {
        crearOrden = false;
    }

    public void saveOrdenCompra() {
        logger.info(usuario.getUserid() + " Inicia saveOrdenCompra");
        try {
            if (ordenCompra.getNumeroOc() != null && !ordenCompra.getNumeroOc().trim().isEmpty()) {
                if (ordenCompra.getTotal() != null && ordenCompra.getTotal().compareTo(BigDecimal.ZERO) > 0) {
                    if (ordenCompra.getRfcVendedor() != null && !ordenCompra.getRfcVendedor().trim().isEmpty()) {
                        if (ordenCompra.getTipoMoneda() != null && !ordenCompra.getTipoMoneda().trim().isEmpty()) {
                            ordenCompra.setTipoMoneda(ordenCompra.getTipoMoneda().toUpperCase());
                        }
                        ordenCompra.setIdEmpresa(empresa.getIdEmpresa());
                        ordenCompra.setIdSocioComercial(intIdSocio);
                        if (daoOrdenCompra.insertOrdenCompra(ordenCompra)) {
                            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                                    FacesMessage.SEVERITY_INFO, "Orden de Compra",
                                    "Orden de Compra " + ordenCompra.getNumeroOc() + " se agrego correctamente."));
                            descBitacora = "[CFDI_RECIBIDO - saveOrdenCompra] " + usuario.getUserid()
                                    + " inserto la orden de compra " + ordenCompra.getNumeroOc() + " idEmpresa "
                                    + ordenCompra.getIdEmpresa() + " idSocioComercial "
                                    + ordenCompra.getIdSocioComercial();
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.INFO.name());
                            logger.info(descBitacora);
                            obtenerOrdenesCompra(ordenCompra.getIdSocioComercial());
                            crearOrden = false;
                        } else {
                            FacesContext.getCurrentInstance().addMessage(null,
                                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                                            "Ocurrio un error al guardar la Orden de Compra "
                                                    + ordenCompra.getNumeroOc() + "."));
                            descBitacora = "[CFDI_RECIBIDO - saveOrdenCompra] " + usuario.getUserid()
                                    + " error al insertar la orden de compra " + ordenCompra.getNumeroOc()
                                    + " idEmpresa " + ordenCompra.getIdEmpresa() + " idSocioComercial "
                                    + ordenCompra.getIdSocioComercial();
                            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                    BitacoraTipo.ERROR.name());
                            logger.error(descBitacora);
                        }
                    } else {
                        FacesContext.getCurrentInstance().addMessage(null,
                                new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error",
                                        "Por favor, ingrese un valor para RFC Vendedor."));
                        logger.info(usuario.getUserid() + " rfc vendedor es un campo obligatorio");
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Error", "Por favor, ingrese un valor para Total."));
                    logger.info(usuario.getUserid() + " total es un campo obligatorio");
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Error", "Por favor, ingrese un valor para Nmero."));
                logger.info(usuario.getUserid() + " numero es un campo obligatorio");
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - saveOrdenCompra] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        intIdSocio = 0;
    }

    private boolean validarPDFSocio(CfdisRecibidos cfdi) {
        logger.info(usuario.getUserid() + ". Inicia validarPDFSocio del cfdi id " + cfdi.getIdCfdiRecibido());
        boolean pdfValido = false;
        String strPdf;
        String[] arrayPdf;
        LeerPDF leerPdf = new LeerPDF();
        strPdf = leerPdf.pdftoText(cfdi.getPdf());
        arrayPdf = strPdf.split("\n");
        int a = 0;
        String uuid = null;
        for (String item : arrayPdf) {

            a = item.indexOf("||1.0|");

            if (a != -1) {
                uuid = item.substring(item.indexOf("||1.0|") + 6, item.indexOf("||1.0|") + 6 + 36);
                if (uuid != null) {
                    if (cfdi.getUuid().equals(uuid)) {
                        logger.info(usuario.getUserid() + ". PDF corresponde a este UUID " + cfdi.getUuid()
                                + " uuid encontrado " + uuid);
                        pdfValido = true;
                    } else {
                        logger.info(usuario.getUserid() + ". PDF NO corresponde a este UUID " + cfdi.getUuid()
                                + " uuid encontrado " + uuid);
                    }
                }
            } else {
                logger.error(usuario.getUserid() + ". PDF con nombre " + cfdi.getNombreArchivo()
                        + ".pdf No se encontro la cadena ||1.0|");
            }

        }
        if (pdfValido) {
            logger.info(
                    usuario.getUserid() + ". CFDI con id " + cfdi.getIdCfdiRecibido() + " PDF corresponde al uuid");
        } else {
            logger.info(usuario.getUserid() + ". CFDI con id " + cfdi.getIdCfdiRecibido()
                    + " PDF NO corresponde al uuid");
        }
        try {
            cfdi.setStatusPdf(pdfValido);
            if (daoCfdiRecibido.actualizarCfdi(cfdi)) {
                descBitacora = "[CFDI_RECIBIDO - validarPDFSocio] " + usuario.getUserid()
                        + " modifico correctamente CFDI con id " + cfdi.getIdCfdiRecibido() + " uuid "
                        + cfdi.getUuid() + " statusPDF " + pdfValido;
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.INFO.name());
                logger.info(descBitacora);
            } else {
                descBitacora = "[CFDI_RECIBIDO - validarPDFSocio] " + usuario.getUserid()
                        + " Error al modificar CFDI con id " + cfdi.getIdCfdiRecibido() + " uuid " + cfdi.getUuid()
                        + " statusPDF " + pdfValido;
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.error(descBitacora);
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - validarPDFSocio] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        return pdfValido;
    }

    private void servletDescarga(byte[] bytesFile, String strNombreArchivo) {
        try {
            logger.info(usuario.getUserid() + ". Inicia servletDescarga");
            FacesContext ctx = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
            response.setContentType("application/force-download");
            String disposition = "attachment; fileName=" + strNombreArchivo;
            response.setHeader("Content-Disposition", disposition);
            ServletOutputStream out = response.getOutputStream();
            InputStream ascii;

            ascii = new ByteArrayInputStream(bytesFile);

            byte[] buf = new byte[5 * 1000 * 1024];
            int bytesRead;
            while ((bytesRead = ascii.read(buf)) != -1) {
                out.write(buf, 0, bytesRead);
            }

            out.flush();
            out.close();
            ctx.responseComplete();
            descBitacora = "[CFDI_RECIBIDO - servletDescarga] " + usuario.getUserid() + " genero/descargo "
                    + strNombreArchivo;
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.INFO.name());
            logger.info(descBitacora);
            logger.info(usuario.getUserid() + ". Termina servletDescarga");
        } catch (IOException e) {
            descBitacora = "[CFDI_RECIBIDO - servletDescarga] " + usuario.getUserid() + " ERROR " + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

    private boolean buscarArchivo(String strDir, CfdisRecibidos cfdi) {
        logger.info(usuario.getUserid() + " Inicia buscarArchivo con nombre " + cfdi.getNombreArchivo());
        boolean respuesta = false;
        String strNombreArchivo = null;
        File dir = new File(strDir);
        File fPDF;
        if (dir.exists()) {
            strNombreArchivo = cfdi.getNombreArchivo() + ".pdf";
            fPDF = new File(strDir + strNombreArchivo);
            if (fPDF.exists()) {
                logger.info("Archivo coincide " + strDir + strNombreArchivo);
                respuesta = true;
            }
        } else {
            descBitacora = "[CFDI_RECIBIDO - buscarArchivo] " + usuario.getUserid() + " Directorio no existe "
                    + strDir;
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.WARNING.name());
            logger.warn(descBitacora);
        }
        if (respuesta) {
            FileInputStream fis = null;
            try {
                File f = new File(strDir + strNombreArchivo);
                logger.info(usuario.getUserid() + ". Archivo cargado " + f.getAbsolutePath());
                byte[] b = getBytesFromFile(f);

                cfdi.setPdf(b);
                if (daoCfdiRecibido.actualizarCfdi(cfdi)) {
                    manejorArchivos.eliminar(strDir + strNombreArchivo);
                    descBitacora = "[CFDI_RECIBIDO - buscarArchivo] " + usuario.getUserid()
                            + " modifico el cfdi con id " + cfdi.getIdCfdiRecibido() + " uuid " + cfdi.getUuid()
                            + " inserto pdf " + strNombreArchivo;
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.INFO.name());
                    logger.info(descBitacora);
                } else {
                    descBitacora = "[CFDI_RECIBIDO - buscarArchivo] " + usuario.getUserid()
                            + " Error al modificar el cfdi con id " + cfdi.getIdCfdiRecibido() + " uuid "
                            + cfdi.getUuid() + " pdf " + strNombreArchivo;
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                }
            } catch (FileNotFoundException ex) {
                descBitacora = "[CFDI_RECIBIDO - buscarArchivo] " + usuario.getUserid()
                        + " FileNotFoundException ERROR " + ex.getMessage();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.error(descBitacora);
            } catch (IOException ex) {
                descBitacora = "[CFDI_RECIBIDO - buscarArchivo] " + usuario.getUserid() + " IOException ERROR "
                        + ex.getMessage();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.info(descBitacora);
            } catch (Exception ex) {
                descBitacora = "[CFDI_RECIBIDO - buscarArchivo] " + usuario.getUserid() + " ERROR "
                        + ex.getMessage();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.info(descBitacora);
            }
        }
        return respuesta;
    }

    private boolean generarReporte(List<CfdisRecibidos> lista) {
        logger.info("[CFDI_RECIBIDO - generarReporte] " + usuario.getUserid() + " Inicia Generar Reporte Excel");
        boolean reporte = false;
        try {
            String ruta = "/work/iqtb/validacionfiles/reportes/" + empresa.getRfc() + "/" + usuario.getUserid()
                    + "/";
            DateFormat df = new SimpleDateFormat("ddMMyyyy");
            Date today = new Date();
            String reportDate = df.format(today);
            String strNombreReporte = "Reporte_" + reportDate + ".xls";
            File dir = new File(ruta);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            Workbook libro = new HSSFWorkbook();
            FileOutputStream archivo = new FileOutputStream(ruta + strNombreReporte);
            logger.info("[CFDI_RECIBIDO - generarReporte] " + usuario.getUserid() + " Archivo creado " + ruta
                    + strNombreReporte);
            Sheet hoja = libro.createSheet();
            int y = 1;
            for (CfdisRecibidos var : lista) {
                if (y == 1) {
                    logger.info("Inicia escritura de cabecera");
                    Row fila = hoja.createRow((int) 0);
                    Cell a = fila.createCell((int) 0);
                    a.setCellValue("Fecha Emisin");
                    Cell b = fila.createCell((int) 1);
                    b.setCellValue("Serie");
                    Cell c = fila.createCell((int) 2);
                    c.setCellValue("Folio");
                    Cell d = fila.createCell((int) 3);
                    d.setCellValue("Fecha Recepcin");
                    Cell e = fila.createCell((int) 4);
                    e.setCellValue("RFC Socio Comercial");
                    Cell f = fila.createCell((int) 5);
                    f.setCellValue("Socio Comercial");
                    Cell g = fila.createCell((int) 6);
                    g.setCellValue("UUID");
                    Cell h = fila.createCell((int) 7);
                    h.setCellValue("Total");
                    Cell i = fila.createCell((int) 8);
                    i.setCellValue("Estado");
                    Cell j = fila.createCell((int) 9);
                    j.setCellValue("Warning");
                    Cell k = fila.createCell((int) 10);
                    k.setCellValue("Error");
                    Cell l = fila.createCell((int) 11);
                    l.setCellValue("Nmero Orden de Compra");
                    Cell m = fila.createCell((int) 12);
                    m.setCellValue("Total Orden de Compra");
                    Cell n = fila.createCell((int) 13);
                    n.setCellValue("Tipo de Moneda");
                    Cell o = fila.createCell((int) 14);
                    o.setCellValue("Entrada Almacn");
                    Cell p = fila.createCell((int) 15);
                    p.setCellValue("Control de Calidad");
                    Cell q = fila.createCell((int) 16);
                    q.setCellValue("Autorizacin");

                    logger.info("Termina escritura de cabecera");
                }
                Row fila1 = hoja.createRow((int) y);
                Cell a = fila1.createCell((int) 0);
                a.setCellValue(var.getFecha().toString());
                Cell b = fila1.createCell((int) 1);
                b.setCellValue(var.getSerie());
                Cell c = fila1.createCell((int) 2);
                if (var.getFolio() == null) {
                    c.setCellValue("");
                } else {
                    c.setCellValue(var.getFolio());
                }
                Cell d = fila1.createCell((int) 3);
                d.setCellValue(var.getFechaRecepcion().toString());
                Cell e = fila1.createCell((int) 4);
                e.setCellValue(daoSociosComerciales.getRFCSociobyIdSocio(var.getIdSocioComercial()));
                Cell f = fila1.createCell((int) 5);
                f.setCellValue(daoSociosComerciales.getNombreSociobyIdSocio(var.getIdSocioComercial()));
                Cell g = fila1.createCell((int) 6);
                g.setCellValue(var.getUuid());
                Cell h = fila1.createCell((int) 7);
                h.setCellValue(var.getTotal().toString());
                Cell i = fila1.createCell((int) 8);
                i.setCellValue(var.getEstado());
                Cell j = fila1.createCell((int) 9);
                j.setCellValue(var.getTiposWarn());
                Cell k = fila1.createCell((int) 10);
                k.setCellValue(var.getError());
                Cell l = fila1.createCell((int) 11);
                if (var.getIdOrdenCompra() != null) {
                    l.setCellValue(daoOrdenCompra.numOrdenCompraById(var.getIdOrdenCompra()));
                } else {
                    l.setCellValue("");
                }
                Cell m = fila1.createCell((int) 12);
                if (var.getTotalOc() == null) {
                    m.setCellValue("");
                } else {
                    m.setCellValue(var.getTotalOc().toString());
                }
                Cell n = fila1.createCell((int) 13);
                n.setCellValue(var.getTipoMoneda());
                Cell o = fila1.createCell((int) 14);
                o.setCellValue(var.getEntradaAlmacen());
                Cell p = fila1.createCell((int) 15);
                p.setCellValue(var.getControlCalidad());
                Cell q = fila1.createCell((int) 16);
                q.setCellValue(var.getAutorizacion());
                if (y == 50000) {
                    y = 1;
                    hoja = libro.createSheet();
                    logger.info("se ha creado una nueva hoja");
                } else {
                    y++;
                }
            }
            logger.info(usuario.getUserid() + ". Termina escritura de las filas");
            byte[] bytes = new byte[1024];
            int read = 0;
            libro.write(archivo);
            logger.info(usuario.getUserid() + ". Termina de escribir Reporte de excel");
            archivo.close();
            logger.info(usuario.getUserid() + ". Reporte Generado en la ruta " + ruta + strNombreReporte);
            File ficheroXLS = new File(ruta + strNombreReporte);
            FileInputStream fis = new FileInputStream(ficheroXLS);
            FacesContext ctx = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
            response.setContentType("application/vnd.ms-excel");
            String disposition = "attachment; fileName=" + strNombreReporte;
            response.setHeader("Content-Disposition", disposition);
            ServletOutputStream out = response.getOutputStream();
            while ((read = fis.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
            ctx.responseComplete();
            reporte = true;
            descBitacora = "[CFDI_RECIBIDO - generarReporte] " + usuario.getUserid()
                    + " Genero/Descargo Reporte Excel.";
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.INFO.name());
            logger.info(descBitacora);
            manejorArchivos.eliminar(ruta);
        } catch (IOException e) {
            descBitacora = "[CFDI_RECIBIDO - generarReporte] " + usuario.getUserid() + " IOException ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        } catch (Exception ex) {
            descBitacora = "[CFDI_RECIBIDO - generarReporte] " + usuario.getUserid() + " ERROR " + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        return reporte;
    }

    private boolean notificarCancelacion(AuxCfdiRecibido cfdi) {
        logger.info(usuario.getUserid() + ". Inicia notificarCancelacion");
        boolean notificado = false;
        socioComercial = new SociosComerciales();
        try {

            configEmail = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.EMAIL_SMTP.name());
            configUser = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.USUARIO_SMTP.name());
            configPass = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.PASS_SMTP.name());
            configHost = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.HOST_SMTP.name());
            configPort = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.PUERTO_SMTP.name());
            configSSL = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                    ConfigEmpresa.SSL_SMTP.name());
            logger.info(usuario.getUserid() + ". Configuraciones SMTP cargadas");

            if (configEmail.getValor().trim().isEmpty() || configHost.getValor().trim().isEmpty()
                    || configPort.getValor().trim().isEmpty()) {
                descBitacora = "[CFDI_RECIBIDO - notificarCancelacion] " + usuario.getUserid()
                        + " No es posible enviar el correo electronico, no existe configuracion para el servidor SMTP.";
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.WARNING.name());
                logger.error(descBitacora);
            } else {
                logger.info(usuario.getUserid() + ". Obteniedo direcciones de correo.");
                emailRecepcion = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                        ConfigEmpresa.EMAIL_RECEPCION.name());
                listaNotificacion = daoConfigEmpresa.getConfiguracionEmpresa(empresa.getIdEmpresa(),
                        ConfigEmpresa.EMAILS_RECIBEN_NOTIFICACION.name());
                socioComercial = daoSociosComerciales.getSocioComercialByIdEmpresaRFC(empresa.getIdEmpresa(),
                        cfdi.getRfcSocioComercial());
                String destinatario = null;
                if (!emailRecepcion.getValor().trim().isEmpty()) {
                    destinatario = emailRecepcion.getValor();
                    logger.info(usuario.getUserid() + ". Email Recepcion " + emailRecepcion.getValor()
                            + " agregado a destinatario");
                }
                if (!listaNotificacion.getValor().trim().isEmpty()) {
                    destinatario = destinatario + "," + listaNotificacion.getValor();
                    logger.info(usuario.getUserid() + ". lista notificacion " + listaNotificacion.getValor()
                            + " agregado a destinatario");
                }
                if (socioComercial.getEmail() != null && !socioComercial.getEmail().trim().isEmpty()) {
                    destinatario = destinatario + "," + socioComercial.getEmail();
                    logger.info(usuario.getUserid() + ". Email Socio comercial " + socioComercial.getEmail()
                            + " agregado a destinatario");
                }
                if (destinatario == null) {
                    descBitacora = "[CFDI_RECIBIDO - notificarCancelacion] " + usuario.getUserid()
                            + " No existen destinatarios para notificar la cancelacion del documento con id "
                            + cfdi.getIdCfdiRecibido();
                    registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                            BitacoraTipo.ERROR.name());
                    logger.error(descBitacora);
                } else {
                    logger.info(usuario.getUserid() + ". Creando email para notificacion de cancelacion");
                    String asunto = "Notificacin de Cancelacin";
                    String contenido = "<p><strong>Notificacin de cancelacin del documento.</strong></p>\n"
                            + "<p>Serie: <strong>" + cfdi.getSerie() + "</strong></p>\n" + "<p>Folio: <strong>"
                            + cfdi.getFolio() + "</strong></p>\n" + "<p>UUID: <strong>" + cfdi.getUuid()
                            + "</strong></p>\n" + "<p>Fecha de Emisin: <strong>" + cfdi.getFecha()
                            + "</strong></p>\n" + "<p>Monto total: <strong>" + cfdi.getTotal() + "</strong></p>\n"
                            + "<p>Estado: <strong>" + cfdi.getEstado() + "</strong></p>\n"
                            + "<p>Socio Comercial: <strong>" + cfdi.getRfcSocioComercial() + "</strong></p>\n"
                            + "<p>Empresa: <strong>" + empresa.getRfc() + "</strong></p>\n" + "<p>ERROR: <strong>"
                            + cfdi.getError() + "</strong></p>";
                    boolean ssl = Boolean.valueOf(configSSL.getValor());
                    String pw = "";
                    if (!configPass.getValor().trim().isEmpty()) {
                        pw = decrypt(configPass.getValor());
                    }
                    ConexionSMTP conSMTP = new ConexionSMTP(configHost.getValor(), configPort.getValor(), ssl,
                            true);

                    conSMTP.setUsername(configEmail.getValor());
                    conSMTP.setPassword(pw);
                    conSMTP.getSession();
                    conSMTP.connect();
                    conSMTP.createMessage(destinatario, asunto, contenido, true);
                    String conn;
                    conn = conSMTP.sendMessage();
                    if (conn.trim().charAt(0) == '2') {
                        cfdiNotificado(cfdi.getIdCfdiRecibido());
                        notificado = true;
                        descBitacora = "[CFDI_RECIBIDO - notificarCancelacion] " + usuario.getUserid()
                                + " Notificacion de cancelacion del cfdi con id " + cfdi.getIdCfdiRecibido()
                                + " uuid " + cfdi.getUuid() + " enviada a " + destinatario;
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.INFO.name());
                        logger.info(descBitacora);
                    } else {
                        descBitacora = "[CFDI_RECIBIDO - notificarCancelacion] " + usuario.getUserid()
                                + " ERROR enviado Notificacion de cancelacion del cfdi con id "
                                + cfdi.getIdCfdiRecibido() + " uuid " + cfdi.getUuid() + " destinatario "
                                + destinatario;
                        registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                                BitacoraTipo.ERROR.name());
                        logger.error(descBitacora);
                    }
                }
            }
        } catch (Exception e) {
            descBitacora = "[CFDI_RECIBIDO - notificarCancelacion] " + usuario.getUserid() + " ERROR "
                    + e.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
        configEmail = null;
        configUser = null;
        configPass = null;
        configHost = null;
        configPort = null;
        configSSL = null;
        return notificado;
    }

    private void cfdiNotificado(Integer idCfdi) {
        cfdiRecibido = null;
        try {
            cfdiRecibido = daoCfdiRecibido.getCfdiByID(idCfdi);
            cfdiRecibido.setNombreArchivo(NotificacionCfdiR.NOTIFICADO.name());
            if (daoCfdiRecibido.actualizarCfdi(cfdiRecibido)) {
                descBitacora = "[CFDI_RECIBIDO - cfdiNotificado] " + usuario.getUserid() + " CFDI con uuid: "
                        + cfdiRecibido.getUuid() + " serie " + cfdiRecibido.getSerie() + " folio "
                        + cfdiRecibido.getFolio() + " estado de notificacion: "
                        + cfdiRecibido.getEstadoNotificacion();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.INFO.name());
                logger.info(descBitacora);
            } else {
                descBitacora = "[CFDI_RECIBIDO - cfdiNotificado] " + usuario.getUserid()
                        + " Error al actualizar CFDI con id: " + cfdiRecibido.getIdCfdiRecibido();
                registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                        BitacoraTipo.ERROR.name());
                logger.error(descBitacora);
            }
        } catch (Exception ex) {
            descBitacora = "[CFDI_RECIBIDO - cfdiNotificado] " + usuario.getUserid() + " ERROR " + ex.getMessage();
            registrarBitacora(usuario.getIdUsuario(), null, empresa.getIdEmpresa(), descBitacora,
                    BitacoraTipo.ERROR.name());
            logger.error(descBitacora);
        }
    }

}