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

import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
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 org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.ReportController;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.controller.armas.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.parametros.CashManagementHistoryController;
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.CountryController;
import com.fp.frontend.controller.pgeneral.gene.ParametersController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
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.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmArmaPruebas;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudArmas;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneCountry;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 *
 * Genrera fichas tecnicas de armas faltantes
 *
 * @author Christian Pazmino
 *
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class FichasTecnicasFlatantesController extends AbstractController<TarmArmaPruebas> {

    /**
     *
     */
    private static final long serialVersionUID = 8843091476010012919L;

    /**
     * Controlador que maneja alfresco
     */
    @ManagedProperty(value = "#{alfrescoController}")
    private AlfrescoController alfrescoController;

    /**
     * Controlador que maneja reportes
     */
    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;

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

    private TarmArmas arma = new TarmArmas();

    private String editarReg;

    private String codigoSolicitud;

    private boolean habilitaButtom;

    private TarmCentroControl centroControl = new TarmCentroControl();

    private List<TarmArmaPruebas> listadoArmasPruebas = new ArrayList<>();

    private String observacion;

    private String estado;

    private Date fec_actual;

    private String formato;

    private String xpathflujo;

    private TcustPersonDetail responsableCentroControl = null;

    private TsafeUserDetail tsafeUserDetailUsuario = null;

    private Boolean btnFlujo;

    private List<TarmArmaPruebas> tarmArmaPruebasList;
    /**
     * lista del catalogo de las acciones (Aceptar o rechazar)
     */
    private List<TgeneCatalogDetail> laccion;

    private boolean deshabilitadoGenerarReporte = true;

    private TarmSolicitud solicitud;
    private TarmSolicitudTramite solicitudTramite;
    private TarmTramite tramite;
    private TcustPersonAddress direccionCliente;
    private String provincia;
    private String canton;
    private String ciudad;
    private String direccion;
    private TgeneCatalogDetail estadotramite;
    private TgeneCatalogDetail usoActividad;
    private TcustPersonDetail personaDetalle;
    private TgeneCatalogDetail identificacion;
    private TgeneCatalogDetail detallecatalogoTipoTramite;
    private TgeneCatalogDetail detallecatalogo;
    private TgeneParameters fichasFaltantesParametro;

    private Integer cPruebaInicio;
    private Integer cPruebaFin;

    /**
     * Controlador que maneja los datos de generacion ultima vez del reporte
     */
    @ManagedProperty(value = "#{parametersController}")
    private ParametersController parametersController;

    public FichasTecnicasFlatantesController() throws Exception {
        super(TarmArmaPruebas.class);
    }

    @PostConstruct
    private void postconstruct() {
        try {
            init();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);

        }
    }

    private void init() {
        recperpage = 13000; // Cambiar al # reg a mirar.
        lrecord = new ArrayList<>();
        record = new TarmArmaPruebas();
        beanalias = "INGRESOFICHASFALTANTES";
        fichasFaltantesParametro = ParametersController.find("FICHASFALTANTES", "1");
        cPruebaInicio = fichasFaltantesParametro.getNumbervalue().intValue();
        cPruebaFin = 13187;
    }

    @Override
    public void create() throws Exception {
        super.create();
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {
        try {
            Request request = this.callerhelper.getRequest();
            DtoQuery dto = super.getDtoQuery(true);
            dto.setOrderby("t.pk");
            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.beanalias, dto); // permite adicionar mas de una tabla.
            request.setQueryTables(mtables);
            Response resp = this.callerhelper.executeQuery(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                this.lrecord = new ArrayList<TarmArmaPruebas>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmArmaPruebas>) resp.get(this.beanalias);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void save() {
        try {
            DtoSave dtosave = super.getDtoSave();
            dtosave.setReturnpk(true); // Para que el core devuelva el pk de los registros nuevos.
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

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

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

    public void uploadImpronta(FileUploadEvent event) {
        record.modifiedData().put("FileUploadImpronta", event.getFile());
    }

    public void uploadFoto(FileUploadEvent event) {
        record.modifiedData().put("FileUploadFoto", event.getFile());
    }

    public void generarReportesFaltantes() {
        try {
            for (int i = cPruebaInicio; i <= cPruebaFin; i++) {
                this.record = IngresoFichaTecnicaArmasController.findByPk(String.valueOf(i));

                // Comentar numeroArmasEnSolicitud(xxx) para volver a generar cualquier ficha de solicitud con una unica arma..
                // Validamos solo para solicitudes que tienen path y cuya solicitud tiene mas de una arma
                if (this.record != null && numeroArmasEnSolicitud(record.getCsolicitud()) > 1 && (this.record.getXpathfichatecarmas() != null || this.record.getXpathfotografia() != null || this.record.getXpathimpronta() != null)) {
                    System.out.println("*****GENERACION DE FICHA TECNICA: " + i + " *****");
                    this.solicitud = SolicitudArmasController.findByCSolicitud(this.record.getCsolicitud());
                    this.codigoSolicitud = solicitud.getPk();
                    this.solicitudTramite = SolicitudTramiteController.findByCSolicitud(codigoSolicitud);
                    this.tramite = TarmTramiteController.find(solicitud.getCtramite() + "");
                    this.personaDetalle = PersonDetailController.find(String.valueOf(solicitud.getPersoncode()));
                    direccionCliente = PersonAddressController.find(String.valueOf(solicitud.getPersoncode()));
                    provincia = direccionCliente.modifiedData().get("provincia") == null ? null : direccionCliente.modifiedData().get("provincia").toString(); //personAddressController.getLprovinces()==null || .getLprovinces().isEmpty()?null:personAddressController.getLprovinces().get(0);
                    canton = direccionCliente.modifiedData().get("canton") == null ? null : direccionCliente.modifiedData().get("canton").toString();//personAddressController.getLcantones()==null || personAddressController.getLcantones().isEmpty()?null:personAddressController.getLcantones().get(0);
                    ciudad = direccionCliente.modifiedData().get("ciudad") == null ? null : direccionCliente.modifiedData().get("ciudad").toString();//personAddressController.getLcities()==null || personAddressController.getLcities().isEmpty()?null:personAddressController.getLcities().get(0);
                    direccion = direccionCliente.getAddress();
                    estadotramite = (solicitudTramite.getEstadotramite() == null || solicitudTramite.getEstadotramitecodigo() == null) ? null : CatalogDetailController.findxCodigoCodcatalogo(solicitudTramite.getEstadotramite(), solicitudTramite.getEstadotramitecodigo());
                    usoActividad = (tramite.getUsoactividad() == null || tramite.getUsoactividadcodigo() == null) ? null : CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
                    identificacion = (personaDetalle.getIdentificationcatalog() == null || personaDetalle.getIdentificationcatalogcode() == null) ? null : CatalogDetailController.findxCodigoCodcatalogo(personaDetalle.getIdentificationcatalog(), personaDetalle.getIdentificationcatalogcode());
                    detallecatalogoTipoTramite = (tramite.getTipoautorizacion() == null || tramite.getTipoautorizacioncodigo() == null) ? null : CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());
                    detallecatalogo = (tramite.getCategoria() == null || tramite.getCategoriacodigo() == null) ? null : CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
                    this.obtenerCentroControl();
                    this.obtenerResponsableCentroControl();
                    reporteFichaArmas(i);
                }
            }
        } catch (Exception ex) {
            MessageHelper.setMessageError(ex);
        }
    }

    /**
     * Metodo para extrer solo el nombre del archivo
     *
     * @param xpath xpath del archivo en alfresco
     * @return solo la parte correspondiente al nombre del archivo
     */
    public String soloNombreArchivo(String xpath) {
        return xpath.substring(xpath.lastIndexOf(":") + 1, xpath.length());
    }

    /**
     * Retorna el xpath de la ruta en donde se va a almacenar el documento
     *
     * @param xpath ruta en donde se almacenar&aacute; el archivo
     * @return
     */
    private String obtenerXpath(String xpath) {
        String rutaXpath = null;
        int indice = xpath.lastIndexOf("/cm:");
        rutaXpath = xpath.substring(0, indice);
        return rutaXpath;
    }

    /**
     * Retorna el xpath de la ruta en donde se va a almacenar el documento
     *
     * @param xpath ruta en donde se almacenar&aacute; el archivo
     * @return
     */
    private String obtenerXpathDesdeFotografia(String xpath) {
        String rutaXpath = null;
        int indice = xpath.lastIndexOf("/cm:fotografia/cm:");
        rutaXpath = xpath.substring(0, indice);
        return rutaXpath;
    }

    private String obtenerXpathDesdeImpronta(String xpath) {
        String rutaXpath = null;
        int indice = xpath.lastIndexOf("/cm:impronta/cm:");
        rutaXpath = xpath.substring(0, indice);
        return rutaXpath;
    }

    private Date obtenerFechaEmision(String xpath) {
        String rutaXpath = null;
        int indice = xpath.lastIndexOf("/cm:SOL-");
        rutaXpath = xpath.substring(0, indice);
        rutaXpath = rutaXpath.replace("cm:Solicitudes/cm:A-", "").replace("/cm:M", "").replace("/cm:D", "");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, Integer.valueOf(rutaXpath.substring(0, 4)));
        cal.set(Calendar.MONTH, Integer.valueOf(rutaXpath.substring(5, 7)));
        cal.set(Calendar.DAY_OF_MONTH, Integer.valueOf(rutaXpath.substring(8, 10)));
        return cal.getTime();
    }

    /**
     * @return @throws Exception
     */
    public String codigoAceptado() throws Exception {
        TgeneParameters f = ParametersController.find("ACEPTADO", "1");
        return f.getTextvalue();
    }

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

    /**
     * Metodo que indica si se debe habilitar el boton del pantalla ficha
     * tecnica
     */
    public void habilitarBoton() {
        this.habilitaButtom = true;
    }

    /**
     * Metodo que indica si se debe habilitar el boton del pantalla ficha
     * tecnica
     */
    public void cerrar() {
        if (record.modifiedData().get("GUARDA") != null && record.modifiedData().get("GUARDA").equals("S")
                && record.modifiedData().get("IMPRIME") != null && record.modifiedData().get("IMPRIME").equals("S")) {
        } else {
            MessageHelper.setMessageError("GUARDE Y GENERE EL REPORTE");
        }
    }

    /**
     * Ejecuta reporte de registro balistico
     *
     */
    public void reporteRegistroBalistico() {
        try {
            String gradoUsuario = "";
            String path = "armas/reports/registroBalistico";
            String filename = MsgControlArmas.getProperty("lbl_registroBalistico");

            //Fija parametros del report.
            HashMap<String, Object> parameters = new HashMap<>();

            //Logos
            parameters.put("pathLogoIzquierda", "repo:/maia/1/image/comandoconjunto");
            parameters.put("pathLogoDerecha", "repo:/maia/1/image/selloarmas");

            //Obteniendo la solicitud
            TarmSolicitud solicitud = SolicitudController.findSolicitudxcodsolicitud(this.codigoSolicitud);
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

            //Codigo solicitud
            parameters.put("csolicitud", this.codigoSolicitud);

            //Fecha de solicitud
            parameters.put("fechaSolicitud", sdf.format(solicitud.getFregistro()));

            //Obteniendo los datos del tramite
            TarmTramite tramite = TarmTramiteController.find(solicitud.getCtramite().toString());
            TgeneCatalogDetail tipoTramite = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
            TgeneCatalogDetail categoria = CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
            TarmSolicitudTramite solicitudTramite = SolicitudTramiteController.findByCSolicitud(this.codigoSolicitud);
            TgeneCatalogDetail tipoAutorizacion = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());
            TgeneCatalogDetail usoActividad = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());

            //Tipo de tramite
            if (tipoTramite != null && tipoTramite.getDescription() != null) {
                parameters.put("tipoTramite", tipoTramite.getDescription());
            } else {
                parameters.put("tipoTramite", " ");
            }

            //Categoria
            if (categoria != null && categoria.getDescription() != null) {
                parameters.put("categoria", categoria.getDescription());
            } else {
                parameters.put("categoria", " ");
            }

            //No tramite
            if (solicitudTramite != null) {
                parameters.put("noTramite", solicitudTramite.getNumerotramite());
            } else {
                parameters.put("noTramite", " ");
            }

            //Tipo de autorizacion
            if (tipoAutorizacion != null && tipoAutorizacion.getDescription() != null) {
                parameters.put("tipoAutorizacion", tipoAutorizacion.getDescription());
            } else {
                parameters.put("tipoAutorizacion", " ");
            }

            //Uso-actividad
            if (usoActividad != null && usoActividad.getDescription() != null) {
                parameters.put("usoActividad", usoActividad.getDescription());
            } else {
                parameters.put("usoActividad", " ");
            }

            TgeneCatalogDetail grado = CatalogDetailController.findxCodigoCodcatalogo(this.responsableCentroControl.getMilitarygrade(), this.responsableCentroControl.getMilitarygradecode());
            if (grado != null) {
                gradoUsuario = grado.getDescription() + " - " + this.responsableCentroControl.getName();
            } else {
                gradoUsuario = "Sin Grado - " + this.responsableCentroControl.getName();
            }
            TcustPersonDetail person = PersonDetailController.find(String.valueOf(solicitud.getPersoncode()));
            //PersonDetailController.find(String.valueOf(solicitud.getPersoncode()));
            //Fecha
            parameters.put("fechaActual", sdf.format(this.fec_actual));
            parameters.put("fecActualHora", new SimpleDateFormat("dd-MM-yyyy / hh:mm:ss").format(this.fec_actual));
            parameters.put("personCode", person.getPk().getPersoncode());
            parameters.put("centroControl", this.obtenerCentroControl());
            parameters.put("gradoUsuario", gradoUsuario);
            parameters.put("usuario", this.tsafeUserDetailUsuario.getNickname());
            String format = this.formato;
            try {
                this.reportController.execute(path, parameters, format, filename, this.getLoginController());
                btnFlujo = Boolean.TRUE;

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

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

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

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

    }

//    public void saveImprimir() {
//    	try {
////    		if(!record.modifiedData().get("GUARDA").equals("S")){
////    			MessageHelper.setMessageError("GUARDE LA FICHA PARA GENERAR EL REPORTE");
////    			return;
////    		}
//    		reporteFichaArmas();
//    		record.setIsimpreso("Y");
//    		update();
//    		Request request = callerhelper.getRequest();
//    		HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
//    		request.setSaveTables(msave);
//    		DtoSave dtosave = super.getDtoSave();
//    		dtosave.setReturnpk(true);
//    		msave.put(beanalias, dtosave); 
//    		request.setSaveTables(msave);        	
//    		Response resp = callerhelper.executeSave(request);
//    		if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
//    			this.postCommit(resp);
//    			MessageHelper.setMessageInfo(resp);
//    			record.modifiedData().put("IMPRIME", "S");
//                MessageHelper.setMessageInfo(resp);          
//    		} else {
//    			record.modifiedData().put("IMPRIME", "N");
//    			MessageHelper.setMessageError(resp);
//    		}   
//    	} catch (Throwable e) {
//    		record.modifiedData().put("IMPRIME", "N");
//    		MessageHelper.setMessageError(e);
//    	}
//    }	  
    /**
     * Obtiene el reporte de Ficha de Armas
     *
     * @throws Exception
     */
    public void reporteFichaArmas(int i) throws Exception {
        String gradoUsuario = "";
        String path = "armas/reports/fichaTecArmas";
        TgeneParameters parametro = ParametersController.find("CODIGO.FICHANOLETAL", "1");
        if (parametro != null && parametro.getTextvalue() != null && !parametro.getTextvalue().trim().isEmpty()) {
            String[] arrayCodTramite = parametro.getTextvalue().split(",");
            List<String> listaCodTraite = Arrays.asList(arrayCodTramite);
            for (String item : listaCodTraite) {
                Long codigotramite = Long.parseLong(item);
                if (solicitud.getCtramite().equals(codigotramite)
                        || codigotramite.longValue() == solicitud.getCtramite().longValue()) {
                    path = "armas/reports/fichaTecArmasNoLetales";
                }
            }
        }
        parametro = ParametersController.find("CODIGO.FICHACOLECCION", "1");
        if (parametro != null && parametro.getTextvalue() != null && !parametro.getTextvalue().trim().isEmpty()) {
            String[] arrayCodTramite = parametro.getTextvalue().split(",");
            List<String> listaCodTraite = Arrays.asList(arrayCodTramite);
            for (String item : listaCodTraite) {
                Long codigotramite = Long.parseLong(item);
                if (solicitud.getCtramite().equals(codigotramite)
                        || codigotramite.longValue() == solicitud.getCtramite().longValue()) {
                    path = "armas/reports/fichaTecArmasColeccion";
                }
            }
        }
        String filename = MsgControlArmas.getProperty("lbl_fichaTecnicaArmas");

        //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");

        //Centro de control
        parameters.put("centroControl", this.obtenerCentroControl());

        //Fecha actual
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        //Fecha de solicitud
        if (solicitud != null && solicitud.getFregistro() != null) {
            parameters.put("fechaSolicitud", sdf.format(solicitud.getFregistro()));
        } else {
            parameters.put("fechaSolicitud", " ");
        }
        //No tramite
        if (solicitudTramite != null && solicitudTramite.getNumerotramite() != null) {
            parameters.put("noTramite", solicitudTramite.getNumerotramite());
        } else {
            parameters.put("noTramite", " ");
        }

        //Tipo de tramites
        if (detallecatalogoTipoTramite != null && detallecatalogoTipoTramite.getDescription() != null) {
            parameters.put("tipoTramite", detallecatalogoTipoTramite.getDescription());
        } else {
            parameters.put("tipoTramite", " ");
        }
        //Estado tramite
        if (estadotramite != null && estadotramite.getDescription() != null) {
            parameters.put("estadoTramite", estadotramite.getDescription());
        } else {
            parameters.put("estadoTramite", " ");
        }

        //Uso actividad
        if (usoActividad != null && usoActividad.getDescription() != null) {
            parameters.put("usoActividad", usoActividad.getDescription());
        } else {
            parameters.put("usoActividad", " ");
        }
        //Tipo de documento
        if (identificacion != null) {
            parameters.put("tipoDocumento", identificacion.getDescription());
        } else {
            parameters.put("tipoDocumento", " ");
        }
        //No documento
        if (personaDetalle != null) {
            parameters.put("cedula", personaDetalle.getIdentification());
        } else {
            parameters.put("cedula", " ");
        }
        //Nombre razon social
        if (personaDetalle != null) {
            parameters.put("nombreRazon", personaDetalle.getName());
        } else {
            parameters.put("nombreRazon", " ");
        }
        //Provincia
        if (provincia != null) {
            parameters.put("provincia", provincia);
        } else {
            parameters.put("provincia", " ");
        }
        //Canton
        if (canton != null) {
            parameters.put("canton", canton);
        } else {
            parameters.put("canton", " ");
        }
        //Ciudad
        if (ciudad != null) {
            parameters.put("ciudad", ciudad);
        } else {
            parameters.put("ciudad", " ");
        }
        //Direccion
        if (direccion != null) {
            parameters.put("direccion", direccion);
        } else {
            parameters.put("direccion", " ");
        }
        //Codigo de arma
        parameters.put("codigoArma", this.record.getCarma());
        //Codigo de registro de TarmArmaPrueba
        parameters.put("cArmaPrueba", record.getPk().toString());
        TarmArmas arma = ArmasController.findPorCodigo(this.record.getCarma());
        TarmRegistroArmas regArma = RegistroArmController.findByCodigo(arma.getCregistro().toString());
        TgeneCountry paisOrigen = CountryController.findcountry(regArma.getPaisorigen());
        //Clase
        if (arma.getModifiedData().get("clase") != null) {
            parameters.put("clase", arma.getModifiedData().get("clase") == null ? "" : arma.getModifiedData().get("clase"));
        } else {
            parameters.put("clase", " ");
        }
        //Obtniendo el tipo arma explosivo
        TarmTipoArmaExplosivo tae = arma == null ? null : TiposArmasExplosivosController.findarma(arma.getCtipoarmaexplosivo());
        //Tipo arma
        TgeneCatalogDetail tipoArma = tae == null ? null : CatalogDetailController.findxCodigoCodcatalogo(tae.getTipoarmaexplosivo(), "TIPOARMAEXPLOSIVO");
        parameters.put("tipoArma", (tipoArma == null || tipoArma.getDescription().isEmpty()) ? "" : tipoArma.getDescription());
        //Serie
        parameters.put("serie", (arma == null || arma.getLote() == null || arma.getLote().isEmpty()) ? "" : arma.getLote());
        //Pais fabricacion
        parameters.put("paisFabricacion", (paisOrigen == null) ? "" : (paisOrigen.getDescription()));
        //Calibre
        parameters.put("calibre", (arma.getModifiedData().get("calibre") == null) ? "" : arma.getModifiedData().get("calibre"));
        //Longitud
        TgeneCatalogDetail longitud = (tae == null || tae.getLongitud() == null || tae.getLongitudcodigo() == null || tae.getLongitud().isEmpty() || tae.getLongitudcodigo().isEmpty()) ? null : CatalogDetailController.findxCodigoCodcatalogo(tae.getLongitud(), tae.getLongitudcodigo());
        if (longitud != null && longitud.getDescription() != null) {
            parameters.put("longitud", longitud.getDescription());
        } else {
            parameters.put("longitud", " ");
        }
        //Marca
        parameters.put("marca", arma.getModifiedData().get("marca"));
        //Modelo
        parameters.put("modelo", arma.getModelo());
        //Color
        parameters.put("color", arma.getModifiedData().get("color"));
        //Observacion
        parameters.put("observacion", this.record.getObservacion());
        //Aptitud de disparo
        String aptitudDisparo = " ";
        if (this.record.getAptituddisparo() != null) {
            if (this.record.getAptituddisparo().equalsIgnoreCase("Y")) {
                aptitudDisparo = "BUENO";
            } else {
                aptitudDisparo = "MALO";
            }
        } else {
            aptitudDisparo = "";
        }

        parameters.put("aptitudDisparo", aptitudDisparo);

        //Balas testigo
        String balasTestigo = " ";
        if (this.record.getBalastestigo() != null) {
            if (this.record.getBalastestigo().equalsIgnoreCase("Y")) {
                balasTestigo = MsgControlArmas.getProperty("lbl_si");
            } else {
                balasTestigo = "NO";
            }
        } else {
            balasTestigo = "";
        }
        parameters.put("balasTestigo", balasTestigo);

        //Vainas testigo
        String vainasTestigo = " ";
        if (this.record.getVainastestigo() != null) {
            if (this.record.getVainastestigo().equalsIgnoreCase("Y")) {
                vainasTestigo = MsgControlArmas.getProperty("lbl_si");
            } else {
                vainasTestigo = "NO";
            }
        } else {
            vainasTestigo = "";
        }
        parameters.put("vainasTestigo", vainasTestigo);

        //Estado final
        String estadoFinal = " ";
        if (this.record.getApruebaevaluacion() != null) {
            if (this.record.getApruebaevaluacion().equalsIgnoreCase("Y")) {
                estadoFinal = "APROBADA";
            } else {
                estadoFinal = "REPROBADA";
            }
        } else {
            estadoFinal = "";
        }
        parameters.put("estadoFinal", estadoFinal);
        //Codigo de persona
        parameters.put("personcode", record.getPersoncode());
        //Codigo de arma
        parameters.put("codArma", record.getCarma());
        //codigo solicitud
        parameters.put("csolicitud", this.codigoSolicitud);
        //Grado del funcionario
        TgeneCatalogDetail grado = CatalogDetailController.findxCodigoCodcatalogo(this.responsableCentroControl.getMilitarygrade(), this.responsableCentroControl.getMilitarygradecode());
        if (grado != null) {
            gradoUsuario = grado.getDescription() + " - " + this.responsableCentroControl.getName();
        } else {
            gradoUsuario = "Sin Grado - " + this.responsableCentroControl.getName();
        }
        parameters.put("personcode", responsableCentroControl.getPk().getPersoncode());
        parameters.put("gradoUsuario", gradoUsuario);
        String format = "pdf";

//            String nombreArchivo = soloNombreArchivo(armaPruebasObj.getXpathfichatecarmas());
//			String pathArchivo = obtenerXpath(armaPruegetxbasObj.getXpathfichatecarmas());
        if (this.record.getXpathfichatecarmas() != null) {
            this.xpathflujo = obtenerXpath(this.record.getXpathfichatecarmas());
            this.fec_actual = obtenerFechaEmision(this.record.getXpathfichatecarmas());
        } else if (this.record.getXpathfotografia() != null) {
            this.xpathflujo = obtenerXpathDesdeFotografia(this.record.getXpathfotografia());
            this.fec_actual = obtenerFechaEmision(this.record.getXpathfotografia());
        } else if (this.record.getXpathimpronta() != null) {
            this.xpathflujo = obtenerXpathDesdeImpronta(this.record.getXpathimpronta());
            this.fec_actual = obtenerFechaEmision(this.record.getXpathimpronta());
        }
        if (xpathflujo != null) {
            parameters.put("fechaActual", sdf.format(this.fec_actual));
            filename = filename + this.record.getPk().toString();
            InputStream report = this.reportController.jaspertoInputstream(path, parameters, format, filename, this.getLoginController());
            if (!this.alfrescoController.uploadFile(report, filename + ".pdf", this.xpathflujo)) {
                throw new Exception("ERROR AL CARGAR EL REPORTE");
            }
            this.record.setXpathfichatecarmas(this.xpathflujo + "/cm:" + filename + ".pdf");
            update();
            save();
            fichasFaltantesParametro.setNumbervalue(new BigDecimal(i));
            parametersController.update(fichasFaltantesParametro);
            
            parametersController.save();
        }
    }

//    /**
//     * Metodo para encontrar por codigo de solicitud
//     * @param codigoSolicitud
//     * @return registro de armaPrueba encontrado
//     */
//    public List<TarmArmaPruebas> findPorSolicitud(String codigoSolicitud){
//    	try {
//    		FichasTecnicasFlatantesController cc = new FichasTecnicasFlatantesController();
//    	    cc.init();
//    	    cc.recperpage = 300;
//    	    cc.addFilter("csolicitud", codigoSolicitud);
//    	    cc.querydatabaseArma();
//    	    if (cc.lrecord != null) {
//    	    	return cc.lrecord;
//    	    }
//    	    return null;
//    	} catch (Throwable e) {
//    	    MessageHelper.setMessageError(e);
//    	    return null;
//    	}
//    }
//    /**
//     * Metodo para encontrar por codigo de solicitud
//     * @param codigoSolicitud
//     * @return registro de armaPrueba encontrado
//     */
//    public static List<TarmArmaPruebas> buscarFichasPorSolicitud(String codigoSolicitud){
//    	try {
//    		FichasTecnicasFlatantesController cc = new FichasTecnicasFlatantesController();
//    	    cc.init();
//    	    cc.recperpage = 300;
//    	    cc.addFilter("csolicitud", codigoSolicitud);
//    	    cc.querydatabaseArma();
//    	    if (cc.lrecord != null) {
//    	    	return cc.lrecord;
//    	    }
//    	    return null;
//    	} catch (Throwable e) {
//    	    MessageHelper.setMessageError(e);
//    	    return null;
//    	}
//    }
//    public TarmArmaPruebas find(String codigoSolicitud, String carma){
//    	try {
//    		FichasTecnicasFlatantesController cc = new FichasTecnicasFlatantesController();
//    	    cc.init();
//    	    cc.recperpage = 300;
//    	    cc.addFilter("carma", carma);
//    	    cc.addFilter("csolicitud", codigoSolicitud);
//    	    cc.querydatabaseArma();
//    	    if (cc.lrecord != null && cc.lrecord.size()>0) {
//    	    	return cc.lrecord.get(0);
//    	    }
//    	    return null;
//    	} catch (Throwable e) {
//    	    MessageHelper.setMessageError(e);
//    	    return null;
//    	}
//    }  
//	   
    public AlfrescoController getAlfrescoController() {
        return alfrescoController;
    }

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

    public TarmArmas getArma() {
        return arma;
    }

    public void setArma(TarmArmas arma) {
        this.arma = arma;
    }

    public String getEditarReg() {
        return editarReg;
    }

    public void setEditarReg(String editarReg) {
        this.editarReg = editarReg;
    }

    public String getCodigoSolicitud() {
        return codigoSolicitud;
    }

    public void setCodigoSolicitud(String codigoSolicitud) {
        this.codigoSolicitud = codigoSolicitud;
    }

    public List<TarmArmaPruebas> getListadoArmasPruebas() {
        return listadoArmasPruebas;
    }

    public void setListadoArmasPruebas(List<TarmArmaPruebas> listadoArmasPruebas) {
        this.listadoArmasPruebas = listadoArmasPruebas;
    }

//	/**
//	 * metodo que registra el cambio de la seleccion del recuperador balisitico y segun esto aprueba la evaluacion
//	 */
//	public void cambia(TarmArmaPruebas armaPruebas){
//		record=null;
//		record=armaPruebas;
//		if("Y".equals(record.getAptituddisparo()) &&  "Y".equals(record.getVainastestigo()) && "Y".equals(record.getBalastestigo())){				
//			record.setApruebaevaluacion("Y");
//		}
//		else{			
//			record.setApruebaevaluacion("N");
//		}
//		habilitaButtom = true;
//		armaPruebas.modifiedData().put("GUARDA", "N");
//		armaPruebas.modifiedData().put("IMPRIME", "N");
//		record.modifiedData().put("GUARDA", "N");
//		record.modifiedData().put("IMPRIME", "N");
//	}
//	
    public String getObservacion() {
        return observacion;
    }

    public void setObservacion(String observacion) {
        this.observacion = observacion;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public List<TgeneCatalogDetail> getLaccion() {
        return laccion;
    }

    public void setLaccion(List<TgeneCatalogDetail> laccion) {
        this.laccion = laccion;
    }

    public ReportController getReportController() {
        return reportController;
    }

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

    public boolean isHabilitaButtom() {
        return habilitaButtom;
    }

    public void setHabilitaButtom(boolean habilitaButtom) {
        this.habilitaButtom = habilitaButtom;
    }

    public String getFormato() {
        return formato;
    }

    public void setFormato(String formato) {
        this.formato = formato;
    }

    public Date getFec_actual() {
        return fec_actual;
    }

    public void setFec_actual(Date fec_actual) {
        this.fec_actual = fec_actual;
    }

    public Boolean getBtnFlujo() {
        return btnFlujo;
    }

    public void setBtnFlujo(Boolean btnFlujo) {
        this.btnFlujo = btnFlujo;
    }

    public boolean isDeshabilitadoGenerarReporte() {
        return deshabilitadoGenerarReporte;
    }

    public void setDeshabilitadoGenerarReporte(boolean deshabilitadoGenerarReporte) {
        this.deshabilitadoGenerarReporte = deshabilitadoGenerarReporte;
    }

    public void changeApruebaEvaluacion() {
        if (this.record.getAptituddisparo() != null && ("Y".equalsIgnoreCase(this.record.getAptituddisparo()))
                && (this.record.getBalastestigo() != null && "Y".equalsIgnoreCase(this.record.getBalastestigo()))
                && (this.record.getVainastestigo() != null && "Y".equalsIgnoreCase(this.record.getVainastestigo()))) {
            this.record.setApruebaevaluacion("Y");
        } else {
            this.record.setApruebaevaluacion("N");
        }
    }

    /**
     * Metodo para encontrar por codigo de solicitud
     *
     * @param codigoSolicitud
     * @return registro de armaPrueba encontrado
     */
    public Integer numeroArmasEnSolicitud(String codigoSolicitud) {
        try {
            FichasTecnicasFlatantesController cc = new FichasTecnicasFlatantesController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("csolicitud", codigoSolicitud);
            cc.querydatabase();
            if (cc.lrecord != null) {
                return cc.lrecord.size();
            }
            return 0;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return 0;
        }
    }

    public TarmCentroControl getCentroControl() {
        return centroControl;
    }

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

    public String getXpathflujo() {
        return xpathflujo;
    }

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

    public TcustPersonDetail getResponsableCentroControl() {
        return responsableCentroControl;
    }

    public void setResponsableCentroControl(
            TcustPersonDetail responsableCentroControl) {
        this.responsableCentroControl = responsableCentroControl;
    }

    public TsafeUserDetail getTsafeUserDetailUsuario() {
        return tsafeUserDetailUsuario;
    }

    public void setTsafeUserDetailUsuario(TsafeUserDetail tsafeUserDetailUsuario) {
        this.tsafeUserDetailUsuario = tsafeUserDetailUsuario;
    }

    public TarmSolicitud getSolicitud() {
        return solicitud;
    }

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

    public TarmSolicitudTramite getSolicitudTramite() {
        return solicitudTramite;
    }

    public void setSolicitudTramite(TarmSolicitudTramite solicitudTramite) {
        this.solicitudTramite = solicitudTramite;
    }

    public TarmTramite getTramite() {
        return tramite;
    }

    public void setTramite(TarmTramite tramite) {
        this.tramite = tramite;
    }

    public TcustPersonAddress getDireccionCliente() {
        return direccionCliente;
    }

    public void setDireccionCliente(TcustPersonAddress direccionCliente) {
        this.direccionCliente = direccionCliente;
    }

    public String getProvincia() {
        return provincia;
    }

    public void setProvincia(String provincia) {
        this.provincia = provincia;
    }

    public String getCanton() {
        return canton;
    }

    public void setCanton(String canton) {
        this.canton = canton;
    }

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }

    public String getDireccion() {
        return direccion;
    }

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

    public TgeneCatalogDetail getEstadotramite() {
        return estadotramite;
    }

    public void setEstadotramite(TgeneCatalogDetail estadotramite) {
        this.estadotramite = estadotramite;
    }

    public TgeneCatalogDetail getUsoActividad() {
        return usoActividad;
    }

    public void setUsoActividad(TgeneCatalogDetail usoActividad) {
        this.usoActividad = usoActividad;
    }

    public TcustPersonDetail getPersonaDetalle() {
        return personaDetalle;
    }

    public void setPersonaDetalle(TcustPersonDetail personaDetalle) {
        this.personaDetalle = personaDetalle;
    }

    public TgeneCatalogDetail getIdentificacion() {
        return identificacion;
    }

    public void setIdentificacion(TgeneCatalogDetail identificacion) {
        this.identificacion = identificacion;
    }

    public TgeneCatalogDetail getDetallecatalogoTipoTramite() {
        return detallecatalogoTipoTramite;
    }

    public void setDetallecatalogoTipoTramite(
            TgeneCatalogDetail detallecatalogoTipoTramite) {
        this.detallecatalogoTipoTramite = detallecatalogoTipoTramite;
    }

    public TgeneCatalogDetail getDetallecatalogo() {
        return detallecatalogo;
    }

    public void setDetallecatalogo(TgeneCatalogDetail detallecatalogo) {
        this.detallecatalogo = detallecatalogo;
    }

    public List<TarmArmaPruebas> getTarmArmaPruebasList() {
        return tarmArmaPruebasList;
    }

    public void setTarmArmaPruebasList(List<TarmArmaPruebas> tarmArmaPruebasList) {
        this.tarmArmaPruebasList = tarmArmaPruebasList;
    }

    public ArmasController getArmas() {
        return armas;
    }

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

    public Integer getcPruebaInicio() {
        return cPruebaInicio;
    }

    public void setcPruebaInicio(Integer cPruebaInicio) {
        this.cPruebaInicio = cPruebaInicio;
    }

    public Integer getcPruebaFin() {
        return cPruebaFin;
    }

    public void setcPruebaFin(Integer cPruebaFin) {
        this.cPruebaFin = cPruebaFin;
    }

    public TgeneParameters getFichasFaltantesParametro() {
        return fichasFaltantesParametro;
    }

    public void setFichasFaltantesParametro(TgeneParameters fichasFaltantesParametro) {
        this.fichasFaltantesParametro = fichasFaltantesParametro;
    }

    public ParametersController getParametersController() {
        return parametersController;
    }

    public void setParametersController(ParametersController parametersController) {
        this.parametersController = parametersController;
    }

}
