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

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

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

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.PredicateUtils;
import org.apache.commons.collections.TransformerUtils;
import org.primefaces.context.RequestContext;

import com.fp.common.helper.Constant;
import com.fp.dto.AbstractDataTransport;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.armas.funcionalidad.CargaController;
import com.fp.frontend.controller.armas.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.GuardiasController;
import com.fp.frontend.controller.armas.parametros.RequisitoController;
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.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.frontend.utility.Utilidades;
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.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.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudAgenciaSucursal;
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.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.TgeneParroquia;
import com.fp.persistence.pgeneral.gene.TgeneProvince;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

@ManagedBean
@ViewScoped
public class ReporteConsultaSolicitudClienteController extends
        AbstractController<AbstractDataTransport> {

    private static final long serialVersionUID = -4049698904561227471L;

    /**
     * Lista de tipos de persona.
     */
    private List<TgeneCatalogDetail> ltipopersona;

    /**
     * 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;
    /**
     * Bandera que indica si existe o no un registro para mostrar la solicitud
     */
    private boolean existeSolicitud;
    /**
     * 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;

    private List<TgeneProvince> lprovincias;
    private List<TgeneCanton> lcantones;
    private List<TgeneParroquia> lparroquias;
    private List<TgeneCity> lcities;

    private List<TgeneCatalogDetail> lmarca;
    /**
     * Controlador de la solicitud
     */
    /**
     * Controlador que maneja el usuario
     */
    @ManagedProperty(value = "#{userDetailController}")
    private UserDetailController detalleusuario;

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

    /**
     * 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 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 que maneja cargas para previa importacion
     */
    @ManagedProperty(value = "#{cargaController}")
    private CargaController cargaController;

    private Boolean requiereNoSolAucpBln;

    /**
     * Referencia al Centro de control;
     */
    private TarmCentroControl centroControl = new TarmCentroControl();

    /**
     * Nombre de la Institucion
     */
    private String nombreInstitucion;

    private TsafeUserDetail userDetail;

    /**
     *
     * @throws Exception
     */
    public ReporteConsultaSolicitudClienteController() throws Exception {
        super(AbstractDataTransport.class);
    }

    /**
     * postCosntruct
     *
     * @throws Exception
     */
    @PostConstruct
    private void postconstruct() throws Exception {
        this.init();
        requiereNoSolAucpBln = Boolean.FALSE;
        this.startQuery();
    }

    private void init() {
        this.beanalias = "REPORTESOLICITUD";
        ltipopersona = CatalogDetailController.find("PERSONTYPE");
        ltipoidenti = CatalogDetailController.find("IDENTIFICATION");
        ltipotramite = CatalogDetailController.find("TIPOTRAMITE");
        lorigenadquisicion = CatalogDetailController.find("ORIGENADQUISICION");
        userDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
    }

    @Override
    protected void querydatabase() {
        // TODO Auto-generated method stub
        //Realizo las busquedas en base a los controladores
        try {
            limpiaDatos();
//			if(solicitud.getRecord() == null || solicitud.getRecord().getPk()==null){
            Utilidades.caracterEspecial(solicitud.getMfilters().get("numerosolicitud"));
            solicitud.query();
//			}
            if (solicitud.getRecord() != null && solicitud.getRecord().getPk() != null) {
                //Valida que corresponda al mismo cliente
                if (!userDetail.getPk().getPersoncode().equals(solicitud.getRecord().getPersoncode())) {
                    MessageHelper.setMessageWarn("Solicitud no corresponde a la persona");
                    return;
                }

                if (this.solicitud.getMfilters().get("numerosolicitud") == null || this.solicitud.getMfilters().get("numerosolicitud").equals("")) {
                    this.solicitud.getMfilters().put("numerosolicitud", solicitud.getRecord().getNumerosolicitud());
                }
                existeSolicitud = Boolean.TRUE;
//				solicitud.setRecord(solicitud.getLrecord().get(0));
                detallepersona.getMfilters().clear();
                detallepersona.getMfilters().put("pk.personcode", solicitud.getRecord().getPersoncode().toString());
                detallepersona.addFilterDateto();
                detallepersona.query();

                natural.getMfilters().clear();
                natural.addPersoncodeFilter(solicitud.getRecord().getPersoncode().toString());
                natural.addFilterDateto();
                natural.query();

                direccion.getMfilters().clear();
                direccion.addPersoncodeFilter(solicitud.getRecord().getPersoncode().toString());
                direccion.addFilterDateto();
                direccion.query();

                this.obtenerDireccionesGenerales();

                telefono.getMfilters().clear();
                telefono.addPersoncodeFilter(solicitud.getRecord().getPersoncode().toString());
                telefono.addFilterDateto();
                telefono.query();
                this.obtenerTelefonos();
//	            this.setearCodigoCentroControl();
                this.setearTramite();
            } else {
                existeSolicitud = Boolean.FALSE;
            }
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecked")
    public void loadEdit() throws Exception {
        //TarmArmas arma = ((TarmArmas) solicitudArmas.getRecord().getModifiedData().get("arma"));
        TarmArmas arma = ArmasController.findxCodigo(solicitudArmas.getRecord().getModifiedData().get("carma").toString());
        if (arma.getCountrycode() == null) {
            arma.setCountrycode("EC");
        }
        this.lmarca = (List<TgeneCatalogDetail>) ArmasController.findxCodigo(solicitudArmas.getRecord().getModifiedData().get("carma").toString()).getModifiedData().get("lmarca");
        lprovincias = ProvinceController.find(arma.getCountrycode());
        executeProvince(arma);
        if (arma.getProvincecode() != null) {
            lcantones = CantonController.find(arma.getCountrycode(), arma.getProvincecode());
            executeCanton(arma);
        }
        completaInfTipoArma(arma);
        registroArmas.clearAll();
        if (arma.getCregistro() != null) {
            registroArmas.addFilter("pk", arma.getCregistro().toString());
            registroArmas.query();
            List<TarmRegistroArmas> registroArmasList = registroArmas.getLrecord();
            registroArmas.setRecord(registroArmasList.get(0));
            registroArmas.getRecord().setIsnew(Boolean.FALSE);
        }

    }

    public void loadShowAgencia() {
        TarmAgenciaSucursal tarmAgenciaSucursal = (TarmAgenciaSucursal) solicitudAgenciaSucursal.getRecord().getModifiedData().get("agencia");
        lprovincias = ProvinceController.find(tarmAgenciaSucursal.getCountrycode());
        lcantones = CantonController.find(tarmAgenciaSucursal.getCountrycode(), tarmAgenciaSucursal.getProvincecode());
        lparroquias = ParroquiaController.find(tarmAgenciaSucursal.getCountrycode(), tarmAgenciaSucursal.getProvincecode(), tarmAgenciaSucursal.getCantoncode());
        lcities = CityController.find(tarmAgenciaSucursal.getCountrycode(), tarmAgenciaSucursal.getProvincecode(), tarmAgenciaSucursal.getCantoncode());
    }

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

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

    private void limpiaDatos() {
        this.detallepersona.clearAll();
        this.detalleusuario.clearAll();
        this.agenciaSucursal.clearAll();
        this.armas.clearAll();
        this.direccion.clearAll();
        this.documentoHabilitante.clearAll();
        this.natural.clearAll();
        this.registroArmas.clearAll();
        this.requisitos.clearAll();
        this.solicitudAgenciaSucursal.clearAll();
        this.solicitudArmas.clearAll();
        this.solicitudDocumento.clearAll();
        this.solicitudGuardias.clearAll();
        this.telefono.clearAll();
        existeSolicitud = Boolean.FALSE;
    }

    /**
     * M&eacute;todo que completa la informaci&acute;n del arma una vez se
     * presiona el bot&oacute;n crear
     */
    private void completaInfTipoArma(TarmArmas arma) {
        solicitudArmas.getRecord().getModifiedData().put("estado", arma.getEstado());
        solicitudArmas.getRecord().getModifiedData().put("marca", arma.getMarca());
//    	record.setCountrycode("EC");
//    	clase = ((TarmArmas)record.getModifiedData().get("arma")).getModifiedData().get("cclase") != null ? ((TarmArmas)record.getModifiedData().get("arma")).getModifiedData().get("cclase").toString() : null;
//    	calibre = record.getModifiedData().get("ccalibre") != null ? record.getModifiedData().get("ccalibre").toString() : null;
//    	longitud = record.getModifiedData().get("clongitud") != null ? record.getModifiedData().get("clongitud").toString() : null;
//    	tipoarma = record.getModifiedData().get("ctipoarmaexplosivo") != null ? record.getModifiedData().get("ctipoarmaexplosivo").toString() : null;
    }

    /**
     * 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.getMfilelds().put("solcodprovincia", direccionPersona.getProvincecode());
            direccion.setLprovinces(ProvinceController.find(direccionPersona.getCountrycode()));
            direccion.getMfilelds().put("solcodcanton", direccionPersona.getCantoncode());
            direccion.setLcantones(CantonController.find(direccionPersona.getCountrycode(), direccionPersona.getProvincecode()));
            direccion.getMfilelds().put("solcodciudad", direccionPersona.getCitycode());
            direccion.setLcities(CityController.find(direccionPersona.getCountrycode(), direccionPersona.getProvincecode(), direccionPersona.getCantoncode()));
            direccion.getMfilelds().put("solcodparroquia", direccionPersona.getParroquiacode());
            direccion.setLparroquias(ParroquiaController.find(direccionPersona.getCountrycode(), direccionPersona.getProvincecode(), direccionPersona.getCantoncode()));
            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());
        }
    }

    /**
     * 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());
    	}
    }*/
    /**
     *
     */
    private void setearTramite() {
        try {
            if (solicitud.getRecord().getCtramite() == null) {
                return;
            }
            TarmTramite tramite = TarmTramiteController.find(solicitud.getRecord().getCtramite().toString());
            solicitud.getRecord().setCtramite(tramite.getPk());
            TgeneCatalogDetail tipoTramite = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
            TgeneCatalogDetail tipoAutorizacion = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());
            TgeneCatalogDetail categoria = CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
            TgeneCatalogDetail 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());
            this.ingresarRequisitos = Boolean.TRUE;
            obtenerCentroControl(solicitud.getRecord());
            if (tramite.getCategoria().equals("14")) {
                requiereNoSolAucpBln = Boolean.TRUE;
            } else {
                requiereNoSolAucpBln = Boolean.FALSE;
            }
            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;
                this.cargarDocumentos();
            } else {
                this.listarDocumentos = Boolean.FALSE;
                this.solicitudDocumento.clearAll();
            }

            if (tramite != null) {
                this.cargarRequisitos();
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Obtiene el centro de control segun usurio logeado.
     *
     * @param solicitud
     * @throws Exception
     *
     */
    private void obtenerCentroControl(TarmSolicitud solicitud) throws Exception {

        this.centroControl = CentroControlArmasController.findPorCodigo(solicitud.getCcentrocontrol());
        this.setNombreInstitucion(CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo()).getDescription());

    }

    private void cargaArmas() throws Exception {

        solicitudArmas.clearAll();
        solicitudArmas.addFilter("pk.csolicitud", solicitud.getRecord().getPk());
        solicitudArmas.setCodigoSolicitud(solicitud.getRecord().getPk());
        solicitudArmas.setRecperpage(5000);
        solicitudArmas.querydatabase();
    }

    private void cargaGuardias() throws Exception {
        solicitudGuardias.clearAll();
        solicitudGuardias.addFilter("pk.csolicitud", solicitud.getRecord().getPk());
        solicitudGuardias.query();
        for (TarmSolicitudGuardias solicitudGuardia : solicitudGuardias.getLrecord()) {
            solicitudGuardia.getModifiedData().put("guardia", GuardiasController.find(solicitudGuardia.getPk().getCguardia().toString(), solicitudGuardia.getPk().getCempresa().toString()));
        }
    }

    private void cargarAgencias() throws Exception {
        solicitudAgenciaSucursal.clearAll();
        solicitudAgenciaSucursal.addFilter("pk.csolicitud", solicitud.getRecord().getPk());
        solicitudAgenciaSucursal.query();
        for (TarmSolicitudAgenciaSucursal solAgenciaSucursal : solicitudAgenciaSucursal.getLrecord()) {
            solAgenciaSucursal.getModifiedData().put("agencia", AgenciaSucursalController.find(solAgenciaSucursal.getPk().getCagencia().toString()));
        }
    }

    private void cargarDocumentos() throws Exception {
        solicitudDocumento.clearAll();
        solicitudDocumento.addFilter("pk.csolicitud", solicitud.getRecord().getPk());
        solicitudDocumento.query();

        SolicitudController.findSolicitudxcodsolicitud(solicitud.getRecord().getPk());
        TarmTramite tramite = TarmTramiteController.find(String.valueOf(SolicitudController.findSolicitudxcodsolicitud(solicitud.getRecord().getPk()).getCtramite()));
        TgeneCatalogDetail tipoTramite = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
        TgeneCatalogDetail tipoAutorizacion = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());
        TgeneCatalogDetail actividad = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
        Boolean muestraArmas = listarArmas(tipoTramite, tipoAutorizacion, actividad);

        for (TarmSolicitudDocumento solDocumento : solicitudDocumento.getLrecord()) {
            TarmDocumentoHabilitante documentoHabilitante = DocumentoHabilitanteController.find(solDocumento.getPk().getCdocumento().toString());
            solDocumento.getModifiedData().put("documento", documentoHabilitante);
            solDocumento.getModifiedData().put("arma", muestraArmas ? ArmasController.findPorCodigo(documentoHabilitante.getCarma()) : null);
        }
    }

    /**
     * Metodo para listar las armas segun la combinacion de tipo de tramite
     *
     * @param tipoTramite tipo del tramite
     * @param tipoAutorizacion tipo de la autorizacion
     * @param actividad tipo de la actividad
     * @return valor booleano que indica si se muestran o no als armas
     * @throws Exception
     */
    private boolean listarArmas(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())) {
            return false;
        }
        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())) {
            return true;
        }
        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())) {
            return false;
        }
        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())) {
            return true;
        }
        return true;
    }

    private void cargarRequisitos() throws Exception {
        requisitos.clearAll();
        requisitos.addFilter("pk.csolicitud", solicitud.getRecord().getPk());
        requisitos.query();
        for (TarmSolicitudRequisitos solicitudRequisitos : requisitos.getLrecord()) {
            solicitudRequisitos.getModifiedData().put("requisito", RequisitoController.findxId(solicitudRequisitos.getPk().getCrequisito()));
        }
    }

    public List<TgeneCatalogDetail> getLtipopersona() {
        return ltipopersona;
    }

    public void setLtipopersona(List<TgeneCatalogDetail> ltipopersona) {
        this.ltipopersona = ltipopersona;
    }

    public List<TgeneCatalogDetail> getLtipoidenti() {
        return ltipoidenti;
    }

    public void setLtipoidenti(List<TgeneCatalogDetail> ltipoidenti) {
        this.ltipoidenti = ltipoidenti;
    }

    public List<TgeneCatalogDetail> getLtipotramite() {
        return ltipotramite;
    }

    public void setLtipotramite(List<TgeneCatalogDetail> ltipotramite) {
        this.ltipotramite = ltipotramite;
    }

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

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

    public boolean isExisteSolicitud() {
        return existeSolicitud;
    }

    public void setExisteSolicitud(boolean existeSolicitud) {
        this.existeSolicitud = existeSolicitud;
    }

    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 UserDetailController getDetalleusuario() {
        return detalleusuario;
    }

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

    public SolicitudArmasController getSolicitud() {
        return solicitud;
    }

    public void setSolicitud(SolicitudArmasController solicitud) {
        this.solicitud = solicitud;
    }

    public PersonDetailController getDetallepersona() {
        return detallepersona;
    }

    public void setDetallepersona(PersonDetailController detallepersona) {
        this.detallepersona = detallepersona;
    }

    public PeopleController getNatural() {
        return natural;
    }

    public void setNatural(PeopleController natural) {
        this.natural = natural;
    }

    public PersonAddressController getDireccion() {
        return direccion;
    }

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

    public PersonPhoneController getTelefono() {
        return telefono;
    }

    public void setTelefono(PersonPhoneController telefono) {
        this.telefono = telefono;
    }

    public SolicitudRequisitosController getRequisitos() {
        return requisitos;
    }

    public void setRequisitos(SolicitudRequisitosController requisitos) {
        this.requisitos = requisitos;
    }

    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 RecepcionArmasController getSolicitudArmas() {
        return solicitudArmas;
    }

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

    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 SolicitudAgenciaSucursalController getSolicitudAgenciaSucursal() {
        return solicitudAgenciaSucursal;
    }

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

    public DocumentoHabilitanteController getDocumentoHabilitante() {
        return documentoHabilitante;
    }

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

    public TarmSolicitudDocumentoController getSolicitudDocumento() {
        return solicitudDocumento;
    }

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

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

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

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

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

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

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

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

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

    @Override
    public void completarTarea() {
        try {
            Request request = callerhelper.getRequest();
            // limpiar request para finalizar la tarea.
            super.cleanRequest(request);
            System.out.println("1.....csolicitud :" + solicitud);
            System.out.println("2.....csolicitud :" + solicitud.getRecord());
            System.out.println("3.....csolicitud :" + solicitud.getRecord().getPk());
            request.modifiedData().put("csolicitud", solicitud.getRecord().getPk());
            if (tid == null) {
                tid = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("taskId").toString();
            }
            request.modifiedData().put("TID", tid);
            if (bpmDataStatus.equals("D")) {
                // Se aumento las observaciones para ser enviadas en el mail
                Map<String, Object> datosmail = new HashMap<String, Object>();
                datosmail.put("razons", detallepersona.getRecord().getName());
                datosmail.put("sol", solicitud.getRecord().getNumerosolicitud());
                datosmail.put("observaciones", bpmDataComment);
                //grado funcionario de la persona logeada
                TsafeUserDetail userDetailObj = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
                TcustPersonDetail personDetailObj = PersonDetailController.find(userDetailObj.getPk().getPersoncode().toString());
                datosmail.put("grado", personDetailObj.getMilitarygrade());
                datosmail.put("funcionario", personDetailObj.getName());
                // CCA
                TarmCentroControl centroControl = CentroControlArmasController.findPorCodigo(solicitud.getRecord().getCcentrocontrol());
                datosmail.put("centrocontrol", centroControl.getModifiedData().get("desinstitucion"));
                request.modifiedData().put("datosmail", datosmail);
            }
            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) {
                this.postCommit(resp);
                // CATEGORIA 14	PREVIA IMPORTACION
                if (bpmDataStatus.equals("D")) {
                    TarmTramite tarmTramite = TarmTramiteController.find(this.solicitud.getRecord().getCtramite().toString());
                    if (tarmTramite.getCategoria().equals("14")) {
                        desasociarCargaSolicitud();
                    }
                }
                MessageHelper.setMessageInfo(resp);
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

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

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

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

    public CargaController getCargaController() {
        return cargaController;
    }

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

    public Boolean getRequiereNoSolAucpBln() {
        return requiereNoSolAucpBln;
    }

    public void setRequiereNoSolAucpBln(Boolean requiereNoSolAucpBln) {
        this.requiereNoSolAucpBln = requiereNoSolAucpBln;
    }

    public String getNombreInstitucion() {
        return nombreInstitucion;
    }

    public String setNombreInstitucion(String nombreInstitucion) {
        if (nombreInstitucion != null && !nombreInstitucion.isEmpty()) {
            this.nombreInstitucion = nombreInstitucion;
        } else {
            this.nombreInstitucion = "";
        }

        return nombreInstitucion;
    }

}
