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

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
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.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.Filter;
import com.fp.dto.query.SubQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.TarmVentaArmaTemporalController;
import com.fp.frontend.controller.armas.parametros.TiposArmasExplosivosController;
import com.fp.frontend.controller.armas.parametros.VentaTotalPersonaController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pcustomer.lov.PersonLovController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.frontend.utility.MsgGeneral;
import com.fp.persistence.parmas.fun.TarmMovimientoArmas;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 * @author Andres Cevallos Clase Controladora la cual maneja la venta de armas
 */
@ManagedBean
@ViewScoped
public class VentaController extends AbstractController<TarmArmas> {

    public VentaController() throws Exception {
        super(TarmArmas.class);
    }

    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{movimientoController}")
    private MovimientoController movimientoController;

    @ManagedProperty(value = "#{registroArmController}")
    private RegistroArmController registroArmController;

    @ManagedProperty(value = "#{ventaTotalPersonaController}")
    private VentaTotalPersonaController ventaTotalPersonaController;

    @ManagedProperty(value = "#{tarmVentaArmaTemporalController}")
    private TarmVentaArmaTemporalController ventaArmaTemp;

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

    private String loteFilter;

    /**
     * Lisat de personas
     */
    private List<TcustPersonDetail> lperson;
    private TarmMovimientoArmas movimientoArma;

    /**
     * Persona Cliente a la cual se le vende un arma
     */
    private TcustPersonDetail compradorArma;
    /**
     * Cantidad de producto en venta
     */
    private Integer cantidad;
    /**
     * Peso del producto en venta
     */
    private BigDecimal peso;
    /**
     * Referencia de los Movimientos en el catalogo
     */
    private List<TgeneCatalogDetail> lmovimientos;
    /**
     * Lista referenciada al catalogo
     */
    private List<TgeneCatalogDetail> lcatalog;
    /**
     * Referencia del cliente en el catalogo
     */
    private TgeneCatalogDetail cdetalle;
    /**
     * Detalle de la persona que vende el arma
     */
    private TcustPersonDetail persondetail;
    /**
     * Fecha actual del sistema
     */
    private Date fecha;
    /**
     * Lista de centros de control
     */
    private List<TarmCentroControl> centroControlList;

    /**
     * Codigo del centro de control
     */
    private String ccentrocontrol;

    /**
     * umero de solicitud
     */
    private String numerosolicitud;
    /**
     * bandera para el flujo de venta
     */
    private String flujoventa;
    /**
     * bandera para el consumo de municion
     */
    private String consumomunicion;

    /**
     * Variable que nos permite cargar el documento al Alfresco
     */
    private UploadedFile uploadedFile;

    @PostConstruct
    private void postconstruct() {
        this.init();
        centroControlList = CentroControlArmasController.findEstadoInst("Y", "1");//Departamento
        querydatabase();
    }

