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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.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.faces.event.AjaxBehaviorEvent;

import org.apache.commons.lang3.StringUtils;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.extensions.component.inputnumber.InputNumber;

import com.fp.common.helper.Constant;
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.CargaController;
import com.fp.frontend.controller.armas.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.lov.ArmaExplosivoLovController;
import com.fp.frontend.controller.armas.lov.CargasLovController;
import com.fp.frontend.controller.armas.parametros.CalibreLovController;
import com.fp.frontend.controller.armas.parametros.ClaseLovController;
import com.fp.frontend.controller.armas.parametros.LongitudLovController;
import com.fp.frontend.controller.armas.parametros.TipoArmaExpLovController;
import com.fp.frontend.controller.armas.parametros.TiposArmasExplosivosController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pcustomer.lov.PersonLovController;
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.ParametersController;
import com.fp.frontend.controller.pgeneral.gene.ParroquiaController;
import com.fp.frontend.controller.pgeneral.gene.ProvinceController;
import com.fp.frontend.helper.CallerHelper;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.frontend.utility.Utilidades;
import com.fp.frontend.utility.ValidateIdentification;
import com.fp.persistence.parmas.fun.TarmCarga;
import com.fp.persistence.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
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.TgeneParameters;
import com.fp.persistence.pgeneral.gene.TgeneParroquia;
import com.fp.persistence.pgeneral.gene.TgeneProvince;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 * Controlador principal de armas
 *
 * @author Christian Pazmino
 *
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ImportacionProduccionController extends AbstractController<TarmArmas> {

    private Boolean estadoDesaduanizado = Boolean.FALSE;
    private Boolean esNuevaImportacion = Boolean.TRUE;
    private String filterAUCP;
    //P<artida arancelaria
    private List<TgeneCatalogDetail> lpartidaArancelaria = new ArrayList<>();
    private TarmCarga carga = new TarmCarga();
    private Boolean isSelectAucpPrevio = Boolean.FALSE;
    private Boolean isSave = Boolean.FALSE;
    private Boolean isEnableCategoria = Boolean.TRUE;
    InputNumber cantidadTxt = new InputNumber();
    List<TarmArmas> ldeleteItems = new ArrayList<TarmArmas>();

    @ManagedProperty(value = "#{tiposArmasExplosivosController}")
    private TiposArmasExplosivosController tiposArmasExplosivosController;

    @ManagedProperty(value = "#{registroArmController}")
    private RegistroArmController registroArmas;

    // Datos generales
    private TgeneCatalogDetail tipoDocumento;
    private TcustPersonDetail detallesPersona;
    // Catalogo que contiene tipos de registros
    private List<TgeneCatalogDetail> tiposRegistro;
    private TcustPersonDetail usuario;

//	private String tipoRegistro;
    //Registro armas
    TarmRegistroArmas registro = new TarmRegistroArmas();

    //Detalle de localizacion para el caso de importaciones
    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;

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

    private List<TarmDocumentoHabilitante> ldocumentospersona;

//    /**
//     * Lista de tipos de identificaci&oacute;n
//     */
//    private List<TgeneCatalogDetail> ltipoidentificacion;
    /**
     * Listado de estados del arma
     */
    private List<TgeneCatalogDetail> lestadoarma;
    /**
     * Listado de marcas
     */
    private List<TgeneCatalogDetail> lmarca;
    /**
     * Listado de colores
     */
    private List<TgeneCatalogDetail> lcolor;
    /**
     * Listado de tipos de fabricaci&oacute;n
     */
    private List<TgeneCatalogDetail> ltipofabricacion;
    /**
     * Listado de unidad de medida cantidad
     */
    private List<TgeneCatalogDetail> lunidadmedidacantidad;
    /**
     * Listado de unidad medida peso
     */
    private List<TgeneCatalogDetail> lunidadmedidapeso;
//    /**
//     * Listado de paises
//     */
//    private List<TgeneCountry> lcountry;
//    /**
//     * Listado de provincias
//     */
//    private List<TgeneProvince> lprovincias;
//    /**
//     * Listado de cantones
//     */
//	private List<TgeneCanton> lcantones;
    /**
     * Listado de parroquias
     */
    private List<TgeneParroquia> lparroquias;
    /**
     * Listado de ciudades
     */
    private List<TgeneCity> lcities;

//	/**
//	 * Tipo documento
//	 */
//    private String tipoDoc;
//    /**
//     * N&uacute;mero documento
//     */
//    private String numDoc;
//    /**
//     * Nombre/raz&oacute;n social
//     */
//    private String nombreRazon;
    /**
     * Longitud arma
     */
    private String longitud;
    /**
     * Calibre arma
     */
    private String calibre;
    /**
     * Clase arma
     */
    private String clase;
    /**
     * Clase arma
     */
    private String categoria;
    /**
     * Tipo de arma
     */
    private String tipoarma;
    /**
     * unidad medida peso
     */
    private String unidadmedidapeso;

    /**
     * Bandera que indica que en realidad existe luego del ingreso de datos un
     * tipo de arma explosivo v&aacute;lido
     */
    private boolean existeTipoArmaExplosivo;

    /**
     * Bandera que especifica que se deba verificar que exista un arma explosivo
     * v&aacute;lido
     */
    private boolean verificaArmaExplosivo = Boolean.TRUE;

    /**
     * Bloquea la unidad de cantidad
     */
    private boolean bloquearUnidadCantidad = Boolean.TRUE;

    /**
     * Bloquea la unidad de peso
     */
    private boolean bloquearUnidadPeso = Boolean.TRUE;
    /**
     * Contiene la fecha actual del sistema
     */
    private Date fechaActual;
    /**
     * Contiene la referencia a nuevo propietario del arma
     */
    private TcustPersonDetail nuevoPropietarioArma;
    /**
     * Tipo del arma explosivo
     */
    private TarmTipoArmaExplosivo tipoArmaExplosivo;
    /**
     * codigo del ruc
     */
    private String codigoRuc;
    /**
     * codigo del ruc
     */
    private String codigoCedula;
    /**
     * codigo del ruc
     */
    private String codigoPasaporte;

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

    /**
     * M&eacute;todo que se ejecuta despu&eacute;s del constructor
     */
    @PostConstruct
    private void postconstruct() {
        this.init();
        super.startQuery();
    }

    /**
     * Inicializa valores del controlador
     */
    private void init() {
        try {
            carga.setIsnew(Boolean.TRUE);
            //Localizacion
            lpaises = CountryController.find();
            this.lprovincias = ProvinceController.find("EC");
            //Obteniendo los aeropuertos
            this.laeropuertos = CatalogDetailController.find("AEROPUERTOS");
            this.lpartidaArancelaria = CatalogDetailController.find("PARTIDAARANCELARIA");
            //Obteniendo los datos del usuario logueado
            TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            usuario = PersonDetailController.find(tsafeUserDetail.getPk().getPersoncode().toString());
            detallesPersona = PersonDetailController.find(String.valueOf(usuario.getPk().getPersoncode()));
            //Tipo de documento
            tipoDocumento = CatalogDetailController.findxCodigoCodcatalogo(detallesPersona.getIdentificationcatalog(), detallesPersona.getIdentificationcatalogcode());
            //Tipos de registro
            tiposRegistro = CatalogDetailController.find("TIPOREGISTRO", "REG");
            fechaActual = new Date();
            recperpage = 5000; // Cambiar al # reg a mirar.
//            record = new TarmArmas();
            lrecord = new ArrayList<>();
            beanalias = "ARMAS";
//            ltipoidentificacion = CatalogDetailController.find("IDENTIFICATION");
            lestadoarma = CatalogDetailController.find("ESTADOARMA");
            lmarca = CatalogDetailController.find("MARCA");
            lcolor = CatalogDetailController.find("COLOR");
            ltipofabricacion = CatalogDetailController.find("TIPOFABRICACION");
//            lunidadmedidacantidad = CatalogDetailController.find("UCANTIDAD");
            lunidadmedidapeso = CatalogDetailController.find("UNIDADMEDIDA");
//            lcountry = CountryController.find();
            codigoRuc = codigos("CODIGO.RUC");
            codigoCedula = codigos("CODIGO.CEDULA");
            codigoPasaporte = codigos("CODIGO.PASAPORTE");
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void cargarCategorias() {
        System.out.println("cargarCategorias  1");
        // Cargamos la lista de categorias disponibles para el usuario (en funcion de sus documentos habilitantes)
        ldocumentospersona = new ArrayList<>();
        List<TarmDocumentoHabilitante> listadocum = new ArrayList<>();
        System.out.println("registro.getTiporegistro()  " + registro.getTiporegistro());
        if (registro.getTiporegistro() != null) {
            if ("PRO".equals(registro.getTiporegistro())) {
                listadocum = DocumentoHabilitanteController.findByPerson_Produccion(usuario.getPk().getPersoncode().toString());
                carga = new TarmCarga();
                carga.setIsnew(Boolean.TRUE);
                registro.setIsnew(Boolean.TRUE);
            } else {
                if (esNuevaImportacion) {
                    registro.setIsnew(Boolean.TRUE);
                }
                listadocum = DocumentoHabilitanteController.findByPerson_Importacion(usuario.getPk().getPersoncode().toString());
            }
        } else {
            ldocumentospersona = new ArrayList<>();
        }
        //Forma numero 1 (Uso de Maps).
        Map<Long, TarmDocumentoHabilitante> mapaSinRepetidos = new HashMap<Long, TarmDocumentoHabilitante>(listadocum.size());
        for (TarmDocumentoHabilitante p : listadocum) {
            mapaSinRepetidos.put(p.getCtramite(), p);
        }
        //Agrego cada elemento del map a una nueva lista y muestro cada elemento.	
        for (Entry<Long, TarmDocumentoHabilitante> p : mapaSinRepetidos.entrySet()) {
            ldocumentospersona.add(p.getValue());
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {
        try {
            DtoQuery dto = this.getDtoQuery();
            String sqlFiltroPersona = "";
            String sqlFiltroSancion = "";
            String sqlFiltroEstados = "";
            String sqlFiltroClaseArmas = "";
//    		String sqlFiltroFechaCaducidad = "";
            String sqlFiltroValidacionArma = "";//si entre los estados existe renovacion entonces validamos que no pueda seleccionar las mismas armas
            if (this.getMfilelds().get("personcode") != null) {
                sqlFiltroPersona = " t.cregistro in (SELECT c.pk FROM TarmRegistroArmas c WHERE c.personcode=" + this.getMfilelds().get("personcode") + ")";
            }
            //agregamos los filtros en base a la consideracion del field sancion, en caso de que lo sea buscamos los sancionados que hayan cumplido el tiempo de sancion
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            if (this.getMfilelds().containsKey("sancion") && this.getMfilelds().get("sancion").toString().equals(Constant.STR_Y)) {
                sqlFiltroSancion = " t.pk in (SELECT max(a.pk) FROM TarmArmas a WHERE a.codigoarma in (SELECT distinct(h.codigoarma) from TarmDocumentoHabilitante h WHERE h.pk in (SELECT d.cdocumento FROM TarmSancionDecomiso d WHERE d.personcode=" + this.getMfilelds().get("personcode") + " AND d.fechafinal < TO_DATE('" + dateFormat.format(Calendar.getInstance().getTime()) + "', 'YYYY-MM-DD'))) GROUP BY a.codigoarma)";
            }

            dto.setOrderby("pk");
            if (this.getMfilelds().get("ESTADOS") != null) {
                String[] estados = this.getMfilelds().get("ESTADOS").toString().split(",");
                StringBuffer sqlEstados = new StringBuffer(" t.estado IN (");
                for (int i = 0; i < estados.length; i++) {
                    sqlEstados.append("'").append(estados[i]).append("'");
                    if (i < estados.length - 1) {
                        sqlEstados.append(",");
                    }
                }
                sqlEstados.append(")");
                sqlFiltroEstados = sqlEstados.toString();
            }

            if (this.getMfilelds().get("TRAMITE") != null) {
                TarmTramite tarmTramite = (TarmTramite) this.getMfilelds().get("TRAMITE");
                sqlFiltroValidacionArma = "t.pk not in (SELECT coalesce(max(a.pk),'-1') FROM TarmArmas a WHERE a.codigoarma in (SELECT distinct(h.codigoarma) from TarmDocumentoHabilitante h WHERE h.personcode=" + this.getMfilelds().get("personcode") + " AND h.ctramite=" + tarmTramite.getPk() + " AND h.estado = 'APR' AND h.fechaexpiracion >= " + "TO_DATE('" + dateFormat.format(Calendar.getInstance().getTime()) + "','yyyy-MM-dd')) GROUP BY a.codigoarma)";
            }
            //estados del armas
            if (this.getMfilelds().get("CLASEARMAS") != null) {
                String[] clasesarma = this.getMfilelds().get("CLASEARMAS").toString().split(",");
                StringBuffer sqlclasesarmas = new StringBuffer(" t.ctipoarmaexplosivo IN (select o.pk from TarmTipoArmaExplosivo o where o.clase in(");
                for (int i = 0; i < clasesarma.length; i++) {
                    sqlclasesarmas.append("'").append(clasesarma[i]).append("'");
                    if (i < clasesarma.length - 1) {
                        sqlclasesarmas.append(",");
                    }
                }
                sqlclasesarmas.append(")) ");
                sqlFiltroClaseArmas = sqlclasesarmas.toString();
            }

//    		if(this.getMfilelds().get("FECHACADUCIDADARM") != null){
//    			sqlFiltroFechaCaducidad="t.fechacaducidad "+this.getMfilelds().get("FECHACADUCIDADARM");
//    		}
            String sqlActual = " t.fecharegistro=(select max(ta.fecharegistro) from TarmArmas ta where t.codigoarma=ta.codigoarma) and t.estado !='DEST' and t.estado!='VEND' and t.estado!='MING' and t.estado!='DUPL' and t.estado!='CUSTEM'"
                    + " and (t.peso>0 or t.cantidad>0)";//distintas de destruidas y cambio de propietario and t.cregistro=ta.cregistro para el manejo de los explosivos

//    		String sqlFinal = obtenerFiltroBusquedaGeneral(sqlFiltroPersona, sqlFiltroEstados, sqlFiltroSancion, sqlFiltroValidacionArma,sqlFiltroClaseArmas,sqlFiltroFechaCaducidad, sqlActual);
            String sqlFinal = obtenerFiltroBusquedaGeneral(sqlFiltroPersona, sqlFiltroEstados, sqlFiltroSancion, sqlFiltroValidacionArma, sqlFiltroClaseArmas, sqlActual);
            Filter filtroFinal = new Filter();
            filtroFinal.setSql(sqlFinal);
            dto.addFiltro(filtroFinal);
            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);
        }
    }

    public void actualizaPanelImportacion() {
        if (esNuevaImportacion) {
            System.out.println("Logica para cuando es una nueva importacion: " + esNuevaImportacion);
            carga = new TarmCarga();
            carga.setIsnew(Boolean.TRUE);
            registro.setIsnew(Boolean.TRUE);
//    		if(registro.getPk()!=null){
//    			registro.setPk(null);
//    			
//    		}    		
        } else {
            System.out.println("Logica para cuando es una importacion ya cargada y se consultara por AUCP: " + esNuevaImportacion);
        }
//    	registro = new TarmRegistroArmas();
//    	this.lrecord = new ArrayList<TarmArmas>();

    }

    private String obtenerFiltroBusquedaGeneral(String... sqlFiltros) {
        StringBuffer sqlFinal = new StringBuffer();
        for (int i = 0; i < sqlFiltros.length; i++) {
            if (sqlFinal.length() > 0 && !StringUtils.endsWith(StringUtils.trim(sqlFinal.toString()), "AND")) {
                sqlFinal.append(" AND ");
            }
            sqlFinal.append(sqlFiltros[i]);
        }
        return sqlFinal.toString();
    }

    @SuppressWarnings("unchecked")
    public void querydatabaseSinFiltros() {
        try {
            DtoQuery dto = this.getDtoQuery();

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.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 = this.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);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void next() throws Exception {
        // TODO Auto-generated method stub
        super.next();
    }

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

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.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 = this.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);
        }
    }

    /**
     * Retorna un {@link DtoQuery} con los atributos a presentarse
     *
     * @return
     * @throws Exception
     */
    private DtoQuery getDtoQuery() throws Exception {
        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);
        SubQuery subqueryUnidadMedida = new SubQuery("TgeneCatalogDetail", "description", "unidadmedida", "i.pk.catalog=t.unidadmedidacantidad and i.pk.catalogcode=t.unidadmedidacantidadcodigo");
        dto.addSubQuery(subqueryUnidadMedida);
        SubQuery subquerycpersoncode = new SubQuery("TarmRegistroArmas", "personcode", "personcode", "i.pk=t.cregistro");
        dto.addSubQuery(subquerycpersoncode);
        SubQuery subqueryTipo = new SubQuery("TgeneCatalogDetail", "description", "tipo", "i.pk.catalog=    (select o.tipoarmaexplosivo       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                + " i.pk.catalogcode=(select o.tipoarmaexplosivocodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
        dto.addSubQuery(subqueryTipo);
        SubQuery subqueryTipoArmaExplosivo = new SubQuery("TgeneCatalogDetail", "description", "tipoarmaexplosivo", "i.pk.catalog=    (select o.tipoarmaexplosivo       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                + " i.pk.catalogcode=(select o.tipoarmaexplosivocodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
        dto.addSubQuery(subqueryTipoArmaExplosivo);
        SubQuery subqueryClasecatalogo = new SubQuery("TgeneCatalogDetail", "description", "clase", "i.pk.catalog=    (select o.clase       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                + " i.pk.catalogcode=(select o.clasecodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
        dto.addSubQuery(subqueryClasecatalogo);

        return dto;
    }

    @SuppressWarnings("unchecked")
    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);
        }
    }

    @Override
    public void remove() throws Exception {
        if (record.getPk() == null) {
            super.remove();
        } else {
            ldeleteItems.add(this.record);
            super.remove();
        }
    }

    @Override
    public void save() {
        try {
            if (registro.getTiporegistro().equals("IMP") && registro.isnew) {
                TarmCarga aucpUsadoPrevio = CargaController.findByAUCP(registro.getSolicitudnum());
                if (aucpUsadoPrevio != null) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_aucp_previamente_cargado"));
                    return;
                }
                if (this.registro.getPaisorigen() == null) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_paisOrigenRequerido"));
                    return;
                }
                if (this.carga.getProvincecode() == null) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_provinciaRequerido"));
                    return;
                }
                if (this.carga.getCantoncode() == null) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_cantonRequerido"));
                    return;
                }
                if (this.carga.getCitycode() == null) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_ciudadRequerido"));
                    return;
                }
                if (this.registro.getAeropuertopuerto() == null) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_aeropuertoRequerido"));
                    return;
                }
            }
            if (this.getLrecord().isEmpty()) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_carga_armas_inexistentes"));
                return;
            }
            this.registroArmas.update();
            Request request = callerhelper.getRequest();
            this.registro.setPersoncode(usuario.getPk().getPersoncode());
            this.registro.setFechasolicitud(new java.sql.Date((new Date()).getTime()));
            this.registro.setTiporegistrocodigo("TIPOREGISTRO");
