/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.cosmodas.factura;

import com.cosmodas.EntCosmos.*;
import com.cosmodas.FacadeCosmos.*;
import com.cosmodas.validaciones.DetalleOfertav;
import com.cosmodas.validaciones.FacturaCuerpo;
import com.cosmodas.validaciones.NumeroALetras;
import com.cosmodas.validaciones.ProductosResta;
import com.cosmodas.validaciones.SpoolFactura;
import com.cosmodas.validaciones.obtenerPrograma;
import com.cosmodas.validaciones.validaFact;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.ServletOutputStream;
import java.awt.event.ActionEvent;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.omnifaces.util.Ajax;
import org.primefaces.PrimeFaces;

/**
 * @author obper
 */
@ManagedBean
@ViewScoped
public class bfactura implements Serializable {

    @EJB
    private WcOfertaDescuentoFacadeLocal wdodfl;
    @EJB
    private daoAutoAjusteLocal ajusteLocal;
    @EJB
    private VprecioProgramaFFacadeLocal vppffl;
    @EJB
    private DatosCosultoresCompletosFacturacionFacadeLocal cdcffl;
    @EJB
    private PrecioprogramaFacadeLocal ppfl;
    @EJB
    private CreditoFiscalFacadeLocal cffl;
    @EJB
    private ProductosucursalFacadeLocal productosucursalFacadeLocal;
    @EJB
    private OfertasFacadeLocal ofertasFacadeLocal;
    @EJB
    private SucursalesFacadeLocal sucursalesFacadeLocal;
    @EJB
    private ConsultoresCcfFacadeLocal cccfl;
    @EJB
    private RegaloFacadeLocal daoRegalo;
    @EJB
    private CargosFacadeLocal cfl;
    @EJB
    private DetalleOfertaFacadeLocal detalleOfertaFacadeLocal;
    @EJB
    private DetalleFacturaFacadeLocal detallefacturaDao;
    @EJB
    private FacturasFacadeLocal facturaDao;
    @EJB
    private ArticuloSalaFacadeLocal articuloSalaFacade;
    @EJB
    private EntregaPremiosFacadeLocal entregaPremiosFacade;
    @EJB
    private ConsultorpromocionFacadeLocal consultorPromocionfacace;
    @EJB
    private ProgramasFacadeLocal programasFacadeLocal;
    @EJB
    private BitacorasWebFacadeLocal bitacorasWebFacadeLocal;
    @EJB
    private ArticuloFacadeLocal articuloFacadeLocal;
    @EJB
    private ConsultoresFacadeLocal consultoresFacadeLocal;
    @EJB
    private VProcesodepedidosFacadeLocal vprofl;
    @EJB
    private GeneralesFacadeLocal generalesDao;
    @EJB
    private VConsultorpremioFacadeLocal vcpfl;
    @EJB
    private PremiosFacadeLocal premiosDao;
    @EJB
    private DetallePremioFacadeLocal detallePremioDao;
    @EJB
    private WcOfertasFlotantesFacadeLocal wcof;
    @EJB
    private PedidosFacadeLocal pfl;
    @EJB
    private ProductosFacadeLocal prfl;

    //  @EJB
    //  private DatosCosultoresCompletosFacadeLocal dccfl;
    //-----------------Variables---------------------------------------
    private Date fechaFact;
    private Date fecha;
    private String hostname;
    private String sala;
    private String factSig;
    private String facSerie;
    private String consultorCodigo;
    private String cosultorNombre;
    private String consultorTerritorio;
    private String programa;
    private String tipoDoc;
    private String tipoDocPage;
    private String giro;
    private String registro;
    private String codigoBarra;
    private String cantidadProducto;
    private String nombrePremio;
    private String facturaCodigoBusqueda;
    private String facturaSerieBusqueda;
    private String salida;
    private String factus;
    private String programacodigo;
    private String productoNombre;
    private String productoOferta;
    private String primeraOferta;
    private String descuento;
    private String otrosDescuentos;
    private String cargoPuSum;
    private String chongas;
    private String numeroFacturaTraer;
    private String serieTraer;
    private String entregaPremioPrograma;
    private String ompp;
    private String consultorNombre;
    private String codigoPedido;
    private String pedidoFacturado;
    private String codigoOfertaPrevio;
    private boolean caex;
    private boolean cxc;

    private String nombreNiko;

    private String apellidoNiko;
    //----------------------------------------------------------------
    private int exitenciaPremio;
    private int factConteo;
    private int exstenciasOfertas;
    private int cantitdaRegalo2;
    private int chongasContador;
    //----------------------------------------------------------------
    private boolean contado;
    private boolean bloquearNuevo;
    private boolean bloquearGuardarBtn;
    private boolean consultorCodigol1058;
    private boolean bazar;
    private boolean enableText;
    private boolean impresaFact;
    private boolean historicoFacturas;
    private boolean creditoContado;
    private boolean bloqueaBotonCredito;
    private boolean reparto;
    private boolean consutorBlok;
    private boolean consultorMasivoEntrega;
    private boolean actOferta;
    private boolean entregaPremio;
    private boolean habilitaImpresion;
    private boolean bloqueoFactura;
    private boolean bloqueoBotonGuardar;
    private boolean sumaRestaDeCantidad;
    private boolean productoCantidadCero;
    private boolean mensajesCatalogoB;
    private boolean bolsoPrimerPedido;
    private boolean creditoFiscal;
    private boolean premiob;
    private boolean premiosExistenciasDs;
    private String cantidadCajasCaex;
    private String cantidadCajasCasaPorCasa;
    //----------------------------------------------------------------
    private JasperPrint jasperPrint;
    private ExternalContext exc;
    private HttpSession session;
    //----------------------------------------------------------------
    private FacturaCuerpo producto;
    private FacturaCuerpo factura;
    private List<FacturaCuerpo> facturas;
    private List<FacturaCuerpo> premioEntregar;
    private List<WcOfertasFlotantes> listadoDeOfertas;
    private List<VprecioProgramaF> precioProg;
    private List<DetalleOfertav> detalleOferta;
    private List<FacturaCuerpo> rsPremio, sinExistencias;
    private List<DetalleFactura> resuBusDetallFact;
    private ProductosResta productoResta;
    private WcOfertaDescuento descuentazo;
    private List<ProductosResta> listProductoResta = new ArrayList<>();
    private List<ProductosResta> listaPremiosResta = new ArrayList<>();
    private List<FacturasPK> guardarFacturas;
    private List<EsperaGuardadoFactura> imprimirFcturas;
    private List<VprecioProgramaF> ofertas;
    //----------------------------------------------------------------
    @Inject
    private Sucursales sucursal;
    @Inject
    private DatosCosultoresCompletosFacturacion consultor;
    @Inject
    private Facturas facturaSelc, resuBusFact, facturasBase;
    @Inject
    private VprecioProgramaF producto1, productoSelect;
    @Inject
    private WcUsuarios usuario;
    @Inject
    private Cargos cargosCab;
    @Inject
    private WcOfertasFlotantes ofertaFlo;
    @Inject
    private VConsultorpremio prem;
    @Inject
    private Generales gen;
    @Inject
    Pedidos pedidoSe;
//----------------------------------------------------------------

    @PostConstruct
    public void init() {

        this.contado = true;
        this.cantitdaRegalo2 = 0;
        this.chongasContador = 0;
        this.bloquearNuevo = false;
        this.productoSelect = new VprecioProgramaF();
        this.bloquearGuardarBtn = true;
        this.consultorCodigol1058 = false;
        this.enableText = true;
        this.impresaFact = true;
        this.consutorBlok = true;
        this.consultorMasivoEntrega = false;
        this.actOferta = true;
        this.entregaPremio = false;
        this.habilitaImpresion = true;
        this.bloqueoFactura = false;
        this.bloqueoBotonGuardar = true;
        this.mensajesCatalogoB = false;
        this.otrosDescuentos = "0.00";
        this.premiosExistenciasDs = false;
        this.factus = ":fact:nuevaFactura";
        this.primeraOferta = "";
        this.creditoFiscal = false;
        this.numeroFacturaTraer = "-";
        this.ofertas = new ArrayList<>();
        this.programacodigo = generalesDao.ParametrosGenerales().getPrograma();
        this.programa = generalesDao.ParametrosGenerales().getPrograma();
        this.session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        this.guardarFacturas = new ArrayList<>();
        this.imprimirFcturas = new ArrayList<>();
        this.productoSelect = new VprecioProgramaF();
        this.sinExistencias = new ArrayList<>();
        this.premioEntregar = new ArrayList<>();
        this.caex = false;
        this.cxc = false;

        exc = FacesContext.getCurrentInstance().getExternalContext();
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        ompp = exc.getSessionMap().get("ompp").toString();
        factura = new FacturaCuerpo();
        facturas = new ArrayList<FacturaCuerpo>();
        gen = generalesDao.findAll().get(0);
        prem = new VConsultorpremio();
        pedidoSe = new Pedidos();

        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        Map<String, Object> sessionMap = externalContext.getSessionMap();
        try {
            this.bazar = (Boolean) sessionMap.get("bazar");
        } catch (Exception e) {
        }

        this.facturaSerieBusqueda = sucursal.getSalaSerie();
        this.listadoDeOfertas = wcof.busquedaListadoOfertaProg(programacodigo);

        Date validadorFechas = new Date();
        Date fechaImpresor = generalesDao.ParametrosGenerales().getImpresor();


        if (validadorFechas.after(fechaImpresor)) {
            fecha = new Date();
        } else {
            fecha = fechaImpresor;
        }

    }

    public boolean isCxc() {
        return cxc;
    }

    public void setCxc(boolean cxc) {
        this.cxc = cxc;
    }

    public String getNombreNiko() {
        return nombreNiko;
    }

    public void setNombreNiko(String nombreNiko) {
        this.nombreNiko = nombreNiko;
    }

    public String getApellidoNiko() {
        return apellidoNiko;
    }

    public void setApellidoNiko(String apellidoNiko) {
        this.apellidoNiko = apellidoNiko;
    }

    public String getCantidadCajasCaex() {
        return cantidadCajasCaex;
    }

    public void setCantidadCajasCaex(String cantidadCajasCaex) {
        this.cantidadCajasCaex = cantidadCajasCaex;
    }

    public String getCantidadCajasCasaPorCasa() {
        return cantidadCajasCasaPorCasa;
    }

    public void setCantidadCajasCasaPorCasa(String cantidadCajasCasaPorCasa) {
        this.cantidadCajasCasaPorCasa = cantidadCajasCasaPorCasa;
    }

    public boolean isCaex() {
        return caex;
    }

    public void setCaex(boolean caex) {
        this.caex = caex;
    }

    public String getPedidoFacturado() {
        return pedidoFacturado;
    }

    public void setPedidoFacturado(String pedidoFacturado) {
        this.pedidoFacturado = pedidoFacturado;
    }

    public boolean isPremiob() {
        return premiob;
    }

    public void setPremiob(boolean premiob) {
        this.premiob = premiob;
    }

    public Generales getGen() {
        return gen;
    }

    public void setGen(Generales gen) {
        this.gen = gen;
    }

    public VConsultorpremio getPrem() {
        return prem;
    }

    public void setPrem(VConsultorpremio prem) {
        this.prem = prem;
    }

    public List<FacturaCuerpo> getPremioEntregar() {
        return premioEntregar;
    }

    public void setPremioEntregar(List<FacturaCuerpo> premioEntregar) {
        this.premioEntregar = premioEntregar;
    }

    public String getCodigoPedido() {
        return codigoPedido;
    }

    public void setCodigoPedido(String codigoPedido) {
        this.codigoPedido = codigoPedido;
    }

    public List<FacturaCuerpo> getSinExistencias() {
        return sinExistencias;
    }

    public void setSinExistencias(List<FacturaCuerpo> sinExistencias) {
        this.sinExistencias = sinExistencias;
    }

    public VprecioProgramaF getProductoSelect() {
        return productoSelect;
    }

    public void setProductoSelect(VprecioProgramaF productoSelect) {
        this.productoSelect = productoSelect;
    }

    public List<EsperaGuardadoFactura> getImprimirFcturas() {
        return imprimirFcturas;
    }

    public void setImprimirFcturas(List<EsperaGuardadoFactura> imprimirFcturas) {
        this.imprimirFcturas = imprimirFcturas;
    }

    public List<WcOfertasFlotantes> getListadoDeOfertas() {
        return listadoDeOfertas;
    }

    public void setListadoDeOfertas(List<WcOfertasFlotantes> listadoDeOfertas) {
        this.listadoDeOfertas = listadoDeOfertas;
    }

    public boolean isCreditoFiscal() {
        return creditoFiscal;
    }

    public void setCreditoFiscal(boolean creditoFiscal) {
        this.creditoFiscal = creditoFiscal;
    }

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

    public void setJasperPrint(JasperPrint jasperPrint) {
        this.jasperPrint = jasperPrint;
    }

    public boolean isBloquearNuevo() {
        return bloquearNuevo;
    }

    public void setBloquearNuevo(boolean bloquearNuevo) {
        this.bloquearNuevo = bloquearNuevo;
    }

    public boolean isBloquearGuardarBtn() {
        return bloquearGuardarBtn;
    }

    public void setBloquearGuardarBtn(boolean bloquearGuardarBtn) {
        this.bloquearGuardarBtn = bloquearGuardarBtn;
    }

    public boolean isCreditoContado() {
        return creditoContado;
    }

    public void setCreditoContado(boolean creditoContado) {
        this.creditoContado = creditoContado;
    }

    public boolean isConsutorBlok() {
        return consutorBlok;
    }

    public void setConsutorBlok(boolean consutorBlok) {
        this.consutorBlok = consutorBlok;
    }

    public boolean isBolsoPrimerPedido() {
        return bolsoPrimerPedido;
    }

    public void setBolsoPrimerPedido(boolean bolsoPrimerPedido) {
        this.bolsoPrimerPedido = bolsoPrimerPedido;
    }

    public String getFacturaCodigoBusqueda() {
        return facturaCodigoBusqueda;
    }

    public void setFacturaCodigoBusqueda(String facturaCodigoBusqueda) {
        this.facturaCodigoBusqueda = facturaCodigoBusqueda;
    }

    public String getFacturaSerieBusqueda() {
        return facturaSerieBusqueda;
    }

    public void setFacturaSerieBusqueda(String facturaSerieBusqueda) {
        this.facturaSerieBusqueda = facturaSerieBusqueda;
    }

    public boolean isHistoricoFacturas() {
        return historicoFacturas;
    }

    public void setHistoricoFacturas(boolean historicoFacturas) {
        this.historicoFacturas = historicoFacturas;
    }

    public String getOmpp() {
        return ompp;
    }

    public void setOmpp(String ompp) {
        this.ompp = ompp;
    }

    public ExternalContext getExc() {
        return exc;
    }

    public void setExc(ExternalContext exc) {
        this.exc = exc;
    }

    public String getSerieTraer() {
        return serieTraer;
    }

    public void setSerieTraer(String serieTraer) {
        this.serieTraer = serieTraer;
    }

    public Facturas getFacturaSelc() {
        return facturaSelc;
    }

    public void setFacturaSelc(Facturas facturaSelc) {
        this.facturaSelc = facturaSelc;
    }

    public boolean isBloqueoBotonGuardar() {
        return bloqueoBotonGuardar;
    }

    public void setBloqueoBotonGuardar(boolean bloqueoBotonGuardar) {
        this.bloqueoBotonGuardar = bloqueoBotonGuardar;
    }

    public boolean isBloqueoFactura() {
        return bloqueoFactura;
    }

    public void setBloqueoFactura(boolean bloqueoFactura) {
        this.bloqueoFactura = bloqueoFactura;
    }

    public boolean isHabilitaImpresion() {
        return habilitaImpresion;
    }

    public void setHabilitaImpresion(boolean habilitaImpresion) {
        this.habilitaImpresion = habilitaImpresion;
    }

    public String getSalida() {
        return salida;
    }

    public void setSalida(String salida) {
        this.salida = salida;
    }


    public boolean isBazar() {
        return bazar;
    }

    public WcOfertasFlotantes getOfertaFlo() {
        return ofertaFlo;
    }

    public void setOfertaFlo(WcOfertasFlotantes ofertaFlo) {
        this.ofertaFlo = ofertaFlo;
    }

    public void setBazar(boolean bazar) {
        HttpSession sessions = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        sessions.setAttribute("bazar", bazar);
        this.bazar = bazar;
    }

    public Cargos getCargosCab() {
        return cargosCab;
    }

    public void setCargosCab(Cargos cargosCab) {
        this.cargosCab = cargosCab;
    }

    public Facturas getFacturasBase() {
        return facturasBase;
    }

    public void setFacturasBase(Facturas facturasBase) {
        this.facturasBase = facturasBase;
    }

    public String getConsultorNombre() {
        return consultorNombre;
    }

    public void setConsultorNombre(String consultorNombre) {
        this.consultorNombre = consultorNombre;
    }

    public String getConsultorCodigo() {
        return consultorCodigo;
    }

    public boolean isBloqueaBotonCredito() {
        return bloqueaBotonCredito;
    }

    public void setBloqueaBotonCredito(boolean bloqueaBotonCredito) {
        this.bloqueaBotonCredito = bloqueaBotonCredito;
    }

    public void setConsultorCodigo(String consultorCodigo) {
        this.consultorCodigo = consultorCodigo;
    }

    public String getChongas() {
        return chongas;
    }

    public void setChongas(String chongas) {
        this.chongas = chongas;
    }

    public String getNumeroFacturaTraer() {
        return numeroFacturaTraer;
    }

    public void setNumeroFacturaTraer(String numeroFacturaTraer) {
        this.numeroFacturaTraer = numeroFacturaTraer;
    }

    //-----------------------------------------------------------------
    public int getFactConteo() {
        return factConteo;
    }

    public void setFactConteo(int factConteo) {
        this.factConteo = factConteo;
    }

    public String getCodigoBarra() {
        return codigoBarra;
    }

    public void setCodigoBarra(String codigoBarra) {
        this.codigoBarra = codigoBarra;
    }

    public FacturaCuerpo getProducto() {
        return producto;
    }

    public void setProducto(FacturaCuerpo producto) {
        this.producto = producto;
    }

    public String getCantidadProducto() {
        return cantidadProducto;
    }

    public void setCantidadProducto(String cantidadProducto) {
        this.cantidadProducto = cantidadProducto;
    }

    public String getProductoNombre() {
        return productoNombre;
    }