    private void init() {
        try {
            peso = null;
            cantidad = null;
            this.lrecord = new ArrayList<>();
            this.beanalias = "VENTAARMAS";
            //  tipomovimiento=false;
            TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            this.persondetail = PersonDetailController.find(tsafeUserDetail.getPk().getPersoncode().toString());
            lmovimientos = CatalogDetailController.find("TIPOREGISTRO", "MOV");//catalogo de movimientos
            cdetalle = CatalogDetailController.findxCodigoCodcatalogo(getPersondetail().getIdentificationcatalog(), getPersondetail().getIdentificationcatalogcode());
            fecha = new Date();
            lcatalog = CatalogDetailController.find("IDENTIFICATION");
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public void querydatabase() {
        try {
            DtoQuery dto = super.getDtoQuery(true);
            SubQuery subqueryMarca = new SubQuery("TgeneCatalogDetail", "description", "marca", "i.pk.catalog=t.marca and i.pk.catalogcode=t.marcacodigo");
            dto.addSubQuery(subqueryMarca);
            SubQuery subqueryColor = new SubQuery("TgeneCatalogDetail", "description", "color", "i.pk.catalog=t.color and i.pk.catalogcode=t.colorcodigo");
            dto.addSubQuery(subqueryColor);
            SubQuery subqueryEstado = new SubQuery("TgeneCatalogDetail", "description", "estado", "i.pk.catalog=t.estado and i.pk.catalogcode=t.estadocodigo");
            dto.addSubQuery(subqueryEstado);

            SubQuery subqueryLonguitud = new SubQuery("TgeneCatalogDetail", "description", "longitud", "i.pk.catalog=(select o.longitud       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                    + " i.pk.catalogcode=(select o.longitudcodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
            dto.addSubQuery(subqueryLonguitud);

            SubQuery subqueryClase = new SubQuery("TgeneCatalogDetail", "description", "clase", "i.pk.catalog=(select o.clase       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                    + " i.pk.catalogcode=(select o.clasecodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
            dto.addSubQuery(subqueryClase);

            SubQuery subqueryTipoArma = new SubQuery("TgeneCatalogDetail", "description", "tipoarmaexplosivo", "i.pk.catalog=(select o.tipoarmaexplosivo       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                    + " i.pk.catalogcode=(select o.tipoarmaexplosivocodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
            dto.addSubQuery(subqueryTipoArma);

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

            SubQuery subqueryUnidad = new SubQuery("TgeneCatalogDetail", "description", "unidadmedidapeso", "i.pk.catalog=(select o.unidadmedidapeso       from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo) and "
                    + " i.pk.catalogcode=(select o.unidadmedidapesocodigo from TarmTipoArmaExplosivo o where o.pk=t.ctipoarmaexplosivo)");
            dto.addSubQuery(subqueryUnidad);

            dto.setOrderby("lote, ctipoarmaexplosivo,cregistro");

            Filter filtro = new Filter();
            String filtrofecha = "t.fecharegistro=(select max(ta.fecharegistro) from TarmArmas ta where t.codigoarma=ta.codigoarma and t.cregistro=ta.cregistro) "
                    + " and t.estado in(" + MsgControlArmas.getProperty("codigo_estado_arma_busqueda_venta") + ") "//'REG','REN','APTA','DEV','ECO','COLE'
                    + " and cregistro in (select reg.pk from TarmRegistroArmas reg where reg.personcode ='" + persondetail.getPk().getPersoncode() + "' )"
                    + " and (t.peso>0 or t.cantidad>0)";

            if (loteFilter != null && !loteFilter.isEmpty()) {
                filtrofecha += " and UPPER(t.lote) like '" + loteFilter + "'";
            }

            filtro.setSql(filtrofecha);
            dto.addFiltro(filtro);

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

            Request request = this.callerhelper.getRequest();
            request.setQueryTables(mtables);
//    		request.put("queryalias", "ARMASCOMPLETE");
            Response resp = this.callerhelper.executeQuery(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                this.lrecord = new ArrayList<TarmArmas>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmArmas>) resp.get(this.beanalias);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Cambia el valor del movimiento de Venta a Materia Prima
     */
    public void changeType() {
        compradorArma = new TcustPersonDetail();
    }

    /**
     * Valida que la fecha de venta no seaa superior a la fecha del sistema
     *
     * @param fech
     */
    public void validarfecha(Date fech) {
        if (fech.getTime() > (new Date()).getTime()) {
            fecha = new Date();
        }
    }

    /**
     * Carga el archivo a grabar en la memoria para su posterior persistencia en
     * el Alfresco
     */
    public void handleUpload(FileUploadEvent event) {
        uploadedFile = event.getFile();
    }

    /**
     * Recorta el nombre del archivo a cargarse
     *
     * @param nombre
     * @return nombre recortado
     */
    public String recorteNombre(String nombre) {
        String fielname = nombre;
        if (fielname.length() > 30) {
            fielname = fielname.substring(0, 30) + extencionArchivo(nombre);
        }
        return fielname;
    }

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

    /**
     * Actualiza la informacion en el lrecord
     */
    @Override
    public void update() {
        try {
            String pathRuta = "";
            //ACTUALIZA ELRESTO DE DATOS DE LA TABLA DE MOVIMIENTO
            this.movimientoArma.setPersoncodevendedor(persondetail.getPk().getPersoncode());
            this.movimientoArma.getModifiedData().put("personaVemdedor", persondetail);
            if (movimientoArma.getTipomovimiento().equals("VENT")) {
                if (compradorArma != null && compradorArma.getPk() != null) {
                    //if(verificaDocHabilitante(compradorArma.getPk().getPersoncode())){
                    this.movimientoArma.setPersoncodecomprador(compradorArma.getPk().getPersoncode());
                    this.movimientoArma.getModifiedData().put("personaComprador", compradorArma);
                } else {
                    MessageHelper.setMessageWarn("DEBE INGRESAR UN CLIENTE");
                    return;
                }
                //VALIDA SI ES ARMA: LETAL Y NO LETAL
                TarmTipoArmaExplosivo tipoArmaExplosivo = TiposArmasExplosivosController.findarma(this.record.getCtipoarmaexplosivo());
                if (tipoArmaExplosivo != null && tipoArmaExplosivo.getClasecodigo().equals("CLASE")
                        && ((this.flujoventa != null && this.flujoventa.equals("SI") && movimientoArma.getTipomovimiento().equals("VENT"))
                        || (this.consumomunicion != null && this.consumomunicion.equals("SI") && movimientoArma.getTipomovimiento().equals("CONS")))
                        && (tipoArmaExplosivo.getClase().equals("0010000008") || tipoArmaExplosivo.getClase().equals("0010000001")
                        || tipoArmaExplosivo.getClase().equals("0010000002"))) {//0010000002 MUNICION

                    String xPathLocation = getRutaDocumentoSolBase() + "/cm:I-" + persondetail.getIdentification() + "/cm:C-" + record.getCodigoarma();
                    if (uploadedFile != null && uploadedFile.getFileName() != null) {
                        String extencionArchivo = getExtension(uploadedFile.getFileName());
                        String nombreArchivo = "PERMISO-" + this.record.getCodigoarma() + "." + extencionArchivo;
                        if (alfrescoController.uploadFile(uploadedFile.getInputstream(), nombreArchivo, xPathLocation)) {
                            pathRuta = xPathLocation + "/cm:" + nombreArchivo;
                        } else {
                            MessageHelper.setMessageError("Adjunte el documento erroneo");
                            return;
                        }
                    } else {
                        MessageHelper.setMessageError("Adjunte el documento ");
                        return;
                    }

                    if (ccentrocontrol != null && !ccentrocontrol.trim().isEmpty()) {
                        saveVentaArma(pathRuta);
                        //retorna
                        return;
                    } else {
                        MessageHelper.setMessageWarn("SELECCIONE EL CENTRO DE CONTROL");
                        return;
                    }
                }
            } else {
                this.movimientoArma.getModifiedData().put("personaComprador", persondetail);
                this.movimientoArma.setPersoncodecomprador(persondetail.getPk().getPersoncode());//es el mismo si el tipo movimientoArma.getTipomovimiento() es diferente de nenta
            }
            save();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Retorna la ruta base donde se almacenara dicho archivo
     *
     * @return
     */
    public String getRutaDocumentoSolBase() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        StringBuilder ruta = new StringBuilder("cm:Solicitudes");
        ruta = ruta.append("/cm:VentaTem-");
        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 que retorna la extencion del documento que se desea subir al
     * alfresco
     */
    public String getExtension(String filename) {
        int index = filename.lastIndexOf('.');
        if (index == -1) {
            return "";
        } else {
            return filename.substring(index + 1);
        }
    }

    public void saveVentaArma(String pathRuta) {
        try {
            System.out.println("-------------Ingresa Venta Armas Save: " + numerosolicitud);

            //actualiza el arma a un estado pendiente de venta
            this.record.setEstadoventa("PENVEN");
            numerosolicitud = record.getPk();
            System.out.println("------------Ingresa Venta Armas Save2: " + numerosolicitud);

            super.update();

            ventaArmaTemp.clearAll();
            ventaArmaTemp.create();
            ventaArmaTemp.getRecord().setCarma(record.getPk());
            //this.movimientoArma.setPersoncodecomprador(compradorArma.getPk().getPersoncode());
            ventaArmaTemp.getRecord().setPersoncodigo(compradorArma.getPk().getPersoncode());
            ventaArmaTemp.getRecord().setEstado("PENDIENTE");
            ventaArmaTemp.getRecord().setFcreacion(new java.sql.Date(new Date().getTime()));
            ventaArmaTemp.getRecord().setFactura(movimientoArma.getFactura());
            ventaArmaTemp.getRecord().setNoregistra(movimientoArma.getNoregistro());
            ventaArmaTemp.getRecord().setJustificacion(movimientoArma.getJustificacion());
            ventaArmaTemp.getRecord().setPathdocumento(pathRuta);
            ventaArmaTemp.getRecord().setCentrocontrol(ccentrocontrol);
            ventaArmaTemp.update();

            Request request = this.callerhelper.getRequest();
            super.cleanRequest(request);

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

            DtoSave dtosaveArma = this.getDtoSave(true);
            dtosaveArma.setPosition(1);
            msave.put(this.getBeanalias(), dtosaveArma);//2

            DtoSave dtosaveRegistro = this.ventaArmaTemp.getDtoSave(true);
            dtosaveRegistro.setPosition(2);
            msave.put(ventaArmaTemp.getBeanalias(), dtosaveRegistro);

            request.setSaveTables(msave);
            Response resp = this.callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                this.ventaArmaTemp.postCommit(resp);
                this.record = new TarmArmas();
                MessageHelper.setMessageInfo(resp);
                //inicio del flujo
                iniciarFlujo();
                super.cleanRequest(request);
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
        querydatabase();
    }

    /**
     * M&eacute;todo para el inicio de flujo
     */
    public void iniciarFlujo() {
        try {
            System.out.println("--------------Ingresa Venta Armas Inicio Flujo: " + numerosolicitud);

            String cprovincia = null;
            for (TarmCentroControl centro : centroControlList) {
                if (ccentrocontrol.equals(centro.getPk())) {
                    cprovincia = centro.getProvincecode();
                }
            }
            ;
            if (cprovincia == null || cprovincia.length() == 0) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_sinprovincia"));
                return;
            }

            Request request = callerhelper.getRequest();
            super.cleanRequest(request);

            request.modifiedData().put("csolicitud", numerosolicitud);//nuemro del arma carma pk
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.getDefault());
            request.modifiedData().put("numerosolicitud", numerosolicitud + "-" + this.persondetail.getPk().getPersoncode() + "-" + dateFormat.format(new Date()));
            request.modifiedData().put("cprovincia", cprovincia);
            request.modifiedData().put("isnew", "Y");
            request.setLogsolicitude(numerosolicitud);

            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.setShowRow(true);
                cantidad = null;
                peso = null;
                //crea un movimiento para la tabla TarmMovimientoArmas
                movimientoArma = null;
                //crea a la persona compradora
                compradorArma = null;
                //	tipomovimiento=false;
                flujoventa = null;
                consumomunicion = null;
                //flujoiniciado = true;
                //deshabilitarPantalla = Boolean.TRUE;
                MessageHelper.setMessageInfo(resp, MsgGeneral.getProperty("msg_initFlow") + " SOLICITUD: " + numerosolicitud);
                //saveInicioFlujoEnYES();
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Valida que la cantidad que se desea vender no sea superior a la cantidad
     * maxima que se tiene
     *
     * @param cantidad
     */
    public void validarCantidadMexima(Integer cantidad) {
        this.peso = null;
        if (cantidad == null || cantidad == 0 || cantidad < 0 || cantidad.compareTo(record.getCantidad()) > 0) {
            this.cantidad = record.getCantidad();
        }
    }

    /**
     * Valida que la cantidad que se desea vender no sea superior a la cantidad
     * maxima que se tiene
     *
     * @param peso
     */
    public void validarPesoMexima(BigDecimal peso) {
        this.cantidad = null;
        if (peso == null || peso.compareTo(new BigDecimal(0)) == 0 || peso.compareTo(new BigDecimal(0)) < 0 || peso.compareTo(record.getPeso()) > 0) {
            this.peso = getRecord().getPeso();
        }
    }

    /**
     * Crea un registro de arma
     *
     * @param arm
     */
    public void create(TarmArmas arm) {
        try {
            cantidad = arm.getCantidad();
            peso = arm.getPeso();
            //crea un movimiento para la tabla TarmMovimientoArmas
            movimientoArma = new TarmMovimientoArmas();
            //crea a la persona compradora
            compradorArma = new TcustPersonDetail();
            //	tipomovimiento=false;
            flujoventa = null;
            consumomunicion = null;
            //VALIDA SI ES ARMA: LETAL Y NO LETAL
            TarmTipoArmaExplosivo tipoArmaExplosivo = TiposArmasExplosivosController.findarma(arm.getCtipoarmaexplosivo());
            if (tipoArmaExplosivo != null && tipoArmaExplosivo.getClasecodigo().equals("CLASE")
                    && (tipoArmaExplosivo.getClase().equals("0010000008") || tipoArmaExplosivo.getClase().equals("0010000001"))) {
                flujoventa = "SI";
            }
            if (tipoArmaExplosivo != null && tipoArmaExplosivo.getClasecodigo().equals("CLASE")
                    && tipoArmaExplosivo.getClase().equals("0010000002")) {
                consumomunicion = "SI";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public TgeneCatalogDetail getCdetalle() {
        return cdetalle;
    }

    public void setCdetalle(TgeneCatalogDetail cdetalle) {
        this.cdetalle = cdetalle;
    }

    /**
     * Abre el Lov de Persona
     */
    public void openPersonLov() {
        Map<String, List<String>> params = new HashMap<>();
        PersonLovController.openLov(params);
    }

    /**
     * Carga los datos que se devuelven en el Lov de personas
     *
     * @param event
     * @throws Exception
     */
    public void onReturnPersonLov(SelectEvent event) throws Exception {
        compradorArma = (TcustPersonDetail) event.getObject();
    }

    /**
     * Graba los registros en la base de datos
     */
    @Override
    public void save() {
        try {
            //actualiza el movimiento
            this.movimientoArma.setCarma(record.getPk());
            this.movimientoArma.setTipomovimientocodigo("TIPOMOVIMIENTO");
            this.movimientoArma.setFecha(new java.sql.Timestamp(fecha.getTime()));
            this.movimientoController.create();
            this.movimientoController.setRecord(movimientoArma);
            this.movimientoController.getRecord().setIsnew(true);
            this.movimientoController.update();
            //actualiza el arma
            //this.record.setPk(null);
            if (cantidad != null) {
                this.record.setValorAux(cantidad);
            }
            if (peso != null) {
                this.record.setPesoAux(peso);
            }
            super.update();

            Request request = this.callerhelper.getRequest();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

            DtoSave dtosaveRegistro = this.registroArmController.getDtoSave(true);
            dtosaveRegistro.setPosition(1);
            msave.put(registroArmController.getBeanalias(), dtosaveRegistro);

            DtoSave dtosaveMovimiento = this.movimientoController.getDtoSave(true);
            dtosaveMovimiento.setPosition(2);
            msave.put(movimientoController.getBeanalias(), dtosaveMovimiento);//1

            DtoSave dtosaveTotalPersona = this.ventaTotalPersonaController.getDtoSave(true);
            dtosaveTotalPersona.setPosition(3);
            msave.put(ventaTotalPersonaController.getBeanalias(), dtosaveTotalPersona);

            DtoSave dtosaveArma = this.getDtoSave(true);
            dtosaveArma.setPosition(4);
            msave.put(this.getBeanalias(), dtosaveArma);//2

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

//    private boolean verificaDocHabilitante(Integer personcode) {
//    	boolean verifica = false;
//    	TsafeUserDetail userDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
//    	TgeneParameters habVenta = ParametersController.find("TRAHABVENTAS", userDetail.getCompanycode().toString());
//    	List<TarmDocumentoHabilitante> ldocs = DocumentoHabilitanteController.findPorPersoncode(personcode.toString());
//    	if(ldocs != null && !ldocs.isEmpty()){
//    		for (TarmDocumentoHabilitante doc : ldocs) {
//    			String[] tramites = habVenta.getTextvalue().split(",");
//    			int ind = Arrays.binarySearch(tramites, doc.getCtramite().toString());
//				if(ind >= 0 && Calendar.getInstance().getTime().compareTo(doc.getFechaexpiracion()) <= 0){
//					verifica = true;
//					break;
//				}
//			}
//    	}
//    	return verifica;
//    }

    /* (non-Javadoc)
	 * @see com.fp.frontend.controller.AbstractController#postCommit(com.fp.dto.Response)
     */
    @Override
    public void postCommit(Response response) throws Exception {
        super.postCommit(response);
    }

    public TcustPersonDetail getPersondetail() {
        return persondetail;
    }

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

    public List<TgeneCatalogDetail> getLcatalog() {
        return lcatalog;
    }

    public void setLcatalog(List<TgeneCatalogDetail> lcatalog) {
        this.lcatalog = lcatalog;
    }

    public TcustPersonDetail getCompradorArma() {
        return compradorArma;
    }

    public void setCompradorArma(TcustPersonDetail compradorArma) {
        this.compradorArma = compradorArma;
    }

    public RegistroArmController getRegistroArmController() {
        return registroArmController;
    }

    public void setRegistroArmController(RegistroArmController registroArmController) {
        this.registroArmController = registroArmController;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public BigDecimal getPeso() {
        return peso;
    }

    public void setPeso(BigDecimal peso) {
        this.peso = peso;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public List<TgeneCatalogDetail> getLmovimientos() {
        return lmovimientos;
    }

    public void setLmovimientos(List<TgeneCatalogDetail> lmovimientos) {
        this.lmovimientos = new ArrayList<TgeneCatalogDetail>();
        for (TgeneCatalogDetail mov : lmovimientos) {
            //No se incluye el tipo de registro TRASLADO (TRASL)
            if (!mov.getPk().getCatalog().equalsIgnoreCase("TRASL")) {
                this.lmovimientos.add(mov);
            }
        }
    }

    public List<TcustPersonDetail> getLperson() {
        return lperson;
    }

    public void setLperson(List<TcustPersonDetail> lperson) {
        this.lperson = lperson;
    }

    public TarmMovimientoArmas getMovimientoArma() {
        return movimientoArma;
    }

    public void setMovimientoArma(TarmMovimientoArmas movimientoArma) {
        this.movimientoArma = movimientoArma;
    }

    public MovimientoController getMovimientoController() {
        return movimientoController;
    }

    public void setMovimientoController(MovimientoController movimientoController) {
        this.movimientoController = movimientoController;
    }

    public VentaTotalPersonaController getVentaTotalPersonaController() {
        return ventaTotalPersonaController;
    }

    public void setVentaTotalPersonaController(
            VentaTotalPersonaController ventaTotalPersonaController) {
        this.ventaTotalPersonaController = ventaTotalPersonaController;
    }

    public String getLoteFilter() {
        return loteFilter;
    }

    public void setLoteFilter(String loteFilter) {
        this.loteFilter = loteFilter;
    }

    public List<TarmCentroControl> getCentroControlList() {
        return centroControlList;
    }

    public void setCentroControlList(List<TarmCentroControl> centroControlList) {
        this.centroControlList = centroControlList;
    }

    public String getCcentrocontrol() {
        return ccentrocontrol;
    }

    public void setCcentrocontrol(String ccentrocontrol) {
        this.ccentrocontrol = ccentrocontrol;
    }

    public String getFlujoventa() {
        return flujoventa;
    }

    public void setFlujoventa(String flujoventa) {
        this.flujoventa = flujoventa;
    }

    public String getConsumomunicion() {
        return consumomunicion;
    }

    public void setConsumomunicion(String consumomunicion) {
        this.consumomunicion = consumomunicion;
    }

    public TarmVentaArmaTemporalController getVentaArmaTemp() {
        return ventaArmaTemp;
    }

    public void setVentaArmaTemp(TarmVentaArmaTemporalController ventaArmaTemp) {
        this.ventaArmaTemp = ventaArmaTemp;
    }

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    public AlfrescoController getAlfrescoController() {
        return alfrescoController;
    }

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

}
