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

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
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 org.primefaces.component.selectbooleancheckbox.SelectBooleanCheckbox;
import org.primefaces.event.SelectEvent;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.Filter;
import com.fp.dto.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.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.TarmCentroControlJurController;
import com.fp.frontend.controller.armas.parametros.TiposArmasExplosivosController;
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.Utilidades;
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.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmCabRepDestruirArmas;
import com.fp.persistence.parmas.soli.TarmDecomiso;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.parmas.soli.TarmDetRepDestruirArmas;
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.safe.TsafeUserDetail;

/**
 * Clase controladora de la generaci&oacute;n de reporte de armas a destruirse
 *
 * @author Christian Pazmino.
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ReporteDestruccionDeArmasController extends AbstractController<TarmDecomisoArma> {

    /**
     * Fecha de corte a la que se generara el reporte
	 *
     */
    private Date fechaCorte;
    /**
     * Formato de reporte que se va a generar
	 *
     */
    private String format = "pdf";
    /**
     * Usuario actual loogueado en el sistema
	 *
     */
    private TsafeUserDetail userDetail;
    /**
     * Variable de tipo entero que lee de la tabla par&aacute;metros el
     * n&uacute;mero de d&iacute;as en decomiso previo a la destrucci&oacute;n
     * del arma
	 *
     */
    private Integer diasParaDestruirArma;
    /**
     * Catalogcode de la tabla Cat&aacute;logos que funciona como bandera para
     * indicar si un arma ya se encuentra en alg&uacute;n reporte previo.
	 *
     */
    private final String CATALOGCODEADESTRUIRSE = "ADESTRUIRSE";
    /**
     * Ruta base del reporte generado en el Alfresco
	 *
     */
    private String xPathLocation;
    /**
     * Ubicacion completa del reporte generado en el Alfresco
	 *
     */
    private String xPath;
    /**
     * Nombre del reporte generado en el Alfresco
	 *
     */
    private String nombreReporte;
    /**
     * Codigo de cabecera del reporte generado en base de datos
	 *
     */
    private String creporte;
    /**
     * Bandera de tipo booleano para indicar si se genero o no el reporte
	 *
     */
    private Boolean seGeneroReporte;
    /**
     * Bandera de tipo booleano para indicar si se ha grabado el reporte
     * generado
	 *
     */
    private Boolean isEnableGrabar;
    /**
     * Bandera de tipo booleano para indicar que se debe deshabilitar el boton
     * iniciar flujo
	 *
     */
    private Boolean isEnableEnviar;
    /**
     * Variable del tipo TgeneCatalogDetail(Esta en reporte de armas a
     * destruirse)
     */
    private TgeneCatalogDetail aDestruirseCatalog;
    /**
     * Clase controladora de reportes
     */
    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;
    /**
     * Clase controladora de cabecera de reporte de armas a destruir
     */
    @ManagedProperty(value = "#{cabRepDestruirArmasController}")
    private CabRepDestruirArmasController cabRepDestruirArmasController;
    /**
     * Clase controladora de detalle de reporte de armas a destruir
     */
    @ManagedProperty(value = "#{detRepDestruirArmasController}")
    private DetRepDestruirArmasController detRepDestruirArmasController;
    /**
     * Clase controladora de funcionalidad del Alfresco
     */
    @ManagedProperty(value = "#{alfrescoController}")
    private AlfrescoController alfrescoController;
    /**
     * codigo de la provincia del usuario logeado
     */
    private String cprovincia;

    public ReporteDestruccionDeArmasController() throws Exception {
        super(TarmDecomisoArma.class);
        // TODO Auto-generated constructor stub
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        // Inicializa autoconsulta
        super.startQuery();
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            userDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            diasParaDestruirArma = ParametersController.find("DIASENBODEGA.DESTRUIRARMAS", "1").getNumbervalue().intValue();
            aDestruirseCatalog = CatalogDetailController.findxCodigoCodcatalogo("1", CATALOGCODEADESTRUIRSE);
            recperpage = 10000; // Cambiar al # reg a mirar.
            lrecord = new ArrayList<TarmDecomisoArma>();
            beanalias = "RPRTEDESTRUCCIONDEARMAS";
            seGeneroReporte = Boolean.FALSE;
            isEnableGrabar = Boolean.TRUE;
            isEnableEnviar = Boolean.FALSE;
            TarmCentroControl centroControl = Utilidades.obtenerCentroControl();
            cprovincia = centroControl.getProvincecode();
            querydatabase();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Obtiene el centro de control segun usurio logeado.
     *
     * @throws Exception
     *
     */
    /**
     * Metodo que se debe ejecutar cuando es una transaccion de tipo verificar
     * armas
     *
     * @throws Exception
     */
//    private void provinciaUsuario() throws Exception {    	
//        	PersonAddressController personAddressController = new PersonAddressController();
//            TcustPersonAddress tcustPersonAddres= personAddressController.findPrincipal(userDetail.getPk().getPersoncode().toString());
//            cprovincia=tcustPersonAddres.getProvincecode();
//	}
    /**
     * Crea una instancia y marca el registro como nuevo.
     *
     * @throws Exception
     */
    @Override
    public void create() throws Exception {
        super.create();
    }

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

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {
        try {
            if (fechaCorte != null) {
                Calendar fechaActualCldr = Calendar.getInstance();
                Calendar fechaCorteCldr = Calendar.getInstance();
                fechaCorteCldr.setTime(fechaCorte);
                if (fechaActualCldr.compareTo(fechaCorteCldr) >= 0) {

                    DtoQuery dto = super.getDtoQuery(true);
                    dto.setOrderby("t.fdecomiso");

                    Calendar fechaReferenciaReporteCldr = Calendar.getInstance();

                    fechaReferenciaReporteCldr.setTime(fechaCorte);

                    fechaReferenciaReporteCldr.add(Calendar.DAY_OF_MONTH, -diasParaDestruirArma);
                    StringBuilder fechaReferenciaSB = new StringBuilder();
                    fechaReferenciaSB = fechaReferenciaSB.append((fechaReferenciaReporteCldr.get(Calendar.DAY_OF_MONTH)) <= 9 ? "0" + (fechaReferenciaReporteCldr.get(Calendar.DAY_OF_MONTH)) : (fechaReferenciaReporteCldr.get(Calendar.DAY_OF_MONTH)));
                    fechaReferenciaSB = fechaReferenciaSB.append("-").append((fechaReferenciaReporteCldr.get(Calendar.MONTH) + 1) <= 9 ? "0" + (fechaReferenciaReporteCldr.get(Calendar.MONTH) + 1) : (fechaReferenciaReporteCldr.get(Calendar.MONTH) + 1));
                    fechaReferenciaSB = fechaReferenciaSB.append("-").append(fechaReferenciaReporteCldr.get(Calendar.YEAR));

                    Filter fechaFiltro = new Filter();
                    fechaFiltro.setSql("(t.estado='DEC' or t.estado='INC' or t.estado='ABA' or t.estado='ENTR') and t.adestruirse is null and t.adestruirsecode is null and t.fdecomiso < " + "TO_DATE('" + fechaReferenciaSB.toString() + "','dd-mm-yyyy') and not exists(select 1 from TarmArmas ta where ta.estado = 'SUSP' and   t.carma = (select max(tax.pk) from TarmArmas tax where ta.pk = tax.pk))");
                    dto.addFiltro(fechaFiltro);

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

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

                    Response resp = callerhelper.executeQuery(request);

                    if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                        lrecord = new ArrayList<TarmDecomisoArma>();
                        MessageHelper.setMessageError(resp);
                    } else {
                        lrecord = (List<TarmDecomisoArma>) resp.get(beanalias);
                        for (TarmDecomisoArma decomisoArma : lrecord) {
                            if (decomisoArma.getCdecomiso() != null) {
                                decomisoArma.getModifiedData().put("isSelect", Boolean.FALSE);
                                TarmArmas arma = ArmasController.findByPK(decomisoArma.getCarma());
                                TarmTipoArmaExplosivo tipoArmaExplosivo = TiposArmasExplosivosController.findarma(arma.getCtipoarmaexplosivo());
                                decomisoArma.getModifiedData().put("ntipo", arma.getModifiedData().get("tipo"));
                                decomisoArma.getModifiedData().put("nclase", arma.getModifiedData().get("clase"));
                                if (tipoArmaExplosivo.getLongitud() != null) {
                                    decomisoArma.getModifiedData().put("nlongitud", CatalogDetailController.findxCodigoCodcatalogo(tipoArmaExplosivo.getLongitud(), tipoArmaExplosivo.getLongitudcodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tipoArmaExplosivo.getLongitud(), tipoArmaExplosivo.getLongitudcodigo()).getDescription() : "");
                                } else {
                                    decomisoArma.getModifiedData().put("nlongitud", "");
                                }
                                if (tipoArmaExplosivo.getCalibre() != null) {
                                    decomisoArma.getModifiedData().put("ncalibre", CatalogDetailController.findxCodigoCodcatalogo(tipoArmaExplosivo.getCalibre(), tipoArmaExplosivo.getCalibrecodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(tipoArmaExplosivo.getCalibre(), tipoArmaExplosivo.getCalibrecodigo()).getDescription() : "");
                                } else {
                                    decomisoArma.getModifiedData().put("ncalibre", "");
                                }

                                decomisoArma.getModifiedData().put("nmarca", CatalogDetailController.findxCodigoCodcatalogo(arma.getMarca(), arma.getMarcacodigo()) != null ? CatalogDetailController.findxCodigoCodcatalogo(arma.getMarca(), arma.getMarcacodigo()).getDescription() : "");
                                decomisoArma.getModifiedData().put("nserie", arma.getLote());
                                decomisoArma.getModifiedData().put("nunidad", CatalogDetailController.findxCodigoCodcatalogo(decomisoArma.getUnidadmedida(), decomisoArma.getUnidadmedidacode()) != null ? CatalogDetailController.findxCodigoCodcatalogo(decomisoArma.getUnidadmedida(), decomisoArma.getUnidadmedidacode()).getDescription() : "");

                                TarmRegistroArmas registroArma = RegistroArmController.findByCodigo(arma.getCregistro().toString());
                                if (registroArma != null && registroArma.getPersoncode() != null) {
                                    Integer personCodePropietario = registroArma.getPersoncode();
                                    decomisoArma.getModifiedData().put("npropietario", PersonDetailController.find(personCodePropietario.toString()).getName());
                                } else {
                                    decomisoArma.getModifiedData().put("npropietario", "");
                                }
                                TarmDecomiso decomiso = DecomisoController.findByCodigo(decomisoArma.getCdecomiso().toString());
                                if (decomiso != null && decomiso.getNumerodocumento() != null) {
                                    decomisoArma.getModifiedData().put("nrecibo", decomiso.getNumerorecibo());
                                } else {
                                    decomisoArma.getModifiedData().put("nrecibo", "");
                                }
                            } else {
                                lrecord.remove(decomisoArma);
                            }
                        }
                        super.postQuery(lrecord);
                    }
                } else {
                    lrecord = new ArrayList<TarmDecomisoArma>();
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_fechaCorteMayorAFechaActual"));
                }
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo para reconsultar en base a una nueva fecha de corte seleccionada
     */
    public void cambioFechaDeCorte(SelectEvent event) {
        querydatabase();
    }

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

    /**
     * Genera un reporte de armas a destruir
     *
     */
    public void generateReport() {
        if (fechaCorte != null) {
            if (existeArmasSeleccionadas()) {
                Calendar fechaActualCldr = Calendar.getInstance();
                Calendar fechaCorteCldr = Calendar.getInstance();
                fechaCorteCldr.setTime(fechaCorte);
                if (fechaActualCldr.compareTo(fechaCorteCldr) >= 0) {
                    String path = "armas/reports/bajaDestruccion";
                    String filename = "ArmasADestruirse";

                    // 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");
                    // Datos del supervisor militar
                    String CISupervisorMilitar = ParametersController.find("IDSUPERMILITDPTOARMSPICH", "1").getTextvalue();
                    TcustPersonDetail supervisorMilitarObj = PersonDetailController.findxidentification(CISupervisorMilitar, "CED");
                    String gradoSupMilitar = supervisorMilitarObj.getMilitarygrade() == null ? "" : supervisorMilitarObj.getMilitarygrade() + " - ";
                    parameters.put("nombreSupMilitar", gradoSupMilitar + supervisorMilitarObj.getName() == null ? "" : supervisorMilitarObj.getName());
                    parameters.put("personCodeSupMilitar", supervisorMilitarObj.getPk().getPersoncode() == null ? "1001" : supervisorMilitarObj.getPk().getPersoncode());
                    // Datos del coordinador militar
                    String CICoordinadorMilitar = ParametersController.find("IDCOORDMILITDPTOARMSPICH", "1").getTextvalue();
                    TcustPersonDetail coordinadorMilitarObj = PersonDetailController.findxidentification(CICoordinadorMilitar, "CED");
                    String gradoCoordMilitar = coordinadorMilitarObj.getMilitarygrade() == null ? "" : coordinadorMilitarObj.getMilitarygrade() + " - ";
                    parameters.put("nombreCoordMilitar", gradoCoordMilitar + coordinadorMilitarObj.getName() == null ? "" : coordinadorMilitarObj.getName());
                    parameters.put("personCodeCoordMilitar", coordinadorMilitarObj.getPk().getPersoncode() == null ? "1001" : coordinadorMilitarObj.getPk().getPersoncode());

                    try {

                        //Usuario logueado en la aplicacion
                        String nombreUsuario;
                        if (userDetail.getPk().getPersoncode() != null) {
                            nombreUsuario = PersonDetailController.find(userDetail.getPk().getPersoncode().toString()).getName();
                        } else {
                            nombreUsuario = "";
                        }
                        parameters.put("usuario", nombreUsuario);

                        //Fecha de corte
                        StringBuilder fechaCorteSB = new StringBuilder();
                        fechaCorteSB = fechaCorteSB.append((fechaCorteCldr.get(Calendar.DAY_OF_MONTH)) <= 9 ? "0" + (fechaCorteCldr.get(Calendar.DAY_OF_MONTH)) : (fechaCorteCldr.get(Calendar.DAY_OF_MONTH)));
                        fechaCorteSB = fechaCorteSB.append("-").append((fechaCorteCldr.get(Calendar.MONTH) + 1) <= 9 ? "0" + (fechaCorteCldr.get(Calendar.MONTH) + 1) : (fechaCorteCldr.get(Calendar.MONTH) + 1));
                        fechaCorteSB = fechaCorteSB.append("-").append(fechaCorteCldr.get(Calendar.YEAR));
                        parameters.put("fechaCorte", fechaCorteSB.toString());
                        parameters.put("codArmasDecomisadasLst", actualizarArmasSeleccionadas());
                        //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());

                        //Fecha de referencia
                        Calendar fechaReferenciaReporteCldr = Calendar.getInstance();
                        fechaReferenciaReporteCldr.setTime(fechaCorte);
                        fechaReferenciaReporteCldr.add(Calendar.DAY_OF_MONTH, -diasParaDestruirArma);
                        StringBuilder fechaReferenciaSB = new StringBuilder();
                        fechaReferenciaSB = fechaReferenciaSB.append((fechaReferenciaReporteCldr.get(Calendar.DAY_OF_MONTH)) <= 9 ? "0" + (fechaReferenciaReporteCldr.get(Calendar.DAY_OF_MONTH)) : (fechaReferenciaReporteCldr.get(Calendar.DAY_OF_MONTH)));
                        fechaReferenciaSB = fechaReferenciaSB.append("-").append((fechaReferenciaReporteCldr.get(Calendar.MONTH) + 1) <= 9 ? "0" + (fechaReferenciaReporteCldr.get(Calendar.MONTH) + 1) : (fechaReferenciaReporteCldr.get(Calendar.MONTH) + 1));
                        fechaReferenciaSB = fechaReferenciaSB.append("-").append(fechaReferenciaReporteCldr.get(Calendar.YEAR));
                        parameters.put("fechaReferenciaReporte", fechaReferenciaSB.toString());

                        // Verifico si el reporte fue enviado en el flujo y debe subirse al Alfresco
//						if(isDenied){
                        InputStream file = this.reportController.jaspertoInputstream(path, parameters, format, filename, this.getLoginController());
                        alfrescoController.uploadFile(file, nombreReporte, this.xPathLocation);
                        seGeneroReporte = Boolean.TRUE;
//						}else{
//							this.reportController.execute(path, parameters, format, filename, this.getLoginController());
//						}

                    } catch (Exception ex) {
                        MessageHelper.setMessageError(ex);
                    }
                } else {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_fechaCorteMayorAFechaActual"));
                }
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccioneAlmenosUnArma"));
            }
        }
    }

    /**
     * Retorna la ruta de documento base en donde se almacenar&aacute; el
     * reporte
     *
     * @return
     */
    public String getRutaDocumentoRepBase() {
        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));
        return ruta.toString();
    }

    public String getxPath() {
        return xPath;
    }

    public void setxPath(String xPath) {
        this.xPath = xPath;
    }

    /**
     * M&eacute;todo para el inicio de flujo. Guardar el reporte creado para su
     * posterior aprobacion en otras instancias del flujo
     */
    @Override
    public void save() {
        try {
            if (lrecord != null && lrecord.size() > 0) {
                if (validaSiExisteArmasSeleccionadas()) {
                    TarmCabRepDestruirArmas cabeceraReporteObj = new TarmCabRepDestruirArmas();
                    cabeceraReporteObj.setFreporte((java.sql.Date) fechaCorte);
                    xPathLocation = getRutaDocumentoRepBase() + "/cm:BAJA";
                    cabeceraReporteObj.setXpath(xPathLocation);
                    cabeceraReporteObj.setIsnew(Boolean.TRUE);
                    //Guarda la ruta donde se almacenara el reporte    			
                    cabRepDestruirArmasController.update(cabeceraReporteObj);
                    Boolean existArmasEnReporte = Boolean.FALSE;
                    for (TarmDecomisoArma decomisoArmaObj : lrecord) {
                        if (decomisoArmaObj.getAdestruirse() == null) {
                            if (decomisoArmaObj.getModifiedData().get("isSelect") == null || decomisoArmaObj.getModifiedData().get("isSelect").equals(Boolean.FALSE)) {
                                continue;
                            }
                            TarmDetRepDestruirArmas detalleReporteObj = new TarmDetRepDestruirArmas();
                            detalleReporteObj.setIsnew(Boolean.TRUE);
                            if (decomisoArmaObj.getCdecomiso() != null) {
                                detalleReporteObj.setCdecomisoarma(decomisoArmaObj.getPk());
                            }
                            if (decomisoArmaObj.getModifiedData().get("nclase") != null) {
                                detalleReporteObj.setClase(decomisoArmaObj.getModifiedData().get("nclase").toString());
                            }
                            if (decomisoArmaObj.getModifiedData().get("ntipo") != null) {
                                detalleReporteObj.setTipo(decomisoArmaObj.getModifiedData().get("ntipo").toString());
                            }
                            if (decomisoArmaObj.getModifiedData().get("ncalibre") != null) {
                                detalleReporteObj.setCalibre(decomisoArmaObj.getModifiedData().get("ncalibre").toString());
                            }
                            if (decomisoArmaObj.getModifiedData().get("nmarca") != null) {
                                detalleReporteObj.setMarca(decomisoArmaObj.getModifiedData().get("nmarca").toString());
                            }
                            if (decomisoArmaObj.getModifiedData().get("nserie") != null) {
                                detalleReporteObj.setSerie(decomisoArmaObj.getModifiedData().get("nserie").toString());
                            }
                            if (decomisoArmaObj.getCantidad() != null) {
                                detalleReporteObj.setCantidad(decomisoArmaObj.getCantidad().toString());
                            }
                            if (decomisoArmaObj.getModifiedData().get("nunidad") != null) {
                                detalleReporteObj.setUnidad(decomisoArmaObj.getModifiedData().get("nunidad").toString());
                            }
                            if (decomisoArmaObj.getFdecomiso() != null) {
                                java.sql.Date date = new java.sql.Date(decomisoArmaObj.getFdecomiso().getTime());
                                detalleReporteObj.setFdecomiso(date);
                            }
                            if (decomisoArmaObj.getModifiedData().get("npropietario") != null) {
                                detalleReporteObj.setPropietario(decomisoArmaObj.getModifiedData().get("npropietario").toString());
                            }
                            if (decomisoArmaObj.getModifiedData().get("nrecibo") != null) {
                                detalleReporteObj.setNrecibo(decomisoArmaObj.getModifiedData().get("nrecibo").toString());
                            }
                            if (!existArmasEnReporte) {
                                existArmasEnReporte = Boolean.TRUE;
                            }

                            // Marca que indica que el arma decomisada ya se encuentra dentro de un reporte de armas a destruir
                            decomisoArmaObj.setAdestruirse(aDestruirseCatalog.getPk().getCatalog());
                            decomisoArmaObj.setAdestruirsecode(aDestruirseCatalog.getPk().getCatalogcode());
                            record = decomisoArmaObj;
                            super.update();
                            detRepDestruirArmasController.update(detalleReporteObj);

                        }
                    }

                    if (existArmasEnReporte) {
                        Request request = this.callerhelper.getRequest();
                        DtoSave dtosave = super.getDtoSave();
                        dtosave.setPosition(1);

                        DtoSave dtoSaveCabecera = cabRepDestruirArmasController.getDtoSave();
                        dtoSaveCabecera.setIsForm(Boolean.TRUE);
                        dtoSaveCabecera.setReturnpk(Boolean.TRUE);
                        dtoSaveCabecera.setPosition(2);

                        DtoSave dtoSaveDetalle = detRepDestruirArmasController.getDtoSave();
                        dtoSaveDetalle.setReturnpk(Boolean.TRUE);
                        dtoSaveDetalle.setPosition(3);

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

                        msave.put(this.beanalias, dtosave); // adicionar metadata de mantenimiento para cada tabla.
                        msave.put(cabRepDestruirArmasController.getBeanalias(), dtoSaveCabecera);
                        msave.put(detRepDestruirArmasController.getBeanalias(), dtoSaveDetalle);

                        request.setSaveTables(msave);

                        Response resp = this.callerhelper.executeSave(request);

                        if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                            this.postCommit(resp);
                            this.cabRepDestruirArmasController.postCommit(resp);
                            this.detRepDestruirArmasController.postCommit(resp);
                            isEnableGrabar = Boolean.FALSE;
                            isEnableEnviar = Boolean.TRUE;
                            MessageHelper.setMessageInfo(resp);
                            this.nombreReporte = resp.get("nombreReporte").toString();
                            this.creporte = resp.get("creporte").toString();
                            this.xPath = resp.get("xpath").toString();
                        } else {
                            MessageHelper.setMessageError(resp);
                        }
                    } else {
                        MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccioneAlmenosUnArma"));
                    }
                } else {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccioneAlmenosUnArma"));
                }
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo usado para validar si existen armas seleccionadas por el usuario
     */
    public Boolean validaSiExisteArmasSeleccionadas() {
        Boolean bandera = Boolean.FALSE;
        if (lrecord != null && lrecord.size() > 0) {
            for (TarmDecomisoArma decomisoArmaObj : lrecord) {
                if (decomisoArmaObj.getModifiedData().get("isSelect") != null && decomisoArmaObj.getModifiedData().get("isSelect").equals(Boolean.TRUE)) {
                    bandera = Boolean.TRUE;
                }
            }
        }
        return bandera;
    }

    /**
     * Metodo que inicia el flujo de baja y destruccion de armas
     */
    public void iniciarFlujo() {
        try {
            if (seGeneroReporte) {
                Request request = this.callerhelper.getRequest();
                super.cleanRequest(request);
                request.modifiedData().put("isnew", "Y");
                request.modifiedData().put("xpath", this.xPath);
                request.modifiedData().put("creporte", this.creporte);
                request.modifiedData().put("cprovincia", cprovincia);
                request.setLogsolicitude(this.creporte);
                Response resp = this.callerhelper.executeSave(request);
                if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                    MessageHelper.setMessageInfo(resp);
                    isEnableEnviar = Boolean.FALSE;
//		   			RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
                } else {
                    MessageHelper.setMessageError(resp);
                }
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_generarReporteRequerido"));
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    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 TsafeUserDetail getUserDetail() {
        return userDetail;
    }

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

    public Integer getDiasParaDestruirArma() {
        return diasParaDestruirArma;
    }

    public void setDiasParaDestruirArma(Integer diasParaDestruirArma) {
        this.diasParaDestruirArma = diasParaDestruirArma;
    }

    public CabRepDestruirArmasController getCabRepDestruirArmasController() {
        return cabRepDestruirArmasController;
    }

    public void setCabRepDestruirArmasController(
            CabRepDestruirArmasController cabRepDestruirArmasController) {
        this.cabRepDestruirArmasController = cabRepDestruirArmasController;
    }

    public DetRepDestruirArmasController getDetRepDestruirArmasController() {
        return detRepDestruirArmasController;
    }

    public void setDetRepDestruirArmasController(
            DetRepDestruirArmasController detRepDestruirArmasController) {
        this.detRepDestruirArmasController = detRepDestruirArmasController;
    }

    public TgeneCatalogDetail getaDestruirseCatalog() {
        return aDestruirseCatalog;
    }

    public void setaDestruirseCatalog(TgeneCatalogDetail aDestruirseCatalog) {
        this.aDestruirseCatalog = aDestruirseCatalog;
    }

    public String getxPathLocation() {
        return xPathLocation;
    }

    public void setxPathLocation(String xPathLocation) {
        this.xPathLocation = xPathLocation;
    }

    public String getNombreReporte() {
        return nombreReporte;
    }

    public void setNombreReporte(String nombreReporte) {
        this.nombreReporte = nombreReporte;
    }

    public AlfrescoController getAlfrescoController() {
        return alfrescoController;
    }

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

    public String getCreporte() {
        return creporte;
    }

    public void setCreporte(String creporte) {
        this.creporte = creporte;
    }

    public Boolean getSeGeneroReporte() {
        return seGeneroReporte;
    }

    public void setSeGeneroReporte(Boolean seGeneroReporte) {
        this.seGeneroReporte = seGeneroReporte;
    }

    public Boolean getIsEnableGrabar() {
        return isEnableGrabar;
    }

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

    public Boolean getIsEnableEnviar() {
        return isEnableEnviar;
    }

    public void setIsEnableEnviar(Boolean isEnableEnviar) {
        this.isEnableEnviar = isEnableEnviar;
    }

    /**
     * Metodo encargado de marcar un registro de la tabla como seleccionado
     */
    public void seleccionarArma(AjaxBehaviorEvent event) {
        try {
            SelectBooleanCheckbox booleanCheckbox = (SelectBooleanCheckbox) event.getComponent();
            record = (TarmDecomisoArma) booleanCheckbox.getAttributes().get("armaDecomisadaObj");
            boolean checked = (Boolean) booleanCheckbox.getValue();
            if (checked) {
                record.getModifiedData().put("isSelect", Boolean.TRUE);
            } else {
                record.getModifiedData().put("isSelect", Boolean.FALSE);
                this.getMfilelds().put("seleccionarTodos", Boolean.FALSE);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * Metodo encargado de obtener todas las claves primarias de los elementos
     * seleccionados en la tabla
     */
    public Collection<String> actualizarArmasSeleccionadas() {
        List<String> armasSeleccionadasLst = new ArrayList<>();
        for (TarmDecomisoArma decomisoArmaObj : lrecord) {
            if (decomisoArmaObj.getModifiedData().get("isSelect").equals(Boolean.TRUE)) {
                armasSeleccionadasLst.add(decomisoArmaObj.getPk());
            }
        }
        return armasSeleccionadasLst;
    }

    /**
     * Metodo encargado de verificar si existe al menos un registro seleccionado
     * en la tabla
     */
    public Boolean existeArmasSeleccionadas() {
        Boolean flag = Boolean.FALSE;
        for (TarmDecomisoArma decomisoArmaObj : lrecord) {
            if (decomisoArmaObj.getModifiedData().get("isSelect").equals(Boolean.TRUE)) {
                flag = Boolean.TRUE;
                break;
            }
        }
        return flag;
    }

}
