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

import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.SelectEvent;

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.helper.MessageHelper;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.param.TarmUnidadTipo;
import com.fp.persistence.parmas.param.TarmUnidadTipoKey;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;

/**
 * Clase controladora del bean TarmTipoArmaExplosivo.
 *
 * @author Christian Pazmino
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class TiposArmasExplosivosController extends
        AbstractController<TarmTipoArmaExplosivo> {

    /**
     * Variable que contiene el String (nombre de clase) del dialogo seleccionar
     * clase de la pantalla principal
     */
    private String clase;
    /**
     * Variable que contiene el String (codigo de clase) del dialogo seleccionar
     * clase de la pantalla principal
     */
    private String claseCodigo;

    /**
     * Variable que contiene el String (nombre de clase) del dialogo seleccionar
     * clase de la pantalla principal
     */
    private String unidadMedidaPesoD;
    /**
     * Variable que contiene el String (codigo de clase) del dialogo seleccionar
     * clase de la pantalla principal
     */
    private String unidadMedidaPesoCodigoD;

    /**
     * Variable que contiene el String (nombre de clase) del dialogo seleccionar
     * clase de la pantalla crear/editar
     */
    private String claseD;
    /**
     * Variable que contiene el String (codigo de clase) del dialogo seleccionar
     * clase de la pantalla crear/editar
     */
    private String claseCodigoD;
    /**
     * Variable que contiene el String (codigo de longitud) del dialogo
     * seleccionar longitud de la pantalla principal
     */
    private String longitud;
    /**
     * Variable que contiene el String (codigo de longitud) del dialogo
     * seleccionar longitud de la pantalla crear/editar
     */
    private String longitudD;
    /**
     * Variable de tipo boleano (TRUE o FALSE) que indica si la clase
     * seleccionada en la pantalla principal es un arma de fuego
     */
    private Boolean isArmaFuego;
    /**
     * Variable de tipo boleano (TRUE o FALSE) que indica si la clase
     * seleccionada en la pantalla crear/editar es un arma de fuego
     */
    private Boolean isArmaFuegoD;
    /**
     * Constante usada para referirse a la clase arma de fuego
     */
    private final String CODIGOARMADEFUEGO = "0010000001";

    @ManagedProperty(value = "#{unidadTipoController}")
    private UnidadTipoController unidadTipoController;

    /**
     * Map que contiene los criterios de busqueda de una tabla previos a los
     * criterios de creacion.
     */
    private Map<String, String> mfiltersBKP = new HashMap<String, String>();

    public TiposArmasExplosivosController() throws Exception {
        super(TarmTipoArmaExplosivo.class);
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        isArmaFuego = false;
        isArmaFuegoD = false;
        super.startQuery();

    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            recperpage = 15; // Cambiar al # reg a mirar.
            lrecord = new ArrayList<>();
            beanalias = "TIPOARMAEXPLOSIVO";
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Crea una instancia de TgeneTransactionProcess y marca el registro como
     * nuevo.
     *
     * @throws Exception
     */
    @Override
    public void create() throws Exception {
        super.create();
        super.addField("clasedescriptionD", null);
        super.addField("longituddescriptionD", null);
        super.addField("tipodescriptionD", null);
        super.addField("calibredescriptionD", null);
        super.addField("unidaddescriptionD", null);
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {
        try {
            DtoQuery dto = super.getDtoQuery(true);
            dto.setOrderby("t.pk");
            // Subquery
            SubQuery subqueryClase = new SubQuery("TgeneCatalogDetail",
                    "description", "nclase",
                    "i.pk.catalog = t.clase and i.pk.catalogcode = t.clasecodigo");
            dto.addSubQuery(subqueryClase);

            SubQuery subqueryLongitud = new SubQuery("TgeneCatalogDetail",
                    "description", "nlongitud",
                    "i.pk.catalog = t.longitud and i.pk.catalogcode = t.longitudcodigo");
            dto.addSubQuery(subqueryLongitud);

            SubQuery subqueryTipoArmaExplosivo = new SubQuery(
                    "TgeneCatalogDetail",
                    "description",
                    "ntipo",
                    "i.pk.catalog = t.tipoarmaexplosivo and i.pk.catalogcode = t.tipoarmaexplosivocodigo");
            dto.addSubQuery(subqueryTipoArmaExplosivo);

            SubQuery subqueryCalibre = new SubQuery("TgeneCatalogDetail",
                    "description", "ncalibre",
                    "i.pk.catalog = t.calibre and i.pk.catalogcode = t.calibrecodigo");
            dto.addSubQuery(subqueryCalibre);

            SubQuery subqueryUnidad = new SubQuery("TgeneCatalogDetail",
                    "description", "nunidadMedidaPeso",
                    "i.pk.catalog = t.unidadmedidapeso and i.pk.catalogcode = t.unidadmedidapesocodigo");
            dto.addSubQuery(subqueryUnidad);

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

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

            Response resp = callerhelper.executeQuery(request);

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

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

    /**
     * ?
     */
    protected void queryDatbase(String longitud, String calibre) {
        try {
            DtoQuery dto = super.getDtoQuery(true);
            dto.setOrderby("t.pk");
            // Subquery
            if (longitud == null && calibre == null) {
                Filter longitudFiltro = new Filter();
                longitudFiltro
                        .setSql("t.longitud is null and t.calibre is null");
                dto.addFiltro(longitudFiltro);
            } else if (longitud == null) {
                Filter longitudFiltro = new Filter();
                longitudFiltro.setSql("t.longitud is null");
                dto.addFiltro(longitudFiltro);
            } else if (calibre == null) {
                Filter calibreFiltro = new Filter();
                calibreFiltro.setSql("t.calibre is null");
                dto.addFiltro(calibreFiltro);
            }

            SubQuery subqueryClase = new SubQuery("TgeneCatalogDetail",
                    "description", "nclase",
                    "i.pk.catalog = t.clase and i.pk.catalogcode = t.clasecodigo");
            dto.addSubQuery(subqueryClase);

            SubQuery subqueryLongitud = new SubQuery("TgeneCatalogDetail",
                    "description", "nlongitud",
                    "i.pk.catalog = t.longitud and i.pk.catalogcode = t.longitudcodigo");
            dto.addSubQuery(subqueryLongitud);

            SubQuery subqueryTipoArmaExplosivo = new SubQuery(
                    "TgeneCatalogDetail",
                    "description",
                    "ntipo",
                    "i.pk.catalog = t.tipoarmaexplosivo and i.pk.catalogcode = t.tipoarmaexplosivocodigo");
            dto.addSubQuery(subqueryTipoArmaExplosivo);

            SubQuery subqueryCalibre = new SubQuery("TgeneCatalogDetail",
                    "description", "ncalibre",
                    "i.pk.catalog = t.calibre and i.pk.catalogcode = t.calibrecodigo");
            dto.addSubQuery(subqueryCalibre);

            SubQuery subunidad = new SubQuery(
                    "TgeneCatalogDetail",
                    "description",
                    "desunidad",
                    "i.pk.catalog = t.pk.unidadmedidapeso and  i.pk.catalogcode=t.pk.unidadmedidapesocodigo");
            dto.addSubQuery(subunidad);

            SubQuery subunidadlegalcode = new SubQuery(
                    "TgeneCatalogDetail",
                    "legalcode",
                    "deslegalcode",
                    "i.pk.catalog = t.pk.unidadmedidapeso and  i.pk.catalogcode=t.pk.unidadmedidapesocodigo");
            dto.addSubQuery(subunidadlegalcode);

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

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

            Response resp = callerhelper.executeQuery(request);

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

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

    @Override
    public void save() {
        try {

            DtoSave dtosave = super.getDtoSave();
            if (!dtosave.pendingProcess()) {
                return;
            }
            dtosave.setReturnpk(true); // Para que el core devuelva el pk de los registros nuevos.
            dtosave.setPosition(2);

            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

            Request request = callerhelper.getRequest();
            msave.put(beanalias, dtosave); // adicionar metadata de
            // mantenimiento para cada tabla.

            TarmUnidadTipo tipoUnidadSeleccionada = UnidadTipoController.findByClaseAndClasecode(record.getClase(), record.getClasecodigo(), record.getTipoarmaexplosivo(), record.getUnidadmedidapeso());
            if (tipoUnidadSeleccionada == null) {
                TarmUnidadTipoKey tarmUnidadTipoKey = new TarmUnidadTipoKey();
                tarmUnidadTipoKey.setClase(record.getClase());
                tarmUnidadTipoKey.setClasecode(record.getClasecodigo());

                tarmUnidadTipoKey.setTipoarmaexplosivo(record.getTipoarmaexplosivo());
                tarmUnidadTipoKey.setTipoarmaexplosivocodigo(record.getTipoarmaexplosivocodigo());

                tarmUnidadTipoKey.setUnidadmedidapeso(record.getUnidadmedidapeso());
                tarmUnidadTipoKey.setUnidadmedidapesocodigo(record.getUnidadmedidapesocodigo());

                tipoUnidadSeleccionada = new TarmUnidadTipo();
                tipoUnidadSeleccionada.setPk(tarmUnidadTipoKey);
                tipoUnidadSeleccionada.setRecordversion(0);
                tipoUnidadSeleccionada.setIsnew(Boolean.TRUE);
                tipoUnidadSeleccionada.setFecharegistro(new Date(new java.util.Date().getTime()));

                unidadTipoController.update(tipoUnidadSeleccionada);
            }

            DtoSave dtosaveUnidadTipo = unidadTipoController.getDtoSave(true);
            dtosaveUnidadTipo.setPosition(1);
            msave.put(unidadTipoController.getBeanalias(), dtosaveUnidadTipo);

            request.setSaveTables(msave);
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                this.unidadTipoController.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);
    }

    public String getClase() {
        return clase;
    }

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

    public String getClaseCodigo() {
        return claseCodigo;
    }

    public void setClaseCodigo(String claseCodigo) {
        this.claseCodigo = claseCodigo;
    }

    public String getLongitud() {
        return longitud;
    }

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

    public Boolean getIsArmaFuego() {
        return isArmaFuego;
    }

    public Boolean getIsArmaFuegoD() {
        return isArmaFuegoD;
    }

    public void setIsArmaFuegoD(Boolean isArmaFuegoD) {
        this.isArmaFuegoD = isArmaFuegoD;
    }

    public String getClaseD() {
        return claseD;
    }

    public void setClaseD(String claseD) {
        this.claseD = claseD;
    }

    public String getClaseCodigoD() {
        return claseCodigoD;
    }

    public void setClaseCodigoD(String claseCodigoD) {
        this.claseCodigoD = claseCodigoD;
    }

    public String getLongitudD() {
        return longitudD;
    }

    public void setLongitudD(String longitudD) {
        this.longitudD = longitudD;
    }

    public Map<String, String> getMfiltersBKP() {
        return mfiltersBKP;
    }

    public void setMfiltersBKP(Map<String, String> mfiltersBKP) {
        this.mfiltersBKP = mfiltersBKP;
    }

    public UnidadTipoController getUnidadTipoController() {
        return unidadTipoController;
    }

    public void setUnidadTipoController(UnidadTipoController unidadTipoController) {
        this.unidadTipoController = unidadTipoController;
    }

    /**
     * Metodo utilizado para limpiar las variables que contienen las
     * descripciones de los dialogos de seleccion de la pantalla principal
     */
    public void actualizarElementosBusqueda(String tipoBusqueda) {
        if (tipoBusqueda.equals("todo")) {
            super.addField("clasedescription", null);
            super.addField("longituddescription", null);
            super.addField("tipodescription", null);
            super.addField("calibredescription", null);
            super.getMfilters().remove("clase");
            super.getMfilters().remove("clasecodigo");
            super.getMfilters().remove("longitud");
            super.getMfilters().remove("longitudcodigo");
            super.getMfilters().remove("tipoarmaexplosivo");
            super.getMfilters().remove("tipoarmaexplosivocodigo");
            super.getMfilters().remove("calibre");
            super.getMfilters().remove("calibrecodigo");
        } else if (tipoBusqueda.equals("clase")) {
            super.addField("longituddescription", null);
            super.addField("tipodescription", null);
            super.addField("calibredescription", null);
            super.getMfilters().remove("longitud");
            super.getMfilters().remove("longitudcodigo");
            super.getMfilters().remove("tipoarmaexplosivo");
            super.getMfilters().remove("tipoarmaexplosivocodigo");
            super.getMfilters().remove("calibre");
            super.getMfilters().remove("calibrecodigo");
        } else if (tipoBusqueda.equals("longitud")) {
            super.addField("tipodescription", null);
            super.addField("calibredescription", null);
            super.getMfilters().remove("tipoarmaexplosivo");
            super.getMfilters().remove("tipoarmaexplosivocodigo");
            super.getMfilters().remove("calibre");
            super.getMfilters().remove("calibrecodigo");
        } else if (tipoBusqueda.equals("tipo")) {
            super.addField("calibredescription", null);
            super.getMfilters().remove("calibre");
            super.getMfilters().remove("calibrecodigo");
        }
    }

    /**
     * Metodo utilizado para limpiar las variables que contienen las
     * descripciones de los dialogos de seleccion de la pantalla crear/editar
     */
    public void actualizarElementosBusquedaDialog(String tipoBusqueda) {
        if (tipoBusqueda.equals("clase")) {
            super.addField("longituddescriptionD", null);
            super.addField("tipodescriptionD", null);
            super.addField("calibredescriptionD", null);
            super.addField("unidaddescriptionD", null);
        } else if (tipoBusqueda.equals("longitud")) {
            super.addField("tipodescriptionD", null);
            super.addField("calibredescriptionD", null);
            super.addField("unidaddescriptionD", null);
        } else if (tipoBusqueda.equals("tipo")) {
            super.addField("calibredescriptionD", null);
            super.addField("unidaddescriptionD", null);
        }
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar clase de la pantalla
     * principal y del dialogo crear/editar
     */
    public void openClaseLov() {
        try {
            Map<String, List<String>> params = new HashMap<>();
            List<String> lcat = new ArrayList<>();
            lcat.add("CLASE");
            params.put("catalogcode", lcat);
            //tITULO DEL LOV
            List<String> ltituloLOV = new ArrayList<>();
            ltituloLOV.add("lov_unidades");
            params.put("tituloLOV", ltituloLOV);
            ClaseLovController.openLov(params);
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar clase de la pantalla
     * principal y del dialogo crear/editar
     */
    public void openUnidadLov() {
        try {
            Map<String, List<String>> params = new HashMap<>();
            // CATALOGCODE
            List<String> lcatalogcode = new ArrayList<>();
            lcatalogcode.add("UNIDADMEDIDA");
            params.put("catalogcode", lcatalogcode);
            //tITULO DEL LOV
            List<String> ltituloLOV = new ArrayList<>();
            ltituloLOV.add("lov_unidades");
            params.put("tituloLOV", ltituloLOV);
            ClaseLovController.openLov(params);
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * clase de la pantalla principal
     */
    public void onReturnClaseLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addFilter("clase", t.getPk().getCatalog());
        super.addFilter("clasecodigo", t.getPk().getCatalogcode());
        clase = t.getPk().getCatalog();
        claseCodigo = t.getPk().getCatalogcode();
        if (clase.equalsIgnoreCase(CODIGOARMADEFUEGO)) {
            isArmaFuego = true;
        } else {
            isArmaFuego = false;
        }
        super.addField("clasedescription", t.getDescription());
        actualizarElementosBusqueda("clase");
        this.query();
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * clase de la pantalla principal
     */
    public void onReturnUnidadDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addField("unidaddescriptionD", t.getDescription());
        this.record.setUnidadmedidapeso(t.getPk().getCatalog());
        this.record.setUnidadmedidapesocodigo(t.getPk().getCatalogcode());
        unidadMedidaPesoD = t.getPk().getCatalog();
        unidadMedidaPesoCodigoD = t.getPk().getCatalogcode();
        this.record.put("nunidadMedidaPeso", t.getDescription());
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * clase de la pantalla crear/editar
     */
    public void onReturnClaseDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        claseD = t.getPk().getCatalog();
        claseCodigoD = t.getPk().getCatalogcode();
        if (claseD.equalsIgnoreCase(CODIGOARMADEFUEGO)) {
            isArmaFuegoD = true;
        } else {
            isArmaFuegoD = false;
        }
        super.addField("clasedescriptionD", t.getDescription());
        this.record.setClase(t.getPk().getCatalog());
        ;
        this.record.setClasecodigo(t.getPk().getCatalogcode());
        record.put("nclase", t.getDescription());
        actualizarElementosBusquedaDialog("clase");
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar longitud de la pantalla
     * principal
     */
    public void openLogitudLov() {
        if (clase != null && claseCodigo != null) {
            Map<String, List<String>> params = new HashMap<>();
            LongitudLovController.openLov(params);
        } else {
            MessageHelper
                    .setMessageError("POR FAVOR SELECCIONE UNA CLASE DE ARMA O EXPLOSIVO");
        }
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar longitud de la pantalla
     * crear/editar
     */
    public void openLogitudDialogLov() {
        if (claseD != null && claseCodigoD != null) {
            Map<String, List<String>> params = new HashMap<>();
            LongitudLovController.openLov(params);
        } else {
            MessageHelper
                    .setMessageError("POR FAVOR SELECCIONE UNA CLASE DE ARMA O EXPLOSIVO");
        }
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * longitud de la pantalla principal
     */
    public void onReturnLogitudLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addFilter("longitud", t.getPk().getCatalog());
        super.addFilter("longitudcodigo", t.getPk().getCatalogcode());
        longitud = t.getPk().getCatalog();
        super.addField("longituddescription", t.getDescription());
        actualizarElementosBusqueda("longitud");
        this.query();
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * longitud de la pantalla crear/editar
     */
    public void onReturnLogitudDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        longitudD = t.getPk().getCatalog();
        super.addField("longituddescriptionD", t.getDescription());
        this.record.setLongitud(longitudD);
        this.record.setLongitudcodigo(t.getPk().getCatalogcode());
        record.put("nlongitud", t.getDescription());
        actualizarElementosBusquedaDialog("longitudD");
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar tipo de arma o explosivo
     * de la pantalla principal
     */
    public void openTipoLov() {

        if (clase != null && claseCodigo != null) {
            Map<String, List<String>> params = new HashMap<>();
            List<String> valuesArmaFuego = new ArrayList<String>();
            valuesArmaFuego.add(isArmaFuego.toString());
            params.put("isArmaFuego", valuesArmaFuego);
            if (isArmaFuego) {
                List<String> valuesLongitud = new ArrayList<String>();
                valuesLongitud.add(longitud);
                params.put("longitud", valuesLongitud);
            } else {
                List<String> valuesClase = new ArrayList<String>();
                valuesClase.add(clase);
                params.put("clase", valuesClase);
            }
            TipoArmaExpLovController.openLov(params);
        } else {
            MessageHelper
                    .setMessageError("POR FAVOR SELECCIONE UNA CLASE DE ARMA O EXPLOSIVO");
        }
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar tipo de arma o explosivo
     * de la pantalla crear/editar
     */
    public void openTipoDialogLov() {
        if (record.isnew) {
            if (claseD != null && claseCodigoD != null) {
                Map<String, List<String>> params = new HashMap<>();
                List<String> valuesArmaFuego = new ArrayList<String>();
                valuesArmaFuego.add(isArmaFuegoD.toString());
                params.put("isArmaFuego", valuesArmaFuego);
                if (isArmaFuegoD) {
                    List<String> valuesLongitud = new ArrayList<String>();
                    valuesLongitud.add(longitudD);
                    params.put("longitud", valuesLongitud);
                } else {
                    List<String> valuesClase = new ArrayList<String>();
                    valuesClase.add(claseD);
                    params.put("clase", valuesClase);
                }
                TipoArmaExpLovController.openLov(params);
            } else {
                MessageHelper
                        .setMessageError("POR FAVOR SELECCIONE UNA CLASE DE ARMA O EXPLOSIVO");
            }
        } else {
            Map<String, List<String>> params = new HashMap<>();
            List<String> valuesArmaFuego = new ArrayList<String>();
            valuesArmaFuego.add(isArmaFuegoD.toString());
            params.put("isArmaFuego", valuesArmaFuego);
            if (isArmaFuegoD) {
                List<String> valuesLongitud = new ArrayList<String>();
                valuesLongitud.add(longitudD);
                params.put("longitud", valuesLongitud);
            } else {
                List<String> valuesClase = new ArrayList<String>();
                valuesClase.add(claseD);
                params.put("clase", valuesClase);
            }
            TipoArmaExpLovController.openLov(params);
        }
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * tipo de arma o explosivo de la pantalla principal
     */
    public void onReturnTipoLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addFilter("tipoarmaexplosivo", t.getPk().getCatalog());
        super.addFilter("tipoarmaexplosivocodigo", t.getPk().getCatalogcode());
        super.addField("tipodescription", t.getDescription());
        actualizarElementosBusqueda("tipo");
        this.query();
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * tipo de arma o explosivo de la pantalla crear/editar
     */
    public void onReturnTipoDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addField("tipodescriptionD", t.getDescription());
        this.record.setTipoarmaexplosivo(t.getPk().getCatalog());
        ;
        this.record.setTipoarmaexplosivocodigo(t.getPk().getCatalogcode());
        record.put("ntipo", t.getDescription());
        actualizarElementosBusquedaDialog("tipo");
    }

    /**
     * Metodo usado para abrir el dialogo seleccionar calibre de arma o
     * explosivo de la pantalla principal y del dialogo crear/editar
     */
    public void openCalibreLov() {
        Map<String, List<String>> params = new HashMap<>();
        CalibreLovController.openLov(params);
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * calibre de la pantalla principal
     */
    public void onReturnCalibreLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addFilter("calibre", t.getPk().getCatalog());
        super.addFilter("calibrecodigo", t.getPk().getCatalogcode());
        super.addField("calibredescription", t.getDescription());
        this.query();
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * calibre de la pantalla crear/editar
     */
    public void onReturnCalibreDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addField("calibredescriptionD", t.getDescription());
        this.record.setCalibre(t.getPk().getCatalog());
        this.record.setCalibrecodigo(t.getPk().getCatalogcode());
        record.put("ncalibre", t.getDescription());
    }

    /**
     * Metodo que actualiza las descripciones seleccionadas en el dialogo
     * crear/editar a la variable record y calcula valor de la variable
     * isArmaFuegoD
     */
    public void actualizar() {
        super.addField("clasedescriptionD", record.get("nclase"));
        super.addField("longituddescriptionD", record.get("nlongitud"));
        super.addField("tipodescriptionD", record.get("ntipo"));
        super.addField("calibredescriptionD", record.get("ncalibre"));
        super.addField("unidaddescriptionD", record.get("nunidadMedidaPeso"));
        claseD = record.getClase();
        claseCodigoD = record.getClasecodigo();
        if (record.getClase().equalsIgnoreCase(CODIGOARMADEFUEGO)) {
            isArmaFuegoD = true;
            longitudD = record.getLongitud();
        } else {
            isArmaFuegoD = false;
        }
    }

    @Override
    public void update() throws Exception {
        if (record.getClase() != null) {
            if (record.getClase().equalsIgnoreCase(CODIGOARMADEFUEGO)) {
                if (record.getLongitud() != null) {
                    if (record.getTipoarmaexplosivo() != null) {
                        if (record.getCalibre() != null) {
                            if (record.getUnidadmedidapeso() != null) {
                                super.update();
                            } else {
                                MessageHelper.setMessageError("SELECCIONE UNA UNIDAD PARA EL ARMA O EXPLOSIVO");
                            }
                        } else {
                            MessageHelper
                                    .setMessageError("SELECCIONE UN CALIBRE PARA EL ARMA O EXPLOSIVO");
                        }
                    } else {
                        MessageHelper
                                .setMessageError("SELECCIONE UN TIPO PARA EL ARMA O EXPLOSIVO");
                    }
                } else {
                    MessageHelper
                            .setMessageError("SELECCIONE UNA LONGITUD PARA EL ARMA O EXPLOSIVO");
                }
            } else if (record.getTipoarmaexplosivo() != null) {
                if (record.getUnidadmedidapeso() != null) {
                    super.update();
                } else {
                    MessageHelper.setMessageError("SELECCIONE UNA UNIDAD PARA EL ARMA O EXPLOSIVO");
                }
            } else {
                MessageHelper.setMessageError("SELECCIONE UN TIPO DE ARMA O EXPLOSIVO");
            }
        } else {
            MessageHelper.setMessageError("SELECCIONE UNA CLASE DE ARMA O EXPLOSIVO");
        }
    }

    /**
     * Find para encontrar las caracteristicas del arma mediante el pk. ctipo -
     * tipo de arma o explosivo
     */
    public static TarmTipoArmaExplosivo findarma(String ctipo) {
        try {
            if (ctipo == null) {
                return null;
            }
            TiposArmasExplosivosController cc = new TiposArmasExplosivosController();

            cc.init();
            cc.recperpage = 300;
            cc.addFilter("pk", ctipo);
            cc.querydatabase();

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

    }

    /**
     * Find para encontrar el pk del arma mediante las caracteristicas. Andres
     * Cevallos
     */
    public static TarmTipoArmaExplosivo findpk(String longitud, String calibre,
            String clase, String tipoarmaexplosivo) {
        try {
            TiposArmasExplosivosController cc = new TiposArmasExplosivosController();

            cc.init();
            cc.recperpage = 300;
            cc.addFilter("longitud", longitud);
            cc.addFilter("calibre", calibre);
            cc.addFilter("clase", clase);
            cc.addFilter("tipoarmaexplosivo", tipoarmaexplosivo);
            cc.queryDatbase(longitud, calibre);

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

    /**
     * Find para encontrar el pk del arma mediante las caracteristicas. Andres
     * Cevallos
     */
    public static TarmTipoArmaExplosivo findByClaseLongitudCalibreTipoArma(String longitud, String calibre, String clase,
            String tipoarmaexplosivo, String unidadmedidapeso) {
        try {
            TiposArmasExplosivosController cc = new TiposArmasExplosivosController();

            cc.init();
            cc.recperpage = 300;
            cc.addFilter("longitud", longitud);
            cc.addFilter("calibre", calibre);
            cc.addFilter("clase", clase);
            cc.addFilter("tipoarmaexplosivo", tipoarmaexplosivo);
            cc.addFilter("unidadmedidapeso", unidadmedidapeso);
            cc.queryDatbase(longitud, calibre);

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

    /**
     * Find para encontrar el pk del arma mediante las caracteristicas. FPazmino
     * Cevallos
     */
    public static TarmTipoArmaExplosivo findByClaseCalibreTipoArma(String clase, String calibre,
            String tipoarmaexplosivo, String unidadmedidapeso) {
        try {
            TiposArmasExplosivosController cc = new TiposArmasExplosivosController();

            cc.init();
            cc.recperpage = 300;
            cc.addFilter("clase", clase);
            cc.addFilter("calibre", calibre);
            cc.addFilter("tipoarmaexplosivo", tipoarmaexplosivo);
            cc.addFilter("unidadmedidapeso", unidadmedidapeso);
            cc.queryDatbase(null, calibre);
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Metodo que busca una combinacion de tipo arma explosivo por la clase y el
     * tipo de arma pasados como parametro
     *
     * @param clase
     * @param tipoarmaexplosivo
     * @return
     */
    public static TarmTipoArmaExplosivo findByClaseTipo(String clase,
            String tipoarmaexplosivo, String unidadmedidapeso) {
        try {
            TiposArmasExplosivosController cc = new TiposArmasExplosivosController();

            cc.init();
            cc.recperpage = 300;
            cc.addFilter("clase", clase);
            cc.addFilter("tipoarmaexplosivo", tipoarmaexplosivo);
            cc.addFilter("unidadmedidapeso", unidadmedidapeso);
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Metodo que busca todas las combinaciones de tipos armas explosivos por la
     * clase y el tipo de arma pasados como parametro
     *
     * @param clase
     * @param tipoarmaexplosivo
     * @return
     */
    public static List<TarmTipoArmaExplosivo> findByClaseTipoAll(String clase,
            String tipoarmaexplosivo) {
        try {
            TiposArmasExplosivosController cc = new TiposArmasExplosivosController();

            cc.init();
            cc.recperpage = 300;
            cc.addFilter("clase", clase);
            cc.addFilter("tipoarmaexplosivo", tipoarmaexplosivo);
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord;
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

}
