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

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.UploadedFile;

import com.fp.dto.AbstractDataTransport;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.controller.armas.funcionalidad.CargaController;
import com.fp.frontend.controller.armas.lov.SitioAlmacenamientoLovController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.IngresoDatosTipoTramite;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pcustomer.PersonPhoneController;
import com.fp.frontend.controller.pgeneral.gene.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.TarmCarga;
import com.fp.persistence.parmas.param.TarmSitioAlmacenamiento;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmAgenciaArma;
import com.fp.persistence.parmas.soli.TarmSolicitudAgenciaSucursal;
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.pcustomer.gene.TcustPersonPhone;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

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

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

    /**
     * Atributo para obtener el valor del flujo
     */
    private String codigoSolicitud;
    /**
     * Atributo para obtener el valor del flujo
     */
    private String numeroSolicitud;

    @ManagedProperty(value = "#{inspeccionController}")
    private InspeccionController inspeccionController;

    @ManagedProperty(value = "#{solicitudTramiteController}")
    private SolicitudTramiteController solicitudTramiteController;

    @ManagedProperty(value = "#{solicitudArmasController}")
    private SolicitudArmasController solicitudArmasController;

    @ManagedProperty(value = "#{personDetailController}")
    private PersonDetailController persondetail;

    @ManagedProperty(value = "#{personAddressController}")
    private PersonAddressController address;

    @ManagedProperty(value = "#{centroControlArmasController}")
    private CentroControlArmasController centroControlArmasController;

    @ManagedProperty(value = "#{personPhoneController}")
    private PersonPhoneController personPhoneController;

    //PARA LOS  ARCHIVOS
    @ManagedProperty(value = "#{inspeccionArchivoController}")
    private InspeccionArchivoController inspeccionArchivoController;
