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

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
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.collections.CollectionUtils;
import org.apache.commons.collections.PredicateUtils;
import org.apache.commons.collections.TransformerUtils;
import org.apache.commons.lang.StringUtils;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import com.fp.common.helper.Constant;
import com.fp.dto.AbstractDataTransport;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.ReportController;
import com.fp.frontend.controller.armas.eval.EvaluacionController;
import com.fp.frontend.controller.armas.funcionalidad.CargaController;
import com.fp.frontend.controller.armas.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.lov.CargasLovController;
import com.fp.frontend.controller.armas.parametros.BuscarTramiteLovController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.ClaseLovController;
import com.fp.frontend.controller.armas.parametros.GuardiasController;
import com.fp.frontend.controller.armas.parametros.OrigenTramiteController;
import com.fp.frontend.controller.armas.parametros.RequisitoPorTramiteController;
import com.fp.frontend.controller.armas.parametros.TarmCentroControlJurController;
import com.fp.frontend.controller.pcustomer.PeopleController;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pcustomer.PersonPhoneController;
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.ParametersController;
import com.fp.frontend.controller.pgeneral.gene.ParroquiaController;
import com.fp.frontend.controller.pgeneral.gene.ProvinceController;
import com.fp.frontend.controller.pgeneral.safe.UserDetailController;
import com.fp.frontend.controller.security.LoginController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.CommonTransformer;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.frontend.utility.MsgGeneral;
import com.fp.frontend.utility.Utilidades;
import com.fp.frontend.webservices.snap.cedula.ClienteCedula;
import com.fp.frontend.webservices.snap.ruc.ClienteRUC;
import com.fp.persistence.parmas.fun.TarmCarga;
import com.fp.persistence.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmCentroControlJur;
import com.fp.persistence.parmas.param.TarmOrigenTramite;
import com.fp.persistence.parmas.param.TarmRequisitoPorTipoTramite;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmAgenciaSucursal;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.parmas.soli.TarmGuardias;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudAgenciaSucursal;
import com.fp.persistence.parmas.soli.TarmSolicitudArmas;
import com.fp.persistence.parmas.soli.TarmSolicitudDocumento;
import com.fp.persistence.parmas.soli.TarmSolicitudGuardias;
import com.fp.persistence.parmas.soli.TarmSolicitudRequisitos;
import com.fp.persistence.parmas.soli.TarmSolicitudRequisitosKey;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonPhone;
import com.fp.persistence.pgeneral.gene.TgeneCanton;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneCity;
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;

import ec.gob.registrocivil.consultacedula.Cedula;
import ec.gov.sri.wsconsultacontribuyente.Contribuyente;

