package com.fp.frontend.controller.armas.parametros;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.Filter;
import com.fp.dto.query.SubQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.armas.funcionalidad.ArmaExcell;
import com.fp.frontend.controller.armas.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.funcionalidad.TotalArmasController;
import com.fp.frontend.controller.armas.solicitud.ArmasController;
import com.fp.frontend.controller.armas.solicitud.DocumentoHabilitanteController;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pgeneral.gene.CantonController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.CityController;
import com.fp.frontend.controller.pgeneral.gene.CountryController;
import com.fp.frontend.controller.pgeneral.gene.ProvinceController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.frontend.utility.Utilidades;
import com.fp.persistence.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.fun.TarmTotalPersona;
import com.fp.persistence.parmas.param.TarmComercianteCupo;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.param.TarmUnidadTipo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCanton;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneCity;
import com.fp.persistence.pgeneral.gene.TgeneCountry;
import com.fp.persistence.pgeneral.gene.TgeneProvince;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 * @author Andres Cevallos Clase Controladora para la entidad TarmArma Incluye
 * metodo de consulta para la busqueda de persona y registro
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ArmaController extends AbstractController<TarmArmas> {

    //Variabgles globales
    private Integer personcode;

    private Boolean descargar;
    private String csolicitud;
    InputStream filei;

    //Datos generales
    private TgeneCatalogDetail tipoDocumento;
    private TcustPersonDetail detallesPersona;

    Date fechaActual;
    private List<TgeneCatalogDetail> tiposRegistro;
    private TgeneCatalogDetail tipoRegistro;

    //Detalle del material
    //Pais
    private List<TgeneCountry> lpaises;
    private TgeneCountry pais;
    //private String pais;

    //Provincia
    private List<TgeneProvince> lprovincias;
    private String codigoProvincia;

    //Canton
    private List<TgeneCanton> lcantones;
    private String codigoCanton;

    //Ciudad
    private List<TgeneCity> lciudades;
    private TgeneCity ciudad;

    //Registro armas
    TarmRegistroArmas registro = new TarmRegistroArmas();

    //Variables de las armas	
    private TcustPersonDetail usuario;
    private TcustPersonAddress direccion;
    private List<Row> listaFilas;
    private List<String> listaErrores;
//		private List<TarmComercianteCupo> cuposArmas;

    //private BigDecimal pesoTotal;
    private TarmTipoArmaExplosivo tipoArmaExplosivo;
    private List<ArmaExcell> listaArmas;
    private ArmaExcell armaexcell;

    private List<ArmaExcell> laexel;
    private List<TarmArmas> armas = new ArrayList<TarmArmas>();
    private List<TarmTotalPersona> totalesPersoan = new ArrayList<TarmTotalPersona>();

    //Aeropuertos
    List<TgeneCatalogDetail> laeropuertos = new ArrayList<>();

    @ManagedProperty(value = "#{personAddressController}")
    private PersonAddressController personAddressController;

//	    @ManagedProperty(value = "#{comercianteCupoController}")
//	    private ComercianteCupoController comercianteCupoController;
    @ManagedProperty(value = "#{registroArmController}")
    private RegistroArmController registroArmasController;

    @ManagedProperty(value = "#{totalArmasController}")
    private TotalArmasController totalPersonaController;

    private List<TarmDocumentoHabilitante> ldocumentospersona;

    private String clase;

    public ArmaController() throws Exception {
        super(TarmArmas.class);
    }

    /**
     * Metodo invocado despues de instanciar el controlador
     */
    @PostConstruct
    private void postconstruct() {
        this.init();
        // Inicializa autoconsulta
        super.startQuery();
    }

    /**
     * Incializa variables del controlador, cuando se esta utilizando una pagina
     * que utliza el controlador.
     */
    private void init() {
        try {
            this.recperpage = 15; // Cambiar al # reg a mirar.
            this.lrecord = new ArrayList<>();
            this.record = new TarmArmas();
            this.beanalias = "ARMAS";
            this.create();

            //Globales
            descargar = false;
            csolicitud = null;

            //Datos generales
            //Obteniendo los datos del usuario logueado
            TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            usuario = PersonDetailController.find(tsafeUserDetail.getPk().getPersoncode().toString());

            //Obteniendo los datos de la persona
            detallesPersona = PersonDetailController.find(String.valueOf(usuario.getPk().getPersoncode()));

            //Tipo de documento
            tipoDocumento = CatalogDetailController.findxCodigoCodcatalogo(detallesPersona.getIdentificationcatalog(), detallesPersona.getIdentificationcatalogcode());

            //Fecha actual
            this.fechaActual = Calendar.getInstance().getTime();

            //Tipos de registro
            tiposRegistro = CatalogDetailController.find("TIPOREGISTRO", "REG");

            //Detalle del material  
            lpaises = CountryController.find();
            registro.setFechasolicitud(new java.sql.Date((new Date()).getTime()));

            //Obteniendo la direccion de la persona
            String tipoDireccion = "";

            if (detallesPersona != null) {
                switch (detallesPersona.getIdentificationcatalog()) {
                    case "CED":
                        tipoDireccion = "1";
                        break;
                    case "RUC":
                        tipoDireccion = "2";
                        break;
                    default:
                        tipoDireccion = "";
                        break;
                }
            }
            //direccion= personAddressController.findByPersonCode(usuario.getPk().getPersoncode().toString());
            direccion = personAddressController.findPrincipal(String.valueOf(usuario.getPk().getPersoncode().toString()));

            //Imprtacion
            this.lprovincias = ProvinceController.find("EC");

            //Armas
            listaErrores = new ArrayList<String>();

            //Controlador de totales
//	            this.totalPersonaController=new TotalPersonaController();
//	            this.totalPersonaController.create();
//	            this.totalPersonaController.setLrecord(new ArrayList<TarmTotalPersona>());
            RegistroArmController registroArmas = new RegistroArmController();
            registroArmas.init();
            registroArmas.setRecperpage(3000000);
            registroArmas.addFilter("personcode", tsafeUserDetail.getPk().getPersoncode().toString());
            registroArmas.query();
            this.addFilter("estado", "REG");
            filtro(registroArmas.getLrecord());

            //Obteniendo los aeropuertos
            this.laeropuertos = CatalogDetailController.find("AEROPUERTOS");

        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /* (non-Javadoc)
		 * @see com.fp.frontend.controller.AbstractController#querydatabase()
     */
    @SuppressWarnings("unchecked")
    @Override
    public void querydatabase() {
        try {

            DtoQuery dto = super.getDtoQuery(true);
            SubQuery subqueryMarca = new SubQuery("TgeneCatalogDetail", "description", "marca", "i.pk.catalog=t.marca and i.pk.catalogcode=t.marcacodigo");
            dto.addSubQuery(subqueryMarca);
            SubQuery subqueryColor = new SubQuery("TgeneCatalogDetail", "description", "color", "i.pk.catalog=t.color and i.pk.catalogcode=t.colorcodigo");
            dto.addSubQuery(subqueryColor);
            SubQuery subqueryEstado = new SubQuery("TgeneCatalogDetail", "description", "estado", "i.pk.catalog=t.estado and i.pk.catalogcode=t.estadocodigo");
            dto.addSubQuery(subqueryEstado);
            SubQuery subqueryClase = new SubQuery("TarmTipoArmaExplosivo", "clase", "cclase", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryClase);
            SubQuery subqueryClaseCodigo = new SubQuery("TarmTipoArmaExplosivo", "clasecodigo", "cclasecodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryClaseCodigo);
            SubQuery subqueryLongitud = new SubQuery("TarmTipoArmaExplosivo", "longitud", "clongitud", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryLongitud);
            SubQuery subqueryLongitudCodigo = new SubQuery("TarmTipoArmaExplosivo", "longitudcodigo", "clongitudcodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryLongitudCodigo);
            SubQuery subqueryCalibre = new SubQuery("TarmTipoArmaExplosivo", "calibre", "ccalibre", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryCalibre);
            SubQuery subqueryCalibreCodigo = new SubQuery("TarmTipoArmaExplosivo", "calibrecodigo", "ccalibrecodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryCalibreCodigo);
            SubQuery subqueryTipoArma = new SubQuery("TarmTipoArmaExplosivo", "tipoarmaexplosivo", "ctipoarmaexplosivo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryTipoArma);
            SubQuery subqueryTipoArmaCodigo = new SubQuery("TarmTipoArmaExplosivo", "tipoarmaexplosivocodigo", "ctipoarmaexplosivocodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryTipoArmaCodigo);
            SubQuery subqueryUnidad = new SubQuery("TarmTipoArmaExplosivo", "unidadmedidapeso", "cunidadmedidapeso", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryUnidad);
            SubQuery subqueryUnidadCodigo = new SubQuery("TarmTipoArmaExplosivo", "unidadmedidapesocodigo", "cunidadmedidapesocodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryUnidadCodigo);

            Filter filtrofecha = new Filter();
            filtrofecha.setSql("t.fecharegistro=(select max(ta.fecharegistro) from TarmArmas ta where t.codigoarma=ta.codigoarma and t.cregistro=ta.cregistro) and t.estado !='DEST' and t.estado !='CDP'");
            dto.addFiltro(filtrofecha);
            dto.setOrderby("pk");
            String sql = csolicitud;
            if (csolicitud != null) {
                Filter filtro = new Filter();
                filtro.setSql(sql);
                dto.addFiltro(filtro);
            }
            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.beanalias, dto); // permite adicionar mas de una tabla.

            Request request = this.callerhelper.getRequest();
            request.setQueryTables(mtables);
            request.put("queryalias", "ARMASCOMPLETE");

            Response resp = this.callerhelper.executeQuery(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                this.lrecord = new ArrayList<TarmArmas>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmArmas>) resp.get(this.beanalias);
                if (!lrecord.isEmpty()) {
                    record = lrecord.get(0);
                }
                super.postQuery(this.lrecord);
            }

        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /* (non-Javadoc)
		 * @see com.fp.frontend.controller.AbstractController#querydatabase()
     */
    @SuppressWarnings("unchecked")
    public void querydatabaseMarcaSerie(String cregistro, String marca, String serie) {
        try {

            DtoQuery dto = super.getDtoQuery(true);
            SubQuery subqueryMarca = new SubQuery("TgeneCatalogDetail", "description", "marca", "i.pk.catalog=t.marca and i.pk.catalogcode=t.marcacodigo");
            dto.addSubQuery(subqueryMarca);
            SubQuery subqueryColor = new SubQuery("TgeneCatalogDetail", "description", "color", "i.pk.catalog=t.color and i.pk.catalogcode=t.colorcodigo");
            dto.addSubQuery(subqueryColor);
            SubQuery subqueryEstado = new SubQuery("TgeneCatalogDetail", "description", "estado", "i.pk.catalog=t.estado and i.pk.catalogcode=t.estadocodigo");
            dto.addSubQuery(subqueryEstado);
            SubQuery subqueryClase = new SubQuery("TarmTipoArmaExplosivo", "clase", "cclase", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryClase);
            SubQuery subqueryClaseCodigo = new SubQuery("TarmTipoArmaExplosivo", "clasecodigo", "cclasecodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryClaseCodigo);
            SubQuery subqueryLongitud = new SubQuery("TarmTipoArmaExplosivo", "longitud", "clongitud", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryLongitud);
            SubQuery subqueryLongitudCodigo = new SubQuery("TarmTipoArmaExplosivo", "longitudcodigo", "clongitudcodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryLongitudCodigo);
            SubQuery subqueryCalibre = new SubQuery("TarmTipoArmaExplosivo", "calibre", "ccalibre", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryCalibre);
            SubQuery subqueryCalibreCodigo = new SubQuery("TarmTipoArmaExplosivo", "calibrecodigo", "ccalibrecodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryCalibreCodigo);
            SubQuery subqueryTipoArma = new SubQuery("TarmTipoArmaExplosivo", "tipoarmaexplosivo", "ctipoarmaexplosivo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryTipoArma);
            SubQuery subqueryTipoArmaCodigo = new SubQuery("TarmTipoArmaExplosivo", "tipoarmaexplosivocodigo", "ctipoarmaexplosivocodigo", "i.pk=t.ctipoarmaexplosivo");//  and i.clase='" + clase + "' and i.tipoarmaexplosivo='" + tipoArmaExplosivo + "'");
            dto.addSubQuery(subqueryTipoArmaCodigo);
            SubQuery subqueryUnidad = new SubQuery("TarmTipoArmaExplosivo", "unidadmedidapeso", "cunidadmedidapeso", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryUnidad);
            SubQuery subqueryUnidadCodigo = new SubQuery("TarmTipoArmaExplosivo", "unidadmedidapesocodigo", "cunidadmedidapesocodigo", "i.pk=t.ctipoarmaexplosivo");
            dto.addSubQuery(subqueryUnidadCodigo);

            Filter filtrofecha = new Filter();
            filtrofecha.setSql("t.fecharegistro=(select max(ta.fecharegistro) from TarmArmas ta where t.codigoarma=ta.codigoarma and t.cregistro=ta.cregistro) "
                    + " and t.estado !='DEST' and t.estado !='CDP' and t.lote " + (serie == null ? " is null" : ("= '" + serie + "'")) + " and t.cregistro= '"
                    + cregistro + "' and t.marca " + (marca == null ? " is null" : ("= '" + marca + "'")));
            dto.addFiltro(filtrofecha);
            dto.setOrderby("pk");
            /*            String sql=csolicitud;
	            if(csolicitud!=null){
	            	Filter filtro = new Filter();
	            	filtro.setSql(sql);
	            	dto.addFiltro(filtro);
	            }*/
            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.beanalias, dto); // permite adicionar mas de una tabla.

            /*    		Request request = this.callerhelper.getRequest();
	    		request.setQueryTables(mtables);
	    		request.put("queryalias", "ARMASCOMPLETE");*/
            Request request = callerhelper.getRequest();
            request.setQueryTables(mtables);

            Response resp = this.callerhelper.executeQuery(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                this.lrecord = new ArrayList<TarmArmas>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmArmas>) resp.get(this.beanalias);
                if (!lrecord.isEmpty()) {
                    record = lrecord.get(0);
                }
                super.postQuery(this.lrecord);
            }

        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecOked")
    protected void querydatabaseSimple() {
        try {
            DtoQuery dto = super.getDtoQuery(true);

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(beanalias, dto); // permite adicionar mas de una tabla.

            //se discrima las armas que sean distintas de destruidas y cambio de propietario
            Filter filtro = new Filter();
            String sql = " t.estado !='DEST' and t.estado !='CDP'";
            filtro.setSql(sql);
            dto.addFiltro(filtro);

            Request request = callerhelper.getRequest();
            request.setQueryTables(mtables);

            Response resp = callerhelper.executeQuery(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                lrecord = new ArrayList<TarmArmas>();
                MessageHelper.setMessageError(resp);
            } else {
                lrecord = (List<TarmArmas>) resp.get(beanalias);
                if (!lrecord.isEmpty()) {
                    record = lrecord.get(0);
                }
                super.postQuery(lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo para armar el registro
     *
     * @param lsolicitud
     */
    public void filtro(List<TarmRegistroArmas> lsolicitud) {

        for (TarmRegistroArmas soli : lsolicitud) {
            if (csolicitud == null) {
                csolicitud = "(cregistro=" + soli.getPk();
            } else {
                csolicitud += " or cregistro=" + soli.getPk();
            }
        }
        csolicitud += ")";

    }

    /* (non-Javadoc)
		 * @see com.fp.frontend.controller.AbstractController#save()
     */
    @Override
    public void save() {
        try {
            Request request = this.callerhelper.getRequest();

            DtoSave dtosave = super.getDtoSave(true);
            dtosave.setPosition(2);
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            msave.put(this.beanalias, dtosave);

            registroArmasController.clearAll();
            DtoSave dtosaveregistroarma = registroArmasController.getDtoSave(true);
            dtosaveregistroarma.setPosition(1);
            msave.put(registroArmasController.getBeanalias(), dtosaveregistroarma);

            totalPersonaController.clearAll();
            DtoSave dtosavetotalper = totalPersonaController.getDtoSave(true);
            dtosavetotalper.setPosition(3);
            msave.put(totalPersonaController.getBeanalias(), dtosavetotalper);

            request.setSaveTables(msave);
            request.getModifiedData().put("LISTAARMAS", this.armas);
            request.getModifiedData().put("LISTATOTALES", this.totalesPersoan);
            request.getModifiedData().put("REGISTRO", this.registro);

            Response resp = this.callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                //this.totalPersonaController.postCommit(resp);
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void postCommit(Response response) throws Exception {
        super.postCommitGeneric(response, beanalias);
    }

    /**
     * Metodo que carga y valida el contenido de un archivo excel con
     * informaci&oacute;n de armas
     *
     * @param event
     */
    public void cargarArchivo(FileUploadEvent event) {
        HashMap<String, TarmTotalPersona> mapaTotalesTemporales = new HashMap<>();
        int f1 = 0;
        try {
            //Completando los datos del registro
            this.registro.setPersoncode(this.usuario.getPk().getPersoncode());
            this.registro.setTiporegistrocodigo("TIPOREGISTRO");
            this.registro.setFechasolicitud(new java.sql.Date(Calendar.getInstance().getTimeInMillis()));
            //Inicializando las listas
            listaFilas = new ArrayList<Row>();
            listaArmas = new ArrayList<ArmaExcell>();
            listaErrores = new ArrayList<String>();
            //caraga el excel
            UploadedFile selectedFile = event.getFile();
            InputStream archivo = selectedFile.getInputstream();
            XSSFWorkbook libro = new XSSFWorkbook(archivo);
            XSSFSheet hoja = libro.getSheetAt(0);
            //Iterando sobre las filas
            int cont = 0;
            Iterator<Row> rowIterator = hoja.iterator();
            //Cargando el contenido de las celdas a una lista de objetos
            while (rowIterator.hasNext()) {
                cont++;
                Row row = rowIterator.next();
                if (cont > 1) {
                    Cell numero = row.getCell(0);
                    Cell serie = row.getCell(1);
                    Cell clase = row.getCell(2);
                    Cell longitud = row.getCell(3);
                    Cell tipo = row.getCell(4);
                    Cell calibre = row.getCell(5);
                    Cell color = row.getCell(6);
                    Cell marca = row.getCell(7);
                    Cell cantidad = row.getCell(8);
                    Cell umcantidad = row.getCell(9);
                    Cell peso = row.getCell(10);
                    Cell umpeso = row.getCell(11);
                    Boolean filaEnBlanco = false;
                    if (this.celdaVacia(numero) && this.celdaVacia(serie) && this.celdaVacia(clase)
                            && this.celdaVacia(longitud) && this.celdaVacia(tipo) && this.celdaVacia(calibre)
                            && this.celdaVacia(color) && this.celdaVacia(marca) && this.celdaVacia(cantidad)
                            && this.celdaVacia(umcantidad) && this.celdaVacia(peso) && this.celdaVacia(umpeso)) {
                        filaEnBlanco = true;
                    } else {
                        listaFilas.add(row);
                    }
                    if (!filaEnBlanco) {
                        //arma la lista de las armas en un dto aniade en la lista listaArmas
                        armarlistaArmasExcel(numero, serie, clase, longitud, tipo, calibre, color, marca, cantidad, umcantidad, peso, umpeso, row);
                    }
                }
            }
            //Verificando las filas duplicadas en el archivo
            verificarFilasDuplicadas(listaArmas);
            if (this.registro.getTiporegistro().equals("PRO")) {
                //Verificando las filas duplicadas en la BD
                verificarArmasExistentesEnBaseDeDatos(listaArmas, this.usuario.getPk().getPersoncode());
            }
            Boolean contieneSerie = false;
            //RECORRE LA LISTA DE LAS ARMAS y valida el CUPO DEL ARMA
            //Validando los campos requeridos que estan vacios
            recorreListaArmasExcel(contieneSerie, f1, mapaTotalesTemporales);
            //Seteando los atributos de las armas y totales si no hay ningun error
            if (listaErrores.isEmpty()) {
                for (int i = 0; i < listaArmas.size(); i++) {
                    if (!listaArmas.get(i).getCamposIncompletos() && !listaArmas.get(i).getDuplicada() && listaArmas.get(i).getExisteCatalogo()
                            && listaArmas.get(i).getExisteTARMTIPOARMAEXPLOSIVO()) { //&& !listaArmas.get(i).getCupoInsuficiente()
                        //Marca						
                        if (listaArmas.get(i).getCatalogoMarca() != null) {
                            listaArmas.get(i).getArma().setMarcacodigo("MARCA");
                            listaArmas.get(i).getArma().setMarca(listaArmas.get(i).getCatalogoMarca().getPk().getCatalog());
                        }
                        //Color
                        if (listaArmas.get(i).getCatalogoColor() != null) {
                            listaArmas.get(i).getArma().setColorcodigo("COLOR");
                            listaArmas.get(i).getArma().setColor(listaArmas.get(i).getCatalogoColor().getPk().getCatalog());
                        }
                        //Unidad medida cantidad
                        if (listaArmas.get(i).getTipoArmaExplosivo() != null) {
                            listaArmas.get(i).getArma().setUnidadmedidacantidadcodigo("UNIDADMEDIDA");
                            Double doubleNum = 0.0;
                            //Cargando el catalodo del tipo de unidad de medida
                            if (listaArmas.get(i).getUnidadMedidaCantidad() != null && !listaArmas.get(i).getUnidadMedidaCantidad().isEmpty()) {
                                listaArmas.get(i).getArma().setUnidadmedidacantidad(listaArmas.get(i).getUnidadMedidaCantidad());
                                doubleNum = Double.parseDouble(listaArmas.get(i).getTextoCantidad());
                                //Cantidad
                                Integer intNum = (int) doubleNum.doubleValue();
                                listaArmas.get(i).getArma().setCantidad(intNum);
                            } else if (listaArmas.get(i).getUnidadMedidaPeso() != null && !listaArmas.get(i).getUnidadMedidaPeso().isEmpty()) {
                                listaArmas.get(i).getArma().setUnidadmedidacantidad(listaArmas.get(i).getUnidadMedidaPeso());
                                doubleNum = Double.parseDouble(listaArmas.get(i).getTextoPeso());
                                //Peso
                                listaArmas.get(i).getArma().setPeso(new BigDecimal(doubleNum));
                            }
                        }
                        //Estado
                        //1-Serie
                        //Validando que si el tipo de registro es de importacion
                        //las armas no contengan numero de serie
                        if (this.registro.getTiporegistro().equalsIgnoreCase("IMP")) {
                            listaArmas.get(i).getArma().setEstado("IMPO");
                        } else {
                            listaArmas.get(i).getArma().setEstado("PRO");
                        }
                        listaArmas.get(i).getArma().setEstadocodigo("ESTADOARMA");
                        if (direccion != null) {
                            //Codigo de pais
                            listaArmas.get(i).getArma().setCountrycode(direccion.getCountrycode());
                            //Codigo de provincia
                            listaArmas.get(i).getArma().setProvincecode(direccion.getProvincecode());
                            //Codigo de canton
                            listaArmas.get(i).getArma().setCantoncode(direccion.getCantoncode());
                            //Codigo de parroquia
                            listaArmas.get(i).getArma().setParroquiacode(direccion.getParroquiacode());
                            //Codigo de ciudad
                            listaArmas.get(i).getArma().setCitycode(direccion.getCitycode());
                        }
                        //Lote
                        listaArmas.get(i).getArma().setLote(listaArmas.get(i).getSerie());
                        //Peso
                        if (listaArmas.get(i).getTextoPeso() != null && !listaArmas.get(i).getTextoPeso().isEmpty()) {
                            listaArmas.get(i).getArma().setPeso(BigDecimal.valueOf(Double.parseDouble(listaArmas.get(i).getTextoPeso())));
                        }
                        //Direccion
                        listaArmas.get(i).getArma().setDireccion(direccion.getAddress());

                        //Fecha de registro
                        listaArmas.get(i).getArma().setFecharegistro(new java.sql.Date(Calendar.getInstance().getTimeInMillis()));

                        //Tipo de arma explosivo
                        if (listaArmas.get(i).getTipoArmaExplosivo() != null) {
                            listaArmas.get(i).getArma().setCtipoarmaexplosivo(listaArmas.get(i).getTipoArmaExplosivo().getPk());
                        }
                        armas.add(listaArmas.get(i).getArma());
                    }
                }
                //Se rrecorre el mapa HashMap<String, TarmTotalPersona>  mapaTotalesTemporales
                for (TarmTotalPersona value : mapaTotalesTemporales.values()) {
                    totalesPersoan.add(value);
                }
                save();
            }
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        } finally {
            if (!listaErrores.isEmpty()) {
                listaArmas.clear();
                MessageHelper.setMessageError("ERRORES ENCONTRADOS DENTRO DEL ARCHIVO EXCEL: ");// + errores.toString());
                descargar = true;
            } else {
//					MessageHelper.setMessageInfo("ARCHIVO CARGADO EXITOSAMENTE");
                descargar = false;
            }
        }
    }

    /**
     * Metodo para cargar los valores del EXCEL EN UNA CLASE DTO(ArmaExcell	)
     *
     * @param numero * @param serie * @param clase	* @param longitud	* @param
     * tipo	* @param calibre
     * @param color	* @param marca	* @param cantidad	* @param umcantidad *
     * @param peso * @param umpeso	* @param row
     */
    public void armarlistaArmasExcel(Cell numero, Cell serie, Cell clase, Cell longitud, Cell tipo, Cell calibre, Cell color, Cell marca,
            Cell cantidad, Cell umcantidad, Cell peso, Cell umpeso, Row row) {
        ArmaExcell arma = new ArmaExcell();
        arma.setTextoNumero(Utilidades.setearValorCelda(numero));//Numero
        arma.setSerie(Utilidades.setearValorCelda(serie));//Serie
        arma.setClase(Utilidades.setearValorCelda(clase));//Clase
        arma.setLongitud(Utilidades.setearValorCelda(longitud));//Longitud
        arma.setTipo(Utilidades.setearValorCelda(tipo));//Tipo
        arma.setCalibre(Utilidades.setearValorCelda(calibre));//Calibre	
        arma.setColor(Utilidades.setearValorCelda(color));//Color
        arma.setMarca(Utilidades.setearValorCelda(marca));//Marca
        arma.setTextoCantidad(Utilidades.setearValorCelda(cantidad));//Cantidad
        arma.setUnidadMedidaCantidad(Utilidades.setearValorCelda(umcantidad));//U. Medida Cantidad							
        arma.setTextoPeso(Utilidades.setearValorCelda(peso));//Peso
        arma.setUnidadMedidaPeso(Utilidades.setearValorCelda(umpeso));//U. Medida Peso
        if (this.registro.getTiporegistro().equals("PRO")) {
            if (arma.getSerie() != null) {
                if (arma.getClase().equalsIgnoreCase("arma de fuego") && !arma.getTextoCantidad().equals("1.0")) {
                    listaErrores.add("Fila " + row.getRowNum() + ": " + "Columna 8: " + MsgControlArmas.getProperty("msg_limitecantidadarma"));
                    return;
                }
                listaArmas.add(arma);
            } else {
                listaErrores.add("Fila " + row.getRowNum() + ": " + "Columna 1: " + MsgControlArmas.getProperty("msg_serieVacia"));
                return;
            }
        } else if (arma.getClase().equalsIgnoreCase("arma de fuego") && arma.getTextoCantidad().equals("1.0")) {
            listaArmas.add(arma);
        } else if (!arma.getClase().equalsIgnoreCase("arma de fuego")) {
            listaArmas.add(arma);
        } else {
            listaErrores.add("Fila " + row.getRowNum() + ": " + "Columna 8: " + MsgControlArmas.getProperty("msg_limitecantidadarma"));
            return;
        }
    }

    /**
     * Metodo que verifica si existen filas duplicadas en el archivo de excell
     *
     * @param listaArmas
     */
    private void verificarFilasDuplicadas(List<ArmaExcell> listaArmas) {
        for (int i = 0; i < listaArmas.size() - 1; i++) {
            for (int j = i + 1; j < listaArmas.size(); j++) {
                if (!this.registro.getTiporegistro().equalsIgnoreCase("IMP") && ((listaArmas.get(i).getSerie().equalsIgnoreCase(listaArmas.get(j).getSerie()))
                        && listaArmas.get(i).getClase().equalsIgnoreCase(listaArmas.get(j).getClase())
                        && listaArmas.get(i).getTipo().equalsIgnoreCase(listaArmas.get(j).getTipo())
                        && (!listaArmas.get(i).getClase().toLowerCase().equalsIgnoreCase("arma de fuego")
                        || (listaArmas.get(i).getClase().toLowerCase().equalsIgnoreCase("arma de fuego") && listaArmas.get(j).getClase().toLowerCase().equalsIgnoreCase("arma de fuego"))
                        && listaArmas.get(i).getCalibre().equalsIgnoreCase(listaArmas.get(j).getCalibre()))
                        && listaArmas.get(i).getMarca().equalsIgnoreCase(listaArmas.get(j).getMarca()))) {
                    listaArmas.get(j).setDuplicada(true);
                    break;
                }
            }
        }
    }

    /**
     * @param listaArmas
     * @throws Exception
     */
    @SuppressWarnings("static-access")
    private void verificarArmasExistentesEnBaseDeDatos(List<ArmaExcell> listaArmas, Integer codigoPersona) throws Exception {
        TgeneCatalogDetail codigoClase = new TgeneCatalogDetail();
        TgeneCatalogDetail codigoMarca = new TgeneCatalogDetail();
        TgeneCatalogDetail codigoTipo = new TgeneCatalogDetail();
        TgeneCatalogDetail codigoCalibre = new TgeneCatalogDetail();
        String codigoSerie;
        List<TarmRegistroArmas> lstRegistroArmas = registroArmasController.findxPersoncode(String.valueOf(codigoPersona));
        if (lstRegistroArmas == null || listaArmas == null || lstRegistroArmas.isEmpty() || listaArmas.isEmpty()) {
            return;
        }
        for (int i = 0; i < listaArmas.size(); i++) {
            codigoClase = CatalogDetailController.findByCatalogcodeDescrption("CLASE", listaArmas.get(i).getClase());
            codigoTipo = CatalogDetailController.findByCatalogcodeDescrption("TIPOARMAEXPLOSIVO", listaArmas.get(i).getTipo());
            codigoMarca = CatalogDetailController.findByCatalogcodeDescrption("MARCA", listaArmas.get(i).getMarca());
            codigoSerie = this.registro.getTiporegistro().equalsIgnoreCase("IMP") ? null : listaArmas.get(i).getSerie();
            codigoCalibre = listaArmas.get(i).getClase().toLowerCase().equalsIgnoreCase("arma de fuego") ? CatalogDetailController.findByCatalogcodeDescrption("CALIBRE", listaArmas.get(i).getCalibre()) : null;

            if ((codigoClase == null && (listaArmas.get(i).getClase() != null && !listaArmas.get(i).getClase().trim().isEmpty())) || (codigoTipo == null && (listaArmas.get(i).getTipo() != null && !listaArmas.get(i).getTipo().trim().isEmpty()))
                    || (codigoMarca == null && (listaArmas.get(i).getMarca() != null && !listaArmas.get(i).getMarca().trim().isEmpty())) || (codigoSerie == null && (listaArmas.get(i).getSerie() != null && !listaArmas.get(i).getSerie().trim().isEmpty()))
                    || (codigoCalibre == null && (listaArmas.get(i).getCalibre() != null && !listaArmas.get(i).getCalibre().trim().isEmpty()))
                    || listaArmas.get(i).getClase() == null || listaArmas.get(i).getMarca() == null || listaArmas.get(i).getCalibre() == null
                    || listaArmas.get(i).getClase().isEmpty() || listaArmas.get(i).getMarca().isEmpty() || listaArmas.get(i).getCalibre().isEmpty()) {
                continue;
            }
            for (TarmRegistroArmas registroArmas : lstRegistroArmas) {
                List<TarmArmas> lstArmasEncontradas = findByMarcaSerie(String.valueOf(registroArmas.getPk()), codigoMarca.getPk().getCatalog(), codigoSerie);
                if (lstArmasEncontradas != null) {
                    for (TarmArmas armas : lstArmasEncontradas) {
                        TarmTipoArmaExplosivo tipoArma = TiposArmasExplosivosController.findarma(armas.getCtipoarmaexplosivo());
                        if (tipoArma.getClase().equalsIgnoreCase(codigoClase.getPk().getCatalog()) && codigoCalibre != null ? tipoArma.getCalibre().equalsIgnoreCase(codigoCalibre.getPk().getCatalog()) : true && tipoArma.getTipoarmaexplosivo().equalsIgnoreCase(codigoTipo.getPk().getCatalog())) {
                            listaArmas.get(i).setDuplicada(true);
                            break;
                        }
                    }
                }
            }
        }
    }

    /**
     * Metodo que recorre la lista de las armas con los valores cargados del
     * EXCEL
     *
     * @param contieneSerie
     * @param f1
     * @param mapaTotalesTemporales
     */
    public void recorreListaArmasExcel(Boolean contieneSerie, int f1, HashMap<String, TarmTotalPersona> mapaTotalesTemporales) {
        for (int i = 0; i < listaArmas.size(); i++) {
            Integer fila = i + 1;
            f1 = i;
            Boolean campoCantidad = false;
            //0-Datos duplicados
            if (listaArmas.get(i).getDuplicada()) {
                listaErrores.add("Fila " + fila.toString() + ": " + MsgControlArmas.getProperty("msg_datosDuplicados"));
            }
            //1-Serie
            //Validando que si el tipo de registro es de importacion
            //las armas no contengan numero de serie
            if (this.registro.getTiporegistro().equalsIgnoreCase("IMP") && (listaArmas.get(i).getSerie() != null) && !contieneSerie) {
                contieneSerie = true;
                listaErrores.add(MsgControlArmas.getProperty("msg_archivoImportacionSerie"));
            }
            if (!this.registro.getTiporegistro().equalsIgnoreCase("IMP") && (listaArmas.get(i).getSerie() == null || listaArmas.get(i).getSerie().trim().isEmpty())) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 1: " + MsgControlArmas.getProperty("msg_serieVacia"));
                listaArmas.get(i).setCamposIncompletos(true);
            }
            //2-Clase
            if (listaArmas.get(i).getClase() == null || listaArmas.get(i).getClase().trim().isEmpty()) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 2: " + MsgControlArmas.getProperty("msg_claseVacia"));
                listaArmas.get(i).setCamposIncompletos(true);

                //3-Validando que cuando la clase sea ARMA DE FUEGO la longitud no este vacia	
            } else if (listaArmas.get(i).getClase().equalsIgnoreCase("ARMA DE FUEGO")
                    && (listaArmas.get(i).getLongitud() == null || listaArmas.get(i).getLongitud().trim().isEmpty())) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 3: " + MsgControlArmas.getProperty("msg_longitudVacia"));
                listaArmas.get(i).setCamposIncompletos(true);

                //Validando que cuando la clase no sea ARMA DE FUEGO la longitud este vacia
            } else if (!listaArmas.get(i).getClase().equalsIgnoreCase("ARMA DE FUEGO")
                    && (listaArmas.get(i).getLongitud() != null && !listaArmas.get(i).getLongitud().trim().isEmpty())) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 3: " + MsgControlArmas.getProperty("msg_longitudNoVacia"));
            }
            //Carga de catalogos
            TgeneCatalogDetail catalogoClase = CatalogDetailController.findByCatalogcodeDescrption("CLASE", listaArmas.get(i).getClase());
            listaArmas.get(i).setCatalogoClase(catalogoClase);
            if (catalogoClase != null && catalogoClase.getPk() != null && catalogoClase.getPk().getCatalog() != null && !clase.contains(catalogoClase.getPk().getCatalog())) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 2: " + " No tiene permiso para cargar " + catalogoClase.getDescription());
                listaArmas.get(i).setCamposIncompletos(true);
            } else if (catalogoClase == null) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 2: " + " No tiene ingresado una Clase V\u00e1lida ");
                listaArmas.get(i).setCamposIncompletos(true);
            }
            TgeneCatalogDetail catalogoLongitud = CatalogDetailController.findByCatalogcodeDescrption("LONGITUD", listaArmas.get(i).getLongitud());
            listaArmas.get(i).setCatalogoLongitud(catalogoLongitud);
            TgeneCatalogDetail catalogoTipoArma = CatalogDetailController.findByCatalogcodeDescrption("TIPOARMAEXPLOSIVO", listaArmas.get(i).getTipo());
            listaArmas.get(i).setCatalogoTipoArma(catalogoTipoArma);
            TgeneCatalogDetail catalogoCalibre = CatalogDetailController.findByCatalogcodeDescrption("CALIBRE", listaArmas.get(i).getCalibre());
            listaArmas.get(i).setCatalogoCalibre(catalogoCalibre);
            TgeneCatalogDetail catalogoColor = CatalogDetailController.findByCatalogcodeDescrption("COLOR", listaArmas.get(i).getColor());
            listaArmas.get(i).setCatalogoColor(catalogoColor);
            TgeneCatalogDetail catalogoMarca = CatalogDetailController.findByCatalogcodeDescrption("MARCA", listaArmas.get(i).getMarca());
            listaArmas.get(i).setCatalogoMarca(catalogoMarca);
            TarmUnidadTipo tipoUnidadSeleccionada = null;// new TarmUnidadTipo();	
            if (catalogoClase != null) {
                //Obteniendo la configuracion de TARMUNIDADTIPO
                if (!(listaArmas.get(i).getUnidadMedidaCantidad() == null || listaArmas.get(i).getUnidadMedidaCantidad().isEmpty()) && !(listaArmas.get(i).getUnidadMedidaPeso() == null || listaArmas.get(i).getUnidadMedidaPeso().isEmpty())) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 9,11: " + MsgControlArmas.getProperty("msg_unidadMedidaSoloUna"));
                }
                String unidadMedidaIngresada = (listaArmas.get(i).getUnidadMedidaCantidad() == null || listaArmas.get(i).getUnidadMedidaCantidad().isEmpty()) ? listaArmas.get(i).getUnidadMedidaPeso() : listaArmas.get(i).getUnidadMedidaCantidad();
                String columnaUnidadMedidaError = (listaArmas.get(i).getUnidadMedidaCantidad() == null || listaArmas.get(i).getUnidadMedidaCantidad().isEmpty()) ? "Columna 11" : "Columna 9";
                if (listaArmas.get(i).getCatalogoTipoArma() == null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 5: El Tipo de Arma Explosivo no existe en el Catálogo. Revise los espacios entre cada palabra y que este bien escrito.");
                    listaArmas.get(i).setCamposIncompletos(true);
                    tipoUnidadSeleccionada = null;
                } else {
                    tipoUnidadSeleccionada = UnidadTipoController.findByClaseAndClasecode(catalogoClase.getPk().getCatalog(), catalogoClase.getPk().getCatalogcode(), listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog(), unidadMedidaIngresada);
                }
                if (tipoUnidadSeleccionada != null && tipoUnidadSeleccionada.getPk().getUnidadmedidapeso() != null && !tipoUnidadSeleccionada.getPk().getUnidadmedidapeso().isEmpty()) {
                    if (tipoUnidadSeleccionada.getPk().getUnidadmedidapeso().equalsIgnoreCase("UNIDAD") || tipoUnidadSeleccionada.getPk().getUnidadmedidapeso().equalsIgnoreCase("UNIDADES")) {
                        campoCantidad = true;
                    } else if (tipoUnidadSeleccionada.getPk().getUnidadmedidapeso().equalsIgnoreCase("KG")) {
                        campoCantidad = false;
                    }
                } else if (tipoUnidadSeleccionada == null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + columnaUnidadMedidaError + ": " + MsgControlArmas.getProperty("msg_unidadMedidaNoExiste"));
                }
            }
            //4-Tipo
            if (listaArmas.get(i).getTipo() == null || listaArmas.get(i).getTipo().trim().isEmpty()) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 4: " + MsgControlArmas.getProperty("msg_tipoVacio"));
                listaArmas.get(i).setCamposIncompletos(true);
            }
            //5-Calibre
            if (listaArmas.get(i).getClase() != null && !listaArmas.get(i).getClase().isEmpty()
                    && listaArmas.get(i).getClase().equalsIgnoreCase("ARMA DE FUEGO")
                    && (listaArmas.get(i).getCalibre() == null || listaArmas.get(i).getCalibre().trim().isEmpty())) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 5: " + MsgControlArmas.getProperty("msg_calibreVacio"));
            }
            //Marca
            if (listaArmas.get(i).getMarca() == null || listaArmas.get(i).getMarca().trim().isEmpty()) {
                listaErrores.add("Fila " + fila.toString() + ": " + "Columna 7: " + MsgControlArmas.getProperty("msg_marcaVacia"));
                listaArmas.get(i).setCamposIncompletos(true);
            }
            if (campoCantidad) {
                //Cantidad
                if ((listaArmas.get(i).getTextoCantidad() == null || listaArmas.get(i).getTextoCantidad().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 8: " + MsgControlArmas.getProperty("msg_cantidadVacia"));
                    listaArmas.get(i).setCamposIncompletos(true);

                } else if (listaFilas.get(i).getCell(8).getCellType() != Cell.CELL_TYPE_NUMERIC && tipoUnidadSeleccionada != null) {
                    //Verificando el tipo de dato numerico
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 8: " + MsgControlArmas.getProperty("msg_cantidadValorNumerico"));
                }

                //U. Medida Cantidad
                if ((listaArmas.get(i).getUnidadMedidaCantidad() == null || listaArmas.get(i).getUnidadMedidaCantidad().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 9: " + MsgControlArmas.getProperty("msg_unidadMedidaCantidadVacia"));
                }

                //Peso
                if ((listaArmas.get(i).getTextoPeso() != null && !listaArmas.get(i).getTextoPeso().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 10: " + MsgControlArmas.getProperty("msg_pesoNoVacio"));
                }

                //U. Medida Peso
                if ((listaArmas.get(i).getUnidadMedidaPeso() != null && !listaArmas.get(i).getUnidadMedidaPeso().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 11: " + MsgControlArmas.getProperty("msg_unidadMedidaPesoNoVacia"));
                }
                //Validando que cuando la clase NO sea ARMA DE FUEGO, MUNICION, 
                //Explosivos, Accesorios, Fuegos Pirotecnicos, Sustancia Quimica, Armas no Letales 
                //la cantidad y unidad de medida cantidad esten vacios
                //y el peso y unidad de medida peso NO esten vacios
            } else if (listaArmas.get(i).getClase() != null && !listaArmas.get(i).getClase().isEmpty()) {
                //Cantidad
                if ((listaArmas.get(i).getTextoCantidad() != null && !listaArmas.get(i).getTextoCantidad().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 8: " + MsgControlArmas.getProperty("msg_cantidadNoVacia"));
                }
                //U. Medida Cantidad
                if (listaArmas.get(i).getUnidadMedidaCantidad() != null && !listaArmas.get(i).getUnidadMedidaCantidad().trim().isEmpty() && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 9: " + MsgControlArmas.getProperty("msg_unidadMedidaCantidadNoVacia"));
                }
                //Peso
                if ((listaArmas.get(i).getTextoPeso() == null || listaArmas.get(i).getTextoPeso().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 10: " + MsgControlArmas.getProperty("msg_pesoVacio"));
                    listaArmas.get(i).setCamposIncompletos(true);

                } else if (listaFilas.get(i).getCell(10).getCellType() != Cell.CELL_TYPE_NUMERIC && tipoUnidadSeleccionada != null) {
                    //Verificando el tipo de dato numerico
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 10: " + MsgControlArmas.getProperty("msg_pesoValorNumerico"));
                }
                //U. Medida Peso
                if ((listaArmas.get(i).getUnidadMedidaPeso() == null || listaArmas.get(i).getUnidadMedidaPeso().trim().isEmpty()) && tipoUnidadSeleccionada != null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 11: " + MsgControlArmas.getProperty("msg_unidadMedidaPesoVacia"));
                    listaArmas.get(i).setCamposIncompletos(true);
                }
            }
            //Verificando que no existan problemas en el arma proveniente del archivo EXCEL
            //para validar entonces los datos en la base de datos
            if (!listaArmas.get(i).getCamposIncompletos() && !listaArmas.get(i).getDuplicada()) {
                //Verificando los datos en los catalogos
                //Verificando la existencia de la clase en el catalogo
                if (catalogoClase == null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 2: " + MsgControlArmas.getProperty("msg_calibreNoExisteCatalogo"));
                    listaArmas.get(i).setExisteCatalogo(false);
                } else {
                    listaArmas.get(i).setExisteCatalogo(true);
                }
                //Verificando la existencia de la longitud en el catalogo
                if (catalogoLongitud == null) {
                    listaArmas.get(i).setExisteCatalogo(false);
                    if (listaArmas.get(i).getClase().toLowerCase().equalsIgnoreCase("arma de fuego")) {
                        listaErrores.add("Fila " + fila.toString() + ": " + "Columna 3: " + MsgControlArmas.getProperty("msg_longitudNoExisteCatalogo"));
                    }
                } else {
                    listaArmas.get(i).setExisteCatalogo(true);
                }
                //Verificando la existencia del tipo de arma en el catalogo					
                if (catalogoTipoArma == null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 4: " + MsgControlArmas.getProperty("msg_noExisteTipoArmaCatalogo"));
                    listaArmas.get(i).setExisteCatalogo(false);
                } else {
                    listaArmas.get(i).setExisteCatalogo(true);
                }
                //Verificando la existencia del calibre en el catalogo
                if (catalogoCalibre == null) {
                    listaArmas.get(i).setExisteCatalogo(false);
                    if (listaArmas.get(i).getClase().toLowerCase().equalsIgnoreCase("arma de fuego")) {
                        listaErrores.add("Fila " + fila.toString() + ": " + "Columna 5: " + MsgControlArmas.getProperty("msg_calibreNoExisteCatalogo"));
                    }
                } else {
                    listaArmas.get(i).setExisteCatalogo(true);
                }
                //Verificando la existencia del color en el catalogo
                if (listaArmas.get(i).getColor() != null && !listaArmas.get(i).getColor().isEmpty()) {
                    if (catalogoColor == null) {
                        listaErrores.add("Fila " + fila.toString() + ": " + "Columna 6: " + MsgControlArmas.getProperty("msg_colorNoExisteCatalogo"));
                        listaArmas.get(i).setExisteCatalogo(false);
                    } else {
                        listaArmas.get(i).setExisteCatalogo(true);
                    }
                }
                //Verificando la existencia de la marca en el catalogo										
                if (catalogoMarca == null) {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Columna 7: " + MsgControlArmas.getProperty("msg_marcaNoExisteCatalogo"));
                    listaArmas.get(i).setExisteCatalogo(false);
                } else {
                    listaArmas.get(i).setExisteCatalogo(true);
                }
                //Validacio 4- Verificando que exista la combinacion clase, longitud, tipo arma y calibre 
                //en la tabla TARMTIPOARMAEXPLOSIVO
                if (listaArmas.get(i).getClase().toLowerCase().equalsIgnoreCase("arma de fuego")) {
                    if (catalogoClase != null && catalogoLongitud != null && catalogoTipoArma != null && catalogoCalibre != null && tipoUnidadSeleccionada != null) {
                        tipoArmaExplosivo = TiposArmasExplosivosController.findByClaseLongitudCalibreTipoArma(catalogoLongitud.getPk().getCatalog(),
                                catalogoCalibre.getPk().getCatalog(), catalogoClase.getPk().getCatalog(), catalogoTipoArma.getPk().getCatalog(), tipoUnidadSeleccionada.getPk().getUnidadmedidapeso());

                        if (tipoArmaExplosivo == null) {
                            listaErrores.add("Fila " + fila.toString() + ": " + "Registro no encontrado: " + listaArmas.get(i).getClase() + ", " + listaArmas.get(i).getLongitud() + ", " + listaArmas.get(i).getTipo() + ", " + listaArmas.get(i).getCalibre());
                            listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(false);
                        } else {
                            listaArmas.get(i).setTipoArmaExplosivo(tipoArmaExplosivo);
                            listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(true);
                        }
                    } else {
                        listaErrores.add("Fila " + fila.toString() + ": " + "Registro no encontrado la combinaci\u00f3n del Tipo Arma Explosivo");
                        listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(false);
                    }
                } else if (catalogoCalibre != null && catalogoCalibre.getDescription() != null && !catalogoCalibre.getDescription().equals("")) {
                    // Caso donde existe calibre
                    if (catalogoClase != null && catalogoTipoArma != null && tipoUnidadSeleccionada != null) {
                        tipoArmaExplosivo = TiposArmasExplosivosController.findByClaseCalibreTipoArma(catalogoClase.getPk().getCatalog(), catalogoCalibre.getPk().getCatalog(), catalogoTipoArma.getPk().getCatalog(), tipoUnidadSeleccionada.getPk().getUnidadmedidapeso());
                        if (tipoArmaExplosivo == null) {
                            listaErrores.add("Fila " + fila.toString() + ": " + "Registro no encontrado: " + listaArmas.get(i).getClase() + ", " + listaArmas.get(i).getTipo());
                            listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(false);
                        } else {
                            listaArmas.get(i).setTipoArmaExplosivo(tipoArmaExplosivo);
                            listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(true);
                        }
                    } else {
                        listaErrores.add("Fila " + fila.toString() + ": " + "Registro no encontrado la combinaci\u00f3n del Tipo Arma Explosivo ");
                        listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(false);
                    }
                } else // Caso donde no existe calibre
                if (catalogoClase != null && catalogoTipoArma != null && tipoUnidadSeleccionada != null) {
                    tipoArmaExplosivo = TiposArmasExplosivosController.findByClaseTipo(catalogoClase.getPk().getCatalog(), catalogoTipoArma.getPk().getCatalog(), tipoUnidadSeleccionada.getPk().getUnidadmedidapeso());
                    if (tipoArmaExplosivo == null) {
                        listaErrores.add("Fila " + fila.toString() + ": " + "Registro no encontrado: " + listaArmas.get(i).getClase() + ", " + listaArmas.get(i).getTipo());
                        listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(false);
                    } else {
                        listaArmas.get(i).setTipoArmaExplosivo(tipoArmaExplosivo);
                        listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(true);
                    }
                } else {
                    listaErrores.add("Fila " + fila.toString() + ": " + "Registro no encontrado la combinaci\u00f3n del Tipo Arma Explosivo ");
                    listaArmas.get(i).setExisteTARMTIPOARMAEXPLOSIVO(false);
                }
                if (listaArmas.get(i).getCatalogoClase() != null && listaArmas.get(i).getCatalogoTipoArma() != null && listaArmas.get(i).getCatalogoMarca() != null) {
                    TarmArmas armaBD;
                    //Si el tipo de registro es de Importacion, el arma se persiste como nueva
                    //no se busca en la base de datos
                    if (this.registro.getTiporegistro().equalsIgnoreCase("IMP")) {
                        listaArmas.get(i).setExisteBaseDatos(false);
                        armaBD = new TarmArmas();
                        armaBD.setIsnew(true);
                    } else {
                        //Verificando que el arma exista en la base de datos
                        //si el tipo de registro es de produccion
                        armaBD = null; //ArmasController.findBySerieMarca(listaArmas.get(i).getSerie(), listaArmas.get(i).getCatalogoMarca().getPk().getCatalog());
                        if (armaBD == null) {
                            listaArmas.get(i).setExisteBaseDatos(false);
                            armaBD = new TarmArmas();
                            armaBD.setIsnew(true);
                        } else {
                            List<TarmTipoArmaExplosivo> listaExplosivos = TiposArmasExplosivosController.findByClaseTipoAll(listaArmas.get(i).getCatalogoClase().getPk().getCatalog(),
                                    listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog());
                            if (listaExplosivos == null) {
                                listaArmas.get(i).setExisteBaseDatos(false);
                            } else {
                                listaArmas.get(i).setExisteBaseDatos(false);
                                for (TarmTipoArmaExplosivo explosivo : listaExplosivos) {
                                    if (explosivo.getPk().equalsIgnoreCase(armaBD.getCtipoarmaexplosivo())) {
                                        listaArmas.get(i).setExisteBaseDatos(true);
                                        armaBD.setIsnew(false);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    listaArmas.get(i).setArma(armaBD);
                    String unidadTipoIngresada = campoCantidad ? listaArmas.get(i).getUnidadMedidaCantidad() : listaArmas.get(i).getUnidadMedidaPeso();
                    //		CARGA EL CUPO *****			//persona,clase,tipoarmaexplosivo		
//							List<TarmComercianteCupo> cupo =ComercianteCupoController.findByPersonCode(usuario.getPk().getPersoncode().toString(), 
//									listaArmas.get(i).getCatalogoClase().getPk().getCatalog(), listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog(),
//									unidadTipoIngresada);
//							
//							if(cupo!=null && !cupo.isEmpty() && cupo.get(0).getTiporegistro().equalsIgnoreCase(this.registro.getTiporegistro())){
                    //metodo de los TOTALES SETEADOS EN UN MAPA
                    cupoArmasExplosivos(i, mapaTotalesTemporales, fila, tipoUnidadSeleccionada);
//							}else{
//								if(cupo==null || cupo.isEmpty()){
//									listaErrores.add("Fila "+fila.toString()+": Cupo no asignado para "+listaArmas.get(i).getClase()+".");
//								}
//								else{
//									listaErrores.add("Fila "+fila.toString()+": Cupo no disponible para "+listaArmas.get(i).getClase()+".");								
//								}
//								listaArmas.get(i).setCupoInsuficiente(true);
//							}
                }
            }
            tipoUnidadSeleccionada = null;
        }
    }

    public void cupoArmasExplosivos(int i, HashMap<String, TarmTotalPersona> mapaTotalesTemporales, Integer fila, TarmUnidadTipo tipoUnidadSeleccionada) {

//			listaArmas.get(i).setCupo1(0);
        //Cargando el total
        //saldo de la TotalPersona
        BigDecimal saldoPasaraaAnterior = new BigDecimal(0);
        //TarmTotalPersona totalMapa= new BigDecimal(0);
        TarmTotalPersona totalPersona = null;
//			Double cupoMaximo=listaArmas.get(i).getCupo().getCupounidad().doubleValue();
        //no existe
        if (mapaTotalesTemporales.get(usuario.getPk().getPersoncode().toString() + "|" + listaArmas.get(i).getCatalogoClase().getPk().getCatalog() + "|" + listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog()) == null) {
            totalPersona = TotalPersonaController.findMaxFecha(listaArmas.get(i).getCatalogoClase().getPk().getCatalog(),
                    listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog(), usuario.getPk().getPersoncode().toString(),
                    tipoUnidadSeleccionada.getPk().getUnidadmedidapeso());
            if (totalPersona == null) {
                totalPersona = new TarmTotalPersona();
                totalPersona.setTotal(new BigDecimal(0));
            } else {
                saldoPasaraaAnterior = (totalPersona == null ? new BigDecimal(0) : totalPersona.getTotal());
            }
            BigDecimal peso = (listaArmas == null || listaArmas.get(i).getTextoPeso() == null || listaArmas.get(i).getTextoPeso().isEmpty()) ? new BigDecimal(0.0) : new BigDecimal(Double.parseDouble(listaArmas.get(i).getTextoPeso()));
            BigDecimal cantidad = (listaArmas == null || listaArmas.get(i).getTextoCantidad() == null || listaArmas.get(i).getTextoCantidad().isEmpty()) ? new BigDecimal(0.0) : new BigDecimal(Double.parseDouble(listaArmas.get(i).getTextoCantidad()));
            totalPersona.setCantidadmovimiento(cantidad.add(peso));
            totalPersona.setTotal(new BigDecimal(0));//saldoPasaraaAnterior.add((listaArmas==null || listaArmas.get(i).getTextoCantidad()==null)?new BigDecimal(0):new BigDecimal(Double.parseDouble(listaArmas.get(i).getTextoCantidad()))));								
            Double suma = 0.0;
            //Cantidad
            if (listaArmas.get(i).getUnidadMedidaCantidad() != null && !listaArmas.get(i).getUnidadMedidaCantidad().isEmpty()) {
                listaArmas.get(i).setCantidad(Double.parseDouble(listaArmas.get(i).getTextoCantidad()));
                totalPersona.setUnidadmedidapeso(listaArmas.get(i).getUnidadMedidaCantidad());
                //suma eltotal anterior + la cantidad a ingresar
                suma = saldoPasaraaAnterior.doubleValue() + listaArmas.get(i).getCantidad();
                totalPersona.setTotal(new BigDecimal(suma));
                //Peso
            } else if (listaArmas.get(i).getUnidadMedidaPeso() != null && !listaArmas.get(i).getUnidadMedidaPeso().isEmpty()) {
                listaArmas.get(i).setPeso(Double.parseDouble(listaArmas.get(i).getTextoPeso()));
                totalPersona.setUnidadmedidapeso(listaArmas.get(i).getUnidadMedidaPeso());
                //suma eltotal anterior + la cantidad a ingresar
                suma = saldoPasaraaAnterior.doubleValue() + listaArmas.get(i).getPeso();
                totalPersona.setTotal(new BigDecimal(suma));
            }
        } else {//existe la combinacion
            totalPersona = mapaTotalesTemporales.get(usuario.getPk().getPersoncode().toString() + "|" + listaArmas.get(i).getCatalogoClase().getPk().getCatalog() + "|" + listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog());
            BigDecimal peso = (listaArmas == null || listaArmas.get(i).getTextoPeso() == null || listaArmas.get(i).getTextoPeso().isEmpty()) ? new BigDecimal(0.0) : new BigDecimal(Double.parseDouble(listaArmas.get(i).getTextoPeso()));
            BigDecimal cantidad = (listaArmas == null || listaArmas.get(i).getTextoCantidad() == null || listaArmas.get(i).getTextoCantidad().isEmpty()) ? new BigDecimal(0.0) : new BigDecimal(Double.parseDouble(listaArmas.get(i).getTextoCantidad()));
            totalPersona.setCantidadmovimiento(cantidad.add(peso).add(totalPersona.getCantidadmovimiento()));
            totalPersona.setTotal(totalPersona.getSaldoanterior().add(totalPersona.getCantidadmovimiento()));//saldoPasaraaAnterior.add((listaArmas==null || listaArmas.get(i).getTextoCantidad()==null)?new BigDecimal(0):new BigDecimal(Double.parseDouble(listaArmas.get(i).getTextoCantidad()))));
            saldoPasaraaAnterior = totalPersona.getSaldoanterior();
        }
        totalPersona.setPk(null);
        totalPersona.setPersoncodigo(usuario.getPk().getPersoncode());
        totalPersona.setClase(listaArmas.get(i).getCatalogoClase().getPk().getCatalog());
        totalPersona.setClasecodigo("CLASE");
        totalPersona.setTipoarmaexplosivo(listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog());
        totalPersona.setTipoarmaexplosivocodigo("TIPOARMAEXPLOSIVO");
        totalPersona.setIngresoegreso("ING");
        totalPersona.setCarma(listaArmas.get(i).getArma().getPk());
        totalPersona.setIngresoegresocodigo("ESINGRESOEGRESO");
        totalPersona.setUnidadmedidapesocodigo("UNIDADMEDIDA");
        totalPersona.setFecha(new java.sql.Timestamp(new Date().getTime()));
        totalPersona.setSaldoanterior(saldoPasaraaAnterior == null ? new BigDecimal(0) : saldoPasaraaAnterior);
        totalPersona.setIsnew(true);
        //Verificando si el usuario tiene cupo disponible para el arma

        //mapa con el nuevo total por clase tipo unidad
        mapaTotalesTemporales.put(usuario.getPk().getPersoncode().toString() + "|" + listaArmas.get(i).getCatalogoClase().getPk().getCatalog() + "|" + listaArmas.get(i).getCatalogoTipoArma().getPk().getCatalog(), totalPersona);
        listaArmas.get(i).setTotalPersona(totalPersona);
        //Verificando que el la suma del total con la cantidad de armas
        //no sea mayor que el cupo
//			if(totalPersona.getTotal().doubleValue()>cupoMaximo){
//				listaErrores.add("Fila "+fila.toString()+": Cupo no disponible para "+listaArmas.get(i).getClase());
//				listaArmas.get(i).setCupoInsuficiente(true);
//			}else{
//				//Actualizando el valor del total y del total anterior
//				listaArmas.get(i).getTotalPersona().setSaldoanterior(listaArmas.get(i).getTotalPersona().getSaldoanterior());
//				listaArmas.get(i).getTotalPersona().setTotal(totalPersona.getTotal());
//			}
    }

    /**
     * Metodo que indica cuando una celda esta vacia
     *
     * @param celda
     * @return
     */
    public Boolean celdaVacia(Cell celda) {
        Boolean vacia = false;
        if (celda == null || celda.getCellType() == Cell.CELL_TYPE_BLANK || (celda.getCellType() == Cell.CELL_TYPE_STRING && celda.getStringCellValue().isEmpty())) {
            vacia = true;
        }
        return vacia;
    }
    
    /**
     * 
     * @param carma
     * @return 
     */
    public static TarmArmas findByPk(String carma) {
        try {
            ArmaController cc = new ArmaController();
//            cc.init();
            cc.recperpage = 300;
            cc.addFilter("pk", carma);
            cc.querydatabaseSimple();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     *
     * @param codigopersona
     * @return
     */
    public static TarmArmas findBySerieMarca(String serie, String marca) {
        try {
            ArmaController cc = new ArmaController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("lote", serie);
            cc.addFilter("marca", marca);
            cc.querydatabaseSimple();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     *
     * Metodo para encontrar por marca y tipoarmaexplosivo
     *
     * @param marca
     * @param tipoArmaExplosivo
     * @return
     * @throws Exception
     */
    public static List<TarmArmas> findByMarcaSerie(String cregistro, String marca, String serie) throws Exception {

        ArmaController cc = new ArmaController();
        //cc.init();
        cc.recperpage = 300;
        cc.querydatabaseMarcaSerie(cregistro, marca, serie);
        if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
            return cc.lrecord;
        }
        return null;

    }

    @SuppressWarnings("finally")
    public File generarArchivoError(Long key) {
        if (listaErrores.isEmpty()) {

            //MessageHelper.setMessageInfo("ARCHIVO SUBIDO CORRECTAMENTE");
            return null;
        }
        PrintWriter escribir = null;
        File archivo = null;
        try {
            archivo = File.createTempFile("errorlog" + key, ".txt");
            escribir = new PrintWriter(archivo);

            for (String err : listaErrores) {
                System.out.println(err);

                escribir.print(err + "\r\n");
            }
            //escribir.close();
            limpiar();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            escribir.flush();
            escribir.close();
            return archivo;
        }

    }

    /**
     * Llama a la construccion del metodo para recargar
     */
    public void descargarArchivo() {

        Long key = new Date().getTime();
        File archivoTemporal = generarArchivoError(key);
        if (archivoTemporal == null) {
            return;
        }
        try {
            HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            response.addHeader("Content-disposition", "attachment; filename=errorlog" + key + ".txt");
            OutputStream out = response.getOutputStream();
            InputStream inputStream = new FileInputStream(archivoTemporal.getAbsolutePath());

            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = inputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }

            inputStream.close();
            out.flush();

            FacesContext.getCurrentInstance().responseComplete();

        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    /**
     * Limpia las los valores en las listas
     */
    public void limpiar() {
        try {
            create();
            while (lrecord.iterator().hasNext()) {
                record = lrecord.get(0);
                remove();
            }
            listaArmas = new ArrayList<ArmaExcell>();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Carga las listas de cantones y limpia la lista de ciudades
     */
    public void seleccionarProvincia() {
        try {
            codigoProvincia = this.record.getProvincecode();
            lcantones = CantonController.find("EC", record.getProvincecode());
            lciudades = new ArrayList<>();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Carga las listas de ciudades
     */
    public void seleccionarCanton() {
        try {
            codigoCanton = this.record.getCantoncode();
            lciudades = CityController.find("EC", record.getProvincecode(), record.getCantoncode());
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void cargarDocumentosHabilitantes(String categoria) {
        ldocumentospersona = new ArrayList<>();
        List<TarmDocumentoHabilitante> listadocum = DocumentoHabilitanteController.findpersoncode(usuario.getPk().getPersoncode().toString(), categoria);
        //Forma número 1 (Uso de Maps).
        Map<Long, TarmDocumentoHabilitante> mapPersonas = new HashMap<Long, TarmDocumentoHabilitante>(listadocum.size());
        for (TarmDocumentoHabilitante p : listadocum) {
            mapPersonas.put(p.getCtramite(), p);
        }
        //Agrego cada elemento del map a una nueva lista y muestro cada elemento.
        System.out.println("Lista sin repetidos:");
        for (Entry<Long, TarmDocumentoHabilitante> p : mapPersonas.entrySet()) {
            ldocumentospersona.add(p.getValue());
        }
//			ldocumentospersona =DocumentoHabilitanteController.findpersoncode(usuario.getPk().getPersoncode().toString(),categoria);
    }

    public void cambioTipoRegistro() {
        if (registro.getTiporegistro() != null) {
            if ("PRO".equals(registro.getTiporegistro())) {
                cargarDocumentosHabilitantes("4");//4 Fabrica, 5Fabricante
            } else {//  IMP
                cargarDocumentosHabilitantes("8");//8 importador
            }
        } else {
            ldocumentospersona = new ArrayList<>();
        }
    }

    public List<TgeneCanton> getLcantones() {
        return lcantones;
    }

    public void setLcantones(List<TgeneCanton> lcantones) {
        this.lcantones = lcantones;
    }

    public String getCodigoProvincia() {
        return codigoProvincia;
    }

    public void setCodigoProvincia(String codigoProvincia) {
        this.codigoProvincia = codigoProvincia;
    }

    public String getCodigoCanton() {
        return codigoCanton;
    }

    public void setCodigoCanton(String codigoCanton) {
        this.codigoCanton = codigoCanton;
    }

    public String getCodigoCiudad() {
        return codigoCiudad;
    }

    public void setCodigoCiudad(String codigoCiudad) {
        this.codigoCiudad = codigoCiudad;
    }

    String codigoCiudad;

    public void codigoCiudad() {

    }

    public void addPersoncodeFilter(String personcode) {
        super.addFilter("pk.personcode", personcode);
    }

    public List<ArmaExcell> getLarmexcell() {
        return listaArmas;
    }

    public void setLarmexcell(List<ArmaExcell> larmexcell) {
        this.listaArmas = larmexcell;
    }

    public ArmaExcell getArmaexcell() {
        return armaexcell;
    }

    public void setArmaexcell(ArmaExcell armaexcell) {
        this.armaexcell = armaexcell;
    }

    public TarmTipoArmaExplosivo getTipoarmexplosivo() {
        return tipoArmaExplosivo;
    }

    public void setTipoarmexplosivo(TarmTipoArmaExplosivo tipoarmexplosivo) {
        this.tipoArmaExplosivo = tipoarmexplosivo;
    }

    public List<ArmaExcell> getLaexel() {
        return laexel;
    }

    public void setLaexel(List<ArmaExcell> laexel) {
        this.laexel = laexel;
    }

    public TcustPersonDetail getDetallesPersona() {
        return detallesPersona;
    }

    public void setDetallesPersona(TcustPersonDetail detallesPersona) {
        this.detallesPersona = detallesPersona;
    }

    public TcustPersonDetail getUsuario() {
        return usuario;
    }

    public void setUsuario(TcustPersonDetail usuario) {
        this.usuario = usuario;
    }

    public List<Row> getListaFilas() {
        return listaFilas;
    }

    public void setListaFilas(List<Row> listaFilas) {
        this.listaFilas = listaFilas;
    }

    public List<String> getListaErrores() {
        return listaErrores;
    }

    public void setListaErrores(List<String> listaErrores) {
        this.listaErrores = listaErrores;
    }

    public TarmTipoArmaExplosivo getTipoArmaExplosivo() {
        return tipoArmaExplosivo;
    }

    public void setTipoArmaExplosivo(TarmTipoArmaExplosivo tipoArmaExplosivo) {
        this.tipoArmaExplosivo = tipoArmaExplosivo;
    }

    public List<ArmaExcell> getListaArmas() {
        return listaArmas;
    }

    public void setListaArmas(List<ArmaExcell> listaArmas) {
        this.listaArmas = listaArmas;
    }

    public PersonAddressController getPersonAddressController() {
        return personAddressController;
    }

    public void setPersonAddressController(
            PersonAddressController personAddressController) {
        this.personAddressController = personAddressController;
    }

    public InputStream getFilei() {
        return filei;
    }

    public void setFilei(InputStream filei) {
        this.filei = filei;
    }

    public String getCsolicitud() {
        return csolicitud;
    }

    public void setCsolicitud(String csolicitud) {
        this.csolicitud = csolicitud;
    }

    public TcustPersonAddress getDireccion() {
        return direccion;
    }

    public void setDireccion(TcustPersonAddress direccion) {
        this.direccion = direccion;
    }

//		public List<TarmComercianteCupo> getCuposArmas() {
//			return cuposArmas;
//		}
    //
//		public void setCuposArmas(List<TarmComercianteCupo> cuposArmas) {
//			this.cuposArmas = cuposArmas;
//		}
//		public ComercianteCupoController getComercianteCupoController() {
//			return comercianteCupoController;
//		}
    //
//		public void setComercianteCupoController(
//				ComercianteCupoController comercianteCupoController) {
//			this.comercianteCupoController = comercianteCupoController;
//		}
    public Boolean getDescargar() {
        return descargar;
    }

    public void setDescargar(Boolean descargar) {
        this.descargar = descargar;
    }

    public RegistroArmController getRegistroArmasController() {
        return registroArmasController;
    }

    public void setRegistroArmasController(
            RegistroArmController registroArmasController) {
        this.registroArmasController = registroArmasController;
    }

    public TotalArmasController getTotalPersonaController() {
        return totalPersonaController;
    }

    public void setTotalPersonaController(
            TotalArmasController totalPersonaController) {
        this.totalPersonaController = totalPersonaController;
    }

    public TgeneCountry getPais() {
        return pais;
    }

    public void setPais(TgeneCountry pais) {
        this.pais = pais;
    }

    public List<TgeneCity> getLciudades() {
        return lciudades;
    }

    public void setLciudades(List<TgeneCity> lciudades) {
        this.lciudades = lciudades;
    }

    public TgeneCity getCiudad() {
        return ciudad;
    }

    public void setCiudad(TgeneCity ciudad) {
        this.ciudad = ciudad;
    }

    public List<TarmArmas> getArmas() {
        return armas;
    }

    public void setArmas(List<TarmArmas> armas) {
        this.armas = armas;
    }

    public List<TarmTotalPersona> getTotalesPersoan() {
        return totalesPersoan;
    }

    public void setTotalesPersoan(List<TarmTotalPersona> totalesPersoan) {
        this.totalesPersoan = totalesPersoan;
    }

    public TgeneCatalogDetail getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TgeneCatalogDetail tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public Date getFechaActual() {
        return fechaActual;
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public List<TgeneCatalogDetail> getTiposRegistro() {
        return tiposRegistro;
    }

    public void setTiposRegistro(List<TgeneCatalogDetail> tiposRegistro) {
        this.tiposRegistro = tiposRegistro;
    }

    public TgeneCatalogDetail getTipoRegistro() {
        return tipoRegistro;
    }

    public void setTipoRegistro(TgeneCatalogDetail tipoRegistro) {
        this.tipoRegistro = tipoRegistro;
    }

    public List<TgeneCountry> getLpaises() {
        return lpaises;
    }

    public void setLpaises(List<TgeneCountry> lpaises) {
        this.lpaises = lpaises;
    }

    public List<TgeneProvince> getLprovincias() {
        return lprovincias;
    }

    public void setLprovincias(List<TgeneProvince> lprovincias) {
        this.lprovincias = lprovincias;
    }

    public TarmRegistroArmas getRegistro() {
        return registro;
    }

    public void setRegistro(TarmRegistroArmas registro) {
        this.registro = registro;
    }

    public List<TgeneCatalogDetail> getLaeropuertos() {
        return laeropuertos;
    }

    public void setLaeropuertos(List<TgeneCatalogDetail> laeropuertos) {
        this.laeropuertos = laeropuertos;
    }

    public List<TarmDocumentoHabilitante> getLdocumentospersona() {
        return ldocumentospersona;
    }

    public void setLdocumentospersona(
            List<TarmDocumentoHabilitante> ldocumentospersona) {
        this.ldocumentospersona = ldocumentospersona;
    }

    public String getClase() {
        return clase;
    }

    public void setClase(String clase) {
        this.clase = clase;
    }

    public Integer getPersoncode() {
        return personcode;
    }

    public void setPersoncode(Integer personcode) {
        this.personcode = personcode;
    }

}