//    TRAMITE
    @ManagedProperty(value = "#{ingresoDatosTipoTramite}")
    private IngresoDatosTipoTramite tarmTramiteController;

    @ManagedProperty(value = "#{alfrescoController}")
    private AlfrescoController alfrescoController;

    /**
     * Controlador que maneja las armas asociadas a las agencias
     */
    @ManagedProperty(value = "#{agenciaArmaController}")
    private AgenciaArmaController agenciaArma;

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

    /**
     * Campo para seleccionar si el tramite sigue el proceso
     */
    private Boolean tramiteProceso = Boolean.FALSE;
    /**
     * Campo para seleccionar si se niega el tramite
     */
    private Boolean tramiteProcesoNegar = Boolean.FALSE;
    private String aplicaDecomiso;
    private Integer codigoPersona;
    //sitio de almacenamiento
    private TarmSitioAlmacenamiento sitioAlmacenamiento;
    //propietario
    private TcustPersonAddress personAddressDireccion;
    private TcustPersonAddress personAddressCorreo;
    private TcustPersonDetail tcustPersonDetailProp;
    private TcustPersonPhone personPhoneDomiProp;
    //PERSONA RESPONSABLE
    private TcustPersonDetail tcustPersonDetailResp;
    /**
     * campo para cargar al usuario logeado
     */
    private TsafeUserDetail tsafeUserDetail;
    private TcustPersonPhone personPhoneDomiResp;
    private TcustPersonPhone personPhoneCelResp;
    private TcustPersonAddress personAddressCorreoresp;
    /**
     * Atributos para cargar los archivos
     */
    private UploadedFile file;
    private UploadedFile uploadedFileFoto1;
    private UploadedFile uploadedFileFoto2;
    private UploadedFile uploadedFileFoto3;
    /**
     * Atributos para obtener los codigos pra las validaciones
     */
    private String codigoMail;
    private String codigoOficina;
    private String codigoPhoneFijo;
    private String codigoPhoneCelular;
    /**
     * campo para desabilitar el boton
     */
    private Boolean btn = Boolean.FALSE;

    private Boolean btnFlujo;

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

    public void startQuery() {
        try {
            this.pasteBpmScreenParameters();
            codigoSolicitud = super.getMfilters().get("csolicitud");
            super.getMfilters().clear();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Incializa variables del controlador, cuando se esta utilizando una pagina
     * que utliza el controlador.
     */
    private void init() {
        try {
            this.recperpage = 15; // Cambiar al # reg a mirar.
            this.lrecord = new ArrayList<>();
            this.beanalias = "REGISTROINSP";
            inspeccionController.create();
            inspeccionArchivoController.create();
            sitioAlmacenamiento = new TarmSitioAlmacenamiento();
            //propietario
            personAddressDireccion = new TcustPersonAddress();
            personAddressCorreo = new TcustPersonAddress();
            tcustPersonDetailProp = new TcustPersonDetail();
            personPhoneDomiProp = new TcustPersonPhone();
            //PERSONA RESPONSABLE
            tcustPersonDetailResp = new TcustPersonDetail();
            tsafeUserDetail = new TsafeUserDetail();
            personPhoneDomiResp = new TcustPersonPhone();
            personPhoneCelResp = new TcustPersonPhone();
            personAddressCorreoresp = new TcustPersonAddress();
            //se obtiene el usuario logeado
            tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            //codigos
            codigoMail = codigoParameter("CODIGO.MAIL");
            codigoOficina = codigoParameter("CODIGO.OFICINA");
            codigoPhoneFijo = codigoParameter("CODIGO.PHONE.FIJO");
            codigoPhoneCelular = codigoParameter("CODIGO.PHONE.CELULAR");
            btnFlujo = Boolean.FALSE;
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    public String codigoParameter(String codigo) {
        TgeneParameters parameter = ParametersController.find(codigo, "1");
        return parameter.getTextvalue();
    }

    @Override
    protected void querydatabase() {
        try {
            solicitudArmasController.getMfilters().clear();
            solicitudArmasController.getMfilters().put("pk", codigoSolicitud);
            solicitudArmasController.query();//devuelve el record
            codigoPersona = solicitudArmasController.getRecord().getPersoncode();
            String centroControl = solicitudArmasController.getRecord().getCcentrocontrol();
            Long ctramite = solicitudArmasController.getRecord().getCtramite();
            numeroSolicitud = solicitudArmasController.getRecord().getNumerosolicitud();

            solicitudTramiteController.getMfilters().clear();
            solicitudTramiteController.getMfilters().put("pk.csolicitud", codigoSolicitud);
            solicitudTramiteController.getMfilters().put("pk.ctramite", solicitudArmasController.getRecord().getCtramite().toString());
            solicitudTramiteController.query();
            solicitudTramiteController.setRecord(solicitudTramiteController.getLrecord().get(0));

            persondetail.getMfilters().clear();
            persondetail.getMfilters().put("pk.personcode", codigoPersona.toString());
            persondetail.addFilterDateto();
            persondetail.query();
            tcustPersonDetailProp = persondetail.getRecord();

            address.getMfilters().clear();
            address.addPersoncodeFilter(codigoPersona.toString());
            address.addFilterDateto();
            address.query();
            if (address.getLrecord() != null && address.getLrecord().size() > 0) {
                for (TcustPersonAddress direccion : address.getLrecord()) {
                    if (direccion.getAddresstypecatalog().equals(codigoOficina)) {//1-CODIGO.OFICINA
                        personAddressDireccion = direccion;
                    } else {
                        personAddressCorreo = direccion;
                    }
                }
            }

            //telefono
            personPhoneController.getMfilters().clear();
            personPhoneController.addPersoncodeFilter(codigoPersona.toString());
            personPhoneController.addFilterDateto();
            personPhoneController.getMfilters().put("phonetypecatalog", codigoPhoneFijo);//1 CODIGO.PHONE.FIJO
            personPhoneController.query();
            if (personPhoneController.getLrecord() != null && personPhoneController.getLrecord().size() > 0) {
                personPhoneDomiProp = personPhoneController.getLrecord().get(0);
            }

            centroControlArmasController.getMfilters().clear();
            centroControlArmasController.getMfilters().put("pk", centroControl);
            centroControlArmasController.query();
            centroControlArmasController.setRecord(centroControlArmasController.getLrecord().get(0));
            String numOrdenTrabajo = "";
            if (solicitudTramiteController.getRecord().getNumerotramite().contains("TRA")) {
                numOrdenTrabajo = solicitudTramiteController.getRecord().getNumerotramite().replace("TRA", "INS");
            } else {
                numOrdenTrabajo = "TRA" + solicitudTramiteController.getRecord().getNumerotramite();
            }

            inspeccionController.getRecord().setNumordentrabajo(numOrdenTrabajo);
            inspeccionController.getRecord().setFecharegistro(new Date(new java.util.Date().getTime()));
            //TRAMITE
            tarmTramiteController.getMfilters().clear();
            tarmTramiteController.getMfilters().put("pk", ctramite.toString());
            tarmTramiteController.query();
            if (tarmTramiteController.getLrecord() != null && tarmTramiteController.getLrecord().size() > 0) {
                tarmTramiteController.setRecord(tarmTramiteController.getLrecord().get(0));
            }

            //responsable---------------------------------------------------------------------------------------
            persondetail.getMfilters().clear();
            persondetail.getMfilters().put("pk.personcode", tsafeUserDetail.getPk().getPersoncode().toString());
            persondetail.getMfilters().put("pk.dateto", tsafeUserDetail.getPk().getDateto().toString());
            persondetail.query();
            tcustPersonDetailResp = persondetail.getRecord();

            personPhoneController.getMfilters().clear();
            personPhoneController.addPersoncodeFilter(tsafeUserDetail.getPk().getPersoncode().toString());
            personPhoneController.addFilterDateto();
            personPhoneController.query();
            if (personPhoneController.getLrecord() != null && personPhoneController.getLrecord().size() > 0) {
                for (TcustPersonPhone tel : personPhoneController.getLrecord()) {
                    if (tel.getPhonetypecatalog().equals(codigoPhoneFijo)) {    //  CODIGO.PHONE.FIJO 
                        personPhoneDomiResp = tel;
                    } else if (tel.getPhonetypecatalog().equals(codigoPhoneCelular)) {// CODIGO.PHONE.CELULAR
                        personPhoneCelResp = tel;
                    }
                }
            }
            address.getMfilters().clear();
            address.addPersoncodeFilter(tsafeUserDetail.getPk().getPersoncode().toString());
            address.addFilterDateto();
            address.getMfilters().put("addresstypecatalog", codigoMail);// 3 CODIGO.MAIL personaddress
            address.query();
            if (address.getLrecord() != null && address.getLrecord().size() > 0) {
                address.setRecord(address.getLrecord().get(0));
                personAddressCorreoresp = address.getRecord();
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * M&eacute;todo para manejar el evento change en el CheckBox
     */
    public void onChangeAprobar() {
        if (tramiteProceso) {
            tramiteProcesoNegar = false;
            inspeccionController.getRecord().setTramiteproceso("Y");
        } else {
            tramiteProcesoNegar = true;
            inspeccionController.getRecord().setTramiteproceso("N");
        }
        aplicaDecomiso = null;
    }

    /**
     * M&eacute;todo para manejar el evento change en el CheckBox
     */
    public void onChangeRechazar() {
        if (tramiteProcesoNegar) {
            tramiteProceso = false;
            inspeccionController.getRecord().setTramiteproceso("N");
        } else {
            tramiteProceso = true;
            inspeccionController.getRecord().setTramiteproceso("Y");
        }
        aplicaDecomiso = "N";
    }

    //lov de persona
    /**
     * M&eacute;todo para abrir el lov de personas
     */
    public void openSitioLov() {
        if (codigoPersona == null || codigoPersona == 0) {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_realizelabusqueda"));
            return;
        }
        Map<String, List<String>> params = new HashMap<>();
        List<String> lcat = new ArrayList<>();
        lcat.add(codigoPersona.toString());
        params.put("personcode", lcat);
        SitioAlmacenamientoLovController.openLov(params);
    }

    /**
     * Maneja la respuesta del Lov de Personas
     *
     * @param event
     * @throws Exception
     */
    public void onReturnSitioLov(SelectEvent event) throws Exception {
        sitioAlmacenamiento = (TarmSitioAlmacenamiento) event.getObject();;
    }

    @Override
    public void save() {
        Boolean msg = Boolean.FALSE;
        try {
            if (sitioAlmacenamiento == null || sitioAlmacenamiento.getPk() == null
                    || sitioAlmacenamiento.getPk().trim().length() == 0) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionenesitioinspeccion"));
                msg = Boolean.TRUE;
            }
            if (tramiteProceso == false && tramiteProcesoNegar == false) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionenegarocontinuartramiteproceso"));
                msg = Boolean.TRUE;
            }
            if (msg) {
                return;
            }
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            Request request = callerhelper.getRequest();
            if (!saveWithDocumentAlfresco()) {
                return;
            }
            if (tramiteProceso) {
                bpmDataStatus = "A";
                // request.modifiedData().put("BPMStatus", bpmDataStatus == null ? "A" : bpmDataStatus); // A,D,R
            } else {
                if (aplicaDecomiso == null || (!aplicaDecomiso.equals("Y") && !aplicaDecomiso.equals("N"))) {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionesionoenaplicadecomiso"));
                    return;
                }
                inspeccionController.getRecord().setAplicadecomiso(aplicaDecomiso);
                bpmDataStatus = "D";
                //request.modifiedData().put("BPMStatus", bpmDataStatus == null ? "D" : bpmDataStatus); // A,D,R
            }
            //request.modifiedData().put("csolicitud",codigoSolicitud);
            //request.modifiedData().put("TID", tid);
            bpmDataComment = inspeccionController.getRecord().getObservacion();
            //request.modifiedData().put("BPMObs", inspeccionController.getRecord().getObservacion());
            inspeccionController.getRecord().setPlanificado("T");
            inspeccionController.getRecord().setCsolicitud(codigoSolicitud);
            inspeccionController.getRecord().setCtramite(solicitudArmasController.getRecord().getCtramite());
            inspeccionController.getRecord().setCsitioalmacenamiento(sitioAlmacenamiento.getPk());
            inspeccionController.getRecord().setPersoncode(tsafeUserDetail.getPk().getPersoncode());
            inspeccionController.update();

            DtoSave dtosaveInspeccion = inspeccionController.getDtoSave();
            dtosaveInspeccion.setReturnpk(true);

            DtoSave dtosave = inspeccionArchivoController.getDtoSave();
            dtosave.setReturnpk(true); // Para que el core devuelva el pk de los registros nuevos.

            msave.put(inspeccionController.getBeanalias(), dtosaveInspeccion); // adicionar metadata de mantenimiento para cada tabla.
            msave.put(inspeccionArchivoController.getBeanalias(), dtosave); // adicionar metadata de mantenimiento para cada tabla.

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

    public void handleUpload(FileUploadEvent event) {
        file = event.getFile();
    }

    /**
     * M&eacute;todo para cargar el archivo pdf
     *
     * @param event
     */
    public void upload(FileUploadEvent event) {
        file = event.getFile();
    }

    /**
     * M&eacute;todo para cargar la imagen 1
     *
     * @param event
     */
    public void upload1(FileUploadEvent event) {
        uploadedFileFoto1 = event.getFile();
    }

    /**
     * M&eacute;todo para cargar la imagen 2
     *
     * @param event
     */
    public void upload2(FileUploadEvent event) {
        uploadedFileFoto2 = event.getFile();
    }

    /**
     * M&eacute;todo para cargar la imagen 3
     *
     * @param event
     */
    public void upload3(FileUploadEvent event) {
        uploadedFileFoto3 = event.getFile();
    }

    /**
     * M&eacute;todo para cargar los archivos al alfresco
     *
     */
    public Boolean saveWithDocumentAlfresco() {
        try {
            Boolean msgArchivos = Boolean.FALSE;
            //pdf
            if (file == null || file.getFileName() == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_ingreseelformatodeinspeccion"));
                msgArchivos = Boolean.TRUE;
            }
            if (uploadedFileFoto1 == null || uploadedFileFoto1.getFileName() == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_ingreselafoto1"));
                msgArchivos = Boolean.TRUE;
            }
            if (uploadedFileFoto2 == null || uploadedFileFoto2.getFileName() == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_ingreselafoto2"));
                msgArchivos = Boolean.TRUE;
            }
            if (uploadedFileFoto3 == null || uploadedFileFoto3.getFileName() == null) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_ingreselafoto3"));
                msgArchivos = Boolean.TRUE;
            }
            if (msgArchivos) {
                return false;
            }
            String xPathLocation = getRutaDocumentoSolBase() + "/cm:" + numeroSolicitud + "/cm:Inspeccion";

            //String xphat1="FormatoInspeccion-"+forma.format(fecha)+extencionArchivo(file.getFileName());
            String xphat1 = eliminaCaractersEspeciales(Utilidades.obtieneNombreLimpio(recorteNombre(file.getFileName())));
            if (alfrescoController.uploadFile(file.getInputstream(), xphat1, xPathLocation)) {
                inspeccionArchivoController.create();
                inspeccionArchivoController.getRecord().setXpath(xPathLocation + "/cm:" + xphat1);
                String fielname = file.getFileName();
                if (fielname.length() > 99) {
                    fielname = fielname.substring(0, 95) + extencionArchivo(file.getFileName());
                }
                inspeccionArchivoController.getRecord().setDescripcion(fielname);
                inspeccionArchivoController.update();
            } else {
                return false;
            }
            //String xphat2="Foto1-"+forma.format(fecha)+extencionArchivo(uploadedFileFoto1.getFileName());
            String xphat2 = eliminaCaractersEspeciales(Utilidades.obtieneNombreLimpio(recorteNombre(uploadedFileFoto1.getFileName())));
            if (alfrescoController.uploadFile(uploadedFileFoto1.getInputstream(), xphat2, xPathLocation)) {
                inspeccionArchivoController.create();
                inspeccionArchivoController.getRecord().setXpath(xPathLocation + "/cm:" + xphat2);
                String fielname = uploadedFileFoto1.getFileName();
                if (fielname.length() > 99) {
                    fielname = fielname.substring(0, 95) + extencionArchivo(uploadedFileFoto1.getFileName());
                }
                inspeccionArchivoController.getRecord().setDescripcion(fielname);
                inspeccionArchivoController.update();
            } else {
                return false;
            }
            //String xphat3="Foto2-"+forma.format(fecha)+extencionArchivo(uploadedFileFoto2.getFileName());
            String xphat3 = eliminaCaractersEspeciales(Utilidades.obtieneNombreLimpio(recorteNombre(uploadedFileFoto2.getFileName())));
            if (alfrescoController.uploadFile(uploadedFileFoto2.getInputstream(), xphat3, xPathLocation)) {
                inspeccionArchivoController.create();
                inspeccionArchivoController.getRecord().setXpath(xPathLocation + "/cm:" + xphat3);
                String fielname = uploadedFileFoto2.getFileName();
                if (fielname.length() > 99) {
                    fielname = fielname.substring(0, 95) + extencionArchivo(uploadedFileFoto2.getFileName());
                }
                inspeccionArchivoController.getRecord().setDescripcion(fielname);
                inspeccionArchivoController.update();
            } else {
                return false;
            }
            //String xphat4="Foto3-"+forma.format(fecha)+extencionArchivo(uploadedFileFoto3.getFileName());
            String xphat4 = eliminaCaractersEspeciales(Utilidades.obtieneNombreLimpio(recorteNombre(uploadedFileFoto3.getFileName())));
            if (alfrescoController.uploadFile(uploadedFileFoto3.getInputstream(), xphat4, xPathLocation)) {
                inspeccionArchivoController.create();
                inspeccionArchivoController.getRecord().setXpath(xPathLocation + "/cm:" + xphat4);
                String fielname = uploadedFileFoto3.getFileName();
                if (fielname.length() > 99) {
                    fielname = fielname.substring(0, 95) + extencionArchivo(uploadedFileFoto3.getFileName());
                }
                inspeccionArchivoController.getRecord().setDescripcion(fielname);
                inspeccionArchivoController.update();
            } else {
                return false;
            }

        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
        return true;
    }

    public String eliminaCaractersEspeciales(String nombre) {
        nombre = nombre.replace("(", "");
        nombre = nombre.replace(")", "");
        String numero = "1234567890";
        if (numero.contains(nombre.substring(0, 1))) {
            nombre = nombre.replace(nombre.substring(0, 1), "A");
        }
        if (nombre.length() < 10) {
            nombre = "ARC" + nombre;
        }
        return nombre;
    }

    /**
     * obtiene la extencion del archivo
     *
     * @param nombre
     * @return
     */
    private String extencionArchivo(String nombre) {
        int pos = nombre.lastIndexOf('.');
        nombre = nombre.substring(pos);
        return nombre;
    }

    /**
     * recorta el nombre
     *
     * @param nombre
     * @return
     */
    public String recorteNombre(String nombre) {
        String fielname = nombre;
        if (fielname.length() > 30) {
            fielname = fielname.substring(0, 30) + extencionArchivo(nombre);
        }
        return fielname;
    }

    /**
     * Retorna la ruta de documento base en donde se almacenar&aacute; dicho
     * archivo
     *
     * @return
     */
    public String getRutaDocumentoSolBase() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(inspeccionController.getRecord().getFecharegistro());
        StringBuilder ruta = new StringBuilder("cm:Solicitudes");
        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();
    }

    /**
     * Metodo para finalizar la tarea del flujo
     */
    public void completarTarea() {

        try {
            Request request = callerhelper.getRequest();
            // limpiar request para finalizar la tarea.
            super.cleanRequest(request);
            request.modifiedData().put("csolicitud", codigoSolicitud);
            request.modifiedData().put("TID", tid);
            request.modifiedData().put("BPMStatus", bpmDataStatus == null ? "-" : bpmDataStatus); // A,D,R
            request.modifiedData().put("BPMObs", bpmDataComment == null ? "OK" : bpmDataComment);
            if (bpmDataStatus != null && bpmDataStatus.equals("D")) {
                Map<String, Object> datosmail = new HashMap<String, Object>();
                datosmail.put("razons", tcustPersonDetailProp.getName());
                datosmail.put("sol", solicitudArmasController.getRecord().getNumerosolicitud());
                datosmail.put("observaciones", bpmDataComment);
                //grado funcionario de la persona logeada
                TsafeUserDetail userDetailObj = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
                TcustPersonDetail personDetailObj = PersonDetailController.find(userDetailObj.getPk().getPersoncode().toString());
                datosmail.put("grado", personDetailObj.getMilitarygrade());
                datosmail.put("funcionario", personDetailObj.getName());
                // Centro de control de armas
                datosmail.put("centrocontrol", centroControlArmasController.getRecord().getModifiedData().get("desnombreinstitucion"));
                request.modifiedData().put("datosmail", datosmail);
            }

            Response resp = callerhelper.executeSave(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                MessageHelper.setMessageInfo(resp);
                if (bpmDataStatus.equals("D")) {
                    saveAnularSolicitud();
                }
                btnFlujo = Boolean.FALSE;
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void saveAnularSolicitud() {
        try {
            // CATEGORIA 14	PREVIA IMPORTACION
            TarmTramite tarmTramite = TarmTramiteController.find(this.solicitudArmasController.getRecord().getCtramite().toString());
            if (tarmTramite.getCategoria().equals("14")) {
                desasociarCargaSolicitud();
            }

            //Poner la solicitud en estado anulado
            this.solicitudArmasController.getRecord().setEstado("ANU");
            this.solicitudArmasController.update();
            DtoSave dtoSolicitud = this.solicitudArmasController.getDtoSave();

            TarmSolicitudTramite solicitudTramiteObj = SolicitudTramiteController.findByCSolicitud(this.solicitudArmasController.getRecord().getPk());
            if (solicitudTramiteObj != null) {
                solicitudTramiteObj.setIsnew(false);
                solicitudTramiteObj.setEstadotramite("ANU");
                solicitudTramiteController.updateSolicitud(solicitudTramiteObj);
            }
            //Desasociar las armas en apertura de agencias y apertura de sucursales
            if (this.solicitudArmasController.getRecord().getCtramite() == 44 || this.solicitudArmasController.getRecord().getCtramite() == 48) {
                List<TarmSolicitudArmas> armasSolicitudList = RecepcionArmasController.findPorSolicitud(this.solicitudArmasController.getRecord().getPk());
                for (TarmSolicitudArmas armaObj : armasSolicitudList) {

                    // Codigo agencia de la solicitud
                    List<TarmSolicitudAgenciaSucursal> solicitudAgenciaLst = SolicitudAgenciaSucursalController.findPorSolicitud(this.solicitudArmasController.getRecord().getPk());
                    for (TarmSolicitudAgenciaSucursal solicitudAgenciaSucursalObj : solicitudAgenciaLst) {
                        String cAgencia = solicitudAgenciaSucursalObj.getPk().getCagencia().toString();
                        TarmAgenciaArma agenciaArmaObj = AgenciaArmaController.findByCArma(armaObj.getPk().getCarma(), cAgencia);
                        agenciaArma.setRecord(agenciaArmaObj);
                        agenciaArma.remove();
                    }
                }
            }

            DtoSave dtoSolicitudTramite = solicitudTramiteController.getDtoSave();
            DtoSave dtoAgenciaArma = agenciaArma.getDtoSave();

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

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

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

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

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

    public InspeccionController getInspeccionController() {
        return inspeccionController;
    }

    public void setInspeccionController(InspeccionController inspeccionController) {
        this.inspeccionController = inspeccionController;
    }

    public SolicitudTramiteController getSolicitudTramiteController() {
        return solicitudTramiteController;
    }

    public void setSolicitudTramiteController(
            SolicitudTramiteController solicitudTramiteController) {
        this.solicitudTramiteController = solicitudTramiteController;
    }

    public SolicitudArmasController getSolicitudArmasController() {
        return solicitudArmasController;
    }

    public void setSolicitudArmasController(
            SolicitudArmasController solicitudArmasController) {
        this.solicitudArmasController = solicitudArmasController;
    }

    public PersonDetailController getPersondetail() {
        return persondetail;
    }

    public void setPersondetail(PersonDetailController persondetail) {
        this.persondetail = persondetail;
    }

    public PersonAddressController getAddress() {
        return address;
    }

    public void setAddress(PersonAddressController address) {
        this.address = address;
    }

    public TarmSitioAlmacenamiento getSitioAlmacenamiento() {
        return sitioAlmacenamiento;
    }

    public void setSitioAlmacenamiento(TarmSitioAlmacenamiento sitioAlmacenamiento) {
        this.sitioAlmacenamiento = sitioAlmacenamiento;
    }

    public Boolean getTramiteProceso() {
        return tramiteProceso;
    }

    public void setTramiteProceso(Boolean tramiteProceso) {
        this.tramiteProceso = tramiteProceso;
    }

    public String getAplicaDecomiso() {
        return aplicaDecomiso;
    }

    public void setAplicaDecomiso(String aplicaDecomiso) {
        this.aplicaDecomiso = aplicaDecomiso;
    }

    public CentroControlArmasController getCentroControlArmasController() {
        return centroControlArmasController;
    }

    public void setCentroControlArmasController(
            CentroControlArmasController centroControlArmasController) {
        this.centroControlArmasController = centroControlArmasController;
    }

    public TcustPersonAddress getPersonAddressDireccion() {
        return personAddressDireccion;
    }

    public void setPersonAddressDireccion(TcustPersonAddress personAddressDireccion) {
        this.personAddressDireccion = personAddressDireccion;
    }

    public TcustPersonAddress getPersonAddressCorreo() {
        return personAddressCorreo;
    }

    public void setPersonAddressCorreo(TcustPersonAddress personAddressCorreo) {
        this.personAddressCorreo = personAddressCorreo;
    }

    public PersonPhoneController getPersonPhoneController() {
        return personPhoneController;
    }

    public void setPersonPhoneController(PersonPhoneController personPhoneController) {
        this.personPhoneController = personPhoneController;
    }

    public TcustPersonDetail getTcustPersonDetailProp() {
        return tcustPersonDetailProp;
    }

    public void setTcustPersonDetailProp(TcustPersonDetail tcustPersonDetailProp) {
        this.tcustPersonDetailProp = tcustPersonDetailProp;
    }

    public TcustPersonDetail getTcustPersonDetailResp() {
        return tcustPersonDetailResp;
    }

    public void setTcustPersonDetailResp(TcustPersonDetail tcustPersonDetailResp) {
        this.tcustPersonDetailResp = tcustPersonDetailResp;
    }

    public TsafeUserDetail getTsafeUserDetail() {
        return tsafeUserDetail;
    }

    public void setTsafeUserDetail(TsafeUserDetail tsafeUserDetail) {
        this.tsafeUserDetail = tsafeUserDetail;
    }

    public TcustPersonPhone getPersonPhoneDomiProp() {
        return personPhoneDomiProp;
    }

    public void setPersonPhoneDomiProp(TcustPersonPhone personPhoneDomiProp) {
        this.personPhoneDomiProp = personPhoneDomiProp;
    }

    public TcustPersonPhone getPersonPhoneDomiResp() {
        return personPhoneDomiResp;
    }

    public void setPersonPhoneDomiResp(TcustPersonPhone personPhoneDomiResp) {
        this.personPhoneDomiResp = personPhoneDomiResp;
    }

    public TcustPersonPhone getPersonPhoneCelResp() {
        return personPhoneCelResp;
    }

    public void setPersonPhoneCelResp(TcustPersonPhone personPhoneCelResp) {
        this.personPhoneCelResp = personPhoneCelResp;
    }

    public TcustPersonAddress getPersonAddressCorreoresp() {
        return personAddressCorreoresp;
    }

    public void setPersonAddressCorreoresp(
            TcustPersonAddress personAddressCorreoresp) {
        this.personAddressCorreoresp = personAddressCorreoresp;
    }

    public Integer getCodigoPersona() {
        return codigoPersona;
    }

    public void setCodigoPersona(Integer codigoPersona) {
        this.codigoPersona = codigoPersona;
    }

    public InspeccionArchivoController getInspeccionArchivoController() {
        return inspeccionArchivoController;
    }

    public void setInspeccionArchivoController(
            InspeccionArchivoController inspeccionArchivoController) {
        this.inspeccionArchivoController = inspeccionArchivoController;
    }

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;
    }

    public AlfrescoController getAlfrescoController() {
        return alfrescoController;
    }

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

    public UploadedFile getUploadedFileFoto1() {
        return uploadedFileFoto1;
    }

    public void setUploadedFileFoto1(UploadedFile uploadedFileFoto1) {
        this.uploadedFileFoto1 = uploadedFileFoto1;
    }

    public UploadedFile getUploadedFileFoto2() {
        return uploadedFileFoto2;
    }

    public void setUploadedFileFoto2(UploadedFile uploadedFileFoto2) {
        this.uploadedFileFoto2 = uploadedFileFoto2;
    }

    public UploadedFile getUploadedFileFoto3() {
        return uploadedFileFoto3;
    }

    public void setUploadedFileFoto3(UploadedFile uploadedFileFoto3) {
        this.uploadedFileFoto3 = uploadedFileFoto3;
    }

    public String getCodigoSolicitud() {
        return codigoSolicitud;
    }

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

    public IngresoDatosTipoTramite getTarmTramiteController() {
        return tarmTramiteController;
    }

    public void setTarmTramiteController(
            IngresoDatosTipoTramite tarmTramiteController) {
        this.tarmTramiteController = tarmTramiteController;
    }

    public Boolean getTramiteProcesoNegar() {
        return tramiteProcesoNegar;
    }

    public void setTramiteProcesoNegar(Boolean tramiteProcesoNegar) {
        this.tramiteProcesoNegar = tramiteProcesoNegar;
    }

    public Boolean getBtn() {
        return btn;
    }

    public void setBtn(Boolean btn) {
        this.btn = btn;
    }

    public Boolean getBtnFlujo() {
        return btnFlujo;
    }

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

    public AgenciaArmaController getAgenciaArma() {
        return agenciaArma;
    }

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

    public CargaController getCargaController() {
        return cargaController;
    }

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

}