/**
 * Clase controladora de ingreso de tramites de control de armas.
 *
 * @author Jorge Vaca.
 * @author dcruz
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class TramiteArmasController extends AbstractController<AbstractDataTransport> {

    private Boolean mostrarFiltroAUCP = Boolean.FALSE;

    private String filterAUCP;

    /**
     * Responsable de centro de control
     */
    private TcustPersonDetail responsableCentroControl = null;
    /**
     * Detalle de Usuarios
     */
    private TsafeUserDetail tsafeUserDetailUsuario = null;
    /**
     * Referencia al Centro de control;
     */
    private TarmCentroControl centroControl = new TarmCentroControl();
    /**
     * Nombre de la Institucion
     */
    private String nombreInstitucion;
    /**
     * Lista de tipos de persona.
     */
    private List<TgeneCatalogDetail> ltipopersona;

    /**
     * Atributo para la lista de objetos TgeneCatalogDetail de
     * identificaci&oacute;n
     */
    private List<TgeneCatalogDetail> ltipopago;

    /**
     * Atributo para la lista de objetos TgeneCatalogDetail de
     * identificaci&oacute;n
     */
    private List<TgeneCatalogDetail> ltipoidenti;

    /**
     * Lista de tipos de tr&aacute;mite.
     */
    private List<TgeneCatalogDetail> ltipotramite;

    /**
     * Lista de origen de adquisici&oacute;n
     */
    private List<TgeneCatalogDetail> lorigenadquisicion;

    /**
     * Lista de origen de tipos de pagos
     */
    /**
     * Lista de provincias
     */
    private List<TgeneProvince> lprovincias;

    /**
     * Lista de cantones de origen
     */
    private List<TgeneCanton> lcantonOrigen;

    /**
     * Lista de cantones de destino
     */
    private List<TgeneCanton> lcantonDestino;
    /**
     * Longitud de la identificacion de una persona.
     */
    private Integer longitudid;

    /**
     * Indica si se debe activar la pestana de ingresar requisitos
     */
    private boolean ingresarRequisitos;

    /**
     * Indica si se debe activar la pestana de seleccionar armas
     */
    private boolean seleccionarArmas;

    /**
     * Indica si se debe activar la pestana seleccionar guardias
     */
    private boolean seleccionarGuardias;

    /**
     * Indica si se debe activar la pestana seleccionar agencias
     */
    private boolean seleccionarAgencias;

    /**
     * Indica si se debe activar la pestana listar guardias
     */
    private boolean listarDocumentos;

    /**
     * Atributo para activar el keyFilter
     */
    private boolean activarRegExIdentificacion;

    /**
     * Indica si el flujo ya fue iniciado, sirve para controlar que no iniciar
     * el flujo mas de una vez.
     */
    private boolean flujoiniciado = false;

    private boolean esaprobacion = false;

    /**
     * Deshabilita la pantalla despu&eacute;s de grabar la solicitud
     */
    private boolean deshabilitarPantalla;

    /**
     * Muestra el bot&oacute;n de ingreso de armas
     */
    private boolean mostrarIngresoArmas;
    /**
     * codigo de la persona que hace la solicitud
     */
    private Integer cpersona = 0;
    /**
     * Atributo que oculpa botones del flujo
     */
    private boolean ocultarBotonInicioFlujo = true;

    /**
     * Fecha actual
     */
    private Date fechaActual = new Date();

    private String csolicitud;

    /**
     * Bandera de tipo booleano para indicar si se ha grabado el reporte
     * generado
     *
     */
    private Boolean isEnableGrabar;
    /**
     * Tr&aacute;mite seleccionado
     */
    private TarmTramite tarmTramite;

    /**
     * Habilita campos en actualizaci&oacute;n de datos generales
     */
    private boolean actualizaDatosGenerales;

    /**
     * Aprueba si es gu&iacute;a de libre tr&aacute;nsito
     */
    private boolean guiaLibreTransito;

    /**
     * Lista Personas vendedoreas
     */
    private Set<TcustPersonDetail> listaPersonasDetailVen;
    /**
     * Vendedor seleccionado
     */
    private Integer selecionaCodigoVendedor;

    /**
     * Controlador de login
     */
    @ManagedProperty(value = "#{loginController}")
    private LoginController login;

    /**
     * Controlador que maneja el usuario
     */
    @ManagedProperty(value = "#{userDetailController}")
    private UserDetailController detalleusuario;

    /**
     * Controlador que maneja las armas dentro de la solicitud
     */
    @ManagedProperty(value = "#{solicitudArmasController}")
    private SolicitudArmasController solicitud;

    /**
     * Controlador que maneja cargas para previa importacion
     */
    @ManagedProperty(value = "#{cargaController}")
    private CargaController cargaController;

    /**
     * Controlador que maneja la persona
     */
    @ManagedProperty(value = "#{personDetailController}")
    private PersonDetailController detallepersona;

    /**
     * Controlador que maneja los datos de personas naturales
     */
    @ManagedProperty(value = "#{peopleController}")
    private PeopleController natural;

    /**
     * Controlador que maneja direcciones de la persona
     */
    @ManagedProperty(value = "#{personAddressController}")
    private PersonAddressController direccion;

    /**
     * Controlador que maneja tel&eacute;fonos de la persona
     */
    @ManagedProperty(value = "#{personPhoneController}")
    private PersonPhoneController telefono;

    /**
     * Controlador que maneja requisitos dentro de la solicitud
     */
    @ManagedProperty(value = "#{solicitudRequisitosController}")
    private SolicitudRequisitosController requisitos;

    /**
     * Controlador que maneja los requisitos
     */
    @ManagedProperty(value = "#{requisitoPorTramiteController}")
    private RequisitoPorTramiteController requisitoPorTramite;

    /**
     * Controlador que maneja guardias
     */
    @ManagedProperty(value = "#{guardiasController}")
    private GuardiasController guardias;

    /**
     * Controlador que maneja los guardias en la solicitud
     */
    @ManagedProperty(value = "#{solicitudGuardiasController}")
    private SolicitudGuardiasController solicitudGuardias;

    /**
     * Controlador que maneja armas
     */
    @ManagedProperty(value = "#{armasController}")
    private ArmasController armas;

    /**
     * Controlador que maneja las armas dentro de la solicitud
     */
    @ManagedProperty(value = "#{recepcionArmasController}")
    private RecepcionArmasController solicitudArmas;

    /**
     * Controlador que maneja registro de armas
     */
    @ManagedProperty(value = "#{registroArmController}")
    private RegistroArmController registroArmas;

    /**
     * Controlador que maneja agencias y sucursales
     */
    @ManagedProperty(value = "#{agenciaSucursalController}")
    private AgenciaSucursalController agenciaSucursal;

    /**
     * Controlador que maneja las agencias y sucursales dentro de la solicitud
     */
    @ManagedProperty(value = "#{solicitudAgenciaSucursalController}")
    private SolicitudAgenciaSucursalController solicitudAgenciaSucursal;

    /**
     * Controlador que maneja los documentos habilitantes
     */
    @ManagedProperty(value = "#{documentoHabilitanteController}")
    private DocumentoHabilitanteController documentoHabilitante;

    /**
     * Controlador que maneja los documentos dentro de la solicitud
     */
    @ManagedProperty(value = "#{tarmSolicitudDocumentoController}")
    private TarmSolicitudDocumentoController solicitudDocumento;
    /**
     * Controlador Inyectado ReportController
     */
    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;
    /**
     * Controlador que maneja las evaluaciones de las personas
     */
    @ManagedProperty(value = "#{evaluacionController}")
    private EvaluacionController evaluacionController;
    /**
     * Controlador que maneja las armas asociadas a las agencias
     */
    @ManagedProperty(value = "#{agenciaArmaController}")
    private AgenciaArmaController agenciaArma;

    TgeneCatalogDetail tipoTramite = null;
    TgeneCatalogDetail tipoAutorizacion = null;
    TgeneCatalogDetail actividad = null;
    /**
     * codigo de la provincia del usuario logueado
     */
    private String cprovincia;

    private List<TarmCentroControl> centroControlList;
    /**
     * Atributo para la lista de objetos TgeneCatalogDetail
     */
    private List<TgeneCatalogDetail> tipoDocumento;

    /**
     * codigo del ruc
     */
    private String codigoRuc;
    /**
     * codigo del ruc
     */
    private String codigoCedula;

    /**
     * codigo del ruc
     */
    private String codigoPasaporte;
    /**
     * NUMERO BASE DE SOLICITUD
     */
    private String numeroSolicitudBase;
    /**
     * Atributo para setear el vendedor
     */
    private TcustPersonDetail tcustPersonDetailVendedor;

    public TramiteArmasController() throws Exception {
        super(AbstractDataTransport.class);
    }

    @PostConstruct
    private void postconstruct() {
        try {
            this.init();
            ltipopersona = CatalogDetailController.find("PERSONTYPE");
            ltipoidenti = CatalogDetailController.find("IDENTIFICATION");
            ltipotramite = CatalogDetailController.find("TIPOTRAMITE");
            ltipopago = CatalogDetailController.find("TIPOPAGOSOLICITUD");
            lprovincias = ProvinceController.find("EC");
            lorigenadquisicion = new ArrayList<TgeneCatalogDetail>();
            // Inicializa autoconsulta
//	        super.startQuery();
            ocultarBotonInicioFlujo = true;
            isEnableGrabar = Boolean.TRUE;
            if (super.getMfilters().get("pk.csolicitud") != null) {
                esaprobacion = true;
            }
            centroControlList = CentroControlArmasController.findEstadoInst("Y", "1");//Departamento
            this.querydatabase();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     *
     * @throws Exception
     */
    private void init() throws Exception {
        this.beanalias = "SOLICITUD";
        this.responsableCentroControl = new TcustPersonDetail();
        this.tsafeUserDetailUsuario = new TsafeUserDetail();
        tipoDocumento = CatalogDetailController.find("IDENTIFICATION");
        listaPersonasDetailVen = new HashSet<>();
        tcustPersonDetailVendedor = null;
        codigoRuc = codigos("CODIGO.RUC");
        codigoCedula = codigos("CODIGO.CEDULA");
        codigoPasaporte = codigos("CODIGO.PASAPORTE");
        this.obtenerCentroControl();
        this.obtenerResponsableCentroControl();
    }

//    public String onFlowProcess(FlowEvent event) {
//        if (!flujoiniciado) {
//            this.saveCabecera();
//        }
//        return event.getNewStep();
//    }
    @Override
    public void save() {
        try {
            if (deshabilitarPantalla) {
                return;
            }
            try {
                if (!noValidaDocumentoHabilitante(tipoTramite, tipoAutorizacion, actividad)) {
                    MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_listardocumentos_solo"));
                    return;
                }
            } catch (Exception e) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_listardocumentos"));
                return;
            }

            //validamos si tcustPersonDetailPortador este lleno o si han seleccionado sin portador para asignarle el por default
            if (tcustPersonDetailVendedor == null && tarmTramite.getTipoautorizacion().equals("4")) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionesinportadoroverifiqueusuarioexistentevendedor"));
                return;
            }

            Request request = callerhelper.getRequest();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            solicitud.fijaPersona(detallepersona.getRecord());
            solicitud.fijaInicioFlujoEnNO();
            solicitud.update();

            DtoSave dtosavesol = solicitud.getDtoSave();
            dtosavesol.setIsForm(true);
            dtosavesol.setReturnpk(true);
            dtosavesol.setPosition(1);
            msave.put(solicitud.getBeanalias(), dtosavesol); // adicionar metadata de mantenimiento para cada tabla.

            DtoSave dtosavereq = requisitos.getDtoSave();
            dtosavereq.setReturnpk(true);
            dtosavereq.setPosition(2);
            msave.put(requisitos.getBeanalias(), dtosavereq); // adicionar metadata de mantenimiento para cada tabla.

            request.modifiedData().put("csolicitud", solicitud.getRecord().getPk());
            request.modifiedData().put("isnew", "N");
            request.setSaveTables(msave);

            //this.setearCodigoCentroControl();
            this.modificaDatosGenerales();

            this.actualizaDirecciones();

            this.actualizarTelefonos();

            //guardias
            this.copiaGuardias();

            //armas
            this.copiaArmas();

            //agencias
            this.copiaAgencias();

            //documentos
            this.copiaDocumentos();

            //agencia armas
            this.copiaAgenciaArmas();

            if (!validacionFormulario()) {
                return;
            }

            //guardias
            DtoSave dtosaveguardias = solicitudGuardias.getDtoSave();
            dtosaveguardias.setReturnpk(Boolean.TRUE);
            dtosaveguardias.setPosition(3);
            msave.put(solicitudGuardias.getBeanalias(), dtosaveguardias);

            //armas
            DtoSave dtosavearmas = solicitudArmas.getDtoSave();
            dtosavearmas.setReturnpk(Boolean.TRUE);
            dtosavearmas.setPosition(4);
            msave.put(solicitudArmas.getBeanalias(), dtosavearmas);

            //agencias
            DtoSave dtosaveagencias = solicitudAgenciaSucursal.getDtoSave();
            dtosaveagencias.setReturnpk(Boolean.TRUE);
            dtosaveagencias.setPosition(5);
            msave.put(solicitudAgenciaSucursal.getBeanalias(), dtosaveagencias);

            //solicitud_documentos
            DtoSave dtosavedocumentos = solicitudDocumento.getDtoSave();
            dtosavedocumentos.setReturnpk(Boolean.TRUE);
            dtosavedocumentos.setPosition(6);
            msave.put(solicitudDocumento.getBeanalias(), dtosavedocumentos);

            //direcciones
            DtoSave dtosavedirecciones = direccion.getDtoSave();
            dtosavedirecciones.setReturnpk(Boolean.TRUE);
            dtosavedirecciones.setPosition(7);
            msave.put(direccion.getBeanalias(), dtosavedirecciones);

            DtoSave dtosavetelefono = telefono.getDtoSave();
            dtosavetelefono.setReturnpk(Boolean.TRUE);
            dtosavetelefono.setPosition(8);
            msave.put(telefono.getBeanalias(), dtosavetelefono);

            DtoSave dtodatosgenerales = detallepersona.getDtoSave();
            dtodatosgenerales.setReturnpk(Boolean.TRUE);
            dtodatosgenerales.setPosition(9);
            msave.put(detallepersona.getBeanalias(), dtodatosgenerales);

            DtoSave dtosaveagenciaarmas = agenciaArma.getDtoSave();
            dtosaveagenciaarmas.setPosition(10);
            msave.put(agenciaArma.getBeanalias(), dtosaveagenciaarmas);

            //documentoHabilitante
            DtoSave dtosaveDocumentoHabilitante = documentoHabilitante.getDtoSave();
            dtosaveDocumentoHabilitante.setReturnpk(Boolean.TRUE);
            dtosaveDocumentoHabilitante.setPosition(11);
            msave.put(documentoHabilitante.getBeanalias(), dtosaveDocumentoHabilitante);

            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                managedSaveResponse(resp);
                // CATEGORIA 14	PREVIA IMPORTACION
                if (tarmTramite.getCategoria().equals("14")) {
                    asociarCargaSolicitud();
                }
                MessageHelper.setMessageInfo(resp);
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("RECUERDE", MsgControlArmas.getProperty("msg_recuerdeClickContinuarTramite")));
            } else {
                ocultarBotonInicioFlujo = true;
                MessageHelper.setMessageError(resp);
            }

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

    public void asociarCargaSolicitud() {
        try {
            TarmCarga carga = CargaController.findByAUCP(solicitud.getRecord().getAucp());
            if (carga != null) {
                carga.setCsolicitud(solicitud.getRecord().getPk());
                cargaController.update(carga);
                cargaController.save();
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void saveInicioFlujoEnYES() {
        try {

            solicitud.fijaInicioFlujoEnYES();
            solicitud.update();

            DtoSave dtoSolicitud = solicitud.getDtoSave();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

            Request request = callerhelper.getRequest();
            super.cleanRequest(request);
            msave.put(solicitud.getBeanalias(), dtoSolicitud); // adicionar metadata de mantenimiento para cada tabla.

            request.setSaveTables(msave);
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                solicitud.postCommit(resp);
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }

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

    private void managedSaveResponse(Response response) throws Exception {
        csolicitud = response.get("csolicitud").toString();
        solicitud.postCommit(response);
        requisitos.postCommit(response);
        solicitudGuardias.postCommit(response);
        solicitudArmas.postCommit(response);
        solicitudAgenciaSucursal.postCommit(response);
        solicitudDocumento.postCommit(response);
        // flujoiniciado = Boolean.TRUE;
        isEnableGrabar = Boolean.FALSE;
        deshabilitarPantalla = Boolean.TRUE;
        solicitud.getMfilelds().put("estadoSolicitud", "REGISTRADO");
    }

    /**
     * Metodo que valida si ha sido seleccionado ams de un documento en el
     * criterio validado
     *
     * @param tipoTramite
     * @param tipoAutorizacion
     * @param actividad
     * @return
     * @throws Exception
     */
    private boolean noValidaDocumentoHabilitante(TgeneCatalogDetail tipoTramite, TgeneCatalogDetail tipoAutorizacion, TgeneCatalogDetail actividad) throws Exception {
        int count = 0;
        if (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_reimpresion_tipo")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_perdida")).getPk().getCatalog())) {

            for (TarmDocumentoHabilitante documento : documentoHabilitante.getLrecord()) {
                if (documento.getModifiedData().get("seleccionado").equals(Boolean.TRUE)) {
                    count++;
                }
                if (count > 1) {
                    return false;
                }
            }
            if (count == 0) {
                throw new Exception(MsgControlArmas.getProperty("msg_error_listardocumentos"));

            }
        }

        if ((tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_reimpresion_tipo")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_permiso")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_perdida")).getPk().getCatalog()))
                || (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_certificados")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog()))
                || (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_certificados")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_permiso")).getPk().getCatalog()))) {
            //validamos si el tramite esta chequeado documentohabilitante
            if (tarmTramite.getDocumentohabilitante().equals(Constant.STR_Y)) {
                for (TarmDocumentoHabilitante documento : documentoHabilitante.getLrecord()) {
                    if (count > 0) {
                        break;
                    }

                    if (documento.getModifiedData().get("seleccionado").equals(Boolean.TRUE)) {
                        count++;
                    }
                }
                if (count == 0) {
                    throw new Exception(MsgControlArmas.getProperty("msg_error_listardocumentos"));
                }
            }
        }

        return true;
    }

    /**
     * Actualizo datos de la persona
     *
     * @throws Exception
     */
    private void modificaDatosGenerales() throws Exception {
        detallepersona.update();
    }

    /**
     * Actualizo el valor de las direcciones siempre y cuando haya existido un
     * cambio en su valor
     */
    private void actualizaDirecciones() {
        TcustPersonAddress direccionPersona = null;
        direccionPersona = direccion.findPrincipal(detallepersona.getRecord().getPk().getPersoncode().toString());

        if (direccionPersona != null) {
            direccion.setRecord(direccionPersona);
            direccion.getRecord().setCountrycode(direccion.getMfilelds().get("solcodpais").toString());
            direccion.getRecord().setProvincecode(direccion.getMfilelds().get("solcodprovincia").toString());
            direccion.getRecord().setCantoncode(direccion.getMfilelds().get("solcodcanton").toString());
            direccion.getRecord().setCitycode(direccion.getMfilelds().get("solcodciudad").toString());
            direccion.getRecord().setParroquiacode(direccion.getMfilelds().get("solcodparroquia").toString());
            direccion.getRecord().setAddress(direccion.getMfilelds().get("soldireccion").toString());
            direccion.update();
        }

        TcustPersonAddress correo = (TcustPersonAddress) CollectionUtils.find(direccion.getLrecord(), PredicateUtils.transformedPredicate(TransformerUtils.invokerTransformer("getAddresstypecatalog"), PredicateUtils.equalPredicate("3")));
        if (correo != null) {
            direccion.setRecord(correo);
            direccion.getRecord().setAddress(direccion.getMfilelds().get("solcorreopersona").toString());
            direccion.update();
        }
    }

    /**
     * Actualizo los n&uacute;meros de tel&eacute;fono si es que existe un
     * cambio
     *
     * @throws Exception
     */
    private void actualizarTelefonos() throws Exception {
        TcustPersonPhone telefonoLocal = null;
        telefonoLocal = (TcustPersonPhone) CollectionUtils.find(telefono.getLrecord(), PredicateUtils.transformedPredicate(new CommonTransformer("phonetypecatalog"), PredicateUtils.equalPredicate("1")));
        TcustPersonAddress direccionPrincipal = (TcustPersonAddress) CollectionUtils.find(direccion.getLrecord(), PredicateUtils.transformedPredicate(new CommonTransformer("principal"), PredicateUtils.equalPredicate(Constant.STR_Y)));
        Integer codigodireccion = direccionPrincipal != null ? direccionPrincipal.getPk().getAddressnumber() : null;
        if (telefonoLocal != null) {
            telefono.setRecord(telefonoLocal);
            telefono.getRecord().setPhonenumber(telefono.getMfilelds().get("soltelfijo") != null ? telefono.getMfilelds().get("soltelfijo").toString() : null);
            telefono.update();
        } else {
            telefono.create();
            telefono.getRecord().getPk().setPersoncode(cpersona);
            telefono.getRecord().getPk().setPhonesequence(1);
            telefono.getRecord().getPk().setDateto(Utilidades.getFechaExpiracion());
            telefono.getRecord().setPhonenumber(telefono.getMfilelds().get("soltelfijo") != null ? telefono.getMfilelds().get("soltelfijo").toString() : null);
            telefono.getRecord().setDatefrom(new Timestamp(System.currentTimeMillis()));
            telefono.getRecord().setPhonetypecatalogcode("PHONETYPE");
            telefono.getRecord().setPhonetypecatalog("1");
            telefono.getRecord().setAddressnumber(codigodireccion);
            telefono.update();
        }
        TcustPersonPhone telefonoCelular = (TcustPersonPhone) CollectionUtils.find(telefono.getLrecord(), PredicateUtils.transformedPredicate(new CommonTransformer("phonetypecatalog"), PredicateUtils.equalPredicate("2")));
        if (telefonoCelular != null) {
            telefono.setRecord(telefonoCelular);
            telefono.getRecord().setPhonenumber(telefono.getMfilelds().get("soltelcelular") != null ? telefono.getMfilelds().get("soltelcelular").toString() : null);
            telefono.update();
        } else {
            telefono.create();
            telefono.getRecord().getPk().setPersoncode(cpersona);
            telefono.getRecord().getPk().setPhonesequence(2);
            telefono.getRecord().getPk().setDateto(Utilidades.getFechaExpiracion());
            telefono.getRecord().setPhonenumber(telefono.getMfilelds().get("soltelcelular") != null ? telefono.getMfilelds().get("soltelcelular").toString() : null);
            telefono.getRecord().setDatefrom(new Timestamp(System.currentTimeMillis()));
            telefono.getRecord().setPhonetypecatalogcode("PHONETYPE");
            telefono.getRecord().setPhonetypecatalog("2");
            telefono.getRecord().setAddressnumber(codigodireccion);
            telefono.update();
        }
    }

    /**
     * Copia los guardias de la tabla {@link TarmGuardias} a
     * {@link TarmSolicitudGuardias}
     *
     * @throws Exception
     */
    private void copiaGuardias() throws Exception {
        if (seleccionarGuardias && guardias.getLrecord() != null && !guardias.getLrecord().isEmpty()) {
            for (TarmGuardias guardia : guardias.getLrecord()) {
                TarmSolicitudGuardias guardiaSeleccionado = (TarmSolicitudGuardias) CollectionUtils.find(solicitudGuardias.getLrecord(),
                        PredicateUtils.andPredicate(
                                PredicateUtils.transformedPredicate(new CommonTransformer("pk.cempresa"), PredicateUtils.equalPredicate(cpersona)),
                                PredicateUtils.transformedPredicate(new CommonTransformer("pk.cguardia"), PredicateUtils.equalPredicate(guardia.getPk()))));
                if (guardia.getModifiedData().get("seleccionado") != null && Boolean.valueOf(guardia.getModifiedData().get("seleccionado").toString())) {
                    if (guardiaSeleccionado == null) {
                        solicitudGuardias.create();
                        solicitudGuardias.getRecord().getPk().setCempresa(cpersona);
                        solicitudGuardias.getRecord().getPk().setCguardia(guardia.getPk());
                        solicitudGuardias.update();
                    }
                } else if (guardiaSeleccionado != null) {
                    solicitudGuardias.setRecord(guardiaSeleccionado);
                    solicitudGuardias.remove();
//						solicitudGuardias.update();
                }
            }
        }
    }

    /**
     * Copia las armas a {@link TarmSolicitudArmas}
     *
     * @throws Exception
     */
    private void copiaArmas() throws Exception {
        if (seleccionarArmas && armas.getLrecord() != null && !armas.getLrecord().isEmpty()) {
            for (TarmArmas arma : armas.getLrecord()) {
                TarmSolicitudArmas armaSeleccionada = (TarmSolicitudArmas) CollectionUtils.find(solicitudArmas.getLrecord(),
                        PredicateUtils.andPredicate(
                                PredicateUtils.transformedPredicate(new CommonTransformer("pk.personcode"), PredicateUtils.equalPredicate(cpersona)),
                                PredicateUtils.transformedPredicate(new CommonTransformer("pk.carma"), PredicateUtils.equalPredicate(arma.getPk()))));
                if (arma.getModifiedData().get("seleccionado") != null && Boolean.valueOf(arma.getModifiedData().get("seleccionado").toString())) {
                    if (armaSeleccionada == null) {
                        solicitudArmas.create();
                        solicitudArmas.getRecord().getPk().setPersoncode(cpersona);
                        solicitudArmas.getRecord().getPk().setCarma(arma.getPk());
                        solicitudArmas.update();
                    }
                } else if (armaSeleccionada != null) {
                    solicitudArmas.setRecord(armaSeleccionada);
                    solicitudArmas.remove();
//						solicitudArmas.update();
                }
            }
        }
    }

    /**
     * Copia las agencias a {@link TarmSolicitud}
     *
     * @throws Exception
     */
    private void copiaAgencias() throws Exception {
        if (seleccionarAgencias && agenciaSucursal.getLrecord() != null && !agenciaSucursal.getLrecord().isEmpty()) {
            for (TarmAgenciaSucursal agencia : agenciaSucursal.getLrecord()) {
                TarmSolicitudAgenciaSucursal agenciaSeleccionada = (TarmSolicitudAgenciaSucursal) CollectionUtils.find(solicitudAgenciaSucursal.getLrecord(),
                        PredicateUtils.transformedPredicate(new CommonTransformer("pk.cagencia"), PredicateUtils.equalPredicate(agencia.getPk())));
                if (agencia.getModifiedData().get("seleccionado") != null && Boolean.valueOf(agencia.getModifiedData().get("seleccionado").toString())) {
                    if (agenciaSeleccionada == null) {
                        solicitudAgenciaSucursal.create();
                        solicitudAgenciaSucursal.getRecord().getPk().setCagencia(agencia.getPk());
                        solicitudAgenciaSucursal.update();
                    }
                } else if (agenciaSeleccionada != null) {
                    solicitudAgenciaSucursal.setRecord(agenciaSeleccionada);
                    solicitudAgenciaSucursal.remove();
//						solicitudAgenciaSucursal.update();
                }
            }
        }
    }

    /**
     * Copia los documentos para procesarse en la solcitud
     *
     * @throws Exception
     */
    private void copiaDocumentos() throws Exception {
        if (listarDocumentos && documentoHabilitante.getLrecord() != null && !documentoHabilitante.getLrecord().isEmpty()) {
            for (TarmDocumentoHabilitante docHabilitante : documentoHabilitante.getLrecord()) {
                TarmSolicitudDocumento documentoSeleccionado = (TarmSolicitudDocumento) CollectionUtils.find(solicitudDocumento.getLrecord(),
                        PredicateUtils.transformedPredicate(new CommonTransformer("pk.cdocumento"), PredicateUtils.equalPredicate(docHabilitante.getPk())));
                if (docHabilitante.getModifiedData().get("seleccionado") != null && Boolean.valueOf(docHabilitante.getModifiedData().get("seleccionado").toString())) {
                    if (documentoSeleccionado == null) {
                        solicitudDocumento.create();
                        solicitudDocumento.getRecord().getPk().setCdocumento(docHabilitante.getPk());
                        solicitudDocumento.update();
                        // Cambiar el centro de control del documento al centro control de armas actual
                        if (docHabilitante.getCentrocontrol().equalsIgnoreCase("999999")) {
                            docHabilitante.setCentrocontrol(centroControl.getPk());
                            documentoHabilitante.update(docHabilitante);
                        }
                    }
                } else if (documentoSeleccionado != null) {
                    solicitudDocumento.setRecord(documentoSeleccionado);
                    solicitudDocumento.remove();
//						solicitudDocumento.update();
                }
            }
        }
    }

    /**
     * Copia las armas seleccionadas a la agencia seleccionada debe ejecutarse
     * despu&eacute;s de
     *
     * @throws Exception
     */
    private void copiaAgenciaArmas() throws Exception {
        if (seleccionarAgencias) {
            Long cagencia = solicitudAgenciaSucursal.getLrecord().iterator().next().getPk().getCagencia();
            for (TarmSolicitudArmas tarmSolicitudArmas : solicitudArmas.getLrecord()) {
                agenciaArma.create();
                agenciaArma.getRecord().getPk().setCagencia(cagencia);
                agenciaArma.getRecord().getPk().setCarma(tarmSolicitudArmas.getPk().getCarma());
                agenciaArma.update();
            }
        }
    }

    /**
     * Valida que solo se seleccione una agencia en la solicitud
     *
     * @param event
     */
    public void validaAgenciaUnica(AjaxBehaviorEvent event) {
        Boolean valorComponente = (Boolean) (event.getComponent().getAttributes().get("value") != null ? event.getComponent().getAttributes().get("value") : null);
        if (valorComponente) {
            int cont = 0;
            for (TarmAgenciaSucursal tarmAgenciaSucursal : agenciaSucursal.getLrecord()) {
                if (tarmAgenciaSucursal.getModifiedData().get("seleccionado") != null && Boolean.parseBoolean(tarmAgenciaSucursal.getModifiedData().get("seleccionado").toString())) {
                    cont++;
                }
                if (cont > 1) {
                    agenciaSucursal.getLrecord().get(Integer.parseInt(event.getComponent().getAttributes().get("indiceActual").toString())).getModifiedData().put("seleccionado", Boolean.FALSE);
                    MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_unicidad_agencia"));
                    break;
                }
            }
        }
    }

    /**
     * Realiza las validaciones pertinentes del formulario
     *
     * @return
     */
    private boolean validacionFormulario() {
        //Valido el tramite que se ha escogido un tramite
        Boolean valido = Boolean.TRUE;
        if (solicitud.getRecord().getCtramite() == null) {
            MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_tramite"));
            valido = Boolean.FALSE;
        }
        if (ingresarRequisitos) {
            int tamReq = requisitos.getLrecord().size();
            int tamReqSel = 0;
            for (TarmSolicitudRequisitos solicitudRequisitos : requisitos.getLrecord()) {
                if (solicitudRequisitos.getCargado() != null && solicitudRequisitos.getCargado().equals(Constant.STR_Y)) {
                    tamReqSel++;
                }
            }
            if (tamReq == 0) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_no_requisitos"));
                valido = Boolean.FALSE;
            } else if (tamReq != tamReqSel) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_requisitos"));
                valido = Boolean.FALSE;
            }
        }
        if (seleccionarArmas) {
            //tramite autorizacion primera vez/renovacion  Estableciiento de agencias  Companias de vigilancia y seguridad
            TgeneParameters parametro = ParametersController.find("CODIGO.TRAMITE.NOVALIDAARMAS", "1");
            List<Long> codigoTramiteNoValidaArma = null;
            if (parametro != null) {
                codigoTramiteNoValidaArma = new ArrayList<>();
                String[] arrayTramitesNoValidaArmas = parametro.getTextvalue().split(",");
                for (String item : arrayTramitesNoValidaArmas) {
                    codigoTramiteNoValidaArma.add(Long.parseLong(item));
                }
            }

            if (this.tarmTramite != null && codigoTramiteNoValidaArma != null && codigoTramiteNoValidaArma.contains(this.tarmTramite.getPk())) {
                System.err.println("Tramite-" + this.tarmTramite.getPk());
                //pasa
            } else if (solicitudArmas.getLrecord() == null || solicitudArmas.getLrecord().isEmpty()) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_armas"));
                valido = Boolean.FALSE;
            } else if (tarmTramite.getNumeromaxarmas() != null && tarmTramite.getNumeromaxarmas().intValue() < solicitudArmas.getLrecord().size()) {
                MessageHelper.setMessageWarn(MsgControlArmas.getProperty("msg_error_maximo_armas"), tarmTramite.getNumeromaxarmas());
                valido = Boolean.FALSE;
            }
        }
        if (seleccionarGuardias) {
            if (solicitudGuardias.getLrecord() == null || solicitudGuardias.getLrecord().isEmpty()) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_guardias"));
                valido = Boolean.FALSE;
            }
        }
        if (seleccionarAgencias) {
            if (solicitudAgenciaSucursal.getLrecord() == null || solicitudAgenciaSucursal.getLrecord().isEmpty()) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_agencias"));
                valido = Boolean.FALSE;
            }
        }
        if (listarDocumentos) {
            if (documentoHabilitante.getLrecord() == null || documentoHabilitante.getLrecord().isEmpty()) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_noexistendocumentos"));
                valido = Boolean.FALSE;
            } else if (solicitudDocumento.getLrecord() == null || solicitudDocumento.getLrecord().isEmpty()) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_documento"));
                valido = Boolean.FALSE;
            }
        }
        return valido;
    }

