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

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.Filter;
import com.fp.dto.query.SubQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.ReportController;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.TarmCentroControlJurController;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.ParametersController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.frontend.utility.MsgGeneral;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmCentroControlJur;
import com.fp.persistence.parmas.soli.TarmDecomiso;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.parmas.soli.TarmDecomisoArmaTransaccion;
import com.fp.persistence.parmas.soli.TarmTransaccionArmaBodega;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 * Clase controladora del bean TarmDecomisoArma.
 *
 * @author C.P.
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class VerificacionBodegaController extends AbstractController<TarmDecomisoArma> {

    /**
     * prefijo para la generacion del numero de transaccion
     */
    private static final String prefijo = "REC";

    @ManagedProperty(value = "#{decomisoArmaTransaccionController}")
    private DecomisoArmaTransaccionController decomisoArmaTransaccionController;

    @ManagedProperty(value = "#{transaccionArmaBodegaController}")
    private TransaccionArmaBodegaController transaccionArmaBodegaController;

    @ManagedProperty(value = "#{bodegaController}")
    private BodegaController bodegaController;

    @ManagedProperty(value = "#{decomisoController}")
    private DecomisoController decomisoController;

    /**
     * Controlador para generar el reporte
     */
    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;
    /**
     * Controlador para caragar el archivo al alfresco
     */
    @ManagedProperty(value = "#{alfrescoController}")
    private AlfrescoController alfrescoController;

    private Boolean isCentroDpto = Boolean.FALSE;

    /**
     * ruta para cargar el archivo
     */
    private String xpathflujo;
    /**
     * Atributo para la lista de objetos TgeneCatalogDetail
     */
//	private List<TgeneCatalogDetail> linstitucion;
    /**
     * Atributo para la lista de objetos TgeneCatalogDetail
     */
//	private List<TarmCentroControl> lnombreInstitucion;
    /**
     * Fecha de corte
     */
    private Date fechaCorte;
    /**
     * Codigo del centro de control
     */
    private String codigoOrganismoControl;
    /**
     * codigo de la unidad de control
     */
    private String codigoUnidadControl;
    /**
     * numero de custodia del arma
     */
//	private String numeroDecomiso;

    private String numerotransaccionEnvio;
    /**
     * atributo con los datos del usuario logeado
     */
    private TsafeUserDetail userDetail;
    /**
     * catalogo de tipos de reporte
     */
    private List<TgeneCatalogDetail> lTipoReporte;
    /**
     * atributo para habilitar o desabilitar al boton guaradr
     */
    private Boolean btnSave;
    /**
     * Deshabilita la pantalla despu&eacute;s de grabar la solicitud
     */
    private boolean btnSelTodos;
    /**
     * Deshabilita la pantalla despu&eacute;s de grabar la solicitud
     */
    private boolean cmbTransaccionenvio;
    /**
     * atributo para habilitar o desabilitar al boton genera acta
     */
    private Boolean btnGenerarActa;
    /**
     * Atributo para el numero de transacion de recibido que se genera al pulsar
     * el boton generar acta
     */
    private String numRecepcionGenerado;
    /**
     * Atributo para el numero de transacion de recibido que se genera al pulsar
     * el boton generar acta
     */
    private String numRecepcionGeneradoAux;
    /**
     * clave primaria de la tabla TarmDecomisoArmaTransaccion
     */
    private String numerotransaccionpk;
    /**
     * clave primaria de la tabla TarmDecomisoArmaTransaccion
     */
    private String numerotransaccionpkAux;
    /**
     * fecha con la que se realizo el reporte
     */
    private Date fechaCorteg;
    /**
     * formato del reporte PDF
     */
    private String format;
    /**
     * Tipo de reporte PDF
     */
    private String tipoReporte;
    /**
     * centro de control
     */
    private TarmCentroControl centroControl;
    /**
     * nombre del centro de control
     */
    private String institucionCentroControl;
    /**
     * nombre del centro de control
     */
    private String instiCentroControlCode;
    /**
     * codigo del decomiso del catalogo ESTADOARMA
     */
    private String codigoDecomiso;
    /**
     * codigo de la incautacion del catalogo ESTADOARMA
     */
    private String codigoIncautacion;
    /**
     * codigo de entrega voluntaria del catalogo ESTADOARMA
     */
    private String entregaVoluntaria;
    /**
     * codigo de abandono del catalogo ESTADOARMA
     */
    private String abandono;
    /**
     * codigo del reclamo del catalogo ESTADOARMA
     */
    private String codigoReclamo;
    /**
     * codigo de la provincia del usuario que se logeo
     */
    private String cprovincia;

    private Boolean itemsUnidadBolean;

    //Manu
    /**
     * centro de control destino
     */
    private String organismoControlDestino;
    /**
     * codigo de la unidad de control
     */
    private String unidadControlDestino;
    /**
     * unidad de control destino
     */
    private String codigoUnidadControlDestino;

    private String centroControlOrigenStr;
    private String unidadOrigenStr;
    /**
     * estado operacion del decomiso del catalogo ESTADOARMA
     */
    private String estadoOperacion;

    private List<SelectItem> itemUnidadDestino;
    private List<TarmDecomisoArmaTransaccion> listaEnviosRealizados;

    public VerificacionBodegaController() throws Exception {
        super(TarmDecomisoArma.class);
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        super.startQuery();

    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            recperpage = 100000; // Cambiar al # reg a mirar.
            lrecord = new ArrayList<TarmDecomisoArma>();
            beanalias = "DECOMARMTRANRECECCION";
            //boton desabilitado
            btnSave = Boolean.TRUE;
            btnGenerarActa = Boolean.TRUE;
            btnSelTodos = Boolean.TRUE;
            cmbTransaccionenvio = Boolean.TRUE;
            //fecha actual para el corte
            fechaCorte = new Date();
            //CARGA DE CATALOGOS
//			linstitucion=CatalogDetailController.find("INSTITUCION");
            lTipoReporte = CatalogDetailController.find("TIPOREPORTE");
            //obtiene el centro de control
            obtenerCentroControl();
            format = "pdf";
            numerotransaccionpk = null;
            codigoDecomiso = codigos("CODIGO.DECOMISADA");//DEC
            codigoIncautacion = codigos("CODIGO.INCAUTADA");//INC
            entregaVoluntaria = codigos("CODIGO.ENTV");
            abandono = codigos("CODIGO.ABAN");
            codigoReclamo = codigos("CODIGO.RECL");//RECLAMO
            xpathflujo = null;
            itemsUnidadBolean = Boolean.FALSE;
            estadoOperacion = "ENVIO";

            TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");

            codigoUnidadControlDestino = tsafeUserDetail.getCcentrocontrol();

            organismoControlDestino = tsafeUserDetail.getModifiedData().get("centrocontrol").toString();
            unidadControlDestino = tsafeUserDetail.getModifiedData().get("unidad").toString();

            //codigoOrganismoControl = tsafeUserDetail.getCcentrocontrol();
            codigoUnidadControl = tsafeUserDetail.getCcentrocontrol();
            listaEnviosRealizados = DecomisoArmaTransaccionController.findParaReception(codigoUnidadControl);
//        	System.out.println(listaDecomisoArmaTrans1.size());

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

    /**
     * M&eacute;todo para obtener el centro de control
     *
     * @throws Exception
     */
    private void obtenerCentroControl() throws Exception {
        userDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
        centroControl = CentroControlArmasController.findPorCodigo(userDetail.getCcentrocontrol());
        cprovincia = centroControl.getProvincecode();
        itemUnidadDestino = new ArrayList<SelectItem>();
        institucionCentroControl = CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo()).getDescription();
        //codigo del centro de control de pichincha
        TgeneParameters paramCentroControlDestino = ParametersController.find("CODIGO.CENT.CONTROL.PICHINCHA", "1");//000030//CAPI
        //validamos si la persona que ingreso pertenece al centro de control pichincha para darle al opcion de seleccionar el deparatmento de control para la recepcion
        if (paramCentroControlDestino.getTextvalue().equals(centroControl.getNombreinstitucion())) {
            itemUnidadDestino.add(new SelectItem(centroControl.getPk(), institucionCentroControl));
            //codigo del departamento de control
            TgeneParameters paramDepartamentoControl = ParametersController.find("CODIGO.DEPT.CONTROL", "1");//DPCA
            TarmCentroControl institCentroControlDestino = CentroControlArmasController.findPorCentroControl(paramDepartamentoControl.getTextvalue());//000077
            itemUnidadDestino.add(new SelectItem(institCentroControlDestino.getPk(), "" + institCentroControlDestino.getModifiedData().get("desnombreinstitucion")));
        } else {
            instiCentroControlCode = centroControl.getPk();
        }
    }

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

    /**
     * Crea una instancia de TgeneTransactionProcess y marca el registro como
     * nuevo.
     *
     * @throws Exception
     */
    @Override
    public void create() throws Exception {
        super.create();
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {
        try {
            if (fechaCorte != null) {
                DtoQuery dto = this.getDtoQuery();
                dto.setOrderby("t.fdecomiso");
                if (numerotransaccionpk != null) {
                    SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
                    Filter decomisoFiltro = new Filter();
                    decomisoFiltro.setSql("t.fdecomiso <= " + "TO_DATE('"
                            + formato.format(fechaCorte) + "','yyyy-MM-dd') and (t.estado='" + codigoDecomiso + "' or t.estado='" + codigoIncautacion + "' or t.estado='" + abandono + "' or t.estado='" + codigoReclamo + "')  and t.cdecarmtranrecepcion = " + numerotransaccionpk);
                    dto.addFiltro(decomisoFiltro);
                } else {//aniadimos los filtros de busqueda
                    dto = filtroVerificarArmas(dto);
                    numRecepcionGenerado = null;
                    //codigoOrganismoControlDestino = null;
                    //codigoUnidadControlDestino = null;
                }
                HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
                mtables.put(beanalias, dto);
                Request request = callerhelper.getRequest();
                request.setQueryTables(mtables);
                Response resp = callerhelper.executeQuery(request);
                if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                    lrecord = new ArrayList<TarmDecomisoArma>();
                    btnSelTodos = Boolean.TRUE;
                    MessageHelper.setMessageError(resp);
                } else {
                    lrecord = (List<TarmDecomisoArma>) resp.get(beanalias);
                    //metodo para completar la informacion
                    completarInformacionArma();
                    btnSave = Boolean.TRUE;
                    btnSelTodos = Boolean.FALSE;
                    btnGenerarActa = Boolean.TRUE;
                    numerotransaccionpk = null;
                    super.postQuery(lrecord);
                }
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Retorna un {@link DtoQuery} con los atributos a presentarse
     *
     * @return
     * @throws Exception
     */
    private DtoQuery getDtoQuery() throws Exception {
        DtoQuery dto = super.getDtoQuery(true);

        SubQuery subqueryNumRec = new SubQuery("TarmDecomiso", "numerorecibo", "nrecibo", "i.pk=t.cdecomiso");
        dto.addSubQuery(subqueryNumRec);
        SubQuery subqueryNumTransac = new SubQuery("TarmDecomiso", "numerotransaccion", "numerotransaccion", "i.pk=t.cdecomiso");
        dto.addSubQuery(subqueryNumTransac);
        SubQuery subqueryCentroControl = new SubQuery("TarmDecomiso", "ccentrocontrol", "ccentrocontrol", "i.pk=t.cdecomiso");
        dto.addSubQuery(subqueryCentroControl);
        SubQuery subqueryMarca = new SubQuery("TgeneCatalogDetail", "description", "nmarca",
                "i.pk.catalog=(select o.marca from TarmArmas o where o.pk=t.carma)"
                + " and i.pk.catalogcode=(select o.marcacodigo from TarmArmas o where o.pk=t.carma)");
        dto.addSubQuery(subqueryMarca);
        SubQuery subquerySerieArma = new SubQuery("TarmArmas", "lote", "nserie", "i.pk=t.carma");
        dto.addSubQuery(subquerySerieArma);

        SubQuery subqueryCalibre = new SubQuery("TgeneCatalogDetail", "description", "ncalibre",
                "i.pk.catalog    =(select o.calibre       from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))"
                + " and i.pk.catalogcode=(select o.calibrecodigo from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))");//calibrecodigo
        dto.addSubQuery(subqueryCalibre);

        SubQuery subqueryCodigoReg = new SubQuery("TarmArmas", "cregistro", "cregistro", "i.pk=t.carma");
        dto.addSubQuery(subqueryCodigoReg);
        SubQuery subqueryCodigoArmaExplo = new SubQuery("TarmArmas", "ctipoarmaexplosivo", "ctipoarmaexplosivo", "i.pk=t.carma");
        dto.addSubQuery(subqueryCodigoArmaExplo);
        //tipo, clase, unidad de TarmTipoArmaExplosivo
        SubQuery subqueryTipo = new SubQuery("TgeneCatalogDetail", "description", "ntipo",
                "i.pk.catalog    =(select o.tipoarmaexplosivo       from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))"
                + " and i.pk.catalogcode=(select o.tipoarmaexplosivocodigo from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))");
        dto.addSubQuery(subqueryTipo);
        SubQuery subqueryClase = new SubQuery("TgeneCatalogDetail", "description", "nclase",
                "i.pk.catalog    =(select o.clase       from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))"
                + " and i.pk.catalogcode=(select o.clasecodigo from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))");
        dto.addSubQuery(subqueryClase);
        SubQuery subqueryUnidad = new SubQuery("TgeneCatalogDetail", "description", "nunidad",
                "i.pk.catalog    =(select o.unidadmedidapeso       from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))"
                + " and i.pk.catalogcode=(select o.unidadmedidapesocodigo from TarmTipoArmaExplosivo o where o.pk=(select a.ctipoarmaexplosivo from TarmArmas a where a.pk=t.carma))");
        dto.addSubQuery(subqueryUnidad);
        //personcode
        //TarmRegistroArmas registroArma = RegistroArmController.findByCodigo(decomisoArma.getModifiedData().get("cregistro").toString());
        SubQuery subqueryPersonCode = new SubQuery("TarmRegistroArmas", "personcode", "personcode", " i.pk =(select o.cregistro from TarmArmas o where o.pk=t.carma)");
        dto.addSubQuery(subqueryPersonCode);

        SubQuery subquerEstadoFlujo = new SubQuery("TarmDecomisoArmaTransaccion", "estadoflujo", "estadoflujo", "i.pk=t.cdecomisoarmatransaccion");
        dto.addSubQuery(subquerEstadoFlujo);
        return dto;
    }

    @Override
    public void save() {
        try {
            Boolean seleccion = Boolean.FALSE;
            for (TarmDecomisoArma decomisoArma : this.lrecord) {
                record = decomisoArma;
                if (record.getModifiedData().get("seleccion").equals(Boolean.TRUE)) {
                    seleccion = true;
                    record.setCdecarmtranrecepcion(0l);
                    record.setCoperaciontransaccion("RECEPCION");
                }
                this.update();
            }
            if (!seleccion) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_verificararmas"));
                return;
            }
            Request request = callerhelper.getRequest();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

            Calendar cal = Calendar.getInstance();
            cal.setTime(fechaCorte);
            java.sql.Date fechaCorteRegistro = new java.sql.Date(cal.getTimeInMillis());

            this.decomisoArmaTransaccionController.create();
            this.decomisoArmaTransaccionController.getRecord().setFtransaccion(null);
            this.decomisoArmaTransaccionController.getRecord().setFcorte(fechaCorteRegistro);
            this.decomisoArmaTransaccionController.getRecord().setCcentrocontrol(codigoUnidadControlDestino);//de la persona que revcibe//centroControl.getPk() codigoUnidadControlDestino

            TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            TarmCentroControl centroControlLogin = CentroControlArmasController.findPorCodigo(tsafeUserDetail.getCcentrocontrol());

            if (!"1".equals(CatalogDetailController.findxCodigoCodcatalogo(centroControlLogin.getInstitucion(), centroControlLogin.getInstituciontipo()).getPk().getCatalog())) {
                this.decomisoArmaTransaccionController.getRecord().setEstadofirma("Y");
                this.decomisoArmaTransaccionController.getRecord().setEstadoflujo("ENV");
                isCentroDpto = Boolean.FALSE;
            } else {
                this.decomisoArmaTransaccionController.getRecord().setEstadofirma("N");
                this.decomisoArmaTransaccionController.getRecord().setEstadoflujo("NOENV");
                isCentroDpto = Boolean.TRUE;
            }

            this.decomisoArmaTransaccionController.update();
            DtoSave dtosaveDecomisoTran = this.decomisoArmaTransaccionController.getDtoSave(true);
            dtosaveDecomisoTran.setReturnpk(true);
            dtosaveDecomisoTran.setPosition(1);
            msave.put(decomisoArmaTransaccionController.getBeanalias(), dtosaveDecomisoTran);

            DtoSave dtosaveDecomiso = this.getDtoSave(true);
            dtosaveDecomiso.setReturnpk(true);
            dtosaveDecomiso.setPosition(2);
            msave.put(getBeanalias(), dtosaveDecomiso);

            //transacciones del arma
            DtoSave dtosaveArmaBodega = transaccionArmaBodegaController.getDtoSave(true);
            dtosaveArmaBodega.setReturnpk(true);
            dtosaveArmaBodega.setPosition(3);
            msave.put(transaccionArmaBodegaController.getBeanalias(), dtosaveArmaBodega);
            //bodega del arma
            DtoSave dtosaveBodega = bodegaController.getDtoSave(true);
            dtosaveBodega.setReturnpk(true);
            dtosaveBodega.setPosition(4);
            msave.put(bodegaController.getBeanalias(), dtosaveBodega);

            //para la actualizacion del centro de control destino
            DtoSave dtosaveDecomisoCab = decomisoController.getDtoSave(true);
            dtosaveDecomisoCab.setPosition(5);
            msave.put(decomisoController.getBeanalias(), dtosaveDecomisoCab);

            request.setSaveTables(msave);
            //prefijo
            request.put("prefijo", prefijo);
            // para el flujo
            request.modifiedData().put("isnew", "N");//para que ejecute desde un boton
            //completa la informacion en un transaction rule DecomisoArmaRecepcion
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.decomisoArmaTransaccionController.postCommit(resp);
                this.postCommit(resp);
                TarmDecomisoArmaTransaccion decomisoArmaTransaccion = (TarmDecomisoArmaTransaccion) dtosaveDecomisoTran.getLinsert().get(0);
                numerotransaccionpk = decomisoArmaTransaccion.getPk().toString();
                numerotransaccionpkAux = decomisoArmaTransaccion.getPk().toString();
                //numereo de transaccion
                numRecepcionGenerado = resp.get("numerotransaccionrecep").toString();
                numRecepcionGeneradoAux = resp.get("numerotransaccionrecep").toString();
                fechaCorteg = decomisoArmaTransaccion.getFcorte();
                //metodo para generar el acta
                querydatabase();
                btnSave = Boolean.TRUE;
                btnSelTodos = Boolean.TRUE;
                cmbTransaccionenvio = Boolean.FALSE;
                btnGenerarActa = Boolean.FALSE;
//                numerotransaccionEnvio = "";
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

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

    /**
     * M&eacute;todo para el evento change del combo transaccion
     */
    public void executeTransaccion() {
        List<TarmDecomisoArmaTransaccion> decomisoArmaTransaccionOrigen = DecomisoArmaTransaccionController.findPorEnvio(numerotransaccionEnvio, true);
        if (decomisoArmaTransaccionOrigen != null && !decomisoArmaTransaccionOrigen.isEmpty()) {
//    		codigoUnidadControlDestino = decomisoArmaTransaccionOrigen.get(0).getCcentrocontrol();
            TarmCentroControl centroControlOrigen = CentroControlArmasController.findPorCodigo(decomisoArmaTransaccionOrigen.get(0).getCcentrocontrol());
            centroControlOrigenStr = CatalogDetailController.findxCodigoCodcatalogo(centroControlOrigen.getInstitucion(), centroControlOrigen.getInstituciontipo()).getDescription();
            unidadOrigenStr = CatalogDetailController.findxCodigoCodcatalogo(centroControlOrigen.getNombreinstitucion(), centroControlOrigen.getNombreinstitucioncodigo()).getDescription();
        }
    }

    /**
     * Completa las caracteristicas del arma de los catalogos correspondientes
     */
    public void completarInformacionArma() {
        List<TarmDecomisoArma> armasNoenviadas = new ArrayList<TarmDecomisoArma>();
        for (TarmDecomisoArma decomisoArma : lrecord) {
            decomisoArma.getModifiedData().put("seleccion", false);
            //TarmRegistroArmas registroArma = RegistroArmController.findByCodigo(decomisoArma.getModifiedData().get("cregistro").toString());
            if (decomisoArma.getModifiedData().get("personcode") != null) {
                TcustPersonDetail tcustPersonDetail = PersonDetailController.find(decomisoArma.getModifiedData().get("personcode").toString());
                decomisoArma.getModifiedData().put("nrazons", tcustPersonDetail.getName());
                decomisoArma.getModifiedData().put("documento", tcustPersonDetail.getIdentification());
            }
            if (decomisoArma.getModifiedData().get("estadoflujo") != null && decomisoArma.getModifiedData().get("estadoflujo").equals("NOENV")) {
                armasNoenviadas.add(decomisoArma);
            }
        }

        for (TarmDecomisoArma decomisoArma : armasNoenviadas) {
            lrecord.remove(decomisoArma);
        }
    }

    /**
     * M&eacute;todo para habilitar o desabilitar el btn Arma a decomisar
     *
     * @throws Exception
     */
    public void onChange(TarmDecomisoArma decomisoArma) throws Exception {
        btnSave = Boolean.TRUE;
        itemsUnidadBolean = Boolean.FALSE;
        for (TarmDecomisoArma t : lrecord) {
            if (t.getModifiedData().get("seleccion").equals(Boolean.TRUE)) {
                btnSave = Boolean.FALSE;
                itemsUnidadBolean = Boolean.TRUE;
            }
        }
    }

    /**
     * Metodo para filtrar por Unidad de Control
     *
     * @param dto Dto sobre el que se va a ejecutar el filtro
     * @throws Exception
     */
    private DtoQuery filtroVerificarArmas(DtoQuery dto) throws Exception {
        Filter decomisoFiltro = new Filter();
        List<TarmDecomisoArmaTransaccion> listaDecomisoArmaTrans = new ArrayList<>();
        if (numerotransaccionEnvio != null && !"".equals(numerotransaccionEnvio)) {
            listaDecomisoArmaTrans = DecomisoArmaTransaccionController.findPorEnvio(numerotransaccionEnvio, true);
        } else {
            listaDecomisoArmaTrans = DecomisoArmaTransaccionController.findPorOrganismoUnidad(codigoUnidadControl, fechaCorte, estadoOperacion);
        }

        String filtroDecomisoArmaTrans = "";
        if (listaDecomisoArmaTrans != null && !listaDecomisoArmaTrans.isEmpty()) {
            StringBuffer lstBuffer = new StringBuffer();
            for (TarmDecomisoArmaTransaccion decomisoArmaTrans : listaDecomisoArmaTrans) {
                if (!lstBuffer.toString().isEmpty()) {
                    lstBuffer.append(" or ");
                }
                lstBuffer.append("t.cdecomisoarmatransaccion = " + decomisoArmaTrans.getPk());
            }
            filtroDecomisoArmaTrans = (!lstBuffer.toString().trim().isEmpty()) ? " and (" + lstBuffer.toString() + ")" : "";
        } else {
            filtroDecomisoArmaTrans = "and (t.cdecomisoarmatransaccion = 999999)";
        }
        decomisoFiltro.setSql("(t.estado='" + codigoDecomiso + "' or t.estado='" + codigoIncautacion + "' or t.estado='" + entregaVoluntaria + "' or t.estado='" + abandono + "' or t.estado='" + codigoReclamo + "')  and t.cdecomiso is not null and t.coperaciontransaccion = '" + estadoOperacion + "' and t.enbodega='Y'" + filtroDecomisoArmaTrans);
        dto.addFiltro(decomisoFiltro);
        return dto;
    }

    /**
     * Seleccionado todos los registros de la tabla
     */
    public void seleccionarTodos(AjaxBehaviorEvent event) {
        try {
            Boolean valorColocar = Boolean.FALSE;
            if (Boolean.valueOf(event.getComponent().getAttributes().get("value") != null ? event.getComponent().getAttributes().get("value").toString() : "false")) {
                valorColocar = Boolean.TRUE;
            }

            btnSave = Boolean.TRUE;
            for (TarmDecomisoArma decomisoArma : lrecord) {
                decomisoArma.getModifiedData().put("seleccion", valorColocar);
                if (decomisoArma.getModifiedData().get("seleccion").equals(Boolean.TRUE)) {
                    btnSave = Boolean.FALSE;
                    //itemsUnidadBolean=Boolean.TRUE;
                }
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo para generar el acta de recepcion y cargar el archivo en el
     * alfresco
     */
    public void generarActa() {
        if (fechaCorteg != null) {
            Calendar fechaActualCldr = Calendar.getInstance();

            String codigoreporte = numerotransaccionpkAux;
            String path = "armas/reports/repo2";
            String filename = numRecepcionGenerado;
            String gradoUsuario = "";
            TcustPersonDetail usuario = PersonDetailController.find(this.userDetail.getPk().getPersoncode().toString());
            TgeneCatalogDetail grado = CatalogDetailController.findxCodigoCodcatalogo(usuario.getMilitarygrade(), usuario.getMilitarygradecode());
            if (grado != null) {
                gradoUsuario = grado.getDescription() + " - " + usuario.getName();
            } else {
                gradoUsuario = "Sin Grado - " + usuario.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");
            try {
                // Usuario logueado en la aplicacion
                String nombreUsuario;
                if (userDetail.getPk().getPersoncode() != null) {
                    nombreUsuario = PersonDetailController.find(userDetail.getPk().getPersoncode().toString()).getName();
                } else {
                    nombreUsuario = "";
                }

//				TarmCentroControl centroControlDestino = CentroControlArmasController.findPorCodigo(codigoUnidadControlDestino);
//	            String centroControlDestinoStr = CatalogDetailController.findxCodigoCodcatalogo( centroControlDestino.getInstitucion(), centroControlDestino.getInstituciontipo()).getDescription();
//	            String unidadControlDestinoStr = CatalogDetailController.findxCodigoCodcatalogo( centroControlDestino.getNombreinstitucion(), centroControlDestino.getNombreinstitucioncodigo()).getDescription();
                parameters.put("user", nombreUsuario);
                parameters.put("organismoControlOrigen", centroControlOrigenStr);
                parameters.put("unidadControlOrigen", unidadOrigenStr);
                parameters.put("organismoControlDestino", organismoControlDestino);
                parameters.put("unidadControlDestino", unidadControlDestino);
                parameters.put("codigodec", codigoreporte.toString());//este
                parameters.put("fechaCorte", new SimpleDateFormat("dd-MM-yyyy").format(fechaCorteg));//este
                parameters.put("numtransaccion", numRecepcionGeneradoAux);
                parameters.put("personcode", userDetail.getPk().getPersoncode());
                parameters.put("nombregrado", gradoUsuario);//este
                // Fecha actual
                StringBuilder fechaActualSB = new StringBuilder();
                fechaActualSB = fechaActualSB.append((fechaActualCldr.get(Calendar.DAY_OF_MONTH)) <= 9 ? "0" + (fechaActualCldr.get(Calendar.DAY_OF_MONTH)) : (fechaActualCldr.get(Calendar.DAY_OF_MONTH)));
                fechaActualSB = fechaActualSB.append("-").append((fechaActualCldr.get(Calendar.MONTH) + 1) <= 9 ? "0" + (fechaActualCldr.get(Calendar.MONTH) + 1) : (fechaActualCldr.get(Calendar.MONTH) + 1));
                fechaActualSB = fechaActualSB.append("-").append(fechaActualCldr.get(Calendar.YEAR));
                fechaActualSB = fechaActualSB.append(" ").append(fechaActualCldr.get(Calendar.HOUR_OF_DAY));
                fechaActualSB = fechaActualSB.append(":").append((fechaActualCldr.get(Calendar.MINUTE)) <= 9 ? "0" + (fechaActualCldr.get(Calendar.MINUTE)) : (fechaActualCldr.get(Calendar.MINUTE)));
                parameters.put("lugarFecha", fechaActualSB.toString());

                TgeneCatalogDetail orgControl = CatalogDetailController.findCatalogo("NOMBREINSTITUCION", this.codigoUnidadControl);
                if (orgControl != null) {
                    parameters.put("orgControl", orgControl.getDescription());
                } else {
                    parameters.put("orgControl", "");
                }

                format = "pdf";
                InputStream file = this.reportController.jaspertoInputstream(path, parameters, format, filename, this.getLoginController());
                xpathflujo = generarXpath();
                if (!alfrescoController.uploadFile(file, numRecepcionGeneradoAux + ".pdf", xpathflujo)) {
                    xpathflujo = null;
                }
                System.out.println(xpathflujo + "/cm:" + numRecepcionGeneradoAux + ".pdf");
                numerotransaccionEnvio = "";
                //="cm:Decomiso/cm:A-2016/cm:M-01/cm:CENTRO CONTROL/cm:ABANDONO/cm:REC/cm:REC-000000319.pdf"
            } catch (Exception ex) {
                MessageHelper.setMessageError(ex);
            }
        }
    }

    /**
     * Metodo para generar la ruta donde se carga el archivo
     *
     * @return
     */
    public String generarXpath() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        StringBuilder ruta = new StringBuilder("cm:Decomiso");

        ruta = ruta.append("/cm:A-").append(calendar.get(Calendar.YEAR));
        ruta = ruta.append("/cm:M-").append((calendar.get(Calendar.MONTH) + 1) <= 9 ? "0" + (calendar.get(Calendar.MONTH) + 1) : (calendar.get(Calendar.MONTH) + 1));
        String centrocontrol = unidadControlDestino.replaceAll("\\s+", "_");
        ruta = ruta.append("/cm:").append(centrocontrol);
        ruta = ruta.append("/cm:" + "REC");

        return ruta.toString();
    }

    /**
     * Validacion de las fechas que no se amayor a la actual
     *
     * @param fech
     */
    public void validarfecha(Date fech) {
        if (fech.getTime() > (new Date()).getTime()) {
            fech = new Date();
            fechaCorte = new java.sql.Date(new Date().getTime());
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_fechadecomisonopuedesermayoralaactual"));
        }
    }

    /**
     * Ejecuta un reporte de armas a destruir M&eacute;todo para el inicio de
     * flujo
     */
    public void iniciarFlujo() {
        try {
            if (xpathflujo == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_generereporte"));
                return;
            }
            if (cprovincia == null || cprovincia.length() == 0) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_sinprovincia"));
                return;
            }

            //instiCentroControlCode
            TarmCentroControl centroControl = CentroControlArmasController.findPorCodigo(instiCentroControlCode);
            if (centroControl == null || centroControl.getPk() == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_sinprovincia"));
                return;
            }
            TgeneParameters paramDepartamentoControl = ParametersController.find("CODIGO.DEPT.CONTROL", "1");//DPCA
            if (centroControl.getNombreinstitucion().equals(paramDepartamentoControl.getTextvalue())) {
                cprovincia = paramDepartamentoControl.getTextvalue();
            }
            //itemUnidadDestino

            String xpath = xpathflujo + "/cm:" + numRecepcionGeneradoAux + ".pdf";
            Request request = callerhelper.getRequest();
            super.cleanRequest(request);
            //codigo de la tabla TarmDecomisoArmaTransaccion
            request.modifiedData().put("numerotransaccion", numerotransaccionpkAux);
            request.modifiedData().put("cprovincia", cprovincia);
            request.modifiedData().put("numerosolicitud", numRecepcionGeneradoAux);
            //ruta del archivo para la firma
            //TODO Falta crear la variable en maia 2-8
            request.modifiedData().put("xpath", xpath);
            request.modifiedData().put("isnew", "Y");
            request.setLogsolicitude(numRecepcionGeneradoAux);
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.setShowRow(true);
                MessageHelper.setMessageInfo(resp, MsgGeneral.getProperty("msg_initFlow") + " TRANSACCION: " + numerotransaccionpkAux);
                xpathflujo = null;
                btnGenerarActa = Boolean.TRUE;
                btnSelTodos = Boolean.TRUE;
                cmbTransaccionenvio = Boolean.FALSE;
                btnSave = Boolean.TRUE;
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void executeUnidad() {

        for (SelectItem item : itemUnidadDestino) {
            if (item.getValue().equals(instiCentroControlCode)) {
                institucionCentroControl = item.getLabel();
            }
        }
    }

    public List<TgeneCatalogDetail> getlTipoReporte() {
        return lTipoReporte;
    }

    public void setlTipoReporte(List<TgeneCatalogDetail> lTipoReporte) {
        this.lTipoReporte = lTipoReporte;
    }

    public Date getFechaCorte() {
        return fechaCorte;
    }

    public void setFechaCorte(Date fechaCorte) {
        this.fechaCorte = fechaCorte;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public ReportController getReportController() {
        return reportController;
    }

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

    public String getTipoReporte() {
        return tipoReporte;
    }

    public void setTipoReporte(String tipoReporte) {
        this.tipoReporte = tipoReporte;
    }

    public TsafeUserDetail getUserDetail() {
        return userDetail;
    }

    public void setUserDetail(TsafeUserDetail userDetail) {
        this.userDetail = userDetail;
    }

    public TarmCentroControl getCentroControl() {
        return centroControl;
    }

    public void setCentroControl(TarmCentroControl centroControl) {
        this.centroControl = centroControl;
    }

    /**
     * @return the listaEnviosRealizados
     */
    public List<TarmDecomisoArmaTransaccion> getListaEnviosRealizados() {
        return listaEnviosRealizados;
    }

    /**
     * @param listaEnviosRealizados the listaEnviosRealizados to set
     */
    public void setListaEnviosRealizados(
            List<TarmDecomisoArmaTransaccion> listaEnviosRealizados) {
        this.listaEnviosRealizados = listaEnviosRealizados;
    }

    public String getCodigoOrganismoControl() {
        return codigoOrganismoControl;
    }

    public void setCodigoOrganismoControl(String codigoOrganismoControl) {
        this.codigoOrganismoControl = codigoOrganismoControl;
    }

    public String getCodigoUnidadControl() {
        return codigoUnidadControl;
    }

    public void setCodigoUnidadControl(String codigoUnidadControl) {
        this.codigoUnidadControl = codigoUnidadControl;
    }

    public Boolean getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(Boolean btnSave) {
        this.btnSave = btnSave;
    }

    public String getNumRecepcionGenerado() {
        return numRecepcionGenerado;
    }

    public void setNumRecepcionGenerado(String numRecepcionGenerado) {
        this.numRecepcionGenerado = numRecepcionGenerado;
    }

    public DecomisoArmaTransaccionController getDecomisoArmaTransaccionController() {
        return decomisoArmaTransaccionController;
    }

    public void setDecomisoArmaTransaccionController(
            DecomisoArmaTransaccionController decomisoArmaTransaccionController) {
        this.decomisoArmaTransaccionController = decomisoArmaTransaccionController;
    }

    public String getNumerotransaccionEnvio() {
        return numerotransaccionEnvio;
    }

    public void setNumerotransaccionEnvio(String numerotransaccionEnvio) {
        this.numerotransaccionEnvio = numerotransaccionEnvio;
    }

    public AlfrescoController getAlfrescoController() {
        return alfrescoController;
    }

    public void setAlfrescoController(AlfrescoController alfrescoController) {
        this.alfrescoController = alfrescoController;
    }

    public String getXpathflujo() {
        return xpathflujo;
    }

    public void setXpathflujo(String xpathflujo) {
        this.xpathflujo = xpathflujo;
    }

    public String getNumerotransaccionpk() {
        return numerotransaccionpk;
    }

    public void setNumerotransaccionpk(String numerotransaccionpk) {
        this.numerotransaccionpk = numerotransaccionpk;
    }

    public Boolean getBtnGenerarActa() {
        return btnGenerarActa;
    }

    public void setBtnGenerarActa(Boolean btnGenerarActa) {
        this.btnGenerarActa = btnGenerarActa;
    }

    public TransaccionArmaBodegaController getTransaccionArmaBodegaController() {
        return transaccionArmaBodegaController;
    }

    public void setTransaccionArmaBodegaController(
            TransaccionArmaBodegaController transaccionArmaBodegaController) {
        this.transaccionArmaBodegaController = transaccionArmaBodegaController;
    }

    public BodegaController getBodegaController() {
        return bodegaController;
    }

    public void setBodegaController(BodegaController bodegaController) {
        this.bodegaController = bodegaController;
    }

    public String getInstiCentroControlCode() {
        return instiCentroControlCode;
    }

    public void setInstiCentroControlCode(String instiCentroControlCode) {
        this.instiCentroControlCode = instiCentroControlCode;
    }

    public String getInstitucionCentroControl() {
        return institucionCentroControl;
    }

    public void setInstitucionCentroControl(String institucionCentroControl) {
        this.institucionCentroControl = institucionCentroControl;
    }

    public List<SelectItem> getItemUnidadDestino() {
        return itemUnidadDestino;
    }

    public void setItemUnidadDestino(List<SelectItem> itemUnidadDestino) {
        this.itemUnidadDestino = itemUnidadDestino;
    }

    public Boolean getItemsUnidadBolean() {
        return itemsUnidadBolean;
    }

    public void setItemsUnidadBolean(Boolean itemsUnidadBolean) {
        this.itemsUnidadBolean = itemsUnidadBolean;
    }

    public DecomisoController getDecomisoController() {
        return decomisoController;
    }

    public void setDecomisoController(DecomisoController decomisoController) {
        this.decomisoController = decomisoController;
    }

    /**
     * @return the organismoControlDestino
     */
    public String getOrganismoControlDestino() {
        return organismoControlDestino;
    }

    /**
     * @param organismoControlDestino the organismoControlDestino to set
     */
    public void setOrganismoControlDestino(String organismoControlDestino) {
        this.organismoControlDestino = organismoControlDestino;
    }

    /**
     * @return the unidadControlDestino
     */
    public String getUnidadControlDestino() {
        return unidadControlDestino;
    }

    /**
     * @param unidadControlDestino the unidadControlDestino to set
     */
    public void setUnidadControlDestino(String unidadControlDestino) {
        this.unidadControlDestino = unidadControlDestino;
    }

    public String getCodigoUnidadControlDestino() {
        return codigoUnidadControlDestino;
    }

    public void setCodigoUnidadControlDestino(String codigoUnidadControlDestino) {
        this.codigoUnidadControlDestino = codigoUnidadControlDestino;
    }

    public String getCentroControlOrigenStr() {
        return centroControlOrigenStr;
    }

    public void setCentroControlOrigenStr(String centroControlOrigenStr) {
        this.centroControlOrigenStr = centroControlOrigenStr;
    }

    public String getUnidadOrigenStr() {
        return unidadOrigenStr;
    }

    public void setUnidadOrigenStr(String unidadOrigenStr) {
        this.unidadOrigenStr = unidadOrigenStr;
    }

    public Boolean getIsCentroDpto() {
        return isCentroDpto;
    }

    public void setIsCentroDpto(Boolean isCentroDpto) {
        this.isCentroDpto = isCentroDpto;
    }

    public boolean isBtnSelTodos() {
        return btnSelTodos;
    }

    public void setBtnSelTodos(boolean btnSelTodos) {
        this.btnSelTodos = btnSelTodos;
    }

    public boolean isCmbTransaccionenvio() {
        return cmbTransaccionenvio;
    }

    public void setCmbTransaccionenvio(boolean cmbTransaccionenvio) {
        this.cmbTransaccionenvio = cmbTransaccionenvio;
    }

}