    public void setProductoNombre(String productoNombre) {
        this.productoNombre = productoNombre;

    }

    public String getPagar() {
        return TotalConDescuentos();
    }

    public String getDescuento() {
        return Descuentos();
    }


    public boolean isActOferta() {
        return actOferta;
    }

    public void setActOferta(boolean actOferta) {
        this.actOferta = actOferta;
    }

    public String getProgramacodigo() {
        return programacodigo;
    }

    public void setProgramacodigo(String programacodigo) {
        this.programacodigo = programacodigo;
    }

    public String getProductoOferta() {
        return productoOferta;
    }

    public void setProductoOferta(String productoOferta) {
        this.productoOferta = productoOferta;
    }

    public List<VprecioProgramaF> getPrecioProg() {
        return precioProg;
    }

    public void setPrecioProg(List<VprecioProgramaF> precioProg) {
        this.precioProg = precioProg;
    }

    public String getPrimeraOferta() {
        return primeraOferta;
    }

    public void setPrimeraOferta(String primeraOferta) {
        this.primeraOferta = primeraOferta;
    }

    public List<FacturaCuerpo> getFacturas() {
        return facturas;
    }

    public VprecioProgramaF getProducto1() {
        return producto1;
    }

    public void setProducto1(VprecioProgramaF producto1) {
        this.producto1 = producto1;
    }

    public List<DetalleOfertav> getDetalleOferta() {
        try {
            Collections.reverse(detalleOferta);
        } catch (Exception e) {
        }
        return detalleOferta;
    }

    public void setDetalleOferta(List<DetalleOfertav> detalleOferta) {
        this.detalleOferta = detalleOferta;
    }

    public void setFactura(FacturaCuerpo factura) {
        this.factura = factura;
    }

    public String getSubTotal() {
        return TotalSinDescuentos();
    }

    public ProductosResta getProductoResta() {
        return productoResta;
    }

    public void setProductoResta(ProductosResta productoResta) {
        this.productoResta = productoResta;
    }

    public List<ProductosResta> getListProductoResta() {
        return listProductoResta;
    }

    public void setListProductoResta(List<ProductosResta> listProductoResta) {
        this.listProductoResta = listProductoResta;
    }

    public int getExstenciasOfertas() {
        return exstenciasOfertas;
    }

    public void setExstenciasOfertas(int exstenciasOfertas) {
        this.exstenciasOfertas = exstenciasOfertas;
    }

    public List<ProductosResta> getListaPremiosResta() {
        return listaPremiosResta;
    }

    public void setListaPremiosResta(List<ProductosResta> listaPremiosResta) {
        this.listaPremiosResta = listaPremiosResta;
    }

    public String getOtrosDescuentos() {
        return otrosDescuentos;
    }

    public void setOtrosDescuentos(String otrosDescuentos) {
        this.otrosDescuentos = otrosDescuentos;
    }

    public String getCargoPuSum() {
        return cargoPuSum;
    }

    public void setCargoPuSum(String cargoPuSum) {
        this.cargoPuSum = cargoPuSum;
    }

    public boolean isEntregaPremio() {
        return entregaPremio;
    }

    public void setEntregaPremio(boolean entregaPremio) {
        this.entregaPremio = entregaPremio;
    }

    public boolean isConsultorMasivoEntrega() {
        return consultorMasivoEntrega;
    }

    public void setConsultorMasivoEntrega(boolean consultorMasivoEntrega) {
        this.consultorMasivoEntrega = consultorMasivoEntrega;
    }

    public boolean isContado() {
        return contado;
    }

    public void setContado(boolean contado) {
        this.contado = contado;
    }

    public List<VprecioProgramaF> getOfertas() {
        return ofertas;
    }

    public void setOfertas(List<VprecioProgramaF> ofertas) {
        this.ofertas = ofertas;
    }

    public String getGiro() {
        return giro;
    }

    public void setGiro(String giro) {
        this.giro = giro;
    }

    public String getRegistro() {
        return registro;
    }

    public void setRegistro(String registro) {
        this.registro = registro;
    }

    public String getTipoDocPage() {
        return tipoDocPage;
    }

    public void setTipoDocPage(String tipoDocPage) {
        this.tipoDocPage = tipoDocPage;
    }

    public String getTipoDoc() {
        return tipoDoc;
    }

    public void setTipoDoc(String tipoDoc) {
        this.tipoDoc = tipoDoc;
    }

    public String getPrograma() {
        return programa;
    }

    public void setPrograma(String programa) {
        this.programa = programa;
    }

    public DatosCosultoresCompletosFacturacion getConsultor() {
        return consultor;
    }

    public void setConsultor(DatosCosultoresCompletosFacturacion consultor) {
        this.consultor = consultor;
    }

    public boolean isImpresaFact() {
        return impresaFact;
    }

    public void setImpresaFact(boolean impresaFact) {
        this.impresaFact = impresaFact;
    }

    public Date getFechaFact() {
        return fechaFact;
    }

    public void setFechaFact(Date fechaFact) {
        this.fechaFact = fechaFact;
    }

    public String getCosultorNombre() {
        return cosultorNombre;
    }

    public void setCosultorNombre(String cosultorNombre) {
        this.cosultorNombre = cosultorNombre;
    }

    public String getConsultorTerritorio() {
        return consultorTerritorio;
    }

    public void setConsultorTerritorio(String consultorTerritorio) {
        this.consultorTerritorio = consultorTerritorio;
    }

    public Date getFecha() {
        return fecha;
    }

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

    public int getExitenciaPremio() {
        return exitenciaPremio;
    }

    public void setExitenciaPremio(int exitenciaPremio) {
        this.exitenciaPremio = exitenciaPremio;
    }

    public boolean isEnableText() {
        return enableText;
    }

    public void setEnableText(boolean enableText) {
        this.enableText = enableText;
    }

    public String getFacSerie() {
        return facSerie;
    }

    public void setFacSerie(String facSerie) {
        this.facSerie = facSerie;
    }

    public String getSala() {
        return sala;
    }

    public void setSala(String sala) {
        this.sala = sala;
    }

    public String getFactSig() {
        return factSig;
    }