//    public void saveCabecera() {
//        try {
//            Request request = callerhelper.getRequest();
//            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
//            solicitud.fijaPersona(detallepersona.getRecord());
//            solicitud.update();
//
//            DtoSave dtosavesol = solicitud.getDtoSave();
//            dtosavesol.setIsForm(true);
//            dtosavesol.setReturnpk(true);
//            dtosavesol.setPosition(1);
//            msave.put(solicitud.getBeanalias(), dtosavesol); // adicionar metadata de mantenimiento para cada tabla.
//
//            request.setSaveTables(msave);
//            request.modifiedData().put("csolicitud", solicitud.getRecord().getPk());
//            request.modifiedData().put("isnew", "N");
//
//            Response resp = callerhelper.executeSave(request);
//            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
//                solicitud.postCommit(resp);
//                ocultarBotonInicioFlujo = false;
//                MessageHelper.setMessageInfo(resp);
//            } else {
//                ocultarBotonInicioFlujo = true;
//                MessageHelper.setMessageError(resp);
//            }
//
//        } catch (Throwable e) {
//            MessageHelper.setMessageError(e);
//        }
//    }
    @Override
    protected void querydatabase() {
        try {
            if (deshabilitarPantalla) {
                return;
            }
            detalleusuario.getMfilters().clear();
            detalleusuario.getMfilters().put("pk.usercode", login.getRequest().getUser());
            detalleusuario.addFilterDateto();
            detalleusuario.query();
            if (detalleusuario.getRecord() == null || detalleusuario.getRecord().getPk().getPersoncode() == null) {
                return;
            }

            cpersona = detalleusuario.getRecord().getPk().getPersoncode();
            detallepersona.getMfilters().clear();
            detallepersona.getMfilters().put("pk.personcode", cpersona.toString());
            detallepersona.addFilterDateto();
            detallepersona.query();

            natural.getMfilters().clear();
            natural.addPersoncodeFilter(cpersona.toString());
            natural.addFilterDateto();
            natural.query();

            direccion.getMfilters().clear();
            direccion.addPersoncodeFilter(cpersona.toString());
            direccion.addFilterDateto();
            direccion.query();

            this.obtenerDireccionesGenerales();

            telefono.getMfilters().clear();
            telefono.addPersoncodeFilter(cpersona.toString());
            telefono.addFilterDateto();
            telefono.query();

            this.obtenerTelefonos();

            this.setearDatosGenerales();
            //creamos una solicitud por default cuando se consulta por primera vez y al transaccion es 20
            if (this.getLoginController().getRequest().getTransactionModule().equals("30") && this.getLoginController().getRequest().getTransactionCode() == 20) {
                solicitud.create();
                solicitud.getRecord().setFregistro(new java.sql.Date(System.currentTimeMillis()));
                this.obtenerSecuencialSolicitud();
            }

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

    /**
     * Muestra un mensaje de error siempre y cuando sea un error de componente y
     * se lo muestra como general
     *
     * @return
     */
    public Boolean getExisteMensajesError() {
        Boolean resp = Boolean.FALSE;
        FacesContext facesContext = FacesContext.getCurrentInstance();
        final Iterator<String> idComponentesMensajes = facesContext.getClientIdsWithMessages();
        while (idComponentesMensajes.hasNext()) {
            String idComp = idComponentesMensajes.next();
            if (StringUtils.isNotBlank(idComp)) {
                facesContext.validationFailed();
                resp = Boolean.TRUE;
                RequestContext.getCurrentInstance().execute("$('#" + idComp.replace(":", "\\\\:") + "').focus();");
                break;
            }
        }
        return resp;
    }

    /**
     * En base a la provincia y sus jurisdicciones se obtiene y se coloca el
     * centro de control
     */
//    private void setearCodigoCentroControl(){
//    	TarmCentroControlJur centroControlJur = TarmCentroControlJurController.findxProvincia(direccion.getMfilelds().get("solcodprovincia") != null ? 
//    			direccion.getMfilelds().get("solcodprovincia").toString() : StringUtils.EMPTY);
//    	if(centroControlJur != null){
//    		this.solicitud.getRecord().setCcentrocontrol(centroControlJur.getCcentrocontrol());
//    	}
//    }
    /**
     * Ingresa datos que se necesitan en arma
     */
    private void setearDatosGenerales() {
        TcustPersonDetail tcustPersonDetail = PersonDetailController.find(cpersona.toString());
        armas.getMfilelds().put("numdoc", tcustPersonDetail.getIdentification());
        armas.getMfilelds().put("tipodoc", tcustPersonDetail.getIdentificationcatalog());
    }

    /**
     * Arma la petici&oacute;n al core para solicitar un n&uacute;mero de
     * secuencial para la solicitud antes de guardarla
     *
     * @throws Throwable
     */
    private void obtenerSecuencialSolicitud() throws Throwable {
        Request request = callerhelper.getRequest();
        DtoQuery dtoQuery = super.getDtoQuery(true);
        HashMap<String, DtoQuery> mapQuery = new HashMap<String, DtoQuery>();
        mapQuery.put(beanalias, dtoQuery);
        request.put("querytype", "T");
        request.setQueryTables(mapQuery);
        Response response = callerhelper.executeQuery(request);
        if (response.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
            MessageHelper.setMessageError(response);
        } else {
            this.numeroSolicitudBase = response.get("SECUENCIALSOLICITUD").toString();
            solicitud.getRecord().setNumerosolicitud(this.numeroSolicitudBase);
        }
    }

    /**
     * Recupera en base al tipo de identificaci&oacute;n la direcci&oacute;n de
     * la oficina o de la casa
     */
    private void obtenerDireccionesGenerales() {
        TcustPersonAddress direccionPersona = null;
        direccionPersona = direccion.findPrincipal(detallepersona.getRecord().getPk().getPersoncode().toString());

        if (direccionPersona != null) {
            direccion.getMfilelds().put("solcodpais", direccionPersona.getCountrycode());
            direccion.setLprovinces(ProvinceController.find(direccionPersona.getCountrycode()));
            direccion.getMfilelds().put("solcodprovincia", direccionPersona.getProvincecode());
            direccion.setLcantones(CantonController.find(direccionPersona.getCountrycode(), direccionPersona.getProvincecode()));
            direccion.getMfilelds().put("solcodcanton", direccionPersona.getCantoncode());
            direccion.setLcities(CityController.find(direccionPersona.getCountrycode(), direccionPersona.getProvincecode(), direccionPersona.getCantoncode()));
            direccion.getMfilelds().put("solcodciudad", direccionPersona.getCitycode());
            direccion.setLparroquias(ParroquiaController.find(direccionPersona.getCountrycode(), direccionPersona.getProvincecode(), direccionPersona.getCantoncode()));
            direccion.getMfilelds().put("solcodparroquia", direccionPersona.getParroquiacode());
            direccion.getMfilelds().put("soldireccion", direccionPersona.getAddress());
        }

        TcustPersonAddress correo = (TcustPersonAddress) CollectionUtils.find(direccion.getLrecord(), PredicateUtils.transformedPredicate(TransformerUtils.invokerTransformer("getAddresstypecatalog"), PredicateUtils.equalPredicate("3")));
        if (correo != null) {
            direccion.getMfilelds().put("solcorreopersona", correo.getAddress());
        }
    }

    /**
     * Retorna el telefono fijo y celular de la persona
     */
    private void obtenerTelefonos() {
        TcustPersonPhone telf = null;
        telf = (TcustPersonPhone) CollectionUtils.find(telefono.getLrecord(), PredicateUtils.transformedPredicate(TransformerUtils.invokerTransformer("getPhonetypecatalog"), PredicateUtils.equalPredicate("1")));
        if (telf != null) {
            telefono.getMfilelds().put("soltelfijo", telf.getPhonenumber());
        }
        telf = (TcustPersonPhone) CollectionUtils.find(telefono.getLrecord(), PredicateUtils.transformedPredicate(TransformerUtils.invokerTransformer("getPhonetypecatalog"), PredicateUtils.equalPredicate("2")));
        if (telf != null) {
            telefono.getMfilelds().put("soltelcelular", telf.getPhonenumber());
        }
    }

    /**
     * M&eacute;todo para el inicio de flujo
     */
    public void iniciarFlujo() {
        try {
            cprovincia = null;
            for (TarmCentroControl centro : centroControlList) {
                if (solicitud.getRecord().getCcentrocontrol().equals(centro.getPk())) {
                    cprovincia = centro.getProvincecode();
                }
            }
            ;
            if (cprovincia == null || cprovincia.length() == 0) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_sinprovincia"));
                return;
            }

            Request request = callerhelper.getRequest();
            super.cleanRequest(request);

            request.modifiedData().put("csolicitud", solicitud.getRecord().getPk());
            request.modifiedData().put("numerosolicitud", solicitud.getRecord().getNumerosolicitud());
            request.modifiedData().put("numerotransaccion", solicitud.getRecord().getCtramite());
            request.modifiedData().put("cprovincia", cprovincia);
            request.modifiedData().put("isnew", "Y");

            request.setLogsolicitude(solicitud.getRecord().getNumerosolicitud());

            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.setShowRow(true);
                flujoiniciado = true;
                deshabilitarPantalla = Boolean.TRUE;
                MessageHelper.setMessageInfo(resp, MsgGeneral.getProperty("msg_initFlow") + " SOLICITUD: " + solicitud.getRecord().getNumerosolicitud());
                saveInicioFlujoEnYES();
//                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * M&eacute;todo para el inicio de flujo
     */
    public void completarTarea() {

        try {
            Request request = callerhelper.getRequest();
            // limpiar request para finalizar la tarea.
            super.cleanRequest(request);

            request.modifiedData().put("csolicitud", solicitud.getRecord().getPk());
            request.modifiedData().put("TID", tid);
            request.modifiedData().put("BPMStatus", bpmDataStatus == null ? "A" : bpmDataStatus); // A,D,R
            request.modifiedData().put("BPMObs", bpmDataComment);

            Response resp = callerhelper.executeSave(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                MessageHelper.setMessageInfo(resp);
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Evento que se ejecuta cuando cambia el origen de adquisici&oacute;n
     */
    public void executeOrigenAdquisicion() {

        TarmTramite tramite = this.solicitud.getRecord().getCtramite() != null ? TarmTramiteController.find(this.solicitud.getRecord().getCtramite().toString()) : null;
        if ((this.solicitud.getRecord().getOrigenadquisicion() != null && this.solicitud.getRecord().getOrigenadquisicion().equals("DEC"))
                || (tramite != null && tramite.getTipoautorizacion().equals("1") && tramite.getCategoria().equals("10"))) {
            this.mostrarIngresoArmas = Boolean.TRUE;
        } else {
            this.mostrarIngresoArmas = Boolean.FALSE;
        }
    }

    /**
     * 
     */
    public void executeTipoPago() {

        TarmTramite tramite = this.solicitud.getRecord().getCtramite() != null ? TarmTramiteController.find(this.solicitud.getRecord().getCtramite().toString()) : null;
        if ((this.solicitud.getRecord().getOrigenadquisicion() != null && this.solicitud.getRecord().getOrigenadquisicion().equals("DEC"))
                || (tramite != null && tramite.getTipoautorizacion().equals("1") && tramite.getCategoria().equals("10"))) {
            this.mostrarIngresoArmas = Boolean.TRUE;
        } else {
            this.mostrarIngresoArmas = Boolean.FALSE;
        }
    }

    @Override
    public void postCommit(Response response) throws Exception {
    }

    /**
     * Datos de control de la identificacion de la persona.
     */
    public void onChangeTipoId() {
        String tipoid = super.getMfilelds().get("tipoidentificacion").toString();
        switch (tipoid) {
            case "CED":
                longitudid = 10;
                activarRegExIdentificacion = true;
                break;
            case "RUC":
                longitudid = 13;
                activarRegExIdentificacion = true;
                break;
            default:
                longitudid = 13;
                activarRegExIdentificacion = false;
                break;
        }
    }

    /**
     * Abre el LOV de tr&aacute;mite
     */
    public void openLovTramite() {
        Map<String, List<String>> params = new HashMap<String, List<String>>();
        List<String> ltipopersona = new ArrayList<>();
        if (validaNumeros(detallepersona.getRecord().getIdentification())) {
            if (detallepersona.getRecord().getIdentification().length() == 10) {
                ltipopersona.add(ParametersController.find("CODIGO.PERSONTYPE.NATURAL", "1").getTextvalue());//1
            } else {
                ltipopersona.add(ParametersController.find("CODIGO.PERSONTYPE.JURIDICA", "1").getTextvalue());//2
            }
        }
        params.put("tipopersonasol", ltipopersona);
        BuscarTramiteLovController.openLov(params);
    }

    private boolean validaNumeros(String cadena) {
        Boolean aux = Boolean.FALSE;
        if (cadena.matches("[0-9]*")) {
            aux = Boolean.TRUE;
        } else {
            aux = Boolean.FALSE;
        }
        return aux;
    }

    /**
     * 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.armas.getRecord().getModifiedData().put("clase", clase.getDescription());
        this.armas.setClase(clase.getPk().getCatalog());
    }

    /**
     * MODIFICAR EL NUMERO DE SOLICITUD POR TIPO DE TRAMITE
     */
    public void setNumeroSolicitudPorTramite() {
        if (this.tipoAutorizacion.getLegalcode() != null && this.solicitud.getRecord().getNumerosolicitud() != null) {
            this.solicitud.getRecord().setNumerosolicitud(this.numeroSolicitudBase);
        }

    }

    /**
     * Regresa del LOV para cargar valores
     *
     * @param event {@link SelectEvent}
     */
    public void onReturnTramite(SelectEvent event) {
        try {
            TarmTramite tramite = (TarmTramite) event.getObject();
            this.tarmTramite = tramite;
//			if(!procedeTramite(TarmTramiteController.find(tramite.getCtramitepadre() != null ? tramite.getCtramitepadre().toString() : "-1"),tramite.getPk())){
            if (!procedeTramite(tramite)) {
                return;
            }
            if (!verificaAptitudPersona(tarmTramite)) {
                return;
            }

            this.armas.setTarmTramite(this.tarmTramite);
            solicitud.getRecord().setCtramite(tramite.getPk());
            tipoTramite = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
            tipoAutorizacion = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());

            setNumeroSolicitudPorTramite();

            TgeneCatalogDetail categoria = CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
            actividad = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
            this.getSolicitud().addField("tipoTramite", tipoTramite.getDescription());
            this.getSolicitud().addField("tipoAutorizacion", tipoAutorizacion.getDescription());
            this.getSolicitud().addField("categoria", categoria.getDescription());
            this.getSolicitud().addField("actividad", actividad.getDescription());

            if (tarmTramite.getTipotramite().equals(ParametersController.find("CODIGO.TRAMITEREIMPRESION", "1").getTextvalue())) {
                this.actualizaDatosGenerales = Boolean.TRUE;
            } else {
                this.actualizaDatosGenerales = Boolean.FALSE;
            }

            if (tarmTramite.getTipoautorizacion().equals("4")) {//Guia de libre transito
                this.guiaLibreTransito = Boolean.TRUE;
                if (!this.actualizaDatosGenerales) {
                    this.actualizaDatosGenerales = Boolean.TRUE;
                }
            } else {
                this.guiaLibreTransito = Boolean.FALSE;
            }

            this.ingresarRequisitos = Boolean.TRUE;
            if (Constant.ifYes(tramite.getRegistroarmas())) {
                this.seleccionarArmas = Boolean.TRUE;
                this.cargaArmas();
            } else {
                this.seleccionarArmas = Boolean.FALSE;
                this.solicitudArmas.clearAll();
            }
            if (Constant.ifYes(tramite.getRegistroguardia())) {
                this.seleccionarGuardias = Boolean.TRUE;
                this.cargaGuardias();
            } else {
                this.seleccionarGuardias = Boolean.FALSE;
                this.solicitudGuardias.clearAll();
            }
            if (Constant.ifYes(tramite.getRegistroagenciasucursal())) {
                this.seleccionarAgencias = Boolean.TRUE;
                this.cargarAgencias();
            } else {
                this.seleccionarAgencias = Boolean.FALSE;
                this.solicitudAgenciaSucursal.clearAll();
            }

            if (Constant.ifYes(tramite.getDocumentohabilitante()) || tipoTramite.getPk().getCatalog().equals(ParametersController.find("CODIGO.TRAMITEREIMPRESION", "1").getTextvalue())) {
                this.listarDocumentos = Boolean.TRUE;
                listarDocumentos(tipoTramite, tipoAutorizacion, actividad);//Se listan los documentos en el tab listar documentos
            } else {
                this.listarDocumentos = Boolean.FALSE;
                this.solicitudDocumento.clearAll();
            }

            if (tramite != null) {
                requisitoPorTramite.getMfilters().put("pk.ctramite", tramite.getPk().toString());
                requisitoPorTramite.setRecperpage(3000000);
                requisitoPorTramite.setcTramite(tramite.getPk());
                requisitoPorTramite.query();
                requisitos.clearAll();//limpio los datos del requisito anterior
                for (TarmRequisitoPorTipoTramite requisitoPorTipoTramite : requisitoPorTramite.getLrecord()) {
                    requisitos.create();
                    requisitos.getRecord().setCargado(Constant.STR_N);
                    requisitos.getRecord().setPk(new TarmSolicitudRequisitosKey());
                    requisitos.getRecord().getPk().setCrequisito(requisitoPorTipoTramite.getPk().getCrequisito());
                    requisitos.getRecord().getPk().setCtramite(tramite.getPk());
                    requisitos.getRecord().getModifiedData().put("crequisito", requisitoPorTipoTramite.getModifiedData().get("crequisito"));
                    requisitos.getRecord().getModifiedData().put("nrequisito", requisitoPorTipoTramite.getModifiedData().get("nrequisito"));
                    requisitos.getRecord().getModifiedData().put("ndescripcion", requisitoPorTipoTramite.getModifiedData().get("ndescripcion"));
                    requisitos.update();
                }
            }

            if (tarmTramite.getUsoactividad().equals("2") || tarmTramite.getUsoactividad().equals("24")) {//2 AGENCIA // 24 SUCURSAL
                if (agenciaSucursal != null && agenciaSucursal.getTipoAgencias() != null && agenciaSucursal.getTipoAgencias().size() > 0) {
                    TgeneCatalogDetail remover = new TgeneCatalogDetail();
                    agenciaSucursal.setTipoAgencias(CatalogDetailController.find("TIPOAGENCIA"));
                    for (TgeneCatalogDetail item : agenciaSucursal.getTipoAgencias()) {
                        if (!tarmTramite.getUsoactividad().equals("2")) {
                            if (item.getPk().getCatalog().equals(ParametersController.find("CODIGO.AGENCIA.TIPOAGENCIA", "1").getTextvalue())) {//"AGE"
                                remover = item;
                            }
                        }
                        if (!tarmTramite.getUsoactividad().equals("24")) {
                            if (item.getPk().getCatalog().equals(ParametersController.find("CODIGO.SUCURSAL.TIPOAGENCIA", "1").getTextvalue())) {//"SUC"
                                remover = item;
                            }
                        }
                    }
                    agenciaSucursal.getTipoAgencias().remove(remover);
                }
            }

            //AQUI VA EL CODIGO PARA LLENAR LAS ADQUISICION	
            lorigenadquisicion = null;
            lorigenadquisicion = new ArrayList<TgeneCatalogDetail>();
            List<TarmOrigenTramite> origenTramites = OrigenTramiteController.findOrigenTramite(tarmTramite);
            if (origenTramites != null && !origenTramites.isEmpty()) {
                for (int i = 0; i < origenTramites.size(); i++) {
                    TarmOrigenTramite origenTramite = origenTramites.get(i);
                    if (origenTramite != null && origenTramite.getPk().getOrigencatalog() != null && origenTramite.getPk().getOrigencatalogcode() != null
                            && !origenTramite.getPk().getOrigencatalog().isEmpty() && !origenTramite.getPk().getOrigencatalogcode().isEmpty()) {
                        lorigenadquisicion.add(CatalogDetailController.findCatalogo(origenTramite.getPk().getOrigencatalogcode(), origenTramite.getPk().getOrigencatalog()));
                    }
                }
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }

    }

    /**
     * Metodo para listar el listado de documentos para los diferentes
     * critesrios de seleccion
     *
     * @param tipoTramite tipo del tramite
     * @param tipoAutorizacion tipo de la autorizacion
     * @param actividad actividad
     * @throws Exception
     */
    private void listarDocumentos(TgeneCatalogDetail tipoTramite, TgeneCatalogDetail tipoAutorizacion, TgeneCatalogDetail actividad) throws Exception {
        if (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_reimpresion_tipo")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_perdida")).getPk().getCatalog())) {
            this.cargarDocumentos(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_reimpresion_tipo")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog());
        }
        if (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_reimpresion_tipo")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_actualizacionDeDatos")).getPk().getCatalog())) {
            this.cargarTodosDocumentosPersona();
        }
        if (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_reimpresion_tipo")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_permiso")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_perdida")).getPk().getCatalog())) {
            this.cargarDocumentos(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_renovacion")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_permiso")).getPk().getCatalog());
        }
        if (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_certificados")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog())) {
            this.cargarDocumentos(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_renovacion")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_autorizacion")).getPk().getCatalog());
        }
        if (tipoTramite.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog())
                && tipoAutorizacion.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_certificados")).getPk().getCatalog())
                && actividad.getPk().getCatalog().equals(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_usoactividad"), MsgControlArmas.getProperty("ctg_permiso")).getPk().getCatalog())) {
            this.cargarDocumentos(CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_primeravez")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipotramite"), MsgControlArmas.getProperty("ctg_renovacion")).getPk().getCatalog(),
                    CatalogDetailController.findByCatalogcodeDescrption(MsgControlArmas.getProperty("ctg_tipoautorizacion"), MsgControlArmas.getProperty("ctg_permiso")).getPk().getCatalog());
        }
        if (documentoHabilitante.getLrecord() == null || documentoHabilitante.getLrecord().isEmpty()) {
            MessageHelper.setMessageWarn(MsgControlArmas.getProperty("msg_error_noexistendocumentos"));
        }
    }

    /**
     * Verifica si el tr&aacute;mite ingresado cumple la prevalidaci&oacute;n
     * TarmTramite tramite es el tramite padre validamos si este tiene codigo
     * alterno Creado FPAZMINO
     *
     * @return
     */
    private boolean procedeTramite(TarmTramite tramite) {
        if (tramite.getCtramitepadre() == null && tramite.getCtramitepadrealt() == null) {
            return Boolean.TRUE;
        }
        Boolean procede = Boolean.FALSE;
        String msgErrorTramitePadre = "";
        //consulta del tramite padre 
        TarmTramite tramitePadre = TarmTramiteController.find(tramite.getCtramitepadre() != null ? tramite.getCtramitepadre().toString() : "-1");
        //consulta por tramite padre 
        if (tramitePadre != null) {
            Boolean debeValidarCaducidad = (tramite.getValidacaducidadpadre() != null && tramite.getValidacaducidadpadre().equalsIgnoreCase("Y")) ? true : false;
            //consulta documento habilitante del codigo padre alterno
            documentoHabilitante.querydatabaseDocumentosCriterioFiltro(Arrays.asList(tramitePadre), debeValidarCaducidad, cpersona.toString());
            if (documentoHabilitante.getLrecord() != null && !documentoHabilitante.getLrecord().isEmpty()) {
                if (tramitePadre.getCtramitepadre() == null && tramitePadre.getCtramitepadrealt() == null) {
                    return Boolean.TRUE;
                } else {
                    procede = procedeTramite(tramitePadre);
                }
            } else {
                procede = Boolean.FALSE;
                msgErrorTramitePadre = MsgControlArmas.getProperty("msg_error_tramite_padre", tramitePadre.getModifiedData().get("tipotramite"), tramitePadre.getModifiedData().get("tipoautorizacion"), tramitePadre.getModifiedData().get("categoria"), tramitePadre.getModifiedData().get("usoactividad"));
//    			MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_tramite_padre", tramite.getModifiedData().get("tipotramite"), tramite.getModifiedData().get("tipoautorizacion"),  tramite.getModifiedData().get("categoria") , tramite.getModifiedData().get("usoactividad")));
            }
        }
        //consulta del tramite padre alterno, seria el tramite de renovacion
        TarmTramite tramitePadreAlterno = TarmTramiteController.find(tramite.getCtramitepadrealt() != null ? tramite.getCtramitepadrealt().toString() : "-1");
        //consulta por tramite padre alterno
        if (tramitePadreAlterno != null && !procede) {
            Boolean debeValidarCaducidad = (tramite.getValidacaducidadpadre() != null && tramite.getValidacaducidadpadre().equalsIgnoreCase("Y")) ? true : false;
            //consulta documento habilitante del codigo padre alterno
            documentoHabilitante.querydatabaseDocumentosCriterioFiltro(Arrays.asList(tramitePadreAlterno), debeValidarCaducidad, cpersona.toString());
            if (documentoHabilitante.getLrecord() != null && !documentoHabilitante.getLrecord().isEmpty()) {
                if (tramitePadreAlterno.getCtramitepadre() == null && tramitePadreAlterno.getCtramitepadrealt() == null) {
                    return Boolean.TRUE;
                } else {
                    procede = procedeTramite(tramitePadreAlterno);
                }
            } else {
                procede = Boolean.FALSE;
                msgErrorTramitePadre = MsgControlArmas.getProperty("msg_error_tramite_padre", tramitePadreAlterno.getModifiedData().get("tipotramite"), tramitePadreAlterno.getModifiedData().get("tipoautorizacion"), tramitePadreAlterno.getModifiedData().get("categoria"), tramitePadreAlterno.getModifiedData().get("usoactividad"));
//    			MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_tramite_padre", tramite.getModifiedData().get("tipotramite"), tramite.getModifiedData().get("tipoautorizacion"),  tramite.getModifiedData().get("categoria") , tramite.getModifiedData().get("usoactividad")));
            }
        }

        if (!procede && !msgErrorTramitePadre.equalsIgnoreCase("")) {
            MessageHelper.setMessageInfo(msgErrorTramitePadre);
        }
        return procede;
    }

    /**
     * Verifica si la persona es apta para dicho tramite
     *
     * @param tramite
     * @return
     * @throws Exception
     */
    private boolean verificaAptitudPersona(TarmTramite tramite) throws Exception {
        boolean verificaApto = Boolean.TRUE;
        if (tramite.getRequiereevaluacion() != null && tramite.getRequiereevaluacion().equals(Constant.STR_Y)) {
            evaluacionController.addFilter("personcode", cpersona.toString());
            evaluacionController.addFilter("resultado", MsgControlArmas.getProperty("ctg_resultado_aprobado"));
            evaluacionController.addFilter("resultadocodigo", MsgControlArmas.getProperty("ctg_resultado_codigo"));
            evaluacionController.addFilter("tipoevaluacion", MsgControlArmas.getProperty("ctg_tipo_evaluacion_conocimiento"));
            evaluacionController.addFilter("tipoevaluacioncodigo", MsgControlArmas.getProperty("ctg_tipo_evaluacion_codigo"));
            evaluacionController.setTipoTest("CONOCIMIENTO");
            evaluacionController.query();
            if (evaluacionController.getLrecord() == null || evaluacionController.getLrecord().isEmpty()) {
                verificaApto = Boolean.FALSE;
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_requiere_validacion_tecnica"));
            }
            evaluacionController.clearAll();
            evaluacionController.addFilter("personcode", cpersona.toString());
            evaluacionController.addFilter("resultado", MsgControlArmas.getProperty("ctg_resultado_aprobado"));
            evaluacionController.addFilter("resultadocodigo", MsgControlArmas.getProperty("ctg_resultado_codigo"));
            evaluacionController.addFilter("tipoevaluacion", MsgControlArmas.getProperty("ctg_tipo_evaluacion_psicologica"));
            evaluacionController.addFilter("tipoevaluacioncodigo", MsgControlArmas.getProperty("ctg_tipo_evaluacion_codigo"));
            evaluacionController.setTipoTest("PSICOLOGICA");
            evaluacionController.query();
            if (evaluacionController.getLrecord() == null || evaluacionController.getLrecord().isEmpty()) {
                verificaApto = Boolean.FALSE;
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_requiere_validacion_psicologica"));
            }
        }
        return verificaApto;
    }

    /**
     * M&eacute;todo en el cual se cargan los guardias de seguridad de una
     * determina empresa
     *
     * @throws Exception
     */
    private void cargaGuardias() throws Exception {
        guardias.addFilter("cempresa", this.cpersona.toString());
        guardias.addFilter("estado", "APT");
        guardias.setRecperpage(3000000);
        guardias.query();
    }

    /**
     * M&eacute;todo en el cual se cargan las armas de la persona registrada
     *
     * @throws Exception
     */
    public void cargaArmas() throws Exception {
        String estadosarma;
        String tipoFab;
        armas.setRecperpage(5000);
        String fechaCaducidad = null;
        estadosarma = tarmTramite.getEstados();
        tipoFab = tarmTramite.getTipofabricacion();
        if (tarmTramite.getTipoautorizacion().equals("3")) {//devolucion 3
            armas.addField("sancion", Constant.STR_Y);
            armas.addField("personcode", cpersona.toString());
        }
        if (estadosarma != null && estadosarma.contains("REN")) {
            armas.addField("TRAMITE", tarmTramite);
        }
        if (tipoFab != null) {
            armas.addField("TIPOFABRICACION", tipoFab);
        }

        if (tarmTramite.getTipotramite().equals("1")) {//primera vez
            if (!tarmTramite.getCategoria().equals("1")
                    && //Categoria APERTURA   
                    !tarmTramite.getTipoautorizacion().equals("2") && !tarmTramite.getTipoautorizacion().equals("4")) {//tipoautorizacion=CERTIFICADOS 2  GUiA DE LIBRE TRaNSITO 4
                fechaCaducidad = " is null ";
            }
        } else if (tarmTramite.getTipotramite().equals("3")) {//renovacion
            fechaCaducidad = " <> null ";
        } else if (tarmTramite.getTipotramite().equals("2")) {//reimpresion
            Date fechaActual = new Date();
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
            fechaCaducidad = " > " + "to_date(" + format.format(fechaActual + ",'dd/MM/yyyy')");
        }
        // CATEGORIA 14	PREVIA IMPORTACION
        if (!tarmTramite.getCategoria().equals("14")) {
            armas.setLrecord(armas.findxPersona(cpersona.longValue(), estadosarma, tipoFab, tarmTramite.getClase(), fechaCaducidad));
            mostrarFiltroAUCP = Boolean.FALSE;
        } else {
            armas.setLrecord(new ArrayList<TarmArmas>());
            mostrarFiltroAUCP = Boolean.TRUE;
        }
        //
        listaPersonasDetailVen = new HashSet<>();
        Set<String> listaCodigos = new HashSet<>();
        for (TarmArmas arma : armas.getLrecord()) {
            if (arma.getLote() == null) {
                arma.setLote(" ");
            }
            //carga los posibles vendedoeres
            if (this.guiaLibreTransito) {                
                List<TarmArmas> listaArmas = AuxArmasController.findListXCodigoArma(arma.getCodigoarma());
                if (listaArmas != null && !listaArmas.isEmpty()) {
                    for (TarmArmas tarmArmasVendedor : listaArmas) {
                        if (tarmArmasVendedor.getModifiedData().get("personcode") != null
                                && !listaCodigos.contains(tarmArmasVendedor.getModifiedData().get("personcode").toString())) {
                            listaCodigos.add(tarmArmasVendedor.getModifiedData().get("personcode").toString());
                            TcustPersonDetail personaDetail = PersonDetailController.find(tarmArmasVendedor.getModifiedData().get("personcode").toString());
                            listaPersonasDetailVen.add(personaDetail);

                        }
                    }
                }
            }

        }
        System.out.println("listaPersonasDetailVen: " + listaPersonasDetailVen.size());

        Collections.sort(armas.getLrecord(), new Comparator<TarmArmas>() {
            public int compare(TarmArmas p1, TarmArmas p2) {
                return p1.getLote().compareTo(p2.getLote());
            }
        });

        if (armas.getLrecord() == null || armas.getLrecord().isEmpty()) {
            MessageHelper.setMessageWarn(MsgControlArmas.getProperty("msg_error_armas_inexistentes"));
        }
    }

    /**
     * M&eacute;todo en el cual se cargan las agencias de la persona registrada
     *
     * @throws Exception
     */
    private void cargarAgencias() throws Exception {
        agenciaSucursal.setRecperpage(3000000);
        agenciaSucursal.addFilter("personcode", this.cpersona.toString());
        agenciaSucursal.query();
        //	agenciaSucursal.record.fautorizacion
    }

    /**
     * M&eacute;todo en el cual se cargan los documentos habilitantes de la
     * persona registrada
     *
     * @throws Exception
     */
    private void cargarTodosDocumentosPersona() {
        try {
            documentoHabilitante.setRecperpage(3000000);
            documentoHabilitante.documentosXPersona(cpersona);

        } catch (Exception e) {
            MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_noexistendocumentos"));
            return;

        }
    }

    /**
     * M&eacute;todo en el cual se cargan los documentos habilitantes de la
     * persona registrada
     *
     * @throws Exception
     */
    private void cargarDocumentos(String tipoTramite, String tipoTramite2, String tipoAutorizacion) {
        try {
            List<TarmTramite> listTramites = TarmTramiteController.findPorCriteriosTramite(tipoTramite, tipoTramite2, tipoAutorizacion);
//			List<TarmSolicitud> listSolicitudes = new ArrayList<>();
//			for(TarmTramite tramite:listTramites){
//				List<TarmSolicitud> listSolicitud = SolicitudArmasController.findByPersonaCTramite(cpersona, String.valueOf(tramite.getPk()));
//				if(listSolicitud!=null && !listSolicitud.isEmpty()){
//					listSolicitudes.addAll(listSolicitud);
//				}
//			}
            if (listTramites == null || listTramites.isEmpty()) {
                MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_noexistendocumentos"));
                return;
            }
            documentoHabilitante.setRecperpage(3000000);
            documentoHabilitante.documentosXTramite(listTramites, cpersona);
        } catch (Exception e) {
            MessageHelper.setMessageInfo(MsgControlArmas.getProperty("msg_error_noexistendocumentos"));
            return;

        }
    }

    /**
     * Se almacena las agencias en su tabla
     *
     * @throws Exception
     */
    public void guardarAgencias() throws Exception {
        agenciaSucursal.getRecord().setPersoncode(cpersona);
        agenciaSucursal.update();
        agenciaSucursal.save();
        this.cargarAgencias();
        agenciaSucursal.setRecord(null);
    }

    /**
     * Elimina las agencias sucursales de la base de datos
     *
     * @throws Exception
     */
    public void eliminarAgencias() throws Exception {
        agenciaSucursal.remove();
        agenciaSucursal.update();
        agenciaSucursal.save();
        agenciaSucursal.setRecord(null);
    }

    /**
     * Guarda las armas
     *
     * @throws Exception
     */
    public void guardarArmas() throws Exception {
        armas.getRegistroArmas().getRecord().setPersoncode(cpersona);
//    	armas.getRegistroArmas().update();
//    	armas.update();
        armas.saveArmaSolicitud();
        if (this.armas.isExisteTipoArmaExplosivo()) {
            armas.setRecord(null);
        }
    }

    /**
     * Elimina armas de la base de datos
     *
     * @throws Exception
     */
    public void eliminarArmas() throws Exception {
        armas.remove();
        armas.update();
        armas.save();
        cargaArmas();
        armas.setRecord(null);
    }

    /**
     * Datos de control de ingreso de informacion dado el tipo de tramite.
     */
    public void onChangeTipoTramite() throws Exception {
        String ctipotramite = solicitud.getRecord().getCcentrocontrol();//getCtipotramite();
        requisitos.consultaPorTipoTramite(ctipotramite);
    }

    /**
     * Cambia pa&iacute;s
     */
    public void executePais() {
        if (direccion.getMfilelds().get("solcodpais") != null && StringUtils.isNotBlank(direccion.getMfilelds().get("solcodpais").toString())) {
            direccion.setLprovinces(ProvinceController.find(direccion.getMfilelds().get("solcodpais").toString()));
            direccion.setLcantones(new ArrayList<TgeneCanton>());
            direccion.setLparroquias(new ArrayList<TgeneParroquia>());
            direccion.setLcities(new ArrayList<TgeneCity>());
        }
    }

    /**
     * M&eacute;todo para el evento change del combo provincias
     */
    public void executeProvincia() {
        if (direccion.getMfilelds().get("solcodpais") != null && StringUtils.isNotBlank(direccion.getMfilelds().get("solcodpais").toString())) {
            direccion.setLcantones(CantonController.find(direccion.getMfilelds().get("solcodpais").toString(), direccion.getMfilelds().get("solcodprovincia").toString()));
            direccion.setLparroquias(new ArrayList<TgeneParroquia>());
            direccion.setLcities(new ArrayList<TgeneCity>());
        }
    }

    /**
     * M&eacute;todo para el evento change del combo cantones
     */
    public void executeCanton() {
        if (direccion.getMfilelds().get("solcodpais") != null && StringUtils.isNotBlank(direccion.getMfilelds().get("solcodpais").toString())) {
            direccion.setLparroquias(ParroquiaController.find(direccion.getMfilelds().get("solcodpais").toString(), direccion.getMfilelds().get("solcodprovincia").toString(), direccion.getMfilelds().get("solcodcanton").toString()));
            direccion.setLcities(CityController.find(direccion.getMfilelds().get("solcodpais").toString(), direccion.getMfilelds().get("solcodprovincia").toString(), direccion.getMfilelds().get("solcodcanton").toString()));
        }
    }

    /**
     * Cambio la provincia de origen
     */
    public void cambioProvinciasOrigen() {
        if (solicitud.getRecord().getCprovinciaorigen() != null) {
            this.lcantonOrigen = CantonController.find("EC", solicitud.getRecord().getCprovinciaorigen());
            this.solicitud.getRecord().setCpaisorigen("EC");
        } else {
            this.lcantonOrigen.clear();
            this.solicitud.getRecord().setCpaisorigen(null);
        }
    }

    /**
     * Cambio la provincia destino
     */
    public void cambioProvinciaDestino() {
        if (solicitud.getRecord().getCprovinciadestino() != null) {
            this.lcantonDestino = CantonController.find("EC", solicitud.getRecord().getCprovinciadestino());
            this.solicitud.getRecord().setCpaisdestino("EC");
        } else {
            this.lcantonDestino.clear();
            this.solicitud.getRecord().setCpaisdestino(null);
        }
    }

    /**
     * Metodo que genera el reporte
     *
     * @param fila
     */
    public void imprimir() {
        boolean flagArmas = false;
        boolean flagGuardias = false;
        boolean flagAgencia = false;

        if (tarmTramite == null) {
            MessageHelper.setMessageError("ERROR NO MANEJADO POR LA APLICACION CONTACTE AL PROVEEDOR");
            return;
        }
        if (tarmTramite.getRegistroguardia().equalsIgnoreCase("Y")) {
            flagGuardias = true;
        }
        if (tarmTramite.getRegistroarmas().equalsIgnoreCase("Y")) {
            flagArmas = true;
        }
        if (tarmTramite.getRegistroagenciasucursal().equalsIgnoreCase("Y")) {
            flagAgencia = true;
        }
        this.reporteGeneral(csolicitud, flagAgencia, flagArmas, flagGuardias);

        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("RECUERDE", MsgControlArmas.getProperty("msg_recuerdeClickContinuarTramite")));
    }

    /**
     * Obtiene el centro de control segun usurio logeado.
     *
     * @throws Exception
     *
     */
    private String obtenerCentroControl() throws Exception {
        String institucionCentroControl = "";
        this.tsafeUserDetailUsuario = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
        PersonAddressController personAddressController = new PersonAddressController();
        TcustPersonAddress tcustPersonAddres = personAddressController.findPrincipal(tsafeUserDetailUsuario.getPk().getPersoncode().toString());
        //cprovincia=tcustPersonAddres.getProvincecode();
        TarmCentroControlJur centroControlJur = TarmCentroControlJurController.findxProvincia(tcustPersonAddres.getProvincecode());
        this.centroControl = CentroControlArmasController.findPorCodigo(centroControlJur.getCcentrocontrol());
        this.nombreInstitucion = CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo()).getDescription();
        institucionCentroControl = this.nombreInstitucion;

        return institucionCentroControl;
    }

    /**
     * Obtiene el responsable del Centro de Control
     */
    public void obtenerResponsableCentroControl() {
        Integer responsable = this.centroControl.getPersoncode();
        this.responsableCentroControl = PersonDetailController.find(responsable.toString());

    }

    public TarmCentroControl obtenerCentro() {
        for (TarmCentroControl centro : this.centroControlList) {
            if (this.solicitud.getRecord().getCcentrocontrol().equals(centro.getPk())) {
                return centro;
            }
        }
        return null;
    }

    public void reporteGeneral(String solicitud, boolean flagAgencia, boolean flagArmas, boolean flagGuardias) {
        try {
            querydatabase();
            String gradoUsuario = "";
            String path = "armas/reports/generalReport";
            String filename = "Solicitud";
            TgeneCatalogDetail grado = CatalogDetailController.findxCodigoCodcatalogo(this.responsableCentroControl.getMilitarygrade(), this.responsableCentroControl.getMilitarygradecode());
            if (grado != null) {
                gradoUsuario = grado.getDescription() + " - " + this.responsableCentroControl.getName();
            } else {
                gradoUsuario = "Sin Grado - " + this.responsableCentroControl.getName();
            }

            //Fija parametros del report.
            HashMap<String, Object> parameters = new HashMap<>();
            parameters.put("pathLogoIzquierda", "repo:/maia/1/image/comandoconjunto");
            parameters.put("pathLogoDerecha", "repo:/maia/1/image/selloarmas");
            parameters.put("csolicitud", solicitud);

            //Obteniendo la solicitud            
            TarmSolicitud s = SolicitudController.findSolicitudxcodsolicitud(solicitud);
            TarmTramite t;
            Boolean datosTramiteVacios = false;

            //
            if (this.obtenerCentro() != null) {
                parameters.put("centroControl", this.obtenerCentro().modifiedData().get("desnombreinstitucion"));
            }

            if (s != null) {
                //Obteniendo el tramite
                t = TarmTramiteController.find(s.getCtramite().toString());

                //Obteniendo la solicitud trmite
                TarmSolicitudTramite st = TarmSolicitudTramiteController.findPorCSolicitud(solicitud);

                if (t != null) {

                    //No de solicitud
                    if (st != null) {
                        parameters.put("noSolicitud", s.getNumerosolicitud());
                    } else {
                        parameters.put("noSolicitud", " ");
                    }
                    //No de tramite
                    if (st != null) {
                        parameters.put("noTramite", st.getNumerotramite());
                    } else {
                        parameters.put("noTramite", " ");
                    }

                    //Tipo de tramite
                    if (t.getModifiedData().get("tipotramite") != null) {
                        parameters.put("tipoTramite", t.getModifiedData().get("tipotramite"));
                    } else {
                        parameters.put("tipoTramite", " ");
                    }

                    //Tipo de autorizacion
                    if (t.getModifiedData().get("tipoautorizacion") != null) {
                        parameters.put("tipoAutorizacion", t.getModifiedData().get("tipoautorizacion"));
                    } else {
                        parameters.put("tipoAutorizacion", " ");
                    }

                    //Categoria
                    if (t.getModifiedData().get("categoria") != null) {
                        parameters.put("categoria", t.getModifiedData().get("categoria"));
                    } else {
                        parameters.put("categoria", " ");
                    }

                    //Uso actividad
                    if (t.getModifiedData().get("usoactividad") != null) {
                        parameters.put("usoActividad", t.getModifiedData().get("usoactividad"));
                    } else {
                        parameters.put("usoActividad", " ");
                    }

                    //Cabecera
                    if (t.getCabecera() != null) {
                        parameters.put("cabecera", t.getCabecera());
                    } else {
                        parameters.put("cabecera", " ");
                    }

                } else {
                    datosTramiteVacios = true;
                }
            } else {
                datosTramiteVacios = true;
            }

            if (datosTramiteVacios) {
                parameters.put("noTramite", " ");
                parameters.put("tipoTramite", " ");
                parameters.put("tipoAutorizacion", " ");
                parameters.put("categoria", " ");
                parameters.put("usoActividad", " ");
                parameters.put("cabecera", " ");
            }

            //Obteniendo la direccion
            String email = " ", direccion = " ";
            List<TcustPersonAddress> direcciones = PersonAddressController.findAllByPersonCode(s.getPersoncode().toString());
            for (TcustPersonAddress d : direcciones) {
                Calendar calendario = Calendar.getInstance();
                calendario.setTime(d.getPk().getDateto());
                if (calendario.get(Calendar.YEAR) == 2999) {
                    if (d.getAddresstypecatalog().equalsIgnoreCase("3")) {
                        email = d.getAddress();
                    } else if (d.getPrincipal() != null && d.getPrincipal().equalsIgnoreCase("Y")) {
                        direccion = d.getAddress();
                    }
                }
            }

            //Email
            parameters.put("email", email);

            //Direccion            
            parameters.put("direccion", direccion);

            //Actividad Economica
            TcustPersonDetail person = PersonDetailController.find(s.getPersoncode().toString());
            if (person != null && person.getEconimicact() != null) {
                parameters.put("actividadeco", person.getEconimicact());
            } else {
                parameters.put("actividadeco", "");
            }

            //Fecha
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy / hh:mm:ss");
            parameters.put("lugarFecha", sdf.format(Calendar.getInstance().getTime()));
            parameters.put("flagAgencia", flagAgencia);
            parameters.put("flagArmas", flagArmas);
            parameters.put("flagGuardias", flagGuardias);
            //parameters.put("centroControl", this.obtenerCentroControl());
            parameters.put("gradoUsuario", gradoUsuario);
            parameters.put("usuario", PersonDetailController.find(this.tsafeUserDetailUsuario.getPk().getPersoncode().toString()).getName());
            parameters.put("codResponsable", this.responsableCentroControl.getPk().getPersoncode());

            parameters.put("codigoQR", (s != null ? s.getNumerosolicitud() : solicitud) + " " + sdf.format(Calendar.getInstance().getTime()) + " "
                    + gradoUsuario + " " + this.nombreInstitucion);

            String format = "pdf";

            this.reportController.execute(path, parameters, format, filename, this.getLoginController());
        } catch (Exception ex) {
            MessageHelper.setMessageError(ex);
        }
    }

    /**
     * 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(detallepersona.getRecord().getPk().getPersoncode().toString());
        params.put("personcode", lPersoncodeParam);
        CargasLovController.openLov(params);
    }

    /**
     * Regresa del LOV de carga
     *
     * @param event
     */
    public void onReturnCarga(SelectEvent event) { 
        TarmCarga carga = (TarmCarga) event.getObject();
        filterAUCP = carga.getAucp();
        solicitud.getRecord().setAucp(filterAUCP);
        TarmRegistroArmas registro = RegistroArmController.findByCodigo(carga.getCregistro().toString());
        armas.setLrecord(ArmasController.findxRegistro(registro.getPk().toString()));
        if (armas.getLrecord() == null) {
            armas.setLrecord(new ArrayList<TarmArmas>());
        }

    }

    /**
     * M&eacute;todo que valida la persona vendedora en las tablas de maia y en
     * la snap
     *
     */
    public void validarVendedor() {
        tcustPersonDetailVendedor = null;
        if (selecionaCodigoVendedor == null) {
            MessageHelper.setMessageError("Seleccione el vendedor");
            return;
        }
        tcustPersonDetailVendedor = PersonDetailController.find(selecionaCodigoVendedor.toString());
        solicitud.getRecord().setNumerodocumentoorigen(tcustPersonDetailVendedor.getIdentification());
        solicitud.getRecord().setTipodocumentoorigen(tcustPersonDetailVendedor.getIdentificationcatalog());
        solicitud.getRecord().setNombrerazonsocialorigen(tcustPersonDetailVendedor.getName());
        /*
   		if(solicitud.getRecord().getNumerodocumentoorigen()==null || solicitud.getRecord().getTipodocumentoorigen()==null){
   			 MessageHelper.setMessageError(MsgControlArmas.getProperty("mg_error_seleccioneeltipodedocumentooingreselacedulavendedor"));
   			 return;
   		}
   		if(solicitud.getRecord().getTipodocumentoorigen().equals(codigoCedula)){
   //----------validamos si es valida la CEDULA
   			if(!ValidateIdentification.cedula(solicitud.getRecord().getNumerodocumentoorigen())){
   				 MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_nodocumentoinvalidovendedor"));
   				 return;
   			}
   			//envia a buscar en MAIA
   			tcustPersonDetailVendedor=buscarPersonaMaia(solicitud.getRecord().getNumerodocumentoorigen(),solicitud.getRecord().getTipodocumentoorigen());
   			if(tcustPersonDetailVendedor==null){
   				//envia a buscar en la SNAP
   				tcustPersonDetailVendedor=buscarPersonaSnap(solicitud.getRecord().getNumerodocumentoorigen(),solicitud.getRecord().getTipodocumentoorigen());
   			}
   		}else if(solicitud.getRecord().getTipodocumentoorigen().equals(codigoRuc)){
   //----------validamos si es valida el RUC
   			if(!ValidateIdentification.ruc(solicitud.getRecord().getNumerodocumentoorigen())){
   				 MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_nodocumentoinvalidovendedor"));
   				 return;
   			}
   			//envia a buscar en maia
   			tcustPersonDetailVendedor=buscarPersonaMaia(solicitud.getRecord().getNumerodocumentoorigen(),solicitud.getRecord().getTipodocumentoorigen());
   			if(tcustPersonDetailVendedor==null){
   				//envia a buscar en la snap
   				tcustPersonDetailVendedor=buscarPersonaSnap(solicitud.getRecord().getNumerodocumentoorigen(),solicitud.getRecord().getTipodocumentoorigen());
   			}
   		}else{
   //----------si es PASAPORTE
   			tcustPersonDetailVendedor=buscarPersonaMaia(solicitud.getRecord().getNumerodocumentoorigen(),solicitud.getRecord().getTipodocumentoorigen());
   			if(tcustPersonDetailVendedor==null){
   				MessageHelper.setMessageInfo(MsgControlArmas.getProperty("mg_error_usuarionoencontradovendedor"));
   				tcustPersonDetailVendedor= new TcustPersonDetail();
   				tcustPersonDetailVendedor.setIdentification(solicitud.getRecord().getNumerodocumentoorigen());
   				tcustPersonDetailVendedor.setIdentificationcatalog(solicitud.getRecord().getTipodocumentoorigen());
   				tcustPersonDetailVendedor.setIdentificationcatalogcode("IDENTIFICATION");
   				tcustPersonDetailVendedor.setName(solicitud.getRecord().getNombrerazonsocialorigen());
   				//solicitud.getRecord().setNombrerazonsocialorigen(null);
   			}
   		}
   		//validamos que existe la persona en Maia o SNAP
   		if(tcustPersonDetailVendedor!=null && tcustPersonDetailVendedor.getIdentification()!=null && tcustPersonDetailVendedor.getName()!=null){
   			//seteamos el nombre para visualizarle
   			solicitud.getRecord().setNombrerazonsocialorigen(tcustPersonDetailVendedor.getName());
   		}else if(!solicitud.getRecord().getTipodocumentoorigen().equals(codigoPasaporte)){
   			MessageHelper.setMessageError(MsgControlArmas.getProperty("mg_error_usuarionoencontradovendedor"));
   			tcustPersonDetailVendedor= new TcustPersonDetail();
   			solicitud.getRecord().setNombrerazonsocialorigen(null);
   		}
         */
    }

    /**
     * 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);
    }

    /**
     * ============================= buscar EstadoTramite =============================
     */

    /**
     * M&eacute;todo para obtener los codigos
     */
    public String codigos(String parametro) {
        TgeneParameters tgeneParameters = ParametersController.find(parametro, "1");
        return tgeneParameters.getTextvalue();
    }

    /**
     * M&eacute;todo para buscar a la persona en la snap
     *
     * @param documento
     */
    /**
     * ================= GENERAR SQL ===================
     */
    public TcustPersonDetail buscarPersonaSnap(String documento, String tipoDocumento) {
        if (tipoDocumento.equals(codigoCedula)) {
            Cedula cedula = ClienteCedula.obtenerCedula(documento);
            if (cedula != null) {
                TcustPersonDetail detail = new TcustPersonDetail();
                detail.setName(cedula.getNombre());
                detail.setIdentification(cedula.getCedula());
                detail.setIdentificationcatalog("CED");
                detail.setIdentificationcatalogcode("IDENTIFICATION");
                return detail;
            } else {
                return null;
            }
        } else {
            Contribuyente contribuyente = ClienteRUC.obtenerRUC(documento);
            if (contribuyente != null) {
                TcustPersonDetail detail = new TcustPersonDetail();
                detail.setName(contribuyente.getRazonSocial());
                detail.setIdentification(contribuyente.getNumeroRuc());
                detail.setIdentificationcatalog("RUC");
                detail.setIdentificationcatalogcode("IDENTIFICATION");
                return detail;
            } else {
                return null;
            }
        }
    }

    /**
     * Entrega el valor de: ltipopersona
     *
     * @return List<TgeneCatalogDetail>
     */
    public List<TgeneCatalogDetail> getLtipopersona() {
        return ltipopersona;
    }

    /**
     * Entrega el valor de: ltipoidenti
     *
     * @return List<TgeneCatalogDetail>
     */
    public List<TgeneCatalogDetail> getLtipoidenti() {
        return ltipoidenti;
    }

    /**
     * ************ AGREGADOS PARA EL TIPO DE PAGO ************
     */
    public List<TgeneCatalogDetail> getLtipopago() {
        return ltipopago;
    }

    public void setLtipopago(List<TgeneCatalogDetail> ltipopago) {
        this.ltipopago = ltipopago;
    }

    /**
     * Entrega el valor de: ltipotramite
     *
     * @return List<TarmTipoTramite>
     */
    public List<TgeneCatalogDetail> getLtipotramite() {
        return ltipotramite;
    }

    /**
     * Entrega el valor de: longitudid
     *
     * @return Integer
     */
    public Integer getLongitudid() {
        return longitudid;
    }

    /**
     * Entrega el valor de: activarRegExIdentificacion
     *
     * @return boolean
     */
    public boolean isActivarRegExIdentificacion() {
        return activarRegExIdentificacion;
    }

    /**
     * Entrega el valor de: solicitud
     *
     * @return SolicitudArmasController
     */
    public SolicitudArmasController getSolicitud() {
        return solicitud;
    }

    /**
     * Fija el valor de: solicitud
     *
     * @param solicitud Valor a fijar en el atributo.
     */
    public void setSolicitud(SolicitudArmasController solicitud) {
        this.solicitud = solicitud;
    }

    /**
     * Entrega el valor de: detallepersona
     *
     * @return PersonDetailController
     */
    public PersonDetailController getDetallepersona() {
        return detallepersona;
    }

    /**
     * Fija el valor de: detallepersona
     *
     * @param detallepersona Valor a fijar en el atributo.
     */
    public void setDetallepersona(PersonDetailController detallepersona) {
        this.detallepersona = detallepersona;
    }

    /**
     * Entrega el valor de: natural
     *
     * @return PeopleController
     */
    public PeopleController getNatural() {
        return natural;
    }

    /**
     * Fija el valor de: natural
     *
     * @param natural Valor a fijar en el atributo.
     */
    public void setNatural(PeopleController natural) {
        this.natural = natural;
    }

    /**
     * Entrega el valor de: direccion
     *
     * @return PersonAddressController
     */
    public PersonAddressController getDireccion() {
        return direccion;
    }

    /**
     * Fija el valor de: direccion
     *
     * @param direccion Valor a fijar en el atributo.
     */
    public void setDireccion(PersonAddressController direccion) {
        this.direccion = direccion;
    }

    /**
     * Entrega el valor de: telefono
     *
     * @return PersonPhoneController
     */
    public PersonPhoneController getTelefono() {
        return telefono;
    }

    /**
     * Fija el valor de: telefono
     *
     * @param telefono Valor a fijar en el atributo.
     */
    public void setTelefono(PersonPhoneController telefono) {
        this.telefono = telefono;
    }

    /**
     * Entrega el valor de: requisitos
     *
     * @return SolicitudRequisitosController
     */
    public SolicitudRequisitosController getRequisitos() {
        return requisitos;
    }

    /**
     * Fija el valor de: requisitos
     *
     * @param requisitos Valor a fijar en el atributo.
     */
    public void setRequisitos(SolicitudRequisitosController requisitos) {
        this.requisitos = requisitos;
    }

    /**
     * Entrega el valor de: flujoiniciado
     *
     * @return boolean
     */
    public boolean isFlujoiniciado() {
        return flujoiniciado;
    }

    /**
     * Entrega el valor de: ocultarBotonInicioFlujo
     *
     * @return boolean
     */
    public boolean isOcultarBotonInicioFlujo() {
        return ocultarBotonInicioFlujo;
    }

    /**
     * Fija el valor de: ocultarBotonInicioFlujo
     *
     * @param ocultarBotonInicioFlujo Valor a fijar en el atributo.
     */
    public void setOcultarBotonInicioFlujo(boolean ocultarBotonInicioFlujo) {
        this.ocultarBotonInicioFlujo = ocultarBotonInicioFlujo;
    }

    /**
     * Entrega el valor de: esaprobacion
     *
     * @return boolean
     */
    public boolean isEsaprobacion() {
        return esaprobacion;
    }

    public LoginController getLogin() {
        return login;
    }

    public void setLogin(LoginController login) {
        this.login = login;
    }

    public UserDetailController getDetalleusuario() {
        return detalleusuario;
    }

    public void setDetalleusuario(UserDetailController detalleusuario) {
        this.detalleusuario = detalleusuario;
    }

    public List<TgeneCatalogDetail> getLorigenadquisicion() {
        return lorigenadquisicion;
    }

    public void setLorigenadquisicion(List<TgeneCatalogDetail> lorigenadquisicion) {
        this.lorigenadquisicion = lorigenadquisicion;
    }

    public boolean isIngresarRequisitos() {
        return ingresarRequisitos;
    }

    public void setIngresarRequisitos(boolean ingresarRequisitos) {
        this.ingresarRequisitos = ingresarRequisitos;
    }

    public boolean isSeleccionarArmas() {
        return seleccionarArmas;
    }

    public void setSeleccionarArmas(boolean seleccionarArmas) {
        this.seleccionarArmas = seleccionarArmas;
    }

    public boolean isSeleccionarGuardias() {
        return seleccionarGuardias;
    }

    public void setSeleccionarGuardias(boolean seleccionarGuardias) {
        this.seleccionarGuardias = seleccionarGuardias;
    }

    public boolean isSeleccionarAgencias() {
        return seleccionarAgencias;
    }

    public void setSeleccionarAgencias(boolean seleccionarAgencias) {
        this.seleccionarAgencias = seleccionarAgencias;
    }

    public boolean isListarDocumentos() {
        return listarDocumentos;
    }

    public void setListarDocumentos(boolean listarDocumentos) {
        this.listarDocumentos = listarDocumentos;
    }

    public RequisitoPorTramiteController getRequisitoPorTramite() {
        return requisitoPorTramite;
    }

    public void setRequisitoPorTramite(
            RequisitoPorTramiteController requisitoPorTramite) {
        this.requisitoPorTramite = requisitoPorTramite;
    }

    public GuardiasController getGuardias() {
        return guardias;
    }

    public void setGuardias(GuardiasController guardias) {
        this.guardias = guardias;
    }

    public SolicitudGuardiasController getSolicitudGuardias() {
        return solicitudGuardias;
    }

    public void setSolicitudGuardias(SolicitudGuardiasController solicitudGuardias) {
        this.solicitudGuardias = solicitudGuardias;
    }

    public ArmasController getArmas() {
        return armas;
    }

    public void setArmas(ArmasController armas) {
        this.armas = armas;
    }

    public RegistroArmController getRegistroArmas() {
        return registroArmas;
    }

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

    public AgenciaSucursalController getAgenciaSucursal() {
        return agenciaSucursal;
    }

    public void setAgenciaSucursal(AgenciaSucursalController agenciaSucursal) {
        this.agenciaSucursal = agenciaSucursal;
    }

    public RecepcionArmasController getSolicitudArmas() {
        return solicitudArmas;
    }

    public void setSolicitudArmas(RecepcionArmasController solicitudArmas) {
        this.solicitudArmas = solicitudArmas;
    }

    public SolicitudAgenciaSucursalController getSolicitudAgenciaSucursal() {
        return solicitudAgenciaSucursal;
    }

    public void setSolicitudAgenciaSucursal(
            SolicitudAgenciaSucursalController solicitudAgenciaSucursal) {
        this.solicitudAgenciaSucursal = solicitudAgenciaSucursal;
    }

    public TarmSolicitudDocumentoController getSolicitudDocumento() {
        return solicitudDocumento;
    }

    public void setSolicitudDocumento(
            TarmSolicitudDocumentoController solicitudDocumento) {
        this.solicitudDocumento = solicitudDocumento;
    }

    public DocumentoHabilitanteController getDocumentoHabilitante() {
        return documentoHabilitante;
    }

    public void setDocumentoHabilitante(
            DocumentoHabilitanteController documentoHabilitante) {
        this.documentoHabilitante = documentoHabilitante;
    }

    public Date getFechaActual() {
        return fechaActual;
    }

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

    public boolean isDeshabilitarPantalla() {
        return deshabilitarPantalla;
    }

    public void setDeshabilitarPantalla(boolean deshabilitarPantalla) {
        this.deshabilitarPantalla = deshabilitarPantalla;
    }

    public boolean isMostrarIngresoArmas() {
        return mostrarIngresoArmas;
    }

    public void setMostrarIngresoArmas(boolean mostrarIngresoArmas) {
        this.mostrarIngresoArmas = mostrarIngresoArmas;
    }

    public String getCsolicitud() {
        return csolicitud;
    }

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

    public Boolean getIsEnableGrabar() {
        return isEnableGrabar;
    }

    public void setIsEnableGrabar(Boolean isEnableGrabar) {
        this.isEnableGrabar = isEnableGrabar;
    }

    public boolean isActualizaDatosGenerales() {
        return actualizaDatosGenerales;
    }

    public void setActualizaDatosGenerales(boolean actualizaDatosGenerales) {
        this.actualizaDatosGenerales = actualizaDatosGenerales;
    }

    public ReportController getReportController() {
        return reportController;
    }

    public void setReportController(ReportController reportController) {
        this.reportController = reportController;
    }

    public boolean isGuiaLibreTransito() {
        return guiaLibreTransito;
    }

    public void setGuiaLibreTransito(boolean guiaLibreTransito) {
        this.guiaLibreTransito = guiaLibreTransito;
    }

    public EvaluacionController getEvaluacionController() {
        return evaluacionController;
    }

    public void setEvaluacionController(EvaluacionController evaluacionController) {
        this.evaluacionController = evaluacionController;
    }

    public AgenciaArmaController getAgenciaArma() {
        return agenciaArma;
    }

    public void setAgenciaArma(AgenciaArmaController agenciaArma) {
        this.agenciaArma = agenciaArma;
    }

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

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

    public List<TgeneCanton> getLcantonOrigen() {
        return lcantonOrigen;
    }

    public void setLcantonOrigen(List<TgeneCanton> lcantonOrigen) {
        this.lcantonOrigen = lcantonOrigen;
    }

    public List<TgeneCanton> getLcantonDestino() {
        return lcantonDestino;
    }

    public void setLcantonDestino(List<TgeneCanton> lcantonDestino) {
        this.lcantonDestino = lcantonDestino;
    }

    public List<TarmCentroControl> getCentroControlList() {
        return centroControlList;
    }

    public void setCentroControlList(List<TarmCentroControl> centroControlList) {
        this.centroControlList = centroControlList;
    }

    public List<TgeneCatalogDetail> getTipoDocumento() {
        return tipoDocumento;
    }

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

    public Boolean getMostrarFiltroAUCP() {
        return mostrarFiltroAUCP;
    }

    public void setMostrarFiltroAUCP(Boolean mostrarFiltroAUCP) {
        this.mostrarFiltroAUCP = mostrarFiltroAUCP;
    }

    public String getFilterAUCP() {
        return filterAUCP;
    }

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

    public CargaController getCargaController() {
        return cargaController;
    }

    public void setCargaController(CargaController cargaController) {
        this.cargaController = cargaController;
    }

    public Set<TcustPersonDetail> getListaPersonasDetailVen() {
        return listaPersonasDetailVen;
    }

    public void setListaPersonasDetailVen(
            Set<TcustPersonDetail> listaPersonasDetailVen) {
        this.listaPersonasDetailVen = listaPersonasDetailVen;
    }

    public Integer getSelecionaCodigoVendedor() {
        return selecionaCodigoVendedor;
    }

    public void setSelecionaCodigoVendedor(Integer selecionaCodigoVendedor) {
        this.selecionaCodigoVendedor = selecionaCodigoVendedor;
    }

}