//            this.registro.setPaisorigen("EC");
            this.registro.setFcreacion(new java.sql.Date(Calendar.getInstance().getTimeInMillis()));
            request.getModifiedData().put("LISTAARMAS", this.lrecord);
            request.getModifiedData().put("LISTAARMASELIMINADAS", this.ldeleteItems);
            request.getModifiedData().put("TIPOREGISTRO", this.registro.getTiporegistro());
            request.getModifiedData().put("REGISTRO", this.registro);
            request.getModifiedData().put("PERSONCODE", usuario.getPk().getPersoncode());
            request.getModifiedData().put("ESNUEVAIMPORTACION", esNuevaImportacion);
            carga.setCategoria(this.categoria);
            request.getModifiedData().put("TARMCARGA", carga);
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                MessageHelper.setMessageInfo(resp);
                isSave = Boolean.TRUE;
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void saveArmaSolicitud() {
        try {

            if (!isArmaDuplicada(record)) {

                record.getModifiedData().put("edit", "S");

                this.registroArmas.update();
                update();
                if (!existeTipoArmaExplosivo) {
                    return;
                }
                DtoSave dtosave = super.getDtoSave();
                dtosave.setReturnpk(Boolean.TRUE); // Para que el core devuelva el pk de los registros nuevos.
                dtosave.setPosition(2);
                HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
                DtoSave dtoSaveRegistro = registroArmas.getDtoSave();
                dtoSaveRegistro.setIsForm(Boolean.TRUE);
                dtoSaveRegistro.setReturnpk(Boolean.TRUE);
                dtoSaveRegistro.setPosition(1);

                Request request = callerhelper.getRequest();
                request.setTransactionModule("30");
                request.setTransactionCode(15);
                request.setTransactionVersion(1);
                if (!verificaArmaExplosivo) {
                    request.put("eseliminacion", Constant.STR_Y);
                } else {
                    msave.put(registroArmas.getBeanalias(), dtoSaveRegistro);
                }
                msave.put(beanalias, dtosave); // adicionar metadata de mantenimiento para cada tabla.

                request.put("TIPODOC", this.getMfilelds().get("tipodoc"));
                request.put("NUMDOC", this.getMfilelds().get("numdoc"));
                request.setSaveTables(msave);
                Response resp = callerhelper.executeSave(request);
                if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                    this.postCommit(resp);
                    this.registroArmas.postCommit(resp);
                    MessageHelper.setMessageInfo(resp);
                } else {
                    MessageHelper.setMessageError(resp);
                }
            } else {
                record = null;
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_armaDuplicada"));
            }

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

    @Override
    public void update() throws Exception {
//    	TgeneCatalogDetail estado = CatalogDetailController.findxCodigoCodcatalogo(record.getEstado(), record.getEstadocodigo());
        TgeneCatalogDetail marca = CatalogDetailController.findxCodigoCodcatalogo(record.getMarca(), record.getMarcacodigo());
//		record.getModifiedData().put("estado", estado.getDescription());
        isEnableCategoria = Boolean.FALSE;
        record.setPartidaarancelariacodigo("PARTIDAARANCELARIA");
        record.setTipofabricacion("TIPOFABRICACION2");
        record.setTipofabricacioncodigo("TIPOFABRICACION");
        record.getModifiedData().put("marca", marca.getDescription());
        for (TgeneCatalogDetail color : lcolor) {
            if (record.getColor() != null && record.getColor().equals(color.getPk().getCatalog())) {
                record.getModifiedData().put("color", color.getDescription());
                break;
            }
        }
        if (verificaArmaExplosivo) {
            if (tipoArmaExplosivo == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionClase"));
                existeTipoArmaExplosivo = Boolean.FALSE;
                return;
            } else {
                this.record.setCtipoarmaexplosivo(tipoArmaExplosivo.getPk());
                record.getModifiedData().put("unidadMedidaCantidad", tipoArmaExplosivo.getUnidadmedidapeso());
                existeTipoArmaExplosivo = Boolean.TRUE;
            }
        }
        super.update();
    }

    public Boolean existeDuplicidad() {
        if (this.lrecord.contains(record)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    public void updateAutorizacion() throws Exception {
        super.update();
    }

    /**
     * M&eacute;todo que se ejecuta al carga edici&oacute;n
     *
     * @throws Exception
     */
    public void loadEdit() throws Exception {
        verificaArmaExplosivo = Boolean.TRUE;
        if (record.getCountrycode() == null) {
            record.setCountrycode("EC");
        }
        if (record.getCtipoarmaexplosivo() == null) {
            MessageHelper.setMessageError("NO ESTA ASOCIADO A UN TIPO DE ARMA EXPLOSIVO");
            return;
        }
        tipoArmaExplosivo = TiposArmasExplosivosController.findarma(record.getCtipoarmaexplosivo());
//    	lprovincias = ProvinceController.find(record.getCountrycode());
//		executeProvince();
//    	if(record.getProvincecode() != null){
//    		lcantones = CantonController.find(record.getCountrycode(), record.getProvincecode());
//            executeCanton();
//    	}   	
//    	completaInfTipoArma();
        // Anade la descripcion del tipo de arma explosivo
        if (tipoArmaExplosivo != null) {
            this.clase = tipoArmaExplosivo.getClase();
            this.longitud = tipoArmaExplosivo.getLongitud();
            this.tipoarma = tipoArmaExplosivo.getTipoarmaexplosivo();
            this.calibre = tipoArmaExplosivo.getCalibre();
        }
        verificarClaseArma();
    }

//    /**
//     * M&eacute;todo que completa la informaci&acute;n del arma una vez se presiona el bot&oacute;n crear
//     */
//    private void completaInfTipoArma(){
//    	TarmArmas recordArma = findPorCodigo(record.getPk());
//    	record.setCountrycode("EC");
//    	clase = record.getModifiedData().get("clase") != null ? recordArma.getModifiedData().get("clase").toString() : null;
//    	calibre = record.getModifiedData().get("ccalibre") != null ? Utilidades.formatearDecimalesEnTexto((recordArma.getModifiedData().get("ccalibre").toString()).replace("null", ""), "#.00")  : null;
//    	longitud = record.getModifiedData().get("clongitud") != null ? recordArma.getModifiedData().get("clongitud").toString() : null;
//    	tipoarma = record.getModifiedData().get("ctipoarmaexplosivo") != null ? recordArma.getModifiedData().get("ctipoarmaexplosivo").toString() : null;
//    }
    @Override
    public void create() throws Exception {
        if (categoria != null) {
            super.create();
            this.record.setEstadocodigo("ESTADOARMA");
            this.record.setMarcacodigo("MARCA");
            this.record.setCantidad(null);
            this.record.setPeso(null);
            this.lprovincias = ProvinceController.find(record.getCountrycode());
            this.executeProvince();
            this.bloquearUnidadCantidad = Boolean.TRUE;
            this.bloquearUnidadPeso = Boolean.TRUE;
            RequestContext.getCurrentInstance().execute("PF('dialog').show()");
        } else {
            MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_categoriaRequerida"));
            return;
        }
    }

    public void update(TarmArmas bean) throws Exception {
        record = bean;
        updateAutorizacion();
    }

    public void validacionDocumento(String numeroDocumento, String tipoDocumento) {
        if (numeroDocumento == null || tipoDocumento == null) {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("mg_error_seleccioneeltipodedocumentooingreselacedula"));
            return;
        }
        TcustPersonDetail tcustPersonDetail = null;
        if (tipoDocumento.equals(codigoCedula)) {
//----------validamos si es valida la CEDULA
            if (!ValidateIdentification.cedula(numeroDocumento)) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_nodocumentoinvalido"));
                return;
            }
            //envia a buscar en MAIA
            tcustPersonDetail = buscarPersonaMaia(numeroDocumento, tipoDocumento);
        } else if (tipoDocumento.equals(codigoRuc)) {
//----------validamos si es valida el RUC
            if (!ValidateIdentification.ruc(numeroDocumento)) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_nodocumentoinvalido"));
                return;
            }
            //envia a buscar en maia
            tcustPersonDetail = buscarPersonaMaia(numeroDocumento, tipoDocumento);
        } else {
//----------si es PASAPORTE
            tcustPersonDetail = buscarPersonaMaia(numeroDocumento, tipoDocumento);
        }
//		if(tcustPersonDetail==null){
//			nombreRazon=null;
////			numDoc=null;
//			 MessageHelper.setMessageError("La datos de la persona ingresada no existen, por favor crear primero la persona");
//			 return;
//		}else{
//			nombreRazon=tcustPersonDetail.getName();
//		}
    }

    /**
     * M&eacute;todo para validar si la persona existe en la BD de Maia
     *
     * @param numeroDocumento
     * @param tipoDocumento
     * @return TcustPersonDetail
     */
    public TcustPersonDetail buscarPersonaMaia(String numeroDocumento, String tipoDocumento) {
        return PersonDetailController.findxidentification(numeroDocumento, tipoDocumento);
    }

    /**
     * Busca un arma por c&oacute;digo y estado
     *
     * @param armaCode c&oacute;digo del arma
     * @param estado estado del arma
     * @return
     */
    public static TarmArmas find(String armaCode, String estado) {
        try {

            if (armaCode == null) {
                return null;
            }
            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("pk", armaCode);
            if (estado != null) {
                cc.addFilter("estado", estado);
                cc.addFilter("estadocodigo", "ESTADOARMA");
            }
            cc.querydatabaseArmas();

            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                TarmTipoArmaExplosivo tarmTipoArmaExplosivo = new TarmTipoArmaExplosivo();
                tarmTipoArmaExplosivo = TiposArmasExplosivosController.findarma(cc.lrecord.get(0).getCtipoarmaexplosivo());
                if (tarmTipoArmaExplosivo != null && tarmTipoArmaExplosivo.getCalibrecodigo() != null) {
                    cc.record.modifiedData().put("calibre", tarmTipoArmaExplosivo == null ? "" : Utilidades.formatearDecimalesEnTexto((CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()).getDescription()), "#.000"));
                }
                cc.record.modifiedData().put("tipo", tarmTipoArmaExplosivo == null ? "" : CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()).getDescription());
                cc.record.modifiedData().put("clase", tarmTipoArmaExplosivo == null ? "" : CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()).getDescription());
                cc.record.modifiedData().put("seleccion", Boolean.FALSE);
                cc.record.modifiedData().put("pais", cc.record.getCpaisorigen() == null ? "" : CountryController.findcountry(cc.record.getCpaisorigen()).getDescription());

                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 {
            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            if (serie != null && !serie.isEmpty()) {
                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;
        }
    }

    /**
     * Busca un arma por c&oacute;digo
     *
     * @param armaCode
     * @return
     */
    public static TarmArmas findByPK(String cArma) {
        try {

            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("pk", cArma);
            cc.querydatabaseSinFiltros();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                cc.record = cc.lrecord.get(0);
                TarmTipoArmaExplosivo tarmTipoArmaExplosivo = TiposArmasExplosivosController.findarma(cc.lrecord.get(0).getCtipoarmaexplosivo());
                if (tarmTipoArmaExplosivo != null) {
                    if (tarmTipoArmaExplosivo.getCalibre() != null && tarmTipoArmaExplosivo.getCalibrecodigo() != null) {
                        cc.record.modifiedData().put("calibre", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()).getDescription() : "");
                    }
                    if (tarmTipoArmaExplosivo.getTipoarmaexplosivo() != null && tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo() != null) {
                        cc.record.modifiedData().put("tipo", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()).getDescription() : "");
                    }
                    if (tarmTipoArmaExplosivo.getClase() != null && tarmTipoArmaExplosivo.getClasecodigo() != null) {
                        cc.record.modifiedData().put("clase", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()).getDescription() : "");
                    }

                    TarmRegistroArmas registroArmas = new TarmRegistroArmas();
                    TcustPersonDetail detallePersona = new TcustPersonDetail();
                    if (cc.record.getCregistro() != null) {
                        registroArmas = RegistroArmController.findByCodigo(String.valueOf(cc.record.getCregistro()));
                        if (registroArmas != null) {
                            detallePersona = PersonDetailController.find(String.valueOf(registroArmas.getPersoncode()));
                        }
                    }
                    cc.record.modifiedData().put("razonsPropietario", registroArmas == null || detallePersona == null ? "" : detallePersona.getName());
                    cc.record.modifiedData().put("documentoPropietario", registroArmas == null || detallePersona == null ? "" : detallePersona.getIdentification());

                    cc.record.modifiedData().put("seleccion", Boolean.FALSE);

                    return cc.lrecord.get(0);
                }
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Busca un arma por c&oacute;digo
     *
     * @param armaCode
     * @return
     */
    public static TarmArmas findPorCodigo(String armaCode) {
        try {

            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("pk", armaCode);
            //cc.addFilter("REG", "ESTADOARMA");
            cc.querydatabaseArmas();

            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                TarmTipoArmaExplosivo tarmTipoArmaExplosivo = TiposArmasExplosivosController.findarma(cc.lrecord.get(0).getCtipoarmaexplosivo());
                if (tarmTipoArmaExplosivo != null) {
                    if (tarmTipoArmaExplosivo.getCalibre() != null && tarmTipoArmaExplosivo.getCalibrecodigo() != null) {
                        cc.record.modifiedData().put("calibre", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()).getDescription() : "");
                    }
                    if (tarmTipoArmaExplosivo.getTipoarmaexplosivo() != null && tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo() != null) {
                        cc.record.modifiedData().put("tipo", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()).getDescription() : "");
                    }
                    if (tarmTipoArmaExplosivo.getClase() != null && tarmTipoArmaExplosivo.getClasecodigo() != null) {
                        cc.record.modifiedData().put("clase", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()).getDescription() : "");
                    }

                    TarmRegistroArmas registroArmas = new TarmRegistroArmas();
                    TcustPersonDetail detallePersona = new TcustPersonDetail();
                    if (cc.record.getCregistro() != null) {
                        registroArmas = RegistroArmController.findByCodigo(String.valueOf(cc.record.getCregistro()));
                        if (registroArmas != null) {
                            detallePersona = PersonDetailController.find(String.valueOf(registroArmas.getPersoncode()));
                        }
                    }
                    cc.record.modifiedData().put("razonsPropietario", registroArmas == null || detallePersona == null ? "" : detallePersona.getName());
                    cc.record.modifiedData().put("documentoPropietario", registroArmas == null || detallePersona == null ? "" : detallePersona.getIdentification());
                    cc.record.modifiedData().put("marca", (cc.record == null || cc.record.getMarca() == null || cc.record.getMarca().isEmpty() || cc.record.getMarcacodigo() == null || cc.record.getMarcacodigo().isEmpty()) ? "" : CatalogDetailController.findxCodigoCodcatalogo(cc.record.getMarca(), cc.record.getMarcacodigo()).getDescription());

                    cc.record.modifiedData().put("seleccion", Boolean.FALSE);

                    return cc.lrecord.get(0);
                }
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Busca un arma por c&oacute;digo
     *
     * @param armaCode
     * @return
     */
    public static TarmArmas findXCodigo(String armaCode) {
        try {

            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("pk", armaCode);
            //cc.addFilter("REG", "ESTADOARMA");
            cc.querydatabase();

            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * M&eacute;todo para el evento change del combo provincias
     */
    public void executeProvince() {
        if ((record.getCountrycode() != null) && (record.getCountrycode().compareTo("") != 0)) {
            lcantones = CantonController.find(record.getCountrycode(), record.getProvincecode());
            lparroquias = new ArrayList<>();
            lcities = new ArrayList<>();
        }
    }

    /**
     * M&eacute;todo para el evento change del combo cantones
     */
    public void executeCanton() {
        if ((record.getCountrycode() != null) && (record.getCountrycode().compareTo("") != 0)) {
            lparroquias = ParroquiaController.find(record.getCountrycode(), record.getProvincecode(), record.getCantoncode());
            lcities = CityController.find(record.getCountrycode(), record.getProvincecode(), record.getCantoncode());
        }
    }

    /**
     *
     *
     * @param personCode
     * @param estados estados del arma separados por coma
     * @return Una lista de Armas encontradas
     */
    public List<TarmArmas> findxPersona(Long personCode, String estados, String clase, String fechaCaducidad) {
        List<TarmArmas> armasLista = null;
        try {
            armasLista = new ArrayList<TarmArmas>();
            ImportacionProduccionController armas = new ImportacionProduccionController();
            armas.init();
            armas.recperpage = 4000;
            armas.addField("personcode", personCode);
            if (this.getMfilelds().get("sancion") != null) {
                armas.addField("sancion", this.getMfilelds().get("sancion"));
            }
            if (this.getMfilelds().get("TRAMITE") != null) {
                armas.addField("TRAMITE", this.getMfilelds().get("TRAMITE"));
            }
            if (estados == null) {
                armas.addFilter("estado", "REG");
            } else {
                armas.addField("ESTADOS", estados);
            }
            if (clase != null && clase.trim().length() > 0) {
                armas.addField("CLASEARMAS", clase);
            }
//			if(fechaCaducidad != null && fechaCaducidad .trim().length()>0){
//				armas.addField("FECHACADUCIDADARM", fechaCaducidad);
//			}
            armas.query();
            if (armas.getLrecord() != null && !armas.getLrecord().isEmpty()) {
                armasLista.addAll(armas.getLrecord());
            }

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

    /**
     * Lista de Armas por Registro
    *
     */
    public static List<TarmArmas> findxRegistro(String registrocode) {
        try {
            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("cregistro", registrocode);

            cc.querydatabase();

            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                for (TarmArmas item : cc.lrecord) {
                    TarmTipoArmaExplosivo tarmTipoArmaExplosivo = TiposArmasExplosivosController.findarma(item.getCtipoarmaexplosivo());
                    item.modifiedData().put("calibre", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()).getDescription());
                    item.modifiedData().put("tipo", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()).getDescription());
                    item.modifiedData().put("clase", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()).getDescription());
                    item.modifiedData().put("longitud", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getLongitud(), tarmTipoArmaExplosivo.getLongitudcodigo()).getDescription());
                }

                return cc.lrecord;
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Abre el LOV de la clase del arma
     */
    public void openLovClase() {
        Map<String, List<String>> params = new HashMap<String, List<String>>();
        ClaseLovController.openLov(params);
    }

    /**
     * Regresa del LOV de armas
     *
     * @param event
     */
    public void onReturnClase(SelectEvent event) {
        TgeneCatalogDetail clase = (TgeneCatalogDetail) event.getObject();
        this.record.getModifiedData().put("clase", clase.getDescription());
        this.clase = clase.getPk().getCatalog();
        this.verificarClaseArma();
    }

    /**
     * Abre el LOV de la clase del arma
     */
    public void openArmaExplosivoLov() {

        this.record.getModifiedData().put("longitud", null);
        this.record.getModifiedData().put("tipoarmaexplosivo", null);
        this.record.getModifiedData().put("calibre", null);
        //		descripcionUnidadpeso=null;
        Map<String, List<String>> params = new HashMap<>();
        List<String> lcategoriaParam = new ArrayList<>();
        lcategoriaParam.add(categoria);
        params.put("categoria", lcategoriaParam);
        ArmaExplosivoLovController.openLov(params);

    }

    /**
     * Abre el LOV de busqueda de importaciones por codigo solicitud (AUCP)
     */
    public void openCargaPrevia() {
        Map<String, List<String>> params = new HashMap<>();
        List<String> lPersoncodeParam = new ArrayList<>();
        lPersoncodeParam.add(usuario.getPk().getPersoncode().toString());
        params.put("personcode", lPersoncodeParam);
        CargasLovController.openLov(params);
    }

    /**
     * Regresa del LOV de armas
     *
     * @param event
     */
    public void onReturnArmaExplosivo(SelectEvent event) {
        tipoArmaExplosivo = (TarmTipoArmaExplosivo) event.getObject();
        //Setear descripciones a presentarse
        this.record.getModifiedData().put("clase", tipoArmaExplosivo.getModifiedData().get("nclase"));
        this.record.getModifiedData().put("tipoarmaexplosivo", tipoArmaExplosivo.getModifiedData().get("ntipo"));
        this.record.getModifiedData().put("longitud", tipoArmaExplosivo.getModifiedData().get("nlongitud"));
        this.record.getModifiedData().put("calibre", tipoArmaExplosivo.getModifiedData().get("ncalibre"));
        // Setear valores en las variables correspondientes
        if (tipoArmaExplosivo != null) {
            this.clase = tipoArmaExplosivo.getClase();
            this.longitud = tipoArmaExplosivo.getLongitud();
            this.tipoarma = tipoArmaExplosivo.getTipoarmaexplosivo();
            this.calibre = tipoArmaExplosivo.getCalibre();
            this.record.setUnidadmedidacantidad(tipoArmaExplosivo.getUnidadmedidapeso());
        }
        this.verificarClaseArma();
        // valida cantidad para registro de produccion
        cantidadTxt.setValue(null);
        if (registro.getTiporegistro().equals("PRO")) {
            if ((this.clase.equals("0010000001") || this.clase.equals("0010000004") || this.clase.equals("0010000008")) && this.bloquearUnidadPeso) {
                cantidadTxt.setValue("1");
                cantidadTxt.setDisabled(true);
            }
        }
    }

    /**
     * Regresa del LOV de carga
     *
     * @param event
     */
    public void onReturnCarga(SelectEvent event) {
        System.out.println("Retorno del lov carga");
        isSelectAucpPrevio = Boolean.TRUE;
        carga = (TarmCarga) event.getObject();
        this.categoria = carga.getCategoria();
        this.isEnableCategoria = Boolean.FALSE;
        if (carga.getEsdesaduanizado().equals("S")) {
            this.isSave = Boolean.TRUE;
        }
        carga.setIsnew(Boolean.FALSE);
        registro = RegistroArmController.findByCodigo(carga.getCregistro().toString());
        registro.setIsnew(Boolean.FALSE);
        TgeneCountry paisOrigen = CountryController.findcountry(registro.getPaisorigen());
        registro.getModifiedData().put("paisorigen", paisOrigen != null ? paisOrigen.getDescription() : "");
        // Provincia
        TgeneProvince provinciaTmp = ProvinceController.findPorCodigo("EC", carga.getProvincecode()).get(0);
        if (provinciaTmp != null) {
            carga.getModifiedData().put("provinceCode", provinciaTmp.getDescription());
        }
        // Canton
        TgeneCanton cantonTmp = CantonController.findPorCodigo("EC", carga.getProvincecode(), carga.getCantoncode()).get(0);
        if (cantonTmp != null) {
            carga.getModifiedData().put("cantonCode", cantonTmp.getDescription());
        }
        // Ciudad
        TgeneCity ciudadTmp = CityController.findPorCodigo("EC", carga.getProvincecode(), carga.getCantoncode(), carga.getCitycode()).get(0);
        if (ciudadTmp != null) {
            carga.getModifiedData().put("cityCode", ciudadTmp.getDescription());
        }

        lrecord = ArmasController.findxRegistro(registro.getPk().toString());
        if (lrecord == null) {
            this.lrecord = new ArrayList<TarmArmas>();
        }

    }

    /**
     * M&eacute;todo en el cual se determina si se bloquea unidad o cantidad al
     * momento de cargar los datos del arma
     *
     * @param clase
     */
    private void verificarClaseArma() {
        if (tipoArmaExplosivo != null) {
            TgeneCatalogDetail unidadesCatalog = CatalogDetailController.findCatalogo(tipoArmaExplosivo.getUnidadmedidapesocodigo(), tipoArmaExplosivo.getUnidadmedidapeso());
            if (unidadesCatalog != null && unidadesCatalog.getLegalcode().equals("CANTIDAD")) {
                this.record.getModifiedData().put("unidadMedidaCantidad", tipoArmaExplosivo.getUnidadmedidapeso());
                this.record.getModifiedData().put("unidadMedidaPeso", null);
                this.bloquearUnidadCantidad = Boolean.FALSE;
                this.bloquearUnidadPeso = Boolean.TRUE;
                this.record.setPeso(null);
            } else if (unidadesCatalog != null && unidadesCatalog.getLegalcode().equals("PESO")) {
                this.record.getModifiedData().put("unidadMedidaCantidad", null);
                this.record.getModifiedData().put("unidadMedidaPeso", tipoArmaExplosivo.getUnidadmedidapeso());
                this.bloquearUnidadCantidad = Boolean.TRUE;
                this.bloquearUnidadPeso = Boolean.FALSE;
                this.record.setCantidad(null);
            } else {
                this.record.getModifiedData().put("unidadMedidaCantidad", null);
                this.record.getModifiedData().put("unidadMedidaPeso", null);
                this.bloquearUnidadCantidad = Boolean.TRUE;
                this.bloquearUnidadPeso = Boolean.TRUE;
            }
        }
    }

    /**
     * Abre el LOV de la longitud del arma
     */
    public void openLovLongitud() {
        Map<String, List<String>> params = new HashMap<String, List<String>>();
        LongitudLovController.openLov(params);
    }

    /**
     * Regresa del LOV de longitud
     *
     * @param event
     */
    public void onReturnLongitud(SelectEvent event) {
        TgeneCatalogDetail longitud = (TgeneCatalogDetail) event.getObject();
        this.record.getModifiedData().put("longitud", longitud.getDescription());
        this.longitud = longitud.getPk().getCatalog();
    }

    /**
     * Abre el LOV del tipo de arma
     */
    public void openLovTipoArma() {
        Map<String, List<String>> params = new HashMap<String, List<String>>();
        TipoArmaExpLovController.openLov(params);
    }

    /**
     * Regresa del LOV de tipo de arma
     *
     * @param event
     */
    public void onReturnTipoArma(SelectEvent event) {
        TgeneCatalogDetail tipoArma = (TgeneCatalogDetail) event.getObject();
        this.record.getModifiedData().put("tipoarmaexplosivo", tipoArma.getDescription());
        this.tipoarma = tipoArma.getPk().getCatalog();
    }

    /**
     * Abre el LOV de Calibre
     */
    public void openLovCalibre() {
        Map<String, List<String>> params = new HashMap<String, List<String>>();
        CalibreLovController.openLov(params);
    }

    /**
     * Regresa del LOV del calibre
     *
     * @param event
     */
    public void onReturnCalibre(SelectEvent event) {
        TgeneCatalogDetail calibre = (TgeneCatalogDetail) event.getObject();
        this.record.getModifiedData().put("calibre", calibre.getDescription());
        this.calibre = calibre.getPk().getCatalog();
    }

    /**
     * Abre el LOV cambio de usuario
     */
    public void openLovCambioUsuario() {
        Map<String, List<String>> params = new HashMap<>();
        PersonLovController.openLov(params);
    }

    /**
     * Acci&oacute;n de retorno de la selecci&oacute;n del usuario
     *
     * @param event de retorno de la selecci&oacute;n
     */
    public void onReturnCambioUsuario(SelectEvent event) {
        nuevoPropietarioArma = (TcustPersonDetail) event.getObject();
    }

    /**
     * Abre el dialog del cambio de persona
     */
    public void abrirDialogCambio() {
        this.nuevoPropietarioArma = null;
    }

    /**
     * Se cambia el propietario del arma
     */
    public void cambiarArmaUsuario() {
        try {
            CallerHelper callerHelper = new CallerHelper();
            Request request = callerHelper.getRequest();
            request.setCompany(1);
            request.setTransactionModule("30");
            request.setTransactionCode(151);
            request.setTransactionVersion(1);
            request.put("ARMAACTUAL", this.record);
            request.put("NUEVAPERSONA", this.nuevoPropietarioArma);
            Response response = callerHelper.executeSave(request);
            if (response.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                MessageHelper.setMessageInfo(response);
                this.querydatabase();
            } else {
                MessageHelper.setMessageError(response);
            }
        } catch (Throwable 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", carga.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", carga.getProvincecode(), carga.getCantoncode());
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Seleccionado todos los registros de la tabla
     */
    public void seleccionarTodos(AjaxBehaviorEvent event) {
        try {
            Boolean valorColocar = Boolean.FALSE;
            if (Boolean.valueOf(event.getComponent().getAttributes().get("value") != null ? event.getComponent().getAttributes().get("value").toString() : "false")) {
                valorColocar = Boolean.TRUE;
            }
            for (TarmArmas guardias : lrecord) {
                guardias.getModifiedData().put("seleccionado", valorColocar);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo para obtener el listado de las armas por la serie/lote
     *
     * @param serieLote
     * @return
     */
    public static List<TarmArmas> findxSerieLote(String serieLote) {
        try {
            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 1000;
            cc.addFilter("lote", serieLote);
            cc.querydatabaseFechaMax();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord;
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Metodo para obtener los codigos
     */
    private static String codigos(String parametro) {
        TgeneParameters tgeneParameters = ParametersController.find(parametro, "1");
        return tgeneParameters.getTextvalue();
    }

    @SuppressWarnings("unchecked")
    protected void querydatabaseFechaMax() {
        try {
            DtoQuery dto = this.getDtoQuery();
            dto.setOrderby("pk");
            String codigoEstadoIncautada = codigos("CODIGO.INCAUTADA");
            String codigoEstadoDecomisada = codigos("CODIGO.DECOMISADA");
            String codigoEstadoVendida = codigos("CODIGO.VENDIDA");
            String codigoEstadoMatPrima = codigos("CODIGO.MATERIAPRIMA");
            Filter filtro = new Filter();
            String sql = "t.fecharegistro=(select max(ta.fecharegistro) from TarmArmas ta where t.codigoarma=ta.codigoarma and t.cregistro=ta.cregistro)"//and t.cregistro=ta.cregistro para el manejo de los explosivos
                    + " and t.estado !='DEST' and t.estado !='CDP' and t.estado !='" + codigoEstadoIncautada + "' and t.estado !='" + codigoEstadoDecomisada + "' and t.estado !='" + codigoEstadoVendida + "' and t.estado !='" + codigoEstadoMatPrima + "' ";
            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);
            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);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void actualizar(TarmArmas arma) throws Exception {
        record = arma;
        super.update();
    }

    /*Busca un arma por c&oacute;digo
    * @param armaCode
    * @return
     */
    public static TarmArmas findxCodigo(String armaCode) {
        try {

            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("pk", armaCode);
            cc.querydatabaseArmas();
            cc.getRecord().getModifiedData().put("lmarca", cc.getLmarca());
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public TiposArmasExplosivosController getTiposArmasExplosivosController() {
        return tiposArmasExplosivosController;
    }

    public void setTiposArmasExplosivosController(
            TiposArmasExplosivosController tiposArmasExplosivosController) {
        this.tiposArmasExplosivosController = tiposArmasExplosivosController;
    }

    public RegistroArmController getRegistroArmas() {
        return registroArmas;
    }

    public void setRegistroArmas(RegistroArmController registroArmas) {
        this.registroArmas = registroArmas;
    }

//	public List<TgeneCatalogDetail> getLtipoidentificacion() {
//		return ltipoidentificacion;
//	}
//
//
//	public void setLtipoidentificacion(List<TgeneCatalogDetail> ltipoidentificacion) {
//		this.ltipoidentificacion = ltipoidentificacion;
//	}
//
//
//	public String getTipoDoc() {
//		return tipoDoc;
//	}
//
//
//	public void setTipoDoc(String tipoDoc) {
//		this.tipoDoc = tipoDoc;
//	}
//	public String getNumDoc() {
//		return numDoc;
//	}
//
//
//	public void setNumDoc(String numDoc) {
//		this.numDoc = numDoc;
//	}
//	public String getNombreRazon() {
//		return nombreRazon;
//	}
//
//
//	public void setNombreRazon(String nombreRazon) {
//		this.nombreRazon = nombreRazon;
//	}
    public List<TgeneCatalogDetail> getLestadoarma() {
        return lestadoarma;
    }

    public void setLestadoarma(List<TgeneCatalogDetail> lestadoarma) {
        this.lestadoarma = lestadoarma;
    }

    public List<TgeneCatalogDetail> getLmarca() {
        return lmarca;
    }

    public void setLmarca(List<TgeneCatalogDetail> lmarca) {
        this.lmarca = lmarca;
    }

    public List<TgeneCatalogDetail> getLcolor() {
        return lcolor;
    }

    public void setLcolor(List<TgeneCatalogDetail> lcolor) {
        this.lcolor = lcolor;
    }

    public List<TgeneCatalogDetail> getLtipofabricacion() {
        return ltipofabricacion;
    }

    public void setLtipofabricacion(List<TgeneCatalogDetail> ltipofabricacion) {
        this.ltipofabricacion = ltipofabricacion;
    }

//	public List<TgeneCountry> getLcountry() {
//		return lcountry;
//	}
//
//
//	public void setLcountry(List<TgeneCountry> lcountry) {
//		this.lcountry = lcountry;
//	}
    public List<TgeneCatalogDetail> getLunidadmedidacantidad() {
        return lunidadmedidacantidad;
    }

    public void setLunidadmedidacantidad(
            List<TgeneCatalogDetail> lunidadmedidacantidad) {
        this.lunidadmedidacantidad = lunidadmedidacantidad;
    }

    public String getLongitud() {
        return longitud;
    }

    public void setLongitud(String longitud) {
        this.longitud = longitud;
    }

    public String getCalibre() {
        return calibre;
    }

    public void setCalibre(String calibre) {
        this.calibre = calibre;
    }

    public String getClase() {
        return clase;
    }

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

    public String getTipoarma() {
        return tipoarma;
    }

    public void setTipoarma(String tipoarma) {
        this.tipoarma = tipoarma;
    }

    public String getUnidadmedidapeso() {
        return unidadmedidapeso;
    }

    public void setUnidadmedidapeso(String unidadmedidapeso) {
        this.unidadmedidapeso = unidadmedidapeso;
    }

    public List<TgeneCatalogDetail> getLunidadmedidapeso() {
        return lunidadmedidapeso;
    }

    public void setLunidadmedidapeso(List<TgeneCatalogDetail> lunidadmedidapeso) {
        this.lunidadmedidapeso = lunidadmedidapeso;
    }

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

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

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

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

    public List<TgeneParroquia> getLparroquias() {
        return lparroquias;
    }

    public void setLparroquias(List<TgeneParroquia> lparroquias) {
        this.lparroquias = lparroquias;
    }

    public List<TgeneCity> getLcities() {
        return lcities;
    }

    public void setLcities(List<TgeneCity> lcities) {
        this.lcities = lcities;
    }

    public boolean isExisteTipoArmaExplosivo() {
        return existeTipoArmaExplosivo;
    }

    public void setExisteTipoArmaExplosivo(boolean existeTipoArmaExplosivo) {
        this.existeTipoArmaExplosivo = existeTipoArmaExplosivo;
    }

    public boolean isVerificaArmaExplosivo() {
        return verificaArmaExplosivo;
    }

    public void setVerificaArmaExplosivo(boolean verificaArmaExplosivo) {
        this.verificaArmaExplosivo = verificaArmaExplosivo;
    }

    public boolean isBloquearUnidadCantidad() {
        return bloquearUnidadCantidad;
    }

    public void setBloquearUnidadCantidad(boolean bloquearUnidadCantidad) {
        this.bloquearUnidadCantidad = bloquearUnidadCantidad;
    }

    public boolean isBloquearUnidadPeso() {
        return bloquearUnidadPeso;
    }

    public void setBloquearUnidadPeso(boolean bloquearUnidadPeso) {
        this.bloquearUnidadPeso = bloquearUnidadPeso;
    }

    public Date getFechaActual() {
        return fechaActual;
    }

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

    public TarmTipoArmaExplosivo getTipoArmaExplosivo() {
        return tipoArmaExplosivo;
    }

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

    protected void querydatabaseArmas() {
        try {
            DtoQuery dto = this.getDtoQuery();

            dto.setOrderby("pk");
            if (this.getMfilelds().get("ESTADOS") != null) {
                Filter filtroEstados = new Filter();
                String[] estados = this.getMfilelds().get("ESTADOS").toString().split(",");
                StringBuffer sqlEstados = new StringBuffer(" t.estado IN (");
                for (int i = 0; i < estados.length; i++) {
                    sqlEstados.append("'").append(estados[i]).append("'");
                    if (i < estados.length - 1) {
                        sqlEstados.append(",");
                    }
                }
                sqlEstados.append(")");
                filtroEstados.setSql(sqlEstados.toString());
                dto.addFiltro(filtroEstados);
            } else {
                //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);
            }
            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);
        }
    }

    public TcustPersonDetail getNuevoPropietarioArma() {
        return nuevoPropietarioArma;
    }

    public void setNuevoPropietarioArma(TcustPersonDetail nuevoPropietarioArma) {
        this.nuevoPropietarioArma = nuevoPropietarioArma;
    }

    /**
     * Busca un arma por c&oacute;digo
     *
     * @param armaCode
     * @return
     */
    public static TarmArmas findXCodigoArma(String armaCode) {
        try {
            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("codigoarma", armaCode);
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public void querydatabasesimple() {
        try {
            DtoQuery dto = this.getDtoQuery();
            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);
            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);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecked")
    public void querydatabaseArmaDuplicada(TarmArmas armaObj) {
        try {
            DtoQuery dto = this.getDtoQuery();

            Filter filtro = new Filter();
            filtro.setSql("t.marca='" + armaObj.getMarca() + "' and t.marcacodigo='" + armaObj.getMarcacodigo() + "' and upper(t.lote)='" + armaObj.getLote().toUpperCase() + "'");
            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);
            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);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public static TarmArmas findSimple(String carma) {
        try {
            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            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;
        }
    }

    public static Boolean isArmaDuplicada(TarmArmas armaObj) {
        Boolean isDuplicada = Boolean.FALSE;
        ImportacionProduccionController cc;
        try {
            cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 300;
            cc.querydatabaseArmaDuplicada(armaObj);
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                for (TarmArmas armaTmp : cc.lrecord) {
                    TarmTipoArmaExplosivo tipoArmaExpTmp = TiposArmasExplosivosController.findarma(armaTmp.getCtipoarmaexplosivo());
                    TgeneCatalogDetail claseTmp = CatalogDetailController.findCatalogo(tipoArmaExpTmp.getClasecodigo(), tipoArmaExpTmp.getClase());
                    TgeneCatalogDetail tipoArmaTmp = CatalogDetailController.findCatalogo(tipoArmaExpTmp.getTipoarmaexplosivocodigo(), tipoArmaExpTmp.getTipoarmaexplosivo());
                    TgeneCatalogDetail calibreTmp = CatalogDetailController.findCatalogo(tipoArmaExpTmp.getCalibrecodigo(), tipoArmaExpTmp.getCalibre());
                    // Valido la clase, tipoarma y calibre solo para armas de fuego y armas no letales
                    if (claseTmp.getPk().getCatalog().equals("0010000001") || claseTmp.getPk().getCatalog().equals("0010000008")) {
                        if (armaObj.getModifiedData().get("clase") != null && armaObj.getModifiedData().get("tipoarmaexplosivo") != null) {
                            if (armaObj.getModifiedData().get("clase").toString().equalsIgnoreCase(claseTmp != null ? claseTmp.getDescription() : "")
                                    && armaObj.getModifiedData().get("tipoarmaexplosivo").toString().equalsIgnoreCase(tipoArmaTmp != null ? tipoArmaTmp.getDescription() : "")) {
                                if (armaObj.getModifiedData().get("calibre") != null && calibreTmp != null && armaObj.getModifiedData().get("calibre").toString().equalsIgnoreCase(calibreTmp.getDescription())) {
                                    isDuplicada = Boolean.TRUE;
                                    break;
                                }
                            }
                        } else {
                            MessageHelper.setMessageError("CLASE Y/O TIPO DE ARMA EXPLOSIVO INCORRECTOS");
                        }
                    }
                }

            }
            return isDuplicada;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public static TarmArmas find(String carma) {
        try {

            ImportacionProduccionController cc = new ImportacionProduccionController();
            cc.init();
            cc.recperpage = 5000;
            cc.addFilter("pk", carma);
            cc.querydatabasesimple();

            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                TarmTipoArmaExplosivo tarmTipoArmaExplosivo = TiposArmasExplosivosController.findarma(cc.lrecord.get(0).getCtipoarmaexplosivo());
                if (tarmTipoArmaExplosivo != null) {
                    if (tarmTipoArmaExplosivo.getCalibre() != null && tarmTipoArmaExplosivo.getCalibrecodigo() != null) {
                        cc.record.modifiedData().put("calibre", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getCalibre(), tarmTipoArmaExplosivo.getCalibrecodigo()).getDescription() : "");
                    }
                    if (tarmTipoArmaExplosivo.getTipoarmaexplosivo() != null && tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo() != null) {
                        cc.record.modifiedData().put("tipo", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getTipoarmaexplosivo(), tarmTipoArmaExplosivo.getTipoarmaexplosivocodigo()).getDescription() : "");
                    }
                    if (tarmTipoArmaExplosivo.getClase() != null && tarmTipoArmaExplosivo.getClasecodigo() != null) {
                        cc.record.modifiedData().put("clase", CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tarmTipoArmaExplosivo.getClase(), tarmTipoArmaExplosivo.getClasecodigo()).getDescription() : "");
                    }
                    TarmRegistroArmas registroArmas = new TarmRegistroArmas();
                    TcustPersonDetail detallePersona = new TcustPersonDetail();
                    if (cc.record.getCregistro() != null) {
                        registroArmas = RegistroArmController.findByCodigo(String.valueOf(cc.record.getCregistro()));
                        if (registroArmas != null) {
                            detallePersona = PersonDetailController.find(String.valueOf(registroArmas.getPersoncode()));
                        }
                    }
                    cc.record.modifiedData().put("razonsPropietario", registroArmas == null || detallePersona == null ? "" : detallePersona.getName());
                    cc.record.modifiedData().put("documentoPropietario", registroArmas == null || detallePersona == null ? "" : detallePersona.getIdentification());
                    cc.record.modifiedData().put("marca", (cc.record == null || cc.record.getMarca() == null || cc.record.getMarca().isEmpty() || cc.record.getMarcacodigo() == null || cc.record.getMarcacodigo().isEmpty()) ? "" : CatalogDetailController.findxCodigoCodcatalogo(cc.record.getMarca(), cc.record.getMarcacodigo()).getDescription());
                    cc.record.modifiedData().put("seleccion", Boolean.FALSE);
                    return cc.lrecord.get(0);
                }
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public TgeneCatalogDetail getTipoDocumento() {
        return tipoDocumento;
    }

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

    public TcustPersonDetail getDetallesPersona() {
        return detallesPersona;
    }

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

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

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

    public TcustPersonDetail getUsuario() {
        return usuario;
    }

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

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

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

//	public TarmRegistroArmas getRegistro() {
//		return registro;
//	}
//
//	public void setRegistro(TarmRegistroArmas registro) {
//		this.registro = registro;
//	}
    public List<TgeneCountry> getLpaises() {
        return lpaises;
    }

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

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

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

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

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

    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 TarmRegistroArmas getRegistro() {
        return registro;
    }

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

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    public Boolean getEstadoDesaduanizado() {
        return estadoDesaduanizado;
    }

    public void setEstadoDesaduanizado(Boolean estadoDesaduanizado) {
        this.estadoDesaduanizado = estadoDesaduanizado;
    }

    public Boolean getEsNuevaImportacion() {
        return esNuevaImportacion;
    }

    public void setEsNuevaImportacion(Boolean esNuevaImportacion) {
        this.esNuevaImportacion = esNuevaImportacion;
    }

    public String getFilterAUCP() {
        return filterAUCP;
    }

    public void setFilterAUCP(String filterAUCP) {
        this.filterAUCP = filterAUCP;
    }

    public TarmCarga getCarga() {
        return carga;
    }

    public void setCarga(TarmCarga carga) {
        this.carga = carga;
    }

    public Boolean getIsSelectAucpPrevio() {
        return isSelectAucpPrevio;
    }

    public void setIsSelectAucpPrevio(Boolean isSelectAucpPrevio) {
        this.isSelectAucpPrevio = isSelectAucpPrevio;
    }

    public Boolean getIsSave() {
        return isSave;
    }

    public void setIsSave(Boolean isSave) {
        this.isSave = isSave;
    }

    public InputNumber getCantidadTxt() {
        return cantidadTxt;
    }

    public void setCantidadTxt(InputNumber cantidadTxt) {
        this.cantidadTxt = cantidadTxt;
    }

    public List<TgeneCatalogDetail> getLpartidaArancelaria() {
        return lpartidaArancelaria;
    }

    public void setLpartidaArancelaria(List<TgeneCatalogDetail> lpartidaArancelaria) {
        this.lpartidaArancelaria = lpartidaArancelaria;
    }

    public Boolean getIsEnableCategoria() {
        return isEnableCategoria;
    }

    public void setIsEnableCategoria(Boolean isEnableCategoria) {
        this.isEnableCategoria = isEnableCategoria;
    }

}