    public void setFactSig(String factSig) {
        this.factSig = factSig.toUpperCase();
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public Sucursales getSucursal() {
        return sucursal;
    }

    public void setSucursal(Sucursales sucursal) {
        this.sucursal = sucursal;
    }

    public List<FacturaCuerpo> getRsPremio() {
        return rsPremio;
    }

    public void setRsPremio(List<FacturaCuerpo> rsPremio) {
        this.rsPremio = rsPremio;
    }

    public boolean isConsultorCodigol1058() {
        return consultorCodigol1058;
    }

    public void setConsultorCodigol1058(boolean consultorCodigol1058) {
        this.consultorCodigol1058 = consultorCodigol1058;
    }

    public Pedidos getPedidoSe() {
        return pedidoSe;
    }

    public void setPedidoSe(Pedidos pedidoSe) {
        this.pedidoSe = pedidoSe;
    }

    public void verifVodigBarra() {

        if (!codigoBarra.isEmpty()) {
            List<VprecioProgramaF> ofertasProductos = new ArrayList<>();

            if (codigoBarra.length() == 5 || codigoBarra.length() == 4) {
                ofertas = new ArrayList<>();
                ofertasProductos = vppffl.ProductoParaFacturta(codigoBarra, "CO", programacodigo);

                if (ofertasProductos.isEmpty()) {

                    ofertasProductos = vppffl.OfertaParaFacturta(codigoBarra, programacodigo);

                    if (!ofertasProductos.isEmpty()) {
                        verificaProducto(ofertasProductos.get(0).getProductoCodigo(), ofertasProductos);
                    }

                } else {
                    verificaProducto(codigoBarra, ofertasProductos);
                }


            } else if (codigoBarra.length() == 13) {
                ofertas = new ArrayList<>();
                ofertasProductos = vppffl.ProductoParaFacturta(codigoBarra, "BR", programacodigo);

                //   verificaProducto(codigoBarra, ofertasProductos);

            } else if (codigoBarra.length() != 5 || codigoBarra.length() != 4 || codigoBarra.length() != 13) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "NO EXISTE", "codigo incorrecto");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            }

            if (ofertasProductos.isEmpty()) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Codigo de producto Incorrecto", "ingrese codigo correto");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            } else {
                for (VprecioProgramaF ofertasProducto : ofertasProductos) {
                    ofertas.add(ofertasProducto);
                    verificaProducto(ofertasProducto.getProductoCodigo(), ofertasProductos);
                }
            }


        }

    }

    public void verificaProducto(String productoCodigo, List<VprecioProgramaF> v) {
        if (v.size() >= 1) {
            int existencia = 0;
            try {
                existencia = sucursalesFacadeLocal.ExistenciasProducto2(productoCodigo, sucursal.getSucursalDescarga());
            } catch (Exception e) {
            }


            if (existencia <= 0) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Existencia", "No Hay Existencia Del Producto");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            } else if (existencia >= 1) {
                traerProc(productoCodigo);
            }
        } else {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Programa", "El Producto No Pertenece Al Programa");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }

    public void traerProc(String productoCodigo) {
        producto1 = vppffl.obtenerProductoCodigo(productoCodigo, programacodigo);


        List<DetalleOfertav> de = new ArrayList<>();
        List<VprecioProgramaF> b = new ArrayList<>();
        b = vppffl.obtenerProductoPorCodigo(productoCodigo, getProgramacodigo());

        boolean ofertaFlotante = false;
        String ofertaFlotantestr = "";

        for (VprecioProgramaF k : b) {
            if (!k.getOfertaCodigo().equalsIgnoreCase("0000")) {
                ofertaFlotante = true;
                ofertaFlotantestr = k.getOfertaCodigo();
            }

        }
        setPrecioProg(b);

        if (ofertaFlotante) {
            setPrimeraOferta(ofertaFlotantestr);
        } else {
            setPrimeraOferta(b.get(0).getOfertaCodigo());
        }

        List<String> l5 = new ArrayList<>();
        for (VprecioProgramaF i : b) {

            DetalleOfertav j = new DetalleOfertav();
            j.setCodigoOferta(i.getOfertaCodigo());
            j.setNombreOferta(i.getNombreOferta());
            j.setPrecioOferta(i.getPrecioProgramaSinDescuento().toString());
            de.add(j);
        }
        setDetalleOferta(de);
        if (b.size() > 1) {
            setActOferta(false);
        } else if (b.get(0).toString().equals("0000") || b.size() <= 1) {
            setActOferta(true);
        }
    }

    public void createNew() {

        int cantiProd = cantidadProducto.length() == 0 ? 0 : Integer.parseInt(cantidadProducto);

        VprecioProgramaF ofertaEnviar = new VprecioProgramaF();
        ofertaEnviar = productoSelect;

        Boolean exstenciasProducto = sucursalesFacadeLocal.ExistenciasProductoFino(ofertaEnviar.getProductoCodigo(), ofertaEnviar.getOfertaCodigo(), sucursal.getSucursalDescarga(), cantiProd);


        //   ValidaExsitenciConPrecioPrograma(primeraOferta, ofertaEnviar.getProductoCodigo());

        if (factura.getProductoCodigo().equals("59000")) {
            if (factura.getCantidadProducto() <= revisarCatalogos()) {

            } else {

                Double totalSinDescuesto = (double) Math.round(factura.getUnidadSinDescuento().doubleValue() * revisarCatalogos() * 100) / 100;
                Double totalConDescuento = (double) Math.round(factura.getUnidadConDescuento().doubleValue() * revisarCatalogos() * 100) / 100;
                BigDecimal totalSinDescuestoBD = new BigDecimal(totalSinDescuesto);
                BigDecimal totalConDescuentoBD = new BigDecimal(totalConDescuento);

                BigDecimal salidaTotalSinDescuesto = totalSinDescuestoBD.setScale(2, totalSinDescuestoBD.ROUND_HALF_DOWN);
                BigDecimal salidaTotalConDescuento = totalConDescuentoBD.setScale(2, totalConDescuentoBD.ROUND_HALF_DOWN);

                factura.setCantidadProducto(revisarCatalogos());
                factura.setTotalConDescuento(salidaTotalSinDescuesto);
                factura.setTotalSinDescuento(salidaTotalConDescuento);
                mensajeCatalogos();
            }
        }

        if (facturas.isEmpty() && exstenciasOfertas == 1) {
            facturas.add(factura);
        } else if (validaExistenciaFactura('0', ofertaEnviar) && productoCantidadCero) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "NO PUEDE SER CERO", "La cantidad del producto no puede ser 0, quitelo de la factura o ingrese un dato correcto");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        } else if (!productoCantidadCero && validaExistenciaFactura('o', ofertaEnviar) && sumaRestaDeCantidad) {
            if (mensajesCatalogoB) {
                mensajeCatalogos();
            } else {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Agregado", "El producto Ya esta en la Factura y ha sido operado");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            }
        } else if (validaExistenciaFactura('e', ofertaEnviar)) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DUPLICADO", "El producto Ya esta en la Factura");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        } else if (!exstenciasProducto) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "INSUFICIENTE PRODUCTO", "No Hay suficiente producto en sala");
            PrimeFaces.current().dialog().showMessageDynamic(message);
            setExstenciasOfertas(0);
        } else if (cantiProd > 10000) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("CANTIDAD DE PRODUCTO EXAGERADA", "No Hay suficiente producto en sala"));

        } else {

            addfact(factura);
            ofertas = new ArrayList<>();

        }

        Ajax.update("factcups");

        //reinitial();

    }

    public double verificaCargos(String consultorCod) {

        double cargoPuSum = 0.00;
        cargoPuSum = cfl.obtenerCargosPremios(consultorCod);
        return cargoPuSum;
    }

    public BigDecimal OtrosDescuentos2(List<FacturaCuerpo> f) {

        Double rs = 0.00;

        for (FacturaCuerpo ob : f) {
            if (ob.getUnidadConDescuento().doubleValue() <= 0.30) {
                rs = rs + ob.getTotalConDescuento().doubleValue();
            }

        }

        BigDecimal out1 = new BigDecimal(rs);
        BigDecimal out2 = out1.setScale(2, out1.ROUND_HALF_DOWN);

        return out2;
    }

    public String TotalSinDescuentos() {
        double rs = 0;
        double sd = 0;
        for (FacturaCuerpo i : facturas) {
            if (Integer.parseInt(i.getOfertaCodigo()) >= 9995 || i.getOfertaCodigo().equalsIgnoreCase("0003")) {
                sd = sd + i.getUnidadConDescuento().doubleValue() * i.getCantidadProducto();
                //  setOtrosDescuentos(String.valueOf(sd));
            }
            rs = rs + i.getTotalSinDescuento().doubleValue();
        }
        double subt = rs - sd;

        String out = String.valueOf(subt + Double.valueOf(otrosDescuentos()));

        BigDecimal out1 = new BigDecimal(out);
        BigDecimal out2 = out1.setScale(2, out1.ROUND_HALF_DOWN);

        return out2.toString();
    }

    public void creditoFiscalvalida() {
        this.creditoFiscal = true;

    }

    public String otrosDescuentos() {
        double rs = 0;
        double sd = 0;
        for (FacturaCuerpo i : getFacturas()) {
            if (Integer.parseInt(i.getOfertaCodigo()) >= 9995 || i.getOfertaCodigo().equalsIgnoreCase("0003")) {
                sd = sd + i.getTotalConDescuento().doubleValue();
                // setOtrosDescuentos(String.valueOf(sd));
            }
        }

        BigDecimal out1 = new BigDecimal(sd);
        BigDecimal out2 = out1.setScale(2, out1.ROUND_HALF_DOWN);
        setOtrosDescuentos(String.valueOf(sd));
        return out2.toString();
    }

    public void cambiaProductoOferta() {
        this.producto1 = productoSelect;
    }

    ///-------------------
    public String TotalConDescuentos() {
        double rs = 0;
        double sd = 0;

        for (FacturaCuerpo i : facturas) {
            if (Double.parseDouble(i.getOfertaCodigo()) >= 9995) {
                sd = sd + i.getUnidadConDescuento().doubleValue() * i.getCantidadProducto();
            } else {
                rs = rs + Double.valueOf(i.getTotalConDescuento().toString());
            }
        }
        //  String isoa = df2.format();

        BigDecimal out1 = new BigDecimal(rs);
        BigDecimal out2 = out1.setScale(3, out1.ROUND_HALF_DOWN);

        return out2.toString();

    }

    public String reinit() {
        factura = new FacturaCuerpo();
        return null;
    }

    public FacturaCuerpo getFactura() {
        return factura;
    }

    public void addfact(FacturaCuerpo facturaCuerpo) {
        if (facturas.size() == 1700) {
            enableText = true;
        }

        if (facturas.size() <= 1700) {
            facturas.add(facturaCuerpo);
            Collections.reverse(facturas);
            //   RequestContext.getCurrentInstance().update("fact:paneFactus");
            factura = new FacturaCuerpo();
        } else {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Completa", "Factura Completa");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
        // FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("fact:factcups");

        TotalSinDescuentos();
    }

    public void vereficaListaCantidad() {

        if (facturas.size() <= 1700) {
            // enableText = true;
        }

    }

    public int cantProductos() {
        int rs = 0;
        if (facturas.isEmpty()) {
            rs = 0;
        } else {
            rs = facturas.size();
        }
        return rs;
    }

    public String vueltaLista() {
        // Collections.reverse(facturas);
        if (facturas.isEmpty()) {
            return "0 Productos";
        } else {
            return facturas.size() + " Productos";
        }
    }

    public void gatito() {
        System.out.println("NETZML");
    }

    public void nuevoProducto() {

        if (ofertas.size() == 1) {
            productoSelect = ofertas.get(0);
        }

        if (cantidadProducto.length() > 4) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "Cantidad de producto Invalida");
            PrimeFaces.current().dialog().showMessageDynamic(message);
            this.cantidadProducto = "";
        }
        if (consultorCodigo.isEmpty() || consultorCodigo.length() > 6) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cosultor incorrecto", "Codigo de consultor incorrecto ingrese nuevamente");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }




        FacturaCuerpo cue = new FacturaCuerpo();

        DecimalFormat df2 = new DecimalFormat("0.00");
        DecimalFormat df3 = new DecimalFormat("0.000");

        Integer cantidad = Integer.parseInt(getCantidadProducto());

        WcOfertaDescuento ofertaCountIn = new WcOfertaDescuento();
        try {
            ofertaCountIn = wdodfl.obtenerProductoDesc(productoSelect.getProductoCodigo(), productoSelect.getProgramaCodigo());
            if(ofertaCountIn.getOfertaCodigo() !=null){

                if(cantidad >= ofertaCountIn.getDesde()){
                    productoSelect.setPrecioProgramaConDescuento(ofertaCountIn.getPrecioConDescuento());
                    productoSelect.setOfertaCodigo(ofertaCountIn.getOfertaCodigo());
                    productoSelect.setNombreOferta("Descuentos Especial!!");
                }

            }

        }catch (Exception e){

        }

        BigDecimal sd = new BigDecimal(0.00);
        BigDecimal cd = new BigDecimal(0.00);

        if (tipoDoc.equals("10")) {

            sd = new BigDecimal((Double.valueOf(productoSelect.getPrecioProgramaSinDescuento().toString()) / 1.13));
            cd = new BigDecimal((Double.valueOf(productoSelect.getPrecioProgramaConDescuento().toString()) / 1.13));

        } else {
            sd = productoSelect.getPrecioProgramaSinDescuento();
            cd = productoSelect.getPrecioProgramaConDescuento();

        }

        //introduce precios para l1058;
        if (consultorCodigol1058) {
            cd = productoSelect.getPrecioProgramaSinDescuento();
        }
        cue.setTipoCupon(productoSelect.getDetalleEnvio());

        Double totalSinDescuesto = sd.doubleValue() * cantidad;
        Double totalConDescuento = cd.doubleValue() * cantidad;

        cue.setCantidadProducto(cantidad);
        cue.setProductoCodigo(productoSelect.getProductoCodigo());
        cue.setProductoNombre(productoSelect.getProductoNombre());
        cue.setOferta(productoSelect.getNombreOferta());
        cue.setOfertaCodigo(productoSelect.getOfertaCodigo());
        cue.setFoferta(productoSelect.getFoferta());

        BigDecimal sdo = sd.setScale(2, sd.ROUND_HALF_DOWN);
        BigDecimal cdo = cd.setScale(3, cd.ROUND_HALF_DOWN);

        cue.setUnidadSinDescuento(sdo);
        cue.setUnidadConDescuento(cdo);

        BigDecimal tsd = new BigDecimal(totalSinDescuesto);
        BigDecimal tcd = new BigDecimal(totalConDescuento);

        BigDecimal tsdo = tsd.setScale(2, tsd.ROUND_HALF_DOWN);
        BigDecimal tcdo = tcd.setScale(3, tcd.ROUND_HALF_DOWN);

        cue.setTotalSinDescuento(tsdo);
        cue.setTotalConDescuento(tcdo);

        factura = cue;
        ofertas = new ArrayList<>();
        createNew();
    }

    public boolean validaExistenciaFactura(char v, VprecioProgramaF ofertaCs) {
        DecimalFormat df2 = new DecimalFormat("0.00");
        DecimalFormat df3 = new DecimalFormat("0.000");
        boolean out = false;
        List<FacturaCuerpo> q = new ArrayList<>();
        List<VprecioProgramaF> ofe = new ArrayList<>();
        ofe.addAll(getOfertas());
        q = getFacturas();

        for (FacturaCuerpo i : q) {
            if (i.getProductoCodigo().equals(ofertaCs.getProductoCodigo()) && (cantidadProducto.charAt(0) == '+' || cantidadProducto.charAt(0) == '-')) {
                Integer cantProTem = i.getCantidadProducto() + Integer.valueOf(getCantidadProducto());

                if (v == '0' && cantProTem <= 0) {

                    productoCantidadCero = true;
                    out = true;
                } else if (v == 'o') {

                    if (i.getProductoCodigo().equals("59000")) {
                        if (cantProTem <= revisarCatalogos()) {
                        } else {
                            cantProTem = revisarCatalogos();
                            mensajesCatalogoB = true;
                        }
                    }

                    Double totalSinDescuesto = (double) Math.round(i.getUnidadSinDescuento().doubleValue() * cantProTem * 100) / 100;
                    Double totalConDescuento = (double) Math.round(i.getUnidadConDescuento().doubleValue() * cantProTem * 100) / 100;
                    i.setCantidadProducto(cantProTem);
                    i.setTotalConDescuento(new BigDecimal(df2.format(totalConDescuento)));
                    i.setTotalSinDescuento(new BigDecimal(df3.format(totalSinDescuesto)));
                    out = true;
                    sumaRestaDeCantidad = true;
                    productoCantidadCero = false;
                }
            } else if (i.getProductoCodigo().equals(productoSelect.getProductoCodigo()) && i.getOfertaCodigo().equals(productoSelect.getOfertaCodigo())) {
                out = true;
            }
        }
        return out;
    }

    public void reinitial() {
        this.productoNombre = new String();
        this.productoSelect = new VprecioProgramaF();
        this.primeraOferta = new String();
        this.cantidadProducto = new String();
        this.codigoBarra = new String();
        this.detalleOferta = new ArrayList<DetalleOfertav>();
        factura = new FacturaCuerpo();
    }

    public String Descuentos() {

        DecimalFormat df = new DecimalFormat("0.00");
        double dou1 = Double.parseDouble(getSubTotal());
        double dou2 = Double.parseDouble(getPagar());
        double dou3 = Double.parseDouble(otrosDescuentos());
        String oDe = otrosDescuentos();

        Double rsDouble = dou1 - dou2 - dou3;
        String rs = String.valueOf(df.format(rsDouble));
        return rs;
    }


    public void AgregarCatalogoG() {

        String territorioConsultorO = consultor.getTerritorioCodigo();

        if (!territorioConsultorO.equals("90")) {
            Boolean validacatalogo = cfl.ObtenerPrimeraFactura(consultorCodigo);

            if (!validacatalogo && Double.valueOf(getSubTotal()) > 0.80) {

                ProductosucursalPK psPK = new ProductosucursalPK();
                psPK.setProductoCodigo("59100");
                psPK.setSucursalCodigo(sucursal.getSucursalCodigo());

                Productosucursal ps = productosucursalFacadeLocal.find(psPK);
                VprecioProgramaF pro = vppffl.obtenerProductoCodigo("59100", programacodigo);

                if (Objects.isNull(pro.getProductoCodigo())) {
                    addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO ESTA CATALOGO GRATIS EN PROGRAMA DE MES");
                } else {

                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Primer Pedido de mes", "Agregue Catalogo Gratis"));

                    FacturaCuerpo fa = new FacturaCuerpo();
                    fa.setProductoCodigo(pro.getProductoCodigo());
                    fa.setProductoNombre(pro.getProductoNombre());
                    fa.setOferta("CATALOGO GRATIS PRIMER PEDIDO DE MES");
                    fa.setOfertaCodigo("9996");
                    fa.setCantidadProducto(1);

                    BigDecimal sal = new BigDecimal(0.01);
                    BigDecimal sal2 = sal.setScale(2, sal.ROUND_HALF_DOWN);

                    fa.setTotalConDescuento(sal2);
                    fa.setTotalSinDescuento(sal2);
                    fa.setUnidadConDescuento(BigDecimal.valueOf(00.01));
                    fa.setUnidadSinDescuento(BigDecimal.valueOf(00.01));
                    getFacturas().add(fa);
                    System.out.println("Catalogo " + fa.getProductoNombre());
                }

            } else {
                System.err.println("Catalogo gratis ya fue facturado");
            }
        }

    }

    public void AgregaEmpaque() {


        String territorioConsultorO = consultor.getTerritorioCodigo();

        if (!territorioConsultorO.equals("90")) {

            Boolean validacatalogo = cfl.ObtenerPrimeraFactura(consultorCodigo);

            if (!validacatalogo) {

                ProductosucursalPK psPK = new ProductosucursalPK();
                psPK.setProductoCodigo("59101");
                psPK.setSucursalCodigo(sucursal.getSucursalCodigo());

                VprecioProgramaF pro = vppffl.obtenerProductoCodigo("59101", programacodigo);

                if (Objects.isNull(pro.getProductoCodigo())) {
                    addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", " PAQUETE POR ERROR");
                } else {


                    FacturaCuerpo fa = new FacturaCuerpo();
                    fa.setProductoCodigo(pro.getProductoCodigo());
                    fa.setProductoNombre(pro.getProductoNombre());
                    fa.setOferta("**EMPAQUE**!");
                    fa.setOfertaCodigo("0000");
                    fa.setCantidadProducto(1);

                    BigDecimal sal = new BigDecimal(0.99);
                    BigDecimal sal2 = sal.setScale(2, sal.ROUND_HALF_DOWN);

                    fa.setTotalConDescuento(sal2);
                    fa.setTotalSinDescuento(sal2);
                    fa.setUnidadConDescuento(BigDecimal.valueOf(00.99));
                    fa.setUnidadSinDescuento(BigDecimal.valueOf(00.99));
                    getFacturas().add(fa);
                    System.out.println("Catalogo " + fa.getProductoNombre());
                }


            } else {
                System.err.println("Empaque ya fue facturado");
            }
        }

    }


    public void AgregaBolsoPrimerPedido() {
        Boolean validaBolso = cfl.ObtenerBolsoPrimerPedido(consultor.getConsultorCodigo());

        if (validaBolso && Double.valueOf(TotalSinDescuentos()) > 100.00) {

            ProductosucursalPK psPK = new ProductosucursalPK();
            psPK.setProductoCodigo("51813");
            psPK.setSucursalCodigo(sucursal.getSucursalCodigo());

            Productosucursal ps = productosucursalFacadeLocal.find(psPK);

            if (ps.getProductoSucursalFisica() >= 1) {
                VprecioProgramaF pro = vppffl.obtenerProductoCodigo("51813", programacodigo);

                if (Objects.isNull(pro.getProductoCodigo())) {
                    addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO ESTA BOLSO EN PROGRAMA DE MES");
                } else {

                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Primer Pedido", "Agregue bolso 1er Pedido"));

                    FacturaCuerpo fa = new FacturaCuerpo();
                    fa.setProductoCodigo(pro.getProductoCodigo());
                    fa.setProductoNombre(pro.getProductoNombre());
                    fa.setOferta("BOLSO DE REGALO PRIMER PEDIDO");
                    fa.setOfertaCodigo("9996");
                    fa.setCantidadProducto(1);

                    BigDecimal sal = new BigDecimal(0.01);
                    BigDecimal sal2 = sal.setScale(2, sal.ROUND_HALF_DOWN);

                    fa.setTotalConDescuento(sal2);
                    fa.setTotalSinDescuento(sal2);
                    fa.setUnidadConDescuento(BigDecimal.valueOf(00.01));
                    fa.setUnidadSinDescuento(BigDecimal.valueOf(00.01));
                    getFacturas().add(fa);
                    System.out.println("bolso " + fa.getProductoNombre());
                }
            }

        } else {
            System.err.println("sobrepasa fecha");
        }
    }

    public void EquipodeTrabajo() {
        Boolean validaEquipo = cfl.ObtenerEquipoTrabajo(consultor.getConsultorCodigo());

        if (validaEquipo) {
            VprecioProgramaF rsOut;
            boolean existenciasProductoFino = sucursalesFacadeLocal.ExistenciasProductoFino("59001", gen.getPrograma(), sucursal.getSucursalCodigo(), 1);

            if (!existenciasProductoFino) {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Primer Pedido", "NO HAY EXISTENCIAS"));
            } else {


                rsOut = vppffl.obtenerProductoCodigo("59001", programacodigo);
                if (Objects.isNull(rsOut.getProductoCodigo())) {
                    addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO ESTA EQUIPO DE TRABAJO EN PROGRAMA DE MES");
                } else {
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Primer Pedido", "Agregue Equipo de trabajo"));
                    FacturaCuerpo fc = new FacturaCuerpo();
                    fc.setProductoCodigo(rsOut.getProductoCodigo());
                    fc.setOferta("Primer pedido - Muestas");
                    fc.setOfertaCodigo("0000");
                    fc.setCantidadProducto(1);

                    BigDecimal sal = new BigDecimal(0.01);
                    BigDecimal sal2 = sal.setScale(2, sal.ROUND_HALF_DOWN);

                    fc.setProductoNombre(rsOut.getProductoNombre());
                    fc.setTotalConDescuento(sal2);
                    fc.setTotalSinDescuento(sal2);
                    fc.setUnidadConDescuento(BigDecimal.valueOf(00.01));
                    fc.setUnidadSinDescuento(BigDecimal.valueOf(00.01));
                    facturas.add(fc);
                }
            }
        }
    }

    private BigDecimal totalesFacturasSD(List<FacturaCuerpo> f) {

        Double salidasFacturas = 0.00;

        for (FacturaCuerpo f1 : f) {

            salidasFacturas = f1.getTotalSinDescuento().doubleValue() + salidasFacturas;

        }
        BigDecimal vienenBD = new BigDecimal(salidasFacturas.toString());
        BigDecimal rs = vienenBD.setScale(2, vienenBD.ROUND_FLOOR);

        return rs;
    }

    private BigDecimal totalesFacturasCD(List<FacturaCuerpo> f) {

        Double salidasFacturas = 0.00;

        for (FacturaCuerpo f1 : f) {
            if (f1.getUnidadConDescuento().doubleValue() > 0.01) {
                salidasFacturas = f1.getTotalConDescuento().doubleValue() + salidasFacturas;
            }

        }
        BigDecimal vienenBD = new BigDecimal(salidasFacturas.toString());
        BigDecimal rs = vienenBD.setScale(3, vienenBD.ROUND_FLOOR);
        return rs;
    }

    private BigDecimal obtenerIva(List<FacturaCuerpo> f) {

        Double salidasFacturas = 0.00;

        for (FacturaCuerpo f1 : f) {
            salidasFacturas = f1.getTotalConDescuento().doubleValue() + salidasFacturas;
        }

        Double iva = (salidasFacturas / 1.13) * 0.13;

        BigDecimal ivaBD1 = new BigDecimal(iva);
        BigDecimal rs = ivaBD1.setScale(2, ivaBD1.ROUND_FLOOR);

        return rs;
    }

    private BigDecimal obtenerOtrosDescuento(List<FacturaCuerpo> f) {
        Double salidasFacturas = 0.00;

        for (FacturaCuerpo f1 : f) {
            if (f1.getUnidadConDescuento().doubleValue() <= 0.01) {
                salidasFacturas = f1.getTotalConDescuento().doubleValue() + salidasFacturas;
            }

        }
        BigDecimal vienenBD = new BigDecimal(salidasFacturas.toString());
        BigDecimal rs = vienenBD.setScale(2, vienenBD.ROUND_FLOOR);

        return rs;
    }

    public void PrevioGuardado() throws JRException, IOException {

        if (caex) {
            PrimeFaces current = PrimeFaces.current();
            current.executeScript("PF('cantidadCaex').show();");

        } else {
            GuardarFactura();
        }

    }


    public void guardarNombreHugo() throws JRException, IOException {

        PrimeFaces current = PrimeFaces.current();
        current.executeScript("PF('nombreHugo').show();");

     /*   if (caex) {
            PrimeFaces current = PrimeFaces.current();
            current.executeScript("PF('nombreHugo').show();");

        } else {
            // GuardarFactura();
        }
*/
    }

    public void guardarNombreNiko(String nombreNiko, String apellidoNiko){

        consultoresFacadeLocal.guardarConsultorNiko(nombreNiko.toUpperCase() ,apellidoNiko.toUpperCase());
    //    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Nombre Ingresado", "Nombre ingresado");
    //    PrimeFaces.current().dialog().showMessageDynamic(message);

    }

    public void GuardarFactura() throws JRException, IOException {

        if (facturas.isEmpty()) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Sin Datos", "No Puede Guardar sin Datos");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        } else {
            if (!premioEntregar.isEmpty() && premiob) {
                if (vcpfl.validaExistenciaPremios(prem.getCodigoPremio(), sucursal.getSucursalCodigo())) {
                    facturas.addAll(premioEntregar);
                } else {
                    FacesContext.getCurrentInstance().addMessage("messages",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "NO HAY PREMIOS", "No hay premios en sala"));
                }
            }

            Consultores consu = consultoresFacadeLocal.find(consultor.getConsultorCodigo());
            String tipoDocF = tipoDoc;
            String serieSucursal;
            int numeroPageIni = 0;
            int numeroPageFin = 47;

            if (tipoDocF.equals("03")) {
                serieSucursal = gen.getSerieFiscal();
            } else {
                serieSucursal = sucursal.getSerie();
            }

            List<Facturas> facturasGuardar = new ArrayList<>();

            agregaRegaloMes(consultorCodigo);

            for (FacturaCuerpo factura1 : getFacturas()) {
                //   contadorRegalo2(factura1);
                validaChongas(factura1.getOfertaCodigo(), factura1.getCantidadProducto());
                // agregaRegaloMes2(factura1);
            }


            contadorDeOfertas(facturas);

            //agregaRegaloMesPorEstuche(facturas);


            EquipodeTrabajo();
            AgregaBolsoPrimerPedido();
            AgregarCatalogoG();
            AgregaEmpaque();

            //-------------------------------------------inicio Facturas--------------------------------------------------------
            String facturaCodigoSiguiente = "";
            HashMap<String, String> entregaPremioMap = new HashMap<String, String>();
            int numeroFacturasGuardar = 0;

            if ((facturas.size() % 47) > 0) {
                numeroFacturasGuardar = facturas.size() / 47 + 1;
            } else {
                numeroFacturasGuardar = facturas.size() / 47;
            }

            for (int i = 0; i < numeroFacturasGuardar; i++) {
                EsperaGuardadoFactura prosdex = new EsperaGuardadoFactura();
                List<FacturaCuerpo> frso = new ArrayList<>();

                if (i == 0) {
                    if (facturas.size() < 47) {
                        frso = facturas;
                    } else {
                        frso = facturas.subList(0, 47);
                        numeroPageIni = 47;
                        numeroPageFin = 94;
                    }
                } else if (i < (numeroFacturasGuardar - 1)) {

                    frso = facturas.subList(numeroPageIni, numeroPageFin);
                    numeroPageIni = numeroPageIni + 47;
                    numeroPageFin = numeroPageFin + 47;

                } else if (i == (numeroFacturasGuardar - 1)) {
                    frso = facturas.subList(numeroPageIni, facturas.size());
                }

                BigDecimal tpcd = totalesFacturasCD(frso);
                BigDecimal tpsd = totalesFacturasSD(frso);
                BigDecimal civa = obtenerIva(frso);

                facturaCodigoSiguiente = asiganarFacturaGuardar(sucursal.getSucursalCodigo(), tipoDocF, serieSucursal);

                Cargos car = new Cargos();
                CargosPK carPk = new CargosPK();
                Facturas fac = new Facturas();
                FacturasPK facPk = new FacturasPK();

                facPk.setFacturaCodigo(facturaCodigoSiguiente);
                facPk.setFacturaSerie(serieSucursal);

                DetalleFactura detFac = new DetalleFactura();
                DetalleFacturaPK detFacPK = new DetalleFacturaPK();

                fac.setConsultorCodigo(consu);
                fac.setDocumentoCodigo(tipoDocF);////documento
                fac.setFacturaAnulada(false);
                fac.setFacturaCredito(contado);
                fac.setFacturaFecha(fecha);
                fac.setFacturaImpresa(false);
                fac.setFacturaIva(civa);
                fac.setFacturaReparto(true);//reparto arreglar
                fac.setFacturaTotalConDescuento(tpcd);
                fac.setFacturaTotalSinDescuento(tpsd);
                fac.setFacturaenvio(new Character('T'));
                fac.setFacturasPK(facPk);
                fac.setOtrodesc(OtrosDescuentos2(frso));//revisar
                fac.setProgramaCodigo(programacodigo);
                fac.setSucursalCodigo(sucursal);

                carPk.setDocumentoCodigo(tipoDocF);
                carPk.setFacturaCodigo(facturaCodigoSiguiente);

                carPk.setFacturaSerie(serieSucursal);

                car.setBazar(bazar);
                car.setCargoEnvioTarjeta(false);
                car.setCargoFechaFactura(fecha);
                car.setCargoPendiente(tpcd);
                car.setCargoPublico(tpsd);
                car.setCargoValor(tpcd);
                car.setCargosPK(carPk);
                car.setConsultorCodigo(consu);
                car.setCredito(contado);
                car.setOtrodesc(OtrosDescuentos2(frso));
                car.setProgramaCodigo(fac.getProgramaCodigo());
                car.setSucursalCodigo(sucursal);

                facturaDao.create(fac);
                cfl.create(car);

                if (!frso.isEmpty()) {

                    boolean error = false;

                    for (FacturaCuerpo factura1 : frso) {

                        detFacPK.setDetalleFacturaOferta(factura1.getOfertaCodigo());
                        detFacPK.setFacturaCodigo(fac.getFacturasPK().getFacturaCodigo());
                        detFacPK.setFacturaSerie(serieSucursal);
                        detFacPK.setProductoCodigo(factura1.getProductoCodigo());

                        detFac.setDetalleFacturaCantidad(factura1.getCantidadProducto().shortValue());
                        detFac.setDetalleFacturaConDescuento(factura1.getTotalConDescuento());
                        detFac.setDetalleFacturaEntregado(false);
                        detFac.setDetalleFacturaPK(detFacPK);
                        detFac.setDetalleFacturaSinDescuento(factura1.getTotalSinDescuento());

                        try {
                            detallefacturaDao.guardarFactura(detFac);
                            if (factura1.getOfertaCodigo().equals("9995")) {
                                vcpfl.entregaPremio(consultor.getConsultorCodigo(), prem.getCodigoPremioAutorizado(), detFacPK.getFacturaCodigo());
                            }
                            detallefacturaDao.descargarProductos(factura1.getProductoCodigo(), factura1.getOfertaCodigo(), sucursal.getSucursalCodigo(), factura1.getCantidadProducto());
                        } catch (Exception e) {
                            System.err.println(e.toString());
                        }


                    }

                }


                ConsulorPromocion(facturaCodigoSiguiente);
                FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage("Guardado Correctamente"));
                //           editaSucursal(bf.getSuc().getTerminal(), facturaSiguiente(suInfacturaCodigoSiguiente));
                this.habilitaImpresion = false;
                this.bloqueoFactura = true;
                this.impresaFact = true;
                BitacorasWeb bi = new BitacorasWeb();
                bi.setUsuarioCodigo(usuario.getUsuarioCodigo());
                bi.setFecha(new Date());
                bi.setHost(sucursal.getTerminal());
                bi.setModulo("Facturacion");
                bi.setAccion("Imprimir Factura");
                bi.setDescripcion("Guardar de factura: " + facturaCodigoSiguiente + " con serie: " + sucursal.getSalaSerie());
                bitacorasWebFacadeLocal.create(bi);
                bloquearGuardarBtn = true;

                if (numeroFacturaTraer.length() < 3) {
                    numeroFacturaTraer = facPk.getFacturaCodigo();
                } else {
                    numeroFacturaTraer = numeroFacturaTraer + "\n" + facPk.getFacturaCodigo();
                }
                setSerieTraer(facPk.getFacturaSerie());
                factSig = facPk.getFacturaCodigo();

                facturasGuardar.add(fac);

                prosdex.setFactura(fac);
                prosdex.setFacturaCuerpo(frso);

                imprimirFcturas.add(prosdex);

                if (!premioEntregar.isEmpty() && premiob) {


                }


            }
        }

        try {
            if (!pedidoSe.getConsultorCodigo().isEmpty()) {
                vprofl.actualizaFacturado(pedidoSe);
            }
        } catch (Exception e) {

        }
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("consultor", consultor);
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pedidoSe", pedidoSe);
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("cantidadCAEX", cantidadCajasCaex);
        //refresh();
    }

    private void contadorDeOfertas(List<FacturaCuerpo> fc) {
        List<WcOfertasFlotantes> fo = new ArrayList<>();
        List<WcOfertasFlotantes> promocionMultiple = new ArrayList<>();
        promocionMultiple = wcof.busquedaListadoOfertaProgMultiple(programacodigo);


        String prductoMultiple = "0000";
        if (promocionMultiple.size() > 0) {
            prductoMultiple = promocionMultiple.get(0).getWcOfertasFlotantesPK().getProductoCodigo();
        }
        try {
            fo.addAll(listadoDeOfertas);
        } catch (Exception e) {
        }
        if (fo.size() > 0) {
            for (WcOfertasFlotantes ofs : fo) {

                int cantiGuardar = 0;

                for (FacturaCuerpo fct : fc) {

                    try {
                        if (fct.getFoferta().length() == 4) {
                            if (fct.getFoferta().equals(ofs.getWcOfertasFlotantesPK().getOfertaCodigo())) {
                                cantiGuardar = cantiGuardar + fct.getCantidadProducto();
                            }
                        }
                    } catch (Exception e) {

                    }

                }


                ofs.setCantidadGuardar(cantiGuardar);
            }


        }

        int cantidadProdutoDuplicado = 0;
        WcOfertasFlotantes productoDuplika = new WcOfertasFlotantes();


        for (WcOfertasFlotantes f : fo) {

            if (f.getWcOfertasFlotantesPK().getProductoCodigo().equals(prductoMultiple)) {
                cantidadProdutoDuplicado = (cantidadProdutoDuplicado + f.getCantidadGuardar() / f.getCantidadOperacion()) * f.getCantidadFacturar();
                productoDuplika = f;
            } else {

                int ctd = 0;
                int ctdr = 0;
                ctd = (f.getCantidadGuardar() / f.getCantidadOperacion()) * f.getCantidadFacturar();

                if (f.getLimiteFactura() > 0) {
                    ctdr = (f.getCantidadGuardar() / f.getLimiteFactura()) * f.getRestaLimite();
                }

                if (ctd >= 1) {
                    agregaOfertaMes(f, (ctd - ctdr));
                }

              /*  int ctd = 0;
                int ctdr = 0;
                ctd = (f.getCantidadGuardar() / f.getCantidadOperacion()) * f.getCantidadFacturar();

                if(f.getOfertaAdcionales() > 0){
                    ctd = ctd + ((f.getCantidadGuardar() / f.getOfertaAdcionales()) * f.getOfertaAdcionalesAgregados());
                }

                if(f.getLimiteFactura() > 0){
                    ctdr = (f.getCantidadGuardar() / f.getLimiteFactura()) * f.getRestaLimite();
                }

                if (ctdr >= 1) {
                    agregaOfertaMes(f, (ctd-ctdr));
                }*/
            }

        }

        if (cantidadProdutoDuplicado > 0) {
            agregaOfertaMes(productoDuplika, cantidadProdutoDuplicado);
        }

    }


    public void agregaOfertaMes(WcOfertasFlotantes prco, Integer cantidad) {

        boolean regalMesD = false;

        try {

            Productosucursal producS = new Productosucursal();
            ProductosucursalPK producSPK = new ProductosucursalPK();
            producSPK.setProductoCodigo(prco.getWcOfertasFlotantesPK().getProductoCodigo());
            producSPK.setSucursalCodigo(sucursal.getSucursalDescarga());

            producS = productosucursalFacadeLocal.find(producSPK);
            if (producS.getProductoSucursalExistenciaActual() >= 1) {
                FacturaCuerpo f = new FacturaCuerpo();
                f.setCantidadProducto(cantidad);
                f.setOferta("OFERTA " + prco.getNombrePromo());
                f.setOfertaCodigo("9996");
                f.setProductoCodigo(producS.getProductos().getProductoCodigo());
                f.setProductoNombre(producS.getProductos().getProductoNombre());

                BigDecimal centBD = new BigDecimal(0.010 * f.getCantidadProducto());
                BigDecimal centBDS = centBD.setScale(2, centBD.ROUND_HALF_DOWN);

                f.setTotalConDescuento(centBDS);
                f.setTotalSinDescuento(centBDS);
                f.setUnidadConDescuento(centBDS);
                f.setUnidadSinDescuento(centBDS);

                getFacturas().add(f);
                regalMesD = true;
            }

            codigoOfertaPrevio = prco.getWcOfertasFlotantesPK().getProductoCodigo();

        } catch (Exception e) {
            System.err.println("");
        }

        if (regalMesD) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("OFERTA", "Agrege " + cantidad + " de la oferta " + prco.getNombrePromo()));
        }

    }

    public boolean VerificadorOfertas(String productoCodigo) {
        boolean out = false;
        for (ProductosResta lr1 : getListProductoResta()) {
            if (lr1.getProductoCodigo().equalsIgnoreCase(productoCodigo)) {
                out = true;
            } else {
                out = false;
            }
        }
        return out;
    }

    public void agregaRegaloMes(String codg) {

        boolean regalMesD = false;

        try {

            if ((totalesFacturasSD(facturas).doubleValue()) >= 125 && new Date().before(consultor.getFechaRecepcion()) && !consultor.isConsultorMasivo()) {

                Regalo regalo = daoRegalo.porSucursal(sucursal.getSucursalDescarga());
                Productosucursal producS = new Productosucursal();
                ProductosucursalPK producSPK = new ProductosucursalPK();
                producSPK.setProductoCodigo(regalo.getProducto());
                producSPK.setSucursalCodigo(sucursal.getSucursalDescarga());

                producS = productosucursalFacadeLocal.find(producSPK);
                if (producS.getProductoSucursalExistenciaActual() >= 1) {
                    FacturaCuerpo f = new FacturaCuerpo();
                    f.setCantidadProducto(1);
                    f.setOferta("REGALO DEL MES");
                    f.setOfertaCodigo("9996");
                    f.setProductoCodigo(producS.getProductos().getProductoCodigo());
                    f.setProductoNombre(producS.getProductos().getProductoNombre());

                    BigDecimal centBD = new BigDecimal("0.010");
                    BigDecimal centBDS = centBD.setScale(2, centBD.ROUND_HALF_DOWN);

                    f.setTotalConDescuento(centBDS);
                    f.setTotalSinDescuento(centBDS);
                    f.setUnidadConDescuento(centBDS);
                    f.setUnidadSinDescuento(centBDS);

                    getFacturas().add(f);
                    setConsultorMasivoEntrega(true);

                    regalMesD = true;
                    facturaDao.consultorMasivo(codg);
                    // FacesContext context = FacesContext.getCurrentInstance();
                    // context.addMessage(null, new FacesMessage("REGALO DEL MES", "Agregue Regalo del mes"));
                    // cdcffl.ActualizaConsultorMasivo(consultor.getConsultorCodigo());
                }

            } else {
                System.err.println("sobrepasa fecha");
            }
        } catch (Exception e) {
            System.err.println("");
        }

        if (regalMesD) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("REGALO DEL MES", "Agregue Regalo del mes"));
        }
    }

    public void agregaRegaloMes2() {

        if (totalesFacturasSD(facturas).doubleValue() > 75) {
            Productosucursal producS = new Productosucursal();
            ProductosucursalPK producSPK = new ProductosucursalPK();
            producSPK.setProductoCodigo("00011");
            producSPK.setSucursalCodigo(sucursal.getSucursalDescarga());

            producS = productosucursalFacadeLocal.find(producSPK);
            if (producS.getProductoSucursalExistenciaActual() >= 1) {
                FacturaCuerpo f = new FacturaCuerpo();
                f.setCantidadProducto(cantitdaRegalo2);
                f.setOferta("OFERTA DEL MES");
                f.setOfertaCodigo("9996");
                f.setProductoCodigo(producS.getProductos().getProductoCodigo());
                f.setProductoNombre(producS.getProductos().getProductoNombre());

                BigDecimal centBD = new BigDecimal(0.010 * cantitdaRegalo2);
                BigDecimal centBDS = centBD.setScale(2, centBD.ROUND_HALF_DOWN);

                f.setTotalConDescuento(centBDS);
                f.setTotalSinDescuento(centBDS);
                f.setUnidadConDescuento(centBDS);
                f.setUnidadSinDescuento(centBDS);

                getFacturas().add(f);
                setConsultorMasivoEntrega(true);

            }
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("OFERTA ESPECIAL", "Agregue OFERTA ESPECIAL"));
        }

    }

    public void agregaRegaloMesPorEstuche(List<FacturaCuerpo> fac) {

        Integer cantidadProductoProm = 0;

        for (FacturaCuerpo fc : fac) {

            if (fc.getOfertaCodigo().equalsIgnoreCase("0002")) {

                cantidadProductoProm = cantidadProductoProm + fc.getCantidadProducto();

            }

        }

        Integer cantidadProductoPromEntr = cantidadProductoProm / 4;

        if (cantidadProductoPromEntr > 0) {
            try {
                Productosucursal producS = new Productosucursal();
                ProductosucursalPK producSPK = new ProductosucursalPK();
                producSPK.setProductoCodigo("00671");
                producSPK.setSucursalCodigo(sucursal.getSucursalDescarga());

                producS = productosucursalFacadeLocal.find(producSPK);
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("REGALO POR ESTUCHES", "Agregue " + cantidadProductoPromEntr + " de " + producS.getProductos().getProductoNombre()));

                if (producS.getProductoSucursalExistenciaActual() >= 1) {
                    FacturaCuerpo f = new FacturaCuerpo();
                    f.setCantidadProducto(cantidadProductoPromEntr);
                    f.setOferta("GRATIS POR 4 ESTUCHES ");
                    f.setOfertaCodigo("0003");
                    f.setProductoCodigo(producS.getProductos().getProductoCodigo());
                    f.setProductoNombre(producS.getProductos().getProductoNombre());

                    BigDecimal cent2BD = new BigDecimal("0.010");
                    BigDecimal cent2BDS = cent2BD.setScale(2, cent2BD.ROUND_HALF_DOWN);

                    BigDecimal centBD = new BigDecimal(0.010 * cantidadProductoPromEntr);
                    BigDecimal centBDS = centBD.setScale(2, centBD.ROUND_HALF_DOWN);

                    f.setTotalConDescuento(centBDS);
                    f.setTotalSinDescuento(centBDS);
                    f.setUnidadConDescuento(cent2BDS);
                    f.setUnidadSinDescuento(cent2BDS);

                    getFacturas().add(f);
                    setConsultorMasivoEntrega(true);

                }

            } catch (Exception e) {
                System.err.println("");
            }

        }

    }


    public void pagoCaex(String cantidad) throws JRException, IOException {

        BigDecimal paggo = new BigDecimal(0.00);

        if(cxc){
            switch (cantidad) {
                case "1":
                    paggo = obtenerConDecimalesBien(2.50);
                    break;
                case "2":
                    paggo = obtenerConDecimalesBien(5.00);
                    break;
                default:
                    paggo = obtenerConDecimalesBien(7.50);
                    break;
            }

            ProductosucursalPK psPK = new ProductosucursalPK();
            psPK.setProductoCodigo("99004");
            psPK.setSucursalCodigo(sucursal.getSucursalCodigo());


            VprecioProgramaF pro = vppffl.obtenerProductoCodigo("99004", programacodigo);

            if (Objects.isNull(pro.getProductoCodigo())) {
                addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "FALTA CASA POR CASA");
            } else {

                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Pago Casa por Casa", "Pago Agregado"));

                FacturaCuerpo fa = new FacturaCuerpo();
                fa.setProductoCodigo(pro.getProductoCodigo());
                fa.setProductoNombre(pro.getProductoNombre());
                fa.setOferta("PAGO POR ENVIO CXC");
                fa.setOfertaCodigo("0000");
                fa.setCantidadProducto(Integer.parseInt(cantidad));


                fa.setTotalConDescuento(paggo);
                fa.setTotalSinDescuento(paggo);
                fa.setUnidadConDescuento(obtenerConDecimalesBien(2.50));
                fa.setUnidadSinDescuento(obtenerConDecimalesBien(2.50));
                getFacturas().add(fa);
                GuardarFactura();
            }

        }else{
            switch (cantidad) {
                case "1":
                    paggo = obtenerConDecimalesBien(2.25);
                    break;
                case "2":
                    paggo = obtenerConDecimalesBien(4.50);
                    break;
                default:
                    paggo = obtenerConDecimalesBien(6.75);
                    break;
            }


            ProductosucursalPK psPK = new ProductosucursalPK();
            psPK.setProductoCodigo("99002");
            psPK.setSucursalCodigo(sucursal.getSucursalCodigo());


            VprecioProgramaF pro = vppffl.obtenerProductoCodigo("99002", programacodigo);

            if (Objects.isNull(pro.getProductoCodigo())) {
                addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "FALTA CAEX");
            } else {

                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Pago Caex", "Pago Agregado"));

                FacturaCuerpo fa = new FacturaCuerpo();
                fa.setProductoCodigo(pro.getProductoCodigo());
                fa.setProductoNombre(pro.getProductoNombre());
                fa.setOferta("PAGO POR ENVIO CAEX");
                fa.setOfertaCodigo("0000");
                fa.setCantidadProducto(Integer.parseInt(cantidad));


                fa.setTotalConDescuento(paggo);
                fa.setTotalSinDescuento(paggo);
                fa.setUnidadConDescuento(obtenerConDecimalesBien(2.25));
                fa.setUnidadSinDescuento(obtenerConDecimalesBien(2.25));
                getFacturas().add(fa);
                GuardarFactura();
            }
        }


    }

    ///////////////////////////////////////////////////////////////////////////////////////////
    public void pagoCasaporCasa(String cantidad) throws JRException, IOException {

        BigDecimal paggo = new BigDecimal(0.00);

        switch (cantidad) {
            case "1":
                paggo = obtenerConDecimalesBien(2.50);
                break;
            case "2":
                paggo = obtenerConDecimalesBien(5.00);
                break;
            default:
                paggo = obtenerConDecimalesBien(7.50);
                break;
        }

        ProductosucursalPK psPK = new ProductosucursalPK();
        psPK.setProductoCodigo("99004");
        psPK.setSucursalCodigo(sucursal.getSucursalCodigo());


        VprecioProgramaF pro = vppffl.obtenerProductoCodigo("99004", programacodigo);

        if (Objects.isNull(pro.getProductoCodigo())) {
            addMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "FALTA CASA POR CASA");
        } else {

            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Pago Casa por Casa", "Pago Agregado"));

            FacturaCuerpo fa = new FacturaCuerpo();
            fa.setProductoCodigo(pro.getProductoCodigo());
            fa.setProductoNombre(pro.getProductoNombre());
            fa.setOferta("PAGO POR ENVIO CASA POR CASA");
            fa.setOfertaCodigo("0000");
            fa.setCantidadProducto(Integer.parseInt(cantidad));


            fa.setTotalConDescuento(paggo);
            fa.setTotalSinDescuento(paggo);
            fa.setUnidadConDescuento(obtenerConDecimalesBien(2.50));
            fa.setUnidadSinDescuento(obtenerConDecimalesBien(2.50));
            getFacturas().add(fa);
            GuardarFactura();
        }

    }
    /////////////////////////////////////////////////////////////////////////////////////////

    private BigDecimal obtenerConDecimalesBien(Double in) {

        String bi = "0.00";

        BigDecimal rsin = new BigDecimal(in);
        BigDecimal rsOut = rsin.setScale(2, rsin.ROUND_HALF_UP);
        return rsOut;
    }

    public void ConsulorPromocion(String factura) {
        int contador = 0;
        double cdDoble = 0.00;
        double sdDoble = 0.00;
        double cdTriple = 0.00;
        double sdTriple = 0.00;

        List<FacturaCuerpo> doble = new ArrayList<>();
        List<FacturaCuerpo> triple = new ArrayList<>();

        Consultorpromocion cp = new Consultorpromocion();
        ConsultorpromocionPK cpPK = new ConsultorpromocionPK();

        cpPK.setConsultorCodigo(consultor.getConsultorCodigo());
        cpPK.setFacturaCodigo(factura);
        cpPK.setFacturaSerie(sucursal.getSalaSerie());

        cp.setConsultorPromocionFecha(new Date());
        cp.setConsultorpromocionPK(cpPK);

        for (FacturaCuerpo factura1 : getFacturas()) {
            Precioprograma pp = new Precioprograma();
            PrecioprogramaPK ppPK = new PrecioprogramaPK();

            ppPK.setOfertaCodigo(factura1.getOfertaCodigo());
            ppPK.setProductoCodigo(factura1.getProductoCodigo());
            ppPK.setProgramaCodigo(programa);

            pp = ppfl.find(ppPK);

            try {
                if (pp.getPrecioProgramaDoblePromocion()) {

                    if (pp.getNumeroPromocion() == 1) {
                        doble.add(factura1);

                    } else if (pp.getNumeroPromocion() == 2) {
                        triple.add(factura1);

                    }
                }
            } catch (Exception e) {
            }

        }

        if (!doble.isEmpty()) {
            for (FacturaCuerpo doble1 : doble) {
                cdDoble = doble1.getTotalConDescuento().doubleValue() + cdDoble;
                sdDoble = doble1.getTotalSinDescuento().doubleValue() + sdDoble;
            }
            cpPK.setConsultorPromocionSinDescuento(new BigDecimal(sdDoble));
            cpPK.setNumeroPromocion(Short.valueOf("1"));
            cp.setConsultorPromocionConDescuento(new BigDecimal(cdDoble));
            consultorPromocionfacace.create(cp);
        }

        if (!triple.isEmpty()) {
            for (FacturaCuerpo triple1 : triple) {
                cdTriple = triple1.getTotalConDescuento().doubleValue() + cdTriple;
                sdTriple = triple1.getTotalSinDescuento().doubleValue() + sdTriple;
            }
            cpPK.setConsultorPromocionSinDescuento(new BigDecimal(sdTriple));
            cpPK.setNumeroPromocion(Short.valueOf("2"));
            cp.setConsultorPromocionConDescuento(new BigDecimal(cdTriple));
            consultorPromocionfacace.create(cp);
        }

    }


    public void PrintCreditosFiscales() throws IOException {
        for (EsperaGuardadoFactura rih : imprimirFcturas) {
            Facturas frh = facturaDao.BusquedaFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaSerie());

            //            Facturas frh = facturaDao.BusquedaFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaSerie());

            boolean creotextobien = false;
            boolean imprimiobien = false;


            ConsultoresCcf coF = new ConsultoresCcf();
            coF = cccfl.find(consultor.getConsultorCodigo());
            String retencion = null;
            String iva = null;
            String totalSinIva = null;
            String nuevoCargoPagar = null;

            Collections.sort(rih.getFacturaCuerpo(), new Comparator<FacturaCuerpo>() {

                @Override
                public int compare(FacturaCuerpo o1, FacturaCuerpo o2) {
                    return new Integer(o1.getProductoCodigo()).compareTo(new Integer(o2.getProductoCodigo()));
                }
            });

            this.bloqueoFactura = true;
            DecimalFormat df = new DecimalFormat("0.00");
            DateFormat fechaCF = new SimpleDateFormat("yyyy-MM-dd");
            List<FacturaCuerpo> detalleFacturaImprimir = new ArrayList<>();
            detalleFacturaImprimir = callDetalles(rih.getFactura());

            List<FacturaCuerpo> fcrh = new ArrayList<>();
            if (detalleFacturaImprimir.size() > 0) {
                fcrh.addAll(detalleFacturaImprimir);
            }


            //////// desde aca verifica
            //puntos del mes
            Integer puntosMesInteger  = cfl.ObtenerPuntos(rih.getFactura().getConsultorCodigo().getConsultorCodigo(), "MES" );
            Integer puntosAnioInteger = cfl.ObtenerPuntos(rih.getFactura().getConsultorCodigo().getConsultorCodigo(), "ANIO");
            //---------
            Double totaComisionSinDescuento = 0.0D;
            String mensajePrograma = programasFacadeLocal.find(programa).getProgramaMensaje();
            //-----------
            String paraContado = new String();
            if (contado) {
                paraContado = "15 Dias Creditos";
                setContado(true);
            } else {
                setContado(false);
                paraContado = "Contado";
            }
            DateFormat fechaForm = new SimpleDateFormat("dd/MM/yyyy");
            NumeroALetras nu = new NumeroALetras();

            //NUEVA IMPRESION..
            String r1 = frh.getFacturasPK().getFacturaCodigo(); //factSig;
            String r2 = frh.getFacturasPK().getFacturaSerie(); //facSerie;

            String ruta = "/opt/facturasRicoh/F" + r1 + "-" + r2 + ".txt";
            String rutaDestino = "/media/facturas";
            File archivo = new File(ruta);


            List<SpoolFactura> spool = new ArrayList<>();
            BufferedWriter bw;

            String sucursalNombre = "";
            switch (sucursal.getSucursalCodigo()) {

                case "02":
                    sucursalNombre = "01";
                    break;
                case "03":
                    sucursalNombre = "03";
                    //   ompp = sucursal.getSalaExtension();
                    break;
                case "04":
                    sucursalNombre = "04";
                    break;
                case "05":
                    sucursalNombre = "05";
                    break;
                case "06":
                    sucursalNombre = "06";
                    break;
                case "07":
                    sucursalNombre = "07";
                    break;
                case "08":
                    sucursalNombre = "08";
                    break;
                case "11":
                    sucursalNombre = "11";
                    break;
                default:
                    sucursalNombre = "01";
                    break;

            }

            frh.setFacturaTotalConDescuento(frh.getFacturaTotalConDescuento().setScale(2, BigDecimal.ROUND_HALF_EVEN));
            if (!archivo.exists()) {
                bw = new BufferedWriter(new FileWriter(archivo));
                bw.write("---INICIO_PAGINA---");
                bw.newLine();
                bw.write("CODEMPRES|01");
                bw.newLine();
                bw.write("TIPODOCUM|CCFCLIENTE");//
                bw.newLine();
                bw.write("NUMERONRC|3893-8");//
                bw.newLine();
                bw.write("NITCLIENT|" + consultor.getNit());//
                bw.newLine();
                bw.write("MUNICIPIO|" + coF.getMunicipio() + "Departamento:  " + coF.getDepartamento());//
                bw.newLine();
                bw.write("GIROCLIEN| ");//
                bw.newLine();
                bw.write("NUMEFACTU|" + frh.getFacturasPK().getFacturaCodigo());//
                bw.newLine();
                bw.write("SALADIREC|" + sucursal.getSalaDireccion());//
                bw.newLine();
                bw.write("FECHAEMIS|" + fechaForm.format(fecha));//
                bw.newLine();
                bw.write("SOLOCENTR|" + getOmpp());
                bw.newLine();
                bw.write("IMPRESDST|" + sucursalNombre);//
                bw.newLine();
                bw.write("CONSCODIG|" + consultorCodigo.toUpperCase()); //
                bw.newLine();
                bw.write("NITCLIENT|" + consultor.getNit());//
                bw.newLine();
                bw.write("NCRCLIENT|" + coF.getNrc());//
                bw.newLine();
                bw.write("DUICLICAB|" + consultor.getDui());//
                bw.newLine();
                bw.write("SERIEINTE|" + rih.getFactura().getFacturasPK().getFacturaSerie());//
                bw.newLine();
                bw.write("NOCLIENTE|" + consultoresFacadeLocal.ObtenerNombreCompleto(consultorCodigo));//
                bw.newLine();
                bw.write("DIRECCION|" + consultor.getDireccionCompleta()); //
                bw.newLine();
                bw.write("TERRITORI|" + consultor.getTerritorioCodigo());//
                bw.newLine();
                bw.write("DIASPAGOS|" + paraContado); //
                bw.newLine();

                //DETALLE IMPRESION NUEVA----
                for (FacturaCuerpo fa : fcrh) {
                    String nombreProducto = "";

                    if (fa.getProductoCodigo().equals("")) {
                        nombreProducto = fa.getProductoNombre();
                    } else {

                        //  validaChongas(fa.getOfertaCodigo(), fa.getCantidadProducto());
                        if (fa.getTotalConDescuento().equals(fa.getTotalSinDescuento())) {
                            totaComisionSinDescuento += fa.getTotalConDescuento().doubleValue();
                        }

                        if (fa.getProductoNombre().length() > 55) {

                            nombreProducto = fa.getProductoNombre().substring(0, 45);
                            if (fa.getTotalConDescuento().equals(fa.getTotalSinDescuento())) {
                                nombreProducto = nombreProducto.trim() + " **";
                            } else if (Integer.valueOf(fa.getOfertaCodigo()) >= 9997) {
                                nombreProducto = ("**" + nombreProducto.trim()).substring(0, 45);
                            } else if (!fa.getOfertaCodigo().equalsIgnoreCase("0000") && Integer.valueOf(fa.getOfertaCodigo()) <= 9997) {
                                if (fa.getOferta().length() < 15) {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta();
                                } else {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta().substring(0, 15);
                                }
                            }
                            int variableFor = 115 - nombreProducto.length();

                        } else {

                            nombreProducto = fa.getProductoNombre();
                            if (fa.getTotalConDescuento().equals(fa.getTotalSinDescuento()) && Integer.valueOf(fa.getOfertaCodigo()) <= 9997) {
                                nombreProducto = nombreProducto.trim() + " **";
                            }
                            if (Integer.valueOf(fa.getOfertaCodigo()) >= 9997) {
                                nombreProducto = ("**" + nombreProducto.trim());

                            } else if (!fa.getOfertaCodigo().equalsIgnoreCase("0000") && Integer.valueOf(fa.getOfertaCodigo()) <= 9997) {
                                if (fa.getOferta().length() < 15) {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta();
                                } else {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta().substring(0, 15);
                                }
                            }
                            int variableFor = 115 - nombreProducto.length();
                        }

                    }

                    String unidad = df.format(fa.getUnidadSinDescuento().doubleValue() / 1.13);
                    String totalUnidad = df.format(fa.getTotalSinDescuento().doubleValue() / 1.13);

                    bw.write("DETALLEFT|" + fa.getProductoCodigo() + "|" + fa.getCantidadProducto().toString() + "|" + nombreProducto + "|||" + unidad + "|" + totalUnidad);
                    bw.newLine();
                }

                //---------------------------//
                bw.write("MENSAJECL|" + contadorCuponoes(detalleFacturaImprimir, mensajePrograma));
                bw.newLine();

                BigDecimal subtoPasBD = new BigDecimal(Double.valueOf(frh.getFacturaTotalSinDescuento().doubleValue()) / 1.13);
                BigDecimal subtoPasBDS = subtoPasBD.setScale(2, subtoPasBD.ROUND_DOWN);


                BigDecimal apagarBD = new BigDecimal("0.00");
                BigDecimal descuentosBD = new BigDecimal("0.00");
                BigDecimal ivaBD = new BigDecimal("0.00");
                BigDecimal otrosDescuentosBD = new BigDecimal("0.00");
                BigDecimal retencionBD = new BigDecimal("0.00");
                BigDecimal totalApagarSalBD = new BigDecimal("0.00");

                apagarBD = new BigDecimal(Double.valueOf(frh.getFacturaTotalConDescuento().doubleValue()) / 1.13);
                descuentosBD = new BigDecimal(Double.valueOf(frh.getFacturaTotalSinDescuento().doubleValue() - frh.getFacturaTotalConDescuento().doubleValue()) / 1.13);
                ivaBD = new BigDecimal((Double.valueOf(frh.getFacturaTotalConDescuento().doubleValue()) / 1.13) * 0.13);//(Double.valueOf(getPagar()) / 1.13) * 0.13;
                otrosDescuentosBD = new BigDecimal(frh.getOtrodesc().doubleValue());

                if (!coF.getIva() && apagarBD.doubleValue() >= 100.00) {
                    retencionBD = new BigDecimal(apagarBD.doubleValue() * 0.01);
                }

                totalApagarSalBD = new BigDecimal(Double.valueOf(frh.getFacturaTotalConDescuento().doubleValue()) + Double.valueOf(retencionBD.toString()));


                BigDecimal salidaAPagar = apagarBD.setScale(2, apagarBD.ROUND_HALF_EVEN);
                BigDecimal descuentosBDS = descuentosBD.setScale(2, descuentosBD.ROUND_HALF_EVEN);
                BigDecimal ivaBDS = ivaBD.setScale(2, ivaBD.ROUND_HALF_EVEN);
                BigDecimal otrosDescuentosBDS = otrosDescuentosBD.setScale(2, otrosDescuentosBD.ROUND_HALF_EVEN);
                BigDecimal retencionBDS = retencionBD.setScale(2, retencionBD.ROUND_HALF_EVEN);
                BigDecimal totalApagarSalBDs = totalApagarSalBD.setScale(2, totalApagarSalBD.ROUND_HALF_EVEN);

                bw.write("SUMASOPAS|" + subtoPasBDS.toString());//
                bw.newLine();
                bw.write("DESCUENTO|" + descuentosBDS.toString()); //
                bw.newLine();
                bw.write("OTROSDESC|" + otrosDescuentosBDS.toString());//
                bw.newLine();
                bw.write("IVACLIENT|" + ivaBDS.toString());//
                bw.newLine();

                if (coF.getIva().equals("1") && totalApagarSalBDs.doubleValue() < 100.00) {
                    bw.write("RETENCION|" + "0.00");

                    retencion = "0.00";
                } else {
                    bw.write("RETENCION|" + retencionBDS.toString());//
                    retencion = retencionBDS.toString();
                }
                bw.newLine();
                bw.write("SUBTOTALS|" + salidaAPagar.toString());
                bw.newLine();
                bw.write("APAGARTOL|" + totalApagarSalBDs.toString());

                nuevoCargoPagar = totalApagarSalBDs.toString();
                bw.newLine();
                bw.write("PUNTOSMES|" + puntosMesInteger);//
                bw.newLine();
                bw.write("PUNTOSANO|" + puntosAnioInteger);//
                bw.newLine();
                bw.write("MITULIDAD|" + getDescuento());
                bw.newLine();
                bw.write("COMISINDE|" + totaComisionSinDescuento);
                bw.newLine();
                bw.write("COMICONDE|" + totaComisionSinDescuento);
                bw.newLine();
                bw.write("PAGOLETRA|" + nu.Convertir(totalApagarSalBDs.toString(), true));//
                bw.newLine();
                bw.write("USUARIOFT|" + this.usuario.getUsuarioNombre());//SERIEINTE
                bw.newLine();

                String subTotalRs = getSubTotal();
                iva = ivaBDS.toString();
                totalSinIva = apagarBD.toString();

                if (Double.parseDouble(subTotalRs) >= 200) {
                    bw.write("NOUSUARIO|" + this.usuario.getNombreEmpleado());//
                    bw.newLine();
                    bw.write("NOCLIEPIE|" + consultor.getNombreCorto());//
                    bw.newLine();
                    bw.write("DUIUSUARI|" + this.usuario.getDui()); //
                    bw.newLine();
                    bw.write("DUICLIENT|" + consultor.getDui());//
                    bw.newLine();

                } else {
                    bw.write("NOUSUARIO|");
                    bw.newLine();
                    bw.write("NOCLIEPIE|");
                    bw.newLine();
                    bw.write("DUIUSUARI|");
                    bw.newLine();
                    bw.write("DUICLIENT|");
                    bw.newLine();
                }
                bw.write("---FIN_PAGINA---");
                creotextobien = true;
                bw.close();
            }
            try {
                String cmd = "cp " + ruta + " " + rutaDestino; //Comando de apagado en linux
                Runtime.getRuntime().exec(cmd);
                imprimiobien = true;
            } catch (IOException ioe) {
                System.out.println(ioe);
            }

            if (creotextobien & imprimiobien) {
                facturaDao.actualizaImpresoFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaSerie());
            }

            //--------------------------------------
            BitacorasWeb bi = new BitacorasWeb();
            bi.setUsuarioCodigo(this.usuario.getUsuarioCodigo());
            bi.setFecha(new Date());
            bi.setHost(sucursal.getTerminal());
            bi.setModulo("Facturacion");
            bi.setAccion("Imprimir Factura");
            bi.setDescripcion("impresion de factura: " + factSig + " con serie: " + sucursal.getSalaSerie());
            bitacorasWebFacadeLocal.create(bi);

            //    beti.setConsultorCodigo(consultorCodigo);
            try {
                if (Double.valueOf(retencion) > 0.02) {

                    // cffl.actualizaValorCredito(r1, r2, nuevoCargoPagar);

                    cffl.actualizaValorCredito(r1, r2, nuevoCargoPagar);
                }

                CreditoFiscal cf = new CreditoFiscal();
                cf.setCreditoFiscalPK(new CreditoFiscalPK(r1, r2));
                cf.setConsultorCodigo(getConsultorCodigo().toUpperCase());
                cf.setPercepcion(new BigDecimal(retencion));
                cf.setIva(new BigDecimal(iva));
                cf.setMontoSIva(new BigDecimal(totalSinIva));
                cffl.insertaCreditoFiscal(cf);

            } catch (Exception e) {
                System.out.println(e);
            }


            facturaDao.actualizaImpresoFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaSerie());

            PrimeFaces.current().executeScript("PF('numeroFactTra').show();"); //  refresh();
        }
    }


    public void PrintFacturas() throws IOException {


        for (EsperaGuardadoFactura rih : imprimirFcturas) {

            Facturas frh = facturaDao.BusquedaFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaSerie());

            boolean creotextobien = false;
            boolean imprimiobien = false;

            this.bloqueoFactura = true;
            DecimalFormat df = new DecimalFormat("0.00");
            // Obtenemos solamente la fecha pero usamos slash en lugar de guiones

            //puntos del mes

            Integer puntosMesInteger = cfl.ObtenerPuntos(rih.getFactura().getConsultorCodigo().getConsultorCodigo(), "MES");
            Integer puntosAnioInteger = cfl.ObtenerPuntos(rih.getFactura().getConsultorCodigo().getConsultorCodigo(), "ANIO");
            //---------
            Double totaComisionSinDescuento = 0.0D;
            String mensajePrograma = programasFacadeLocal.find(programa).getProgramaMensaje();
            List<FacturaCuerpo> detalleFacturaImprimir = new ArrayList<>();
            detalleFacturaImprimir = callDetalles(rih.getFactura());

            List<FacturaCuerpo> fcrh = new ArrayList<>();
            if (detalleFacturaImprimir.size() > 0) {
                fcrh.addAll(detalleFacturaImprimir);
            }


            //-----------
            String paraContado;
            if (contado) {
                paraContado = "15 Dias Creditos";
                setContado(true);
            } else {
                setContado(false);
                paraContado = "Contado";
            }
            DateFormat fechaForm = new SimpleDateFormat("dd/MM/yyyy");
            NumeroALetras nu = new NumeroALetras();
            String direccionCompleta = consultor.getDireccionCompleta();

            //NUEVA IMPRESION..
            String r1 = frh.getFacturasPK().getFacturaCodigo(); //factSig;
            String r2 = frh.getFacturasPK().getFacturaSerie(); //facSerie;

            String ruta = "/opt/facturasRicoh/F" + r1 + "-" + r2 + ".txt";
            String rutaDestino = "/media/facturas/";
            File archivo = new File(ruta);

            BufferedWriter bw;

            String sucursalNombre = "";
            String docusal = "";

            switch (sucursal.getSucursalDescarga()) {

                case "02":
                    sucursalNombre = "CENTRAL";
                    break;
                case "03":
                    sucursalNombre = "SOYAPANGO";
                    //   ompp = sucursal.getSalaExtension();
                    break;
                case "04":
                    sucursalNombre = "SAN_MIGUEL";
                    break;
                case "05":
                    sucursalNombre = "USULUTAN";
                    break;
                case "06":
                    sucursalNombre = "ZACATECOLUCA";
                    break;
                case "07":
                    sucursalNombre = "SANTA_ANA";
                    break;
                case "08":
                    sucursalNombre = "SONSONATE";
                    break;
                case "11":
                    sucursalNombre = "APOPA";
                    break;
                default:
                    break;

            }

            if (sucursal.getSucursalDescarga().equalsIgnoreCase("02")) {
                docusal = "01";
            } else {
                docusal = sucursal.getSucursalDescarga();
            }

            frh.setFacturaTotalConDescuento(frh.getFacturaTotalConDescuento().setScale(2, BigDecimal.ROUND_HALF_EVEN));
            if (!archivo.exists()) {
                bw = new BufferedWriter(new FileWriter(archivo));
                bw.write("---INICIO_DE_PAGINA---");

                bw.newLine();
                bw.write("CODEMPRES|" + docusal);
                bw.newLine();
                bw.write("TIPODOCUM|FACTURACLIENTE");//
                bw.newLine();
                bw.write("NUMERONRC|" + "3893-8");//
                bw.newLine();
                bw.write("NUMEFACTU|" + frh.getFacturasPK().getFacturaCodigo());//
                bw.newLine();
                bw.write("SALADIREC|" + sucursal.getSalaDireccion());//
                bw.newLine();
                bw.write("FECHAEMIS|" + fechaForm.format(fecha));//
                bw.newLine();
                bw.write("SOLOCENTR|" + ompp);
                bw.newLine();
                bw.write("IMPRESDST|" + sucursalNombre);//
                bw.newLine();
                bw.write("CONSCODIG|" + consultorCodigo.toUpperCase()); //
                bw.newLine();
                bw.write("DUICLICAB|" + consultor.getDui());//
                bw.newLine();
                bw.write("SERIEINTE|" + sucursal.getSerie());//
                bw.newLine();
                bw.write("NOCLIENTE|" + consultoresFacadeLocal.ObtenerNombreCompleto(consultorCodigo));//
                bw.newLine();
                bw.write("DIRECCION|" + consultor.getDireccionCompleta()); //
                bw.newLine();
                bw.write("TERRITORI|" + consultor.getTerritorioCodigo());//
                bw.newLine();
                bw.write("DIASPAGOS|" + paraContado); //
                bw.newLine();

                //DETALLE IMPRESION NUEVA----
                for (FacturaCuerpo fa : fcrh) {
                    String nombreProducto = "";

                    if (fa.getProductoCodigo().equals("")) {
                        nombreProducto = fa.getProductoNombre();
                    } else {

                        if (fa.getTotalConDescuento().equals(fa.getTotalSinDescuento())) {
                            totaComisionSinDescuento += fa.getTotalConDescuento().doubleValue();
                        }

                        if (fa.getProductoNombre().length() > 55) {

                            nombreProducto = fa.getProductoNombre().substring(0, 45);
                            if (fa.getTotalConDescuento().equals(fa.getTotalSinDescuento())) {
                                nombreProducto = nombreProducto.trim() + " **";
                            } else if (Integer.valueOf(fa.getOfertaCodigo()) >= 9997) {
                                nombreProducto = ("**" + nombreProducto.trim()).substring(0, 45);
                            } else if (!fa.getOfertaCodigo().equalsIgnoreCase("0000") && Integer.valueOf(fa.getOfertaCodigo()) <= 9997) {
                                if (fa.getOferta().length() < 15) {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta();
                                } else {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta().substring(0, 15);
                                }
                            }
                            int variableFor = 115 - nombreProducto.length();

                        } else {

                            nombreProducto = fa.getProductoNombre();
                            if (fa.getTotalConDescuento().equals(fa.getTotalSinDescuento()) && Integer.parseInt(fa.getOfertaCodigo()) <= 9997) {
                                nombreProducto = nombreProducto.trim() + " **";
                            }
                            if (Integer.parseInt(fa.getOfertaCodigo()) >= 9997) {
                                nombreProducto = ("**" + nombreProducto.trim());

                            } else if (!fa.getOfertaCodigo().equalsIgnoreCase("0000") && Integer.parseInt(fa.getOfertaCodigo()) <= 9997) {
                                if (fa.getOferta().length() < 15) {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta();
                                } else {
                                    nombreProducto = nombreProducto.trim() + " " + fa.getOferta().substring(0, 15);
                                }
                            }
                            int variableFor = 115 - nombreProducto.length();
                        }

                    }

                    String unidad = df.format(fa.getUnidadSinDescuento().doubleValue());
                    String totalUnidad = df.format(fa.getTotalSinDescuento());

                    bw.write("DETALLEFT|" + fa.getProductoCodigo() + "|" + fa.getCantidadProducto().toString() + "|" + nombreProducto + "|||" + unidad + "|" + totalUnidad);
                    bw.newLine();
                }

                BigDecimal desBD1 = new BigDecimal(frh.getFacturaTotalSinDescuento().doubleValue() - frh.getFacturaTotalConDescuento().doubleValue());
                BigDecimal descu = desBD1.setScale(2, desBD1.ROUND_HALF_DOWN);

                //---------------------------//
                bw.write("MENSAJECL|" + contadorCuponoes(fcrh, mensajePrograma));
                bw.newLine();

                bw.write("SUBTOTALV|" + frh.getFacturaTotalSinDescuento().toString());//
                bw.newLine();
                bw.write("COMISINDE|" + totaComisionSinDescuento);
                bw.newLine();
                bw.write("COMICONDE|" + totaComisionSinDescuento);
                bw.newLine();
                bw.write("USUARIOFT|" + usuario.getUsuarioNombre());//SERIEINTE
                bw.newLine();
                bw.write("DESCUENTO|" + descu.toString()); //
                bw.newLine();
                bw.write("OTROSDESC|" + obtenerOtrosDescuento(fcrh));//
                bw.newLine();
                bw.write("APAGARTOL|" + frh.getFacturaTotalConDescuento().toString());
                bw.newLine();
                bw.write("PUNTOSMES|" + puntosMesInteger);//
                bw.newLine();
                bw.write("PUNTOSANO|" + puntosAnioInteger);//
                bw.newLine();
                bw.write("MITULIDAD|0.00");
                bw.newLine();
                bw.write("PAGOLETRA|" + nu.Convertir(frh.getFacturaTotalConDescuento().toString(), true));//
                bw.newLine();

                if (frh.getFacturaTotalConDescuento().doubleValue() >= 200) {
                    bw.write("NOUSUARIO|" + this.usuario.getNombreEmpleado());//
                    bw.newLine();
                    bw.write("NOCLIEPIE|" + consultor.getNombreConsultor());//
                    bw.newLine();
                    bw.write("DUIUSUARI|" + this.usuario.getDui()); //
                    bw.newLine();
                    bw.write("DUICLIENT|" + consultor.getDui());//
                    bw.newLine();

                } else {
                    bw.write("NOUSUARIO|");
                    bw.newLine();
                    bw.write("NOCLIEPIE|");
                    bw.newLine();
                    bw.write("DUIUSUARI|");
                    bw.newLine();
                    bw.write("DUICLIENT|");
                    bw.newLine();
                }

                bw.write("---FIN_DE_PAGINA---");
                creotextobien = true;
                bw.close();
            }
            try {
                String cmd = "cp " + ruta + " " + rutaDestino; //Comando de apagado en linux
                Runtime.getRuntime().exec(cmd);
                imprimiobien = true;
            } catch (IOException ioe) {
                System.out.println(ioe);
            }

            if (creotextobien & imprimiobien) {
                facturaDao.actualizaImpresoFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaSerie());
            }
            //--------------------------------------
            BitacorasWeb bi = new BitacorasWeb();
            bi.setUsuarioCodigo(this.usuario.getUsuarioCodigo());
            bi.setFecha(new Date());
            bi.setHost(sucursal.getTerminal());
            bi.setModulo("Facturacion");
            bi.setAccion("Imprimir Factura");
            bi.setDescripcion("impresion de factura: " + frh.getFacturasPK().getFacturaCodigo() + " con serie: " + sucursal.getSalaSerie());
            bitacorasWebFacadeLocal.create(bi);
            facturaDao.actualizaImpresoFactura(rih.getFactura().getFacturasPK().getFacturaCodigo(), rih.getFactura().getFacturasPK().getFacturaCodigo());

            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("consultor", consultor);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pedidoSe", pedidoSe);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("cantidadCAEX", cantidadCajasCaex);

            PrimeFaces.current().executeScript("PF('numeroFactTra').show();"); //  refresh();

        }

    }

    public String devuelvePremioNombre(VConsultorpremio prem) {

        String rs = "NO TIENE PREMIO";
        premiob = false;
        Boolean primerPedidods = cfl.ObtenerEquipoTrabajo(consultor.getConsultorCodigo());

        if (!Objects.isNull(prem)) {

            if (premiosExistenciasDs && !primerPedidods) {

                if (!prem.getConsultorCodigo().equals("L10058") || !prem.getConsultorCodigo().equals("M21085")) {
                    if (prem.getPremioAutorizado()) {
                        Premios p = new Premios();


                        p = premiosDao.findPremioByCodigo(prem.getCodigoPremioAutorizado());

                        if (prem.getPremioEntregado()) {

                            String facturaPremios = entregaPremiosFacade.vereificaPremio(prem.getConsultorCodigo(), p.getPremiosPK().getProgramaCodigo());


                            rs = "PREMIO ENTREGADO EN " + facturaPremios;
                        } else {
                            rs = p.getPremioNombre() + " - " + p.getPremiosPK().getProgramaCodigo();
                            premiob = true;
                        }

                    } else if (!consultor.isConsultorTipoPago() && !prem.getCodigoPremio().equals("000")) {

                        Premios p = new Premios();
                        p = premiosDao.findPremioByCodigo(prem.getCodigoPremioAutorizado());

                        if (prem.getPremioEntregado()) {

                            String facturaPremios = entregaPremiosFacade.vereificaPremio(prem.getConsultorCodigo(), p.getPremiosPK().getProgramaCodigo());
                            rs = "PREMIO ENTREGADO EN " + facturaPremios;
                        } else {
                            rs = prem.getPremioNombre();
                            premiob = true;
                        }
                    } else if ((prem.getCargos().doubleValue() <= 0.05 && prem.getDiasPago() <= gen.getDiaspremio()) && !prem.getCodigoPremio().equals("000")) {

                        Premios p = new Premios();
                        p = premiosDao.findPremioByCodigo(prem.getCodigoPremioAutorizado());

                        if (prem.getPremioEntregado()) {

                            String facturaPremios = entregaPremiosFacade.vereificaPremio(prem.getConsultorCodigo(), p.getPremiosPK().getProgramaCodigo());
                            rs = "PREMIO ENTREGADO EN " + facturaPremios;
                        } else {
                            rs = prem.getPremioNombre();
                            premiob = true;
                        }
                    } else if (prem.getCargos().doubleValue() >= 0.05) {
                        rs = "PREMIO DENEGADO SALDO $" + prem.getCargos();
                    }


                }
            } else {
                if (primerPedidods) {
                    rs = "PRIMER PEDIDO";
                } else {

                    if (prem.getCodigoPremio().equals("000")) {
                        rs = "SIN PREMIO";
                    } else {
                        rs = "SIN EXISTENCIAS";
                    }
                }
            }

        }
        return rs;
    }

    public String devuelvePremioColor(VConsultorpremio prem) {

        String rs = "#ff5555";

        try {
            if (!cfl.ObtenerEquipoTrabajo(consultor.getConsultorCodigo())) {
                if ((!prem.getPremioEntregado() && !prem.getConsultorCodigo().equalsIgnoreCase("L10058")) || !prem.getPremioEntregado() && !prem.getConsultorCodigo().equalsIgnoreCase("M21085")) {

                    if (prem.getPremioEntregado()) {
                        rs = "#0b28e3";
                    } else if (prem.getPremioAutorizado()) {
                        rs = "#3e7f5b";

                    } else if (!consultor.isConsultorTipoPago() && !prem.getCodigoPremio().equals("000")) {
                        rs = "#3e7f5b";
                    } else if ((prem.getCargos().doubleValue() <= 0.05 && prem.getDiasPago() <= gen.getDiaspremio()) && !prem.getCodigoPremio().equals("000")) {
                        rs = "#3e7f5b";
                    } else if (!premiosExistenciasDs || prem.getCargos().doubleValue() > 0.05) {
                        rs = "#ab0000";
                    } else {
                        rs = "#0b28e3";
                    }
                }


            } else {
                rs = "#7286ad";
            }

        } catch (Exception e) {

        }


        return rs;
    }

    private String intoString(String textoReal, String textoInsert, int pos) {
        StringBuilder stringBuilder = new StringBuilder(textoReal);
        stringBuilder.insert(pos, textoInsert);
        return stringBuilder.toString();
    }


    public void eligeTipoDocumento() throws IOException {

        if (tipoDoc.equals("01")) {
            PrintFacturas();
        } else if (tipoDoc.equals("03")) {
            PrintCreditosFiscales();
        }

    }

    private String contadorCuponoes(List<FacturaCuerpo> f, String mensajePro) {

        String rs = mensajePro;

        int chongasCo = 0;
        int cuponesCo = 0;

        for (FacturaCuerpo fa : f) {

            switch (fa.getTipoCupon()) {

                case '1':
                    chongasCo = chongasCo + fa.getCantidadProducto();
                    break;
                case '2':
                    cuponesCo = cuponesCo + fa.getCantidadProducto();
                    break;
                case '3':
                    chongasCo = chongasCo + fa.getCantidadProducto();
                    cuponesCo = cuponesCo + fa.getCantidadProducto();
                    break;
                case '4':
                    chongasCo = chongasCo + fa.getCantidadProducto() * 2;
                    break;
                default:
                    break;
            }
        }

        if (chongasCo > 0 && cuponesCo > 0) {
            rs = "Chongas: " + chongasCo + " Cupones: " + cuponesCo;
        } else if (chongasCo > 0 && cuponesCo == 0) {
            rs = mensajePro + ", Chongas: " + chongasCo;
        } else if (chongasCo == 0 && cuponesCo > 0) {
            rs = mensajePro + ", Cupones: " + cuponesCo;
        }

        return rs;
    }


    public String asiganarFacturaGuardar(String sucursalCodigo, String documentoCodigo, String facturaSerie) {

        if (documentoCodigo.equals("03")) {
            sucursalCodigo = "02";
        }

        String rs = cfl.obtenerFacturaSig(sucursalCodigo, documentoCodigo, facturaSerie);

        int rsi = Integer.valueOf(rs) + 1;

        Formatter fmt = new Formatter();

        rs = fmt.format("%06d", rsi).toString();

        return rs;
    }

    public static Date getPrimerDiaDelMes() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR),
                cal.get(Calendar.MONTH),
                cal.getActualMinimum(Calendar.DAY_OF_MONTH),
                cal.getMinimum(Calendar.HOUR_OF_DAY),
                cal.getMinimum(Calendar.MINUTE),
                cal.getMinimum(Calendar.SECOND));
        return cal.getTime();
    }

    public Date PrimerodeAnio() {
        Calendar calendar = Calendar.getInstance();
        Date d = calendar.getTime();
        calendar.set(2, 1);
        calendar.set(12, 1);
        return d;
    }

    public void refresh() throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect("facturacion.jsf");

    }

    public void removeList() {

    }

    public int revisarCatalogos() {

        int numeroCat = consultoresFacadeLocal.NumeroCatalogos(consultor.getConsultorCodigo(), consultor.getTerritorioCodigo());
        return numeroCat;
    }

    public void mensajeCatalogos() {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "CATALOGOS", "Su Maximo de Catalogos es " + revisarCatalogos());
        PrimeFaces.current().dialog().showMessageDynamic(message);
    }

    public void validaChongas(String codigoOfertas, int cantidadProducto) {

        switch (codigoOfertas) {

            case "1707":
                chongasContador = chongasContador + cantidadProducto;
                break;
            case "1708":
                chongasContador = chongasContador + (cantidadProducto * 2);
                break;
            default:
                System.err.println("no hay chongas");
                break;
        }

    }

    public void delProduc() {
        facturas.remove(facturaSelc);
        facturaSelc = null;
    }

    public void fillReport() throws JRException {
        BigDecimal apagarBD = totalesFacturasSD(facturas);
        BigDecimal salidaAPagar = apagarBD.setScale(2, apagarBD.ROUND_HALF_DOWN);

        NumeroALetras nu = new NumeroALetras();
        String numeros = nu.Convertir(salidaAPagar.toString(), true);
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(facturas);
        String reportPath = "/opt/reportesJasper/fact.jasper";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();

        if (contado) {
            parametros.put("credito_contado", "CONTADO");
        } else {
            parametros.put("credito_contado", "15 Dias Credito");
        }

        parametros.put("otros_descuentos", otrosDescuentos());
        parametros.put("subtotal", totalesFacturasSD(facturas));
        parametros.put("pagar", totalesFacturasCD(facturas));
        parametros.put("descuentos", otrosDescuentos);
        parametros.put("dui", consultor.getDui());
        parametros.put("consultor_nombre", cosultorNombre);
        parametros.put("consultor_codigo", consultorCodigo.toUpperCase());
        parametros.put("territorio", consultorTerritorio);
        parametros.put("numero_letras", numeros);
        parametros.put("fecha", fecha);
        parametros.put("direccion", consultor.getDireccionCompleta());
        parametros.put("factura_numero", factSig);
        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
        jasperPrint.setPageHeight(650);
    }

    public void printReport(ActionEvent actionEvent) throws JRException, IOException {
        try {
            // guardarCargos();
            fillReport();
            JasperPrintManager.printReport(jasperPrint, false);
            FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage("Impresion enviada"));
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage("Error en la impresion!!"));
        }
    }

    public void PDF() throws JRException, IOException {
        fillReport();
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
    }

    public int calculaModPagFact(int num) {

        int rs = 0;

        if (num > 0) {
            rs = 1;
        }

        return rs;
    }

    //-----------------------------------


    public List<ProPremTab> getProPremTabs() {
        //     List<ProPremTab> onj = sfl.findCallProPremios("P1254", "ENE", "2014-01-01", "2014-01-31");
        System.out.println("nada");
        return null;
    }

    public void ss() {
        System.out.println("hola funciona el boton XD");
    }

    public void asignarFact() {
        setImpresaFact(false);
        setEnableText(false);
        consutorBlok = false;

        Date validadorFechas = new Date();
        Date fechaImpresor = generalesDao.ParametrosGenerales().getImpresor();

        if (validadorFechas.after(fechaImpresor)) {
            fecha = new Date();
        } else {
            fecha = fechaImpresor;
        }

        setSala(getSucursal().getSalaNombre());
        setFacSerie(getSucursal().getSerie());
        setFactSig("------");

        //--------------obtener fecha------------
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        Map<String, Object> sessionMap = externalContext.getSessionMap();
        Date fechaDescarga = new Date();
        Date fechaInicial = new Date();


        obtenerPrograma objP = new obtenerPrograma();
        setPrograma(generalesDao.findAll().get(0).getPrograma());
        validaFact obj = new validaFact();
        setTipoDoc(obj.validaFact(factSig));
        this.bloquearNuevo = true;
        this.bloquearGuardarBtn = false;
        this.factus = "";
    }

    //***** reutiliza para llamar factura
    public boolean ValidaFactura(String facturaCodigo, String serieCodigo) {
        boolean rsValida;
        Facturas facturagt;
        FacturasPK fPk = new FacturasPK();

        fPk.setFacturaCodigo(facturaCodigo);
        fPk.setFacturaSerie(serieCodigo);

        try {
            facturagt = facturaDao.find(fPk);
            System.err.println("factura = " + facturagt.getConsultorCodigo().getConsultorCodigo());
            rsValida = true;
            setEnableText(true);

        } catch (Exception e) {
            facturagt = new Facturas();
            System.err.println("no existe dato para esta factura");
            rsValida = false;

        }
        String numeroFacturaNUevo = facturaCodigo.substring(1, 6);
        String facturaFinalSistema = sucursal.getSalaFacturaFinal().substring(1, 6);

        if (Integer.valueOf(numeroFacturaNUevo) > Integer.valueOf(facturaFinalSistema)) {
            rsValida = true;
        } else {
            rsValida = false;
        }

        return rsValida;
    }


    public void callFacturas() {

        List<DetalleFactura> detalelfact = new ArrayList<>();
        Facturas facturagt;
        FacturasPK fPk = new FacturasPK();

        EsperaGuardadoFactura es = new EsperaGuardadoFactura();
        fPk.setFacturaCodigo(facturaCodigoBusqueda.toUpperCase());
        if (facturaSerieBusqueda != null) {
            fPk.setFacturaSerie(facturaSerieBusqueda);
        } else {
            //   fPk.setFacturaSerie("D3");
        }

        try {

            if (historicoFacturas) {
                facturagt = facturaDao.busquedaHFacturas(fPk.getFacturaCodigo(), fPk.getFacturaSerie());
                detalelfact = facturaDao.busquedaHdetFacturas(fPk.getFacturaCodigo(), fPk.getFacturaSerie());
                facSerie = facturaSerieBusqueda;

            } else {
                facturagt = facturaDao.BusquedaFactura(fPk.getFacturaCodigo(), fPk.getFacturaSerie());
                detalelfact = detallefacturaDao.obtenerFacturas(fPk.getFacturaCodigo(), fPk.getFacturaSerie());
                facSerie = facturaSerieBusqueda;
            }
            setEnableText(true);
        } catch (Exception e) {
            facturagt = new Facturas();
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "No Existe", "No existen datos para esta Factura");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
        setImpresaFact(facturagt.getFacturaImpresa());
        resuBusFact = facturagt;
        setConsultorCodigo(facturagt.getConsultorCodigo().getConsultorCodigo());
        // this.consultorCodigo = facturagt.getConsultorCodigo().getConsultorCodigo();
        this.cosultorNombre = consultoresFacadeLocal.ObtenerNombreCompleto(getConsultorCodigo());
        this.factSig = facturagt.getFacturasPK().getFacturaCodigo();
        this.facSerie = facturagt.getFacturasPK().getFacturaSerie();
        this.sala = facturagt.getSucursalCodigo().getSalaNombre();
        this.programa = facturagt.getProgramaCodigo();
        this.contado = facturagt.getFacturaCredito();
        this.tipoDoc = facturagt.getDocumentoCodigo();
        this.consultorTerritorio = facturagt.getConsultorCodigo().getTerritorioCodigo().getCodigoTerritorio();
        this.consultor = cdcffl.busquedaDato(facturagt.getConsultorCodigo().getConsultorCodigo());
        //*consultores datos
        //DateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");
        this.fecha = facturagt.getFacturaFecha();
        // this.bazar = facturagt.get

        resuBusDetallFact = detalelfact;


        es.setFactura(facturagt);


        try {
            this.facturas = new ArrayList<>();
            String nombreOferta;

            Facturas facturaBus = resuBusFact;
            List<DetalleFactura> detalleFacturaBus = resuBusDetallFact;

            for (DetalleFactura dbf : detalleFacturaBus) {
                FacturaCuerpo fa = new FacturaCuerpo();

                VprecioProgramaF vps = new VprecioProgramaF();

                fa.setCantidadProducto(Integer.valueOf(String.valueOf(dbf.getDetalleFacturaCantidad())));

                if (Integer.parseInt(dbf.getDetalleFacturaPK().getDetalleFacturaOferta()) == 9995) {
                    Productos vps1 = prfl.find(dbf.getDetalleFacturaPK().getProductoCodigo());
                    fa.setProductoNombre(vps1.getProductoNombre());
                } else {
                    vps = vppffl.obtenerProductoCodigo(dbf.getDetalleFacturaPK().getProductoCodigo(), programacodigo);
                    fa.setProductoNombre(vps.getProductoNombre());
                }

                fa.setOferta(ofertasFacadeLocal.find(dbf.getDetalleFacturaPK().getDetalleFacturaOferta()).getOfertaDescripcion());
                if (dbf.getDetalleFacturaPK().getProductoCodigo().length() > 4) {
                    try {
                        fa.setTipoCupon(vps.getDetalleEnvio());
                    } catch (Exception e) {
                        System.err.println(e.toString());
                    }

                } else {
                    fa.setTipoCupon('0');
                }

                fa.setOfertaCodigo(dbf.getDetalleFacturaPK().getDetalleFacturaOferta());
                fa.setProductoCodigo(dbf.getDetalleFacturaPK().getProductoCodigo());
                fa.setTotalConDescuento(dbf.getDetalleFacturaConDescuento());
                fa.setTotalSinDescuento(dbf.getDetalleFacturaSinDescuento());

                BigDecimal sd = null;
                BigDecimal cd = null;

                if (Integer.parseInt(dbf.getDetalleFacturaPK().getDetalleFacturaOferta()) >= 9995) {
                    sd = new BigDecimal("0.01");
                    cd = new BigDecimal("0.01");
                } else {
                    sd = vps.getPrecioProgramaSinDescuento();
                    cd = vps.getPrecioProgramaConDescuento();
                }
                fa.setUnidadConDescuento(cd);
                fa.setUnidadSinDescuento(sd);
                facturas.add(fa);
            }
            //this.habilitaImpresion = false;
            this.bloqueoBotonGuardar = true;
            this.bloqueoFactura = true;

            es.setFacturaCuerpo(facturas);

            imprimirFcturas.add(es);

        } catch (Exception e) {
            System.out.println(e.toString());
        }
        impresaFact = !facturagt.getFacturaImpresa();
        habilitaImpresion = facturagt.getFacturaImpresa();
    }

    public Integer obtenerCantidadDeProducto(String ofertaCodigo, String codigoProducto, int cantidadProducto) {

        Integer cantidadReturn = 0;
        List<DetalleOferta> ofertaLista = new ArrayList<>();
        List<ProductosResta> lr = new ArrayList<>();


        if (ofertaCodigo.equalsIgnoreCase("0000") || ofertaLista.isEmpty()) {
            cantidadReturn = cantidadProducto;
        } else {
            ofertaLista = detalleOfertaFacadeLocal.BusquedaPorOferta(ofertaCodigo);

            for (DetalleOferta f : ofertaLista) {

                ProductosucursalPK psPK = new ProductosucursalPK();
                psPK.setProductoCodigo(f.getDetalleOfertaPK().getProductoCodigo());
                psPK.setSucursalCodigo(sucursal.getSucursalDescarga());

                Productosucursal ps = new Productosucursal();
                ps = productosucursalFacadeLocal.find(psPK);

                ProductosResta p = new ProductosResta();
                p.setCantidadCodigo(String.valueOf(f.getOfertaCantidad()));
                p.setProductoCodigo(f.getDetalleOfertaPK().getProductoCodigo());
                p.setSucursalCodigo(sucursal.getSucursalDescarga());

                if (!productoSelect.getOfertaCodigo().equals(f.getDetalleOfertaPK().getProductoCodigo())) {

                    int cantidadNeta = ((Integer.parseInt(p.getCantidadCodigo()) * Integer.valueOf(cantidadProducto)));
                    System.err.println("Cantidad Neta " + cantidadNeta);
                    if (ps.getProductoSucursalExistenciaActual() > cantidadNeta) {
                        lr.add(p);
                        cantidadReturn = cantidadNeta;
                    }

                } else {

                    int cantidadNeta = ((Integer.parseInt(p.getCantidadCodigo()) * Integer.valueOf(getCantidadProducto()) + Integer.valueOf(getCantidadProducto())));
                    System.err.println("Cantidad Neta " + cantidadNeta);
                    if (ps.getProductoSucursalExistenciaActual() < cantidadNeta) {
                        lr.add(p);
                        cantidadReturn = cantidadNeta;
                    }
                }
            }
        }

        return cantidadReturn;
    }

    public void ajusteToFactura() {

        List<DetalleAjuste> dptf = ajusteLocal.detalleSalida(codigoPedido);

        List<FacturaCuerpo> conExisten = new ArrayList<>();
        List<FacturaCuerpo> sinExisten = new ArrayList<>();
        if (!facturas.isEmpty()) {
            for (FacturaCuerpo ci : facturas) {

                if (ci.getProductoCodigo().length() == 4) {
                    conExisten.add(ci);
                }

            }
        }

        facturas = new ArrayList<>();
        sinExistencias = new ArrayList<>();


        facturas.addAll(conExisten);
        for (DetalleAjuste d : dptf) {
            try {


                FacturaCuerpo fa = new FacturaCuerpo();
                VprecioProgramaF vps = new VprecioProgramaF();

                fa.setCantidadProducto(d.getDetalleAjusteCantidad());
                vps = vppffl.obtenerProductoCodigoAndOferta(d.getDetalleAjustePK().getProductoCodigo(), programacodigo, "0007");
                fa.setProductoNombre(vps.getProductoNombre()); //
                fa.setOferta("CIERRE DE AÑO 2020");


                fa.setOfertaCodigo("0007");
                fa.setProductoCodigo(d.getDetalleAjustePK().getProductoCodigo());
                fa.setTotalConDescuento(new BigDecimal(getDescuento()));
                fa.setTotalSinDescuento(new BigDecimal(getSubTotal()));

                fa.setUnidadConDescuento(vps.getPrecioProgramaConDescuento());
                fa.setUnidadSinDescuento(vps.getPrecioProgramaSinDescuento());

                fa.setTotalConDescuento(new BigDecimal(vps.getPrecioProgramaSinDescuento().doubleValue() * d.getDetalleAjusteCantidad()));
                fa.setTotalSinDescuento(new BigDecimal(vps.getPrecioProgramaSinDescuento().doubleValue() * d.getDetalleAjusteCantidad()));

                facturas.add(fa);
            } catch (Exception e) {
                System.err.println("error a pedidos1" + e.toString());
                System.err.println("error a pedidos1" + d.toString());
            }
        }

        if (sinExistencias.size() > 0) {

            PrimeFaces current = PrimeFaces.current();
            current.executeScript("PF('productoSinExistencia').show();");
        }


    }

    public void pedidosToFactura() {

        List<DetallePedidos> dptf = pfl.obtenerPedidoDetalle(codigoPedido);

        List<FacturaCuerpo> conExisten = new ArrayList<>();
        List<FacturaCuerpo> sinExisten = new ArrayList<>();
        if (!facturas.isEmpty()) {
            for (FacturaCuerpo ci : facturas) {

                if (ci.getProductoCodigo().length() == 4) {
                    conExisten.add(ci);
                }

            }
        }

        facturas = new ArrayList<>();
        sinExistencias = new ArrayList<>();


        facturas.addAll(conExisten);
        for (DetallePedidos d : dptf) {
            try {
                Boolean exstenciasProducto = sucursalesFacadeLocal.ExistenciasProductoFino(d.getDetallePedidosPK().getProductoCodigo(), d.getDetallePedidosPK().getOfertaDetallePedido(), sucursal.getSucursalDescarga(), d.getCantidad());

                FacturaCuerpo fa = new FacturaCuerpo();
                VprecioProgramaF vps = new VprecioProgramaF();
                fa.setCantidadProducto(d.getCantidad());
                vps = vppffl.obtenerProductoCodigoAndOferta(d.getDetallePedidosPK().getProductoCodigo(), programacodigo, d.getDetallePedidosPK().getOfertaDetallePedido());

                WcOfertaDescuento ofertaCountIn = new WcOfertaDescuento();
                boolean desconton = false;
                BigDecimal fatcd = new BigDecimal("0.00");

                try {
                    ofertaCountIn = wdodfl.obtenerProductoDesc(vps.getProductoCodigo(), vps.getProgramaCodigo());
                    if(ofertaCountIn.getOfertaCodigo() !=null){

                        if(d.getCantidad() >= ofertaCountIn.getDesde()){
                            desconton = true;

                            vps.setPrecioProgramaConDescuento(ofertaCountIn.getPrecioConDescuento());
                            vps.setOfertaCodigo(ofertaCountIn.getOfertaCodigo());
                            vps.setNombreOferta("Descuentos Especial!!");
                            BigDecimal fatcdt = new BigDecimal( ofertaCountIn.getPrecioConDescuento().doubleValue() * d.getCantidad());
                            fatcd = fatcdt.setScale(3, fatcdt.ROUND_HALF_DOWN);

                        }
                    }

                }catch (Exception e){

                }



                fa.setProductoNombre(vps.getProductoNombre()); //
                fa.setOferta(ofertasFacadeLocal.find(d.getDetallePedidosPK().getOfertaDetallePedido()).getOfertaDescripcion());
                if (d.getDetallePedidosPK().getProductoCodigo().length() > 4) {
                    fa.setTipoCupon(vps.getDetalleEnvio());
                } else {
                    fa.setTipoCupon('0');
                }



// aca error...................................................................................................................
                fa.setOfertaCodigo(d.getDetallePedidosPK().getOfertaDetallePedido());
                fa.setOferta(vps.getNombreOferta());
                fa.setProductoCodigo(d.getDetallePedidosPK().getProductoCodigo());
                if(desconton){
                    fa.setTotalConDescuento(fatcd);
                }else{
                    fa.setTotalConDescuento(d.getConDescuento());
                }
                fa.setTotalSinDescuento(d.getSinDescuentto());
                fa.setFoferta(vps.getFoferta());





                BigDecimal sd = null;
                BigDecimal cd = null;

                sd = vps.getPrecioProgramaSinDescuento();
                cd = vps.getPrecioProgramaConDescuento();

                if (consultorCodigol1058) {
                    cd = vps.getPrecioProgramaSinDescuento();
                    fa.setTotalConDescuento(d.getSinDescuentto());
                } else {
                    if(desconton){
                        fa.setTotalConDescuento(fatcd);
                    }else{
                        fa.setTotalConDescuento(d.getConDescuento());
                    }
                }

                fa.setUnidadConDescuento(cd);
                fa.setUnidadSinDescuento(sd);

                //fa.setTotalConDescuento(d.getConDescuento());
                fa.setTotalSinDescuento(d.getSinDescuentto());

                if (exstenciasProducto) {
                    facturas.add(fa);
                } else {
                    sinExistencias.add(fa);
                }
            } catch (Exception e) {
                System.err.println("error a pedidos1" + e.toString());
                System.err.println("error a pedidos1" + d.toString());
            }
        }

        if (sinExistencias.size() > 0) {

            PrimeFaces current = PrimeFaces.current();
            current.executeScript("PF('productoSinExistencia').show();");
        }


    }


    public List<FacturaCuerpo> callDetalles(Facturas f) {

        List<FacturaCuerpo> rs = new ArrayList<>();

        List<DetalleFactura> detalleFacturaBus = new ArrayList<>();
        detalleFacturaBus = detallefacturaDao.obtenerFacturas(f.getFacturasPK().getFacturaCodigo(), f.getFacturasPK().getFacturaSerie());

        for (DetalleFactura dbf : detalleFacturaBus) {
            FacturaCuerpo fa = new FacturaCuerpo();

            VprecioProgramaF vps = new VprecioProgramaF();

            fa.setCantidadProducto(Integer.valueOf(String.valueOf(dbf.getDetalleFacturaCantidad())));


            if (Integer.parseInt(dbf.getDetalleFacturaPK().getDetalleFacturaOferta()) == 9995) {
                fa.setProductoNombre(prfl.find(dbf.getDetalleFacturaPK().getProductoCodigo()).getProductoNombre());
            } else {
                vps = vppffl.obtenerProductoCodigoAndOferta(dbf.getDetalleFacturaPK().getProductoCodigo(), f.getProgramaCodigo(), dbf.getDetalleFacturaPK().getDetalleFacturaOferta());
                fa.setProductoNombre(vps.getProductoNombre()); //
            }

            fa.setOferta(ofertasFacadeLocal.find(dbf.getDetalleFacturaPK().getDetalleFacturaOferta()).getOfertaDescripcion());
            if (dbf.getDetalleFacturaPK().getProductoCodigo().length() > 4) {
                try {
                    fa.setTipoCupon(vps.getDetalleEnvio());

                } catch (Exception e) {
                    System.err.println(e.toString());
                    fa.setTipoCupon('0');
                }


            } else {
                fa.setTipoCupon('0');
            }

            fa.setOfertaCodigo(dbf.getDetalleFacturaPK().getDetalleFacturaOferta());
            fa.setProductoCodigo(dbf.getDetalleFacturaPK().getProductoCodigo());
            fa.setTotalConDescuento(dbf.getDetalleFacturaConDescuento());
            fa.setTotalSinDescuento(dbf.getDetalleFacturaSinDescuento());

            BigDecimal sd = null;
            BigDecimal cd = null;

            if (Integer.parseInt(dbf.getDetalleFacturaPK().getDetalleFacturaOferta()) >= 9995) {
                sd = new BigDecimal("0.01");
                cd = new BigDecimal("0.01");
            } else {
                sd = vps.getPrecioProgramaSinDescuento();
                cd = vps.getPrecioProgramaConDescuento();
            }
            fa.setUnidadConDescuento(cd);
            fa.setUnidadSinDescuento(sd);
            rs.add(fa);
        }

        return rs;
    }

    public void addMessage() {
        String msje;
        if (contado) {
            msje = "es Credito";
            // this.credito = false;
        } else {
            msje = "es Contado";
            // this.credito = true;
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(msje));
    }

    // insertar saldo consultor para validar
    public void obtenerConsultorDatos() throws JRException, IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        switch (consultorCodigo.length()) {


            //solo para factura Final
            case 5:
                Ajuste aju = ajusteLocal.obtenerAjustes(consultorCodigo);
                setCodigoPedido(aju.getAjusteCodigo());

                if (!aju.getAjusteCodigo().isEmpty()) {
                    PrimeFaces current = PrimeFaces.current();
                    current.executeScript("PF('cargarajuste').show();");
                    setConsultorCodigo("C00195");
                }

                facturas = new ArrayList<>();
                consultor = cdcffl.busquedaDato("C00195");
                consutorBlok = true;
                if (consultorCodigo.equalsIgnoreCase("M21085")) {
                    guardarNombreHugo();

                }
                guardarNombreHugo();

                if (consultor.getConsultorCodigo() != null) {

                    if (consultor.getConsultorEstado()) {
                        if (Integer.parseInt(consultor.getTerritorioCodigo()) > 0 && Integer.parseInt(consultor.getTerritorioCodigo()) < 91) {
                            tipoDoc = (consultor.isConsultorIva()) ? "03" : "01";
                            setContado(consultor.getConsultorTipoPago());
                            if (consultorCodigo.equalsIgnoreCase("L10058") || consultorCodigo.equalsIgnoreCase("M21085")) {
                                setConsultorCodigol1058(true);

                            } else {
                                setConsultorCodigol1058(false);
                            }
                            if (!consultor.isConsultorTipoPago()) {
                                context.addMessage(null, new FacesMessage("CONSULTOR CONTADO"));
                            }
                            setBloqueaBotonCredito(!getConsultor().getConsultorTipoPago());
                            prem = infoDePremios(consultor.getConsultorCodigo());
                            ObtenerPremioMes(consultor.getConsultorCodigo());
                        } else {
                            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "CONSULTOR INCORRECTO", "CREDITO CERRADO");
                            PrimeFaces.current().dialog().showMessageDynamic(message);
                        }
                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Consultor Inactivo", "Comuniquese Con departamento de Creditos");
                        enableText = true;
                        PrimeFaces.current().dialog().showMessageDynamic(message);
                    }
                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "CONSULTOR NO EXISTE", "CONSULTOR EQUIVOCADO");
                    PrimeFaces.current().dialog().showMessageDynamic(message);
                }

                break;

            //

            case 6:

                facturas = new ArrayList<>();
                consultor = cdcffl.busquedaDato(consultorCodigo);
                consutorBlok = true;

                if (consultor.getConsultorCodigo() != null) {

                    if (consultor.getConsultorEstado()) {
                        if (Integer.parseInt(consultor.getTerritorioCodigo()) > 0 && Integer.parseInt(consultor.getTerritorioCodigo()) < 91) {
                            tipoDoc = (consultor.isConsultorIva()) ? "03" : "01";
                            setContado(consultor.getConsultorTipoPago());
                            if (consultorCodigo.equalsIgnoreCase("l10058") || consultorCodigo.equalsIgnoreCase("M21085")) {
                                setConsultorCodigol1058(true);
                                //nombreHugo
                                if(consultorCodigo.equalsIgnoreCase("M21085")){
                                    guardarNombreHugo();
                                }
                            } else {
                                setConsultorCodigol1058(false);
                            }
                            if (!consultor.isConsultorTipoPago()) {
                                context.addMessage(null, new FacesMessage("CONSULTOR CONTADO"));
                            }
                            setBloqueaBotonCredito(!getConsultor().getConsultorTipoPago());
                            prem = infoDePremios(consultor.getConsultorCodigo());
                            ObtenerPremioMes(consultor.getConsultorCodigo());
                        } else {
                            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "CONSULTOR INCORRECTO", "CREDITO CERRADO");
                            PrimeFaces.current().dialog().showMessageDynamic(message);
                        }
                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Consultor Inactivo", "Comuniquese Con departamento de Creditos");
                        enableText = true;
                        PrimeFaces.current().dialog().showMessageDynamic(message);
                    }
                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "CONSULTOR NO EXISTE", "CONSULTOR EQUIVOCADO");
                    PrimeFaces.current().dialog().showMessageDynamic(message);
                }

                break;
            case 8:
                Pedidos p = pfl.obtenerPedido(consultorCodigo);
                VProcesodepedidos vp = new VProcesodepedidos();
                vp = vprofl.busquedaPedidoCodigo(p);
                setPedidoSe(p);

                setCodigoPedido(consultorCodigo);

                if (!p.getConsultorCodigo().isEmpty()) {
                    PrimeFaces current = PrimeFaces.current();
                    current.executeScript("PF('cargarpedidos').show();");
                    setConsultorCodigo(p.getConsultorCodigo());
                }

                if (vp.getTipoReparto() == 2 || vp.getTipoReparto() == 4 ) {
                    caex = true;
                    if (vp.getTipoReparto() == 4){
                        cxc = true;
                    }
                }

                facturas = new ArrayList<>();

                if (!Objects.isNull(p.getConsultorCodigo()) && !vp.getDespachadoB()) {
                    consultor = cdcffl.busquedaDato(p.getConsultorCodigo());
                    setConsultorCodigo(p.getConsultorCodigo());
                    if (!Objects.isNull(consultor)) {

                        if (consultor.getConsultorEstado()) {
                            if (Integer.parseInt(consultor.getTerritorioCodigo()) > 0 && Integer.parseInt(consultor.getTerritorioCodigo()) < 91) {
                                tipoDoc = (consultor.isConsultorIva()) ? "03" : "01";
                                setContado(consultor.getConsultorTipoPago());
                                if (consultorCodigo.equalsIgnoreCase("l10058") || consultorCodigo.equalsIgnoreCase("M21085")) {
                                    setConsultorCodigol1058(true);

                                    if (consultorCodigo.equalsIgnoreCase("M21085")) {
                                        guardarNombreHugo();
                                    }


                                } else {
                                    setConsultorCodigol1058(false);
                                }
                                if (!consultor.isConsultorTipoPago()) {
                                    context.addMessage(null, new FacesMessage("CONSULTOR CONTADO"));
                                }

                                setBloqueaBotonCredito(!getConsultor().getConsultorTipoPago());
                                prem = infoDePremios(consultor.getConsultorCodigo());
                                ObtenerPremioMes(consultor.getConsultorCodigo());

                                PrimeFaces current = PrimeFaces.current();
                                current.executeScript("PF('cargarpedidos').show();");

                            } else {
                                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "CONSULTOR INCORRECTO", "CREDITO CERRADO");
                                PrimeFaces.current().dialog().showMessageDynamic(message);
                            }
                        } else {
                            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Consultor Inactivo", "Comuniquese Con departamento de Creditos");
                            enableText = true;
                            PrimeFaces.current().dialog().showMessageDynamic(message);
                        }
                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "CONSULTOR NO EXISTE", "CONSULTOR EQUIVOCADO");
                        PrimeFaces.current().dialog().showMessageDynamic(message);
                    }
                } else {
                    PrimeFaces current = PrimeFaces.current();
                    current.executeScript("PF('pedidoFacturado').show();");
                }
                consutorBlok = true;

                break;

            default:
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Codigo Incorrecto", "Codigo Mal Digitado");
                PrimeFaces.current().dialog().showMessageDynamic(message);
                break;
        }
    }


    private VConsultorpremio infoDePremios(String consultorCodigoIn) {
        obtenerPrograma objP = new obtenerPrograma();
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        String annio;
        if (c.get(Calendar.MONTH) == 0) {
            annio = Integer.toString(c.get(Calendar.YEAR) - 1);
        } else {
            annio = Integer.toString(c.get(Calendar.YEAR));
        }

        String mesAs = objP.ProgramaAnteriorByCodigoProgramaNumero(programacodigo);
        String fechaInicio = annio + "-" + mesAs + "-" + "01";
        String fechaUltimo = annio + "-" + mesAs + "-" + "28";

        VConsultorpremio prems = new VConsultorpremio();
        prems = vcpfl.findCallProPremios(consultorCodigoIn, fechaInicio, fechaUltimo, objP.ProgramaAnteriorByCodigoPrograma(getProgramacodigo()));
        return prems;
    }

    private void ObtenerPremioMes(String consultorCodigoIn) {
        Premios premio = new Premios();
        List<FacturaCuerpo> premios = new ArrayList<>();
        premiosExistenciasDs = vcpfl.validaExistenciaPremios(prem.getCodigoPremio(), sucursal.getSucursalCodigo());
        if (premiosExistenciasDs && !prem.getCodigoPremio().equals("000")) {
            if (!prem.getPremioEntregado() || !consultorCodigoIn.equalsIgnoreCase("L10058") || !consultorCodigoIn.equalsIgnoreCase("M21085")) {

                if (prem.getPremioAutorizado()) {
                    premio = premiosDao.findPremioByCodigo(prem.getCodigoPremioAutorizado());
                    entregaPremioPrograma = premio.getPremiosPK().getProgramaCodigo();
                    List<Productosucursal> arti = articuloSalaFacade.ObtenerArticulos(prem.getCodigoPremioAutorizado(), getSucursal().getSucursalCodigo());
                    premios = ListaPremios(arti, premio);
                    premiob = true;

                } else if (!consultor.isConsultorTipoPago()) {
                    premio = premiosDao.findPremioByCodigo(prem.getCodigoPremio());
                    entregaPremioPrograma = premio.getPremiosPK().getProgramaCodigo();
                    List<Productosucursal> arti = articuloSalaFacade.ObtenerArticulos(prem.getCodigoPremioAutorizado(), getSucursal().getSucursalCodigo());
                    premios = ListaPremios(arti, premio);
                    premiob = true;
                } else if ((prem.getCargos().doubleValue() <= 0.05 && prem.getDiasPago() <= gen.getDiaspremio())) {
                    premio = premiosDao.findPremioByCodigo(prem.getCodigoPremio());
                    entregaPremioPrograma = premio.getPremiosPK().getProgramaCodigo();
                    List<Productosucursal> arti = articuloSalaFacade.ObtenerArticulos(prem.getCodigoPremioAutorizado(), getSucursal().getSucursalCodigo());
                    premios = ListaPremios(arti, premio);
                    premiob = true;
                }
            }
            premioEntregar.addAll(premios);
        }
    }

    private List<FacturaCuerpo> ListaPremios(List<Productosucursal> arti, Premios premio) {
        boolean prems = true;
        List<FacturaCuerpo> premios = new ArrayList<>();
        for (Productosucursal as : arti) {

            if (as.getProductoSucursalExistenciaActual() <= 0) {
                prems = false;
            }
        }

        if (prems) {

            try {
                entregaPremioPrograma = premio.getPremiosPK().getProgramaCodigo();
                List<DetallePremio> dtpl = detallePremioDao.detallePremio(premio.getPremiosPK().getPremioCodigo());
                nombrePremio = premio.getPremioNombre();

                for (DetallePremio d : dtpl) {


                    Productos vps = new Productos();

                    vps = prfl.find(d.getDetallePremioPK().getArticuloCodigo());


                    FacturaCuerpo fa = new FacturaCuerpo();
                    fa.setProductoCodigo(vps.getProductoCodigo());
                    fa.setProductoNombre(vps.getProductoNombre());
                    fa.setOferta("Premio del Programa " + premio.getPremiosPK().getProgramaCodigo());
                    fa.setOfertaCodigo("9995");
                    fa.setCantidadProducto((int) d.getDetallePremioCantidad());

                    BigDecimal totlConDes = new BigDecimal(0.01 * d.getDetallePremioCantidad());
                    BigDecimal totlConDesO = totlConDes.setScale(3, totlConDes.ROUND_HALF_DOWN);

                    BigDecimal totlSinDes = new BigDecimal(0.01 * d.getDetallePremioCantidad());
                    BigDecimal totlSinDesO = totlSinDes.setScale(2, totlSinDes.ROUND_HALF_DOWN);

                    fa.setTotalConDescuento(totlConDesO);
                    fa.setTotalSinDescuento(totlSinDesO);
                    fa.setUnidadConDescuento(BigDecimal.valueOf(00.00));
                    fa.setUnidadSinDescuento(BigDecimal.valueOf(00.00));
                    premios.add(fa);
                }

            } catch (Exception e) {
                premios = new ArrayList<>();
            }
        }

        return premios;
    }

    //---------------------------------Fin Veriricador de Premios-----------------------------//
    public void repartoO() {

        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        Map<String, Object> sessionMap = externalContext.getSessionMap();
        sessionMap.put("reparto", reparto);

    }

    public void actualizaSelect() {

        System.out.println("actualiza");
    }

    public void cambiarProgramaFactura(String cos) {

        this.programa = cos;
        this.programacodigo = cos;

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("PROGRAMA", "Programa Cambiado " + cos));
    }

    public void actualizaSelectDoc() {

        switch (tipoDoc) {

            case "01":
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("FCF", "Factura Consumidor Final"));
                break;
            case "03":
                ConsultoresCcf coF = new ConsultoresCcf();
                coF = cccfl.find(consultor.getConsultorCodigo());

                if (coF.getNrc().length() > 2 && !coF.getNrc().equals("0000000")) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("CCF", "Credito Fiscal"));
                } else {
                    enableText = true;
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("SIN NRC", "No posee registro fiscal"));
                }

                break;
            default:
                break;
        }


    }

    public void addMessage(FacesMessage.Severity severity, String summary, String detail) {
        FacesContext.getCurrentInstance().
                addMessage(null, new FacesMessage(severity, summary, detail));
    }

    public bfactura() {
    }

}