/*
 * 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.pedidos;

import com.cosmodas.EntCosmos.*;
import com.cosmodas.FacadeCosmos.*;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.commons.io.FileUtils;
import org.primefaces.PrimeFaces;

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

    @EJB
    private VprecioProgramaFFacadeLocal vppffl;
    @EJB
    private DatosCosultoresCompletosFacadeLocal dccfl;
    @EJB
    private RutaRepartoFacadeLocal rrfl;
    @EJB
    private PedidosFacadeLocal pedfl;
    @EJB
    private DetallePedidosFacadeLocal depedfl;
    @EJB
    private ProcesoDePedidosFacadeLocal propeddfl;
    @EJB
    private TerritoriosFacadeLocal terfl;
    @EJB
    private VProcesodepedidosFacadeLocal vprofl;
    @EJB
    private ConsultoresFacadeLocal cflo;
    @EJB
    private SucursalesFacadeLocal sfl;
    @EJB
    private ProductosFacadeLocal proFl;
    @EJB
    private OfertasFacadeLocal ofFl;
    @EJB
    private WcUsuariosFacadeLocal ufl;
    @EJB
    private GeneralesFacadeLocal gfl;
    @EJB
    private TerritoriosFacadeLocal tfl;
    @EJB
    private ConsultoresDatosRepartoDaoLocal cdrdl;


    private List<VProcesodepedidos> pedidosDespacho, pedidosLiberar;
    private String archiNuevoPdf;
    private Consultores consultorSelect;
    private JasperPrint jasperPrint;
    private Boolean despacho;
    private DatosCosultoresCompletos consultorCodigoSelect;
    private List<Territorios> territorios;
    private String programaCodigo;
    private ExternalContext exc;
    private String sucursaleCambio;
    private String tipoPedidoOut;
    private VProcesodepedidos vsecl;
    private boolean todosPedidos;
    private boolean despaRepart;
    private int formasPedido;
    private int tipoPedidoPedido;
    private List<CuerpoPedido> detallePedidoSelect;
    private VProcesodepedidos pedidoSelect;
    private List<String> tipoPedido;
    private Date fechaEntregas;
    private String observaciones;
    private boolean reparto;
    private boolean credito;
    private List<Sucursales> sucursales;
    private List<RutaReparto> rutas;
    private String correlativoReparto;
    private int tipoReparto;
    private String productoCodigo;
    private VprecioProgramaF producto;
    private List<VprecioProgramaF> productos;
    private String cantidadString;
    private List<VprecioProgramaF> ofertas;
    private boolean validaListaOfertas;
    private String nombreProducto;
    private VprecioProgramaF oferta;
    private CuerpoPedido pedido;
    private Integer cantidad;
    private String sucursalAnterior;



    @Inject
    private WcUsuarios usuario;
    @Inject
    private Sucursales sucursal;
    @Inject
    private Territorios territorio;
    @Inject
    private VProcesodepedidos despachoPreparcionSele, pedidoSel2, pedidoSel;
    @Inject
    private ConsultoresDatosReparto datosRepartoSelec;

    public ConsultoresDatosReparto getDatosRepartoSelec() {
        return datosRepartoSelec;
    }

    public void setDatosRepartoSelec(ConsultoresDatosReparto datosRepartoSelec) {
        this.datosRepartoSelec = datosRepartoSelec;
    }

    public List<VProcesodepedidos> getPedidosLiberar() {
        return pedidosLiberar;
    }

    public void setPedidosLiberar(List<VProcesodepedidos> pedidosLiberar) {
        this.pedidosLiberar = pedidosLiberar;
    }

    public String getSucursalAnterior() {
        return sucursalAnterior;
    }

    public void setSucursalAnterior(String sucursalAnterior) {
        this.sucursalAnterior = sucursalAnterior;
    }

    public CuerpoPedido getPedido() {
        return pedido;
    }

    public void setPedido(CuerpoPedido pedido) {
        this.pedido = pedido;
    }

    public Integer getCantidad() {
        return cantidad;
    }

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

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

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

    public boolean isValidaListaOfertas() {
        return validaListaOfertas;
    }

    public void setValidaListaOfertas(boolean validaListaOfertas) {
        this.validaListaOfertas = validaListaOfertas;
    }

    public String getNombreProducto() {
        return nombreProducto;
    }

    public void setNombreProducto(String nombreProducto) {
        this.nombreProducto = nombreProducto;
    }

    public VprecioProgramaF getOferta() {
        return oferta;
    }

    public void setOferta(VprecioProgramaF oferta) {
        this.oferta = oferta;
    }

    public String getCorrelativoReparto() {
        return correlativoReparto;
    }

    public void setCorrelativoReparto(String correlativoReparto) {
        this.correlativoReparto = correlativoReparto;
    }

    public int getTipoReparto() {
        return tipoReparto;
    }

    public void setTipoReparto(int tipoReparto) {
        this.tipoReparto = tipoReparto;
    }

    public List<RutaReparto> getRutas() {
        return rutas;
    }

    public void setRutas(List<RutaReparto> rutas) {
        this.rutas = rutas;
    }

    public boolean isReparto() {
        return reparto;
    }

    public void setReparto(boolean reparto) {
        this.reparto = reparto;
    }

    public boolean isCredito() {
        return credito;
    }

    public void setCredito(boolean credito) {
        this.credito = credito;
    }

    public List<Sucursales> getSucursales() {
        return sucursales;
    }

    public void setSucursales(List<Sucursales> sucursales) {
        this.sucursales = sucursales;
    }

    public List<CuerpoPedido> getDetallePedidoSelect() {
        return detallePedidoSelect;
    }

    public void setDetallePedidoSelect(List<CuerpoPedido> detallePedidoSelect) {
        this.detallePedidoSelect = detallePedidoSelect;
    }

    public VProcesodepedidos getPedidoSelect() {
        return pedidoSelect;
    }

    public void setPedidoSelect(VProcesodepedidos pedidoSelect) {
        this.pedidoSelect = pedidoSelect;
    }

    public Date getFechaEntregas() {
        return fechaEntregas;
    }

    public void setFechaEntregas(Date fechaEntregas) {
        this.fechaEntregas = fechaEntregas;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public VProcesodepedidos getPedidoSel2() {
        return pedidoSel2;
    }

    public void setPedidoSel2(VProcesodepedidos pedidoSel2) {
        this.pedidoSel2 = pedidoSel2;
    }

    public String getTipoPedidoOut() {
        return tipoPedidoOut;
    }

    public void setTipoPedidoOut(String tipoPedidoOut) {
        this.tipoPedidoOut = tipoPedidoOut;
    }

    public int getTipoPedidoPedido() {
        return tipoPedidoPedido;
    }

    public void setTipoPedidoPedido(int tipoPedidoPedido) {
        this.tipoPedidoPedido = tipoPedidoPedido;
    }

    public int getFormasPedido() {
        return formasPedido;
    }

    public void setFormasPedido(int formasPedido) {
        this.formasPedido = formasPedido;
    }

    public boolean isTodosPedidos() {
        return todosPedidos;
    }

    public void setTodosPedidos(boolean todosPedidos) {
        this.todosPedidos = todosPedidos;
    }

    public boolean isDespaRepart() {
        return despaRepart;
    }

    public void setDespaRepart(boolean despaRepart) {
        this.despaRepart = despaRepart;
    }

    public List<String> getTipoPedido() {
        return tipoPedido;
    }

    public void setTipoPedido(List<String> tipoPedido) {
        this.tipoPedido = tipoPedido;
    }

    public Territorios getTerritorio() {
        return territorio;
    }

    public void setTerritorio(Territorios territorio) {
        this.territorio = territorio;
    }

    public WcUsuarios getUsuario() {
        return usuario;
    }

    public void setUsuario(WcUsuarios usuario) {
        this.usuario = usuario;
    }

    public Sucursales getSucursal() {
        return sucursal;
    }

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

    public String getProgramaCodigo() {
        return programaCodigo;
    }

    public void setProgramaCodigo(String programaCodigo) {
        this.programaCodigo = programaCodigo;
    }

    public List<VProcesodepedidos> getPedidosDespacho() {
        return pedidosDespacho;
    }

    public void setPedidosDespacho(List<VProcesodepedidos> pedidosDespacho) {
        this.pedidosDespacho = pedidosDespacho;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

    public void setArchiNuevoPdf(String archiNuevoPdf) {
        this.archiNuevoPdf = archiNuevoPdf;
    }

    public Consultores getConsultorSelect() {
        return consultorSelect;
    }

    public void setConsultorSelect(Consultores consultorSelect) {
        this.consultorSelect = consultorSelect;
    }

    public VProcesodepedidos getDespachoPreparcionSele() {
        return despachoPreparcionSele;
    }

    public void setDespachoPreparcionSele(VProcesodepedidos despachoPreparcionSele) {
        this.despachoPreparcionSele = despachoPreparcionSele;
    }

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

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

    public VProcesodepedidos getPedidoSel() {
        return pedidoSel;
    }

    public void setPedidoSel(VProcesodepedidos pedidoSel) {
        editaPedido(pedidoSel);
        this.sucursalAnterior = pedidoSel.getSucursal();
        this.pedidoSel = pedidoSel;

    }

    public Boolean getDespacho() {
        return despacho;
    }

    public void setDespacho(Boolean despacho) {
        this.despacho = despacho;
    }

    public DatosCosultoresCompletos getConsultorCodigoSelect() {
        return consultorCodigoSelect;
    }

    public void setConsultorCodigoSelect(DatosCosultoresCompletos consultorCodigoSelect) {
        this.consultorCodigoSelect = consultorCodigoSelect;
    }

    public List<Territorios> getTerritorios() {
        return territorios;
    }

    public void setTerritorios(List<Territorios> territorios) {
        this.territorios = territorios;
    }

    public bResultadosPedidos() {
    }

    public String getSucursaleCambio() {
        return sucursaleCambio;
    }

    public void setSucursaleCambio(String sucursaleCambio) {
        this.sucursaleCambio = sucursaleCambio;
    }

    public VProcesodepedidos getVsecl() {
        return vsecl;
    }

    public void setVsecl(VProcesodepedidos vsecl) {
        this.vsecl = vsecl;
    }

    public String validaReparto(Boolean i) {

        if (i) {
            return "Reparto";
        } else {
            return "Despacho";
        }

    }

    public String getProductoCodigo() {
        return productoCodigo;
    }

    public void setProductoCodigo(String productoCodigo) {
        this.productoCodigo = productoCodigo;
    }

    public VprecioProgramaF getProducto() {
        return producto;
    }

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

    public List<VprecioProgramaF> getProductos() {
        return productos;
    }

    public void setProductos(List<VprecioProgramaF> productos) {
        this.productos = productos;
    }

    public String getCantidadString() {
        return cantidadString;
    }

    public void setCantidadString(String cantidadString) {
        if (cantidadString.isEmpty()) {
        } else {
            setCantidad(Integer.parseInt(cantidadString));
        }
        this.cantidadString = cantidadString;
    }

    public boolean validaEdicion(VProcesodepedidos pedido) {

        boolean rs = false;

        return rs;
    }

    public void obtenerPedidos() {
        this.pedidosDespacho = new ArrayList<>();
        List<VProcesodepedidos> pedidos = new ArrayList<>();
        List<String> territoriosBa = obtenerTerritorio(usuario);

        for (String t : territoriosBa) {

            try {

                if (todosPedidos) {
                    pedidos.addAll(propeddfl.ObtenerProcesoPedidosRep(t, getProgramaCodigo())); //pedidos.addAll(propeddfl.ObtenerProcesoPedidosDes(selectTerritorio[i], 0, sucCod));
                } else {

                    List<VProcesodepedidos> rso = new ArrayList<>();
                    List<VProcesodepedidos> rso2 = new ArrayList<>();
                    rso = propeddfl.ObtenerProcesoPedidosRep(t, getProgramaCodigo());

                    for (VProcesodepedidos vo : rso) {

                        if (vo.getPedidoReparto() && despaRepart) {
                            rso2.add(vo);
                        } else if (!vo.getPedidoReparto() && !despaRepart) {

                            rso2.add(vo);
                        }
                    }

                    pedidos.addAll(rso2);
                }

            } catch (Exception e) {
            }
        }

        if (tipoPedidoPedido == 0) {
            pedidosDespacho = pedidos;
        } else {
            //pedidosDespacho = pedidos;
            List<VProcesodepedidos> rsout1 = new ArrayList<>();
            for (VProcesodepedidos vp : pedidos) {
                if (vp.getTipoPedido().equals(tipoPedidoOut)) {
                    rsout1.add(vp);
                }
            }

            pedidosDespacho = rsout1;
        }

    }

    public String obtenerSaldo(String cosultorCodigo){

        String rs = "0.00";

        try{
           rs = obtenerConDecimalesBien(cflo.obtenerCargosConsultor(cosultorCodigo)).toString();
        }catch (Exception e){
            System.err.println(e.toString());
        }
        return rs;
    }

    public void soloActulu() {

        System.out.println(observaciones);
    }


    public void actualizaPedidos() {
        switch (formasPedido) {

            case 0:
                todosPedidos = true;
                break;
            case 1:
                todosPedidos = false;
                despaRepart = false;
                break;
            case 2:
                todosPedidos = false;
                despaRepart = true;
                break;
            default:
                break;
        }

        switch (tipoPedidoPedido) {

            case 0:
                tipoPedidoOut = "TODOS";
                break;
            case 1:
                tipoPedidoOut = "FISICO";
                break;
            case 2:
                tipoPedidoOut = "DIGITAL";
                break;
            case 3:
                tipoPedidoOut = "APP";
                break;
            default:
                break;
        }

        obtenerPedidos();
    }

    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 agregarALista(VProcesodepedidos per){

        pedidosLiberar.add(per);
    }


    public void liberarPedidosLista(List<VProcesodepedidos> li){

        for (VProcesodepedidos pro : li){
                propeddfl.liberarPedidos(pro.getNumeroPedido(),pro.getTerritorio());
        }
        pedidosLiberar = new ArrayList<>();
        actualizaPedidos();
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Liberados ", li.size()+" Pedidos Liberados"));
    }

    public boolean pedidosLiberaDis(){

        return pedidosLiberar.size() == 0;

    }


    public void liberarPedidos(VProcesodepedidos v){

        propeddfl.liberarPedidos(v.getNumeroPedido(),v.getTerritorio());

        actualizaPedidos();
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Liberado ", "Pedidos Liberado!!"));
    }

    private List<String> obtenerTerritorio(WcUsuarios u) {
        List<String> rs = new ArrayList<>();

        if (u.getGrupoUsuario().getTipoGruposUsuarios()) {

            String rs1 = "00";
            rs.add(rs1);
        } else {
            if (u.getGrupoUsuario().getIdGruposUsuarios() == 9) {
                String rs1 = u.getUsuarioNombre().substring(1);
                System.out.println("terr " + rs1);

                rs.add(rs1);
            } else {
                List<Territorios> f = new ArrayList<>();
                f = tfl.TerritorioPorSucursal(getUsuario().getSucursal());
                for (Territorios e : f) {
                    rs.add(e.getCodigoTerritorio());
                }
            }

        }

        return rs;
    }

    @PostConstruct
    public void init() {
        exc = FacesContext.getCurrentInstance().getExternalContext();
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        //  ompp = exc.getSessionMap().get("ompp").toString();
        //  this.territorios = terfl.TerritorioPorSucursal(sucursal.getSucursalCodigo());
        this.pedidosDespacho = new ArrayList();
        this.pedidoSel = new VProcesodepedidos();
        this.consultorCodigoSelect = new DatosCosultoresCompletos();
        this.consultorSelect = new Consultores();
        this.despacho = false;
        this.sucursales = sfl.findAll();
        this.tipoPedido = new ArrayList<>();
        this.rutas = new ArrayList<>();
        this.todosPedidos = true;
        this.despaRepart = false;
        this.programaCodigo = gfl.findAll().get(0).getPrograma();
        this.cantidad = 0;
        this.cantidadString = new String();
        this.pedidosLiberar = new ArrayList<>();
        this.detallePedidoSelect = new ArrayList<>();
        this.datosRepartoSelec = new ConsultoresDatosReparto();

        tipoPedido.add("FISICO");
        tipoPedido.add("DIGITAL");
        tipoPedido.add("APP");

        actualizaPedidos();
    }

    public String sucursalDespacha(String su) {
        String rs = "";

        rs = "FACT. DESDE: " + sfl.find(su).getSalaNombre();

        return rs;

    }

    public String obtenerNombre(String codigo) {
        String rs = cflo.ObtenerNombreCompleto(codigo);
        ;
        return rs;
    }

    public String validaEstado(int input) {

        String rs = "No Revisado";

        switch (input) {

            case 0:
                rs = "NO REVISADO";
                break;
            case 1:
                rs = "CREDITO";
                break;
            case 2:
                rs = "CONTADO";
                break;
            case 3:
                rs = "DENEGADO";
                break;
            default:
                break;

        }

        return rs;
    }

    public String alarmaPedidos() {
        String ruta = null;
        try {
            for (VProcesodepedidos p : getPedidosDespacho()) {

                if (!p.getInicioFacturacionB()) {
                    ruta = "./../sonidos/alarma.mp3";
                }

            }

        } catch (Exception e) {
        }

        return ruta;
    }

    public long diferenciasFecha(VProcesodepedidos p, String unidad) {
        try {
            TimeUnit timeUnit = TimeUnit.SECONDS;
            if (unidad.equalsIgnoreCase("min")) {
                timeUnit = TimeUnit.MINUTES;
            }
            Date d = new Date();
            Date df = new Date();

            if (p.getAprobado() > 1) {
                d = p.getTiempoAprobado();
            }

            if (p.getInicioFacturacionB()) {
                d = p.getInicioFacturacion();
            }
            if (p.getDespachadoB()) {
                d = p.getTiempoAprobado();
                df = p.getDespachado();

            }

            long diffInMillies = df.getTime() - d.getTime();
            return timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            return 0;
        }

    }

    public String validaStatus(VProcesodepedidos p) {

        String rs = "en aprobacion";

        if (p.getAprobado() > 0) {
            rs = "Aprobado";
        }
        if (p.getInicioFacturacionB()) {
            rs = "En Preparacion";
        }
        if (p.getDespachadoB()) {
            rs = "Facturado";
        }

        return rs;
    }

    public String validaStatusColor(VProcesodepedidos p) {

        String rs = "red";

        if (p.getAprobado() > 0) {
            rs = "tomato";
        }
        if (p.getInicioFacturacionB()) {
            rs = "orange";
        }
        if (p.getDespachadoB()) {
            rs = "green";
        }

        return rs;
    }

    public Boolean validaStatusMo(VProcesodepedidos p) {

        Boolean rs = false;

        if (p.getDespachadoB()) {
            rs = true;
        }

        return rs;
    }

    public String validaEstado(boolean aprobado, boolean inicioFacturacion, boolean facturado) {
        String rs = "sin aprobar";

        if (aprobado && !inicioFacturacion && !facturado) {
            rs = "Aprobado, en espera de preparacion";
        } else if (aprobado && inicioFacturacion && !facturado) {
            rs = "pedido En preparacion";
        } else if (aprobado && inicioFacturacion && facturado) {
            rs = "Pedido Facturado";
        }

        return rs;
    }

    public String pedidoNoLeido(boolean pedidosColor) {

        if (pedidosColor) {
            return "green";
        } else {
            return "red";
        }

    }

    public String busquedaUsuario(String codigoUsuario) {
        try {
            return ufl.find(codigoUsuario).getNombreEmpleado();
        } catch (Exception e) {
            return "Sin Autorizar";
        }

    }

    public String paletaColores(String color) {

        String rs = "";
        switch (color) {

            case "AMARRILO":
                rs = "#F8F802";
                break;
            case "AZUL":
                rs = "#2E64FE";
                break;
            case "CAFE":
                rs = "#964747";
                break;
            case "CELESTE":
                rs = "#67ACF1";
                break;
            case "FUCSIA":
                rs = "#F60CCB";
                break;
            case "MORADO":
                rs = "#A90CDF";
                break;
            case "NARANJA":
                rs = "#FA6502";
                break;
            case "ROSADA":
                rs = "#F5A9BC";
                break;
            case "S/COLOR":
                rs = "";
                break;
            case "VERDE":
                rs = "#04B431";
                break;
            default:
                break;

        }

        return rs;
    }

    public void soloactualizaXD() {

        if(pedidoSel.getTipoReparto() > 0){
            pedidoSel.setPedidoReparto(true);
        }

        System.out.println("Derechos reservados Marlen Lamur");
        rutas = rrfl.rutaRepartoListasAndTipo(pedidoSel.getTerritorio(), pedidoSel.getTipoReparto());
    }

    public boolean validaZonaReparto(VProcesodepedidos pedido) {
        boolean rs = false;

        try {
            if (pedido.getTipoReparto() == 4) {
                rs = true;
            }
        } catch (Exception e) {
            System.out.println("error de gajes");
        }
        return rs;
    }


    public boolean validaDirReparto(VProcesodepedidos pedido) {
        boolean rs = false;

        try {
            if (pedido.getTipoReparto() == 2) {
                rs = true;
            }
            if (pedido.getTipoReparto() == 4) {
                rs = true;
            }
        } catch (Exception e) {
            System.out.println("error de gajes");
        }


        return rs;
    }

    public String totalSinDescuentoEdit() {
        Double rsd = 0.0;

        for (CuerpoPedido dp : detallePedidoSelect) {
            rsd = rsd + dp.getTotalSinDescuento();
        }

        BigDecimal rsBD = new BigDecimal(rsd);
        BigDecimal rsBDU = rsBD.setScale(2, rsBD.ROUND_HALF_DOWN);

        return rsBDU.toString();
    }

    public String totalConDescuentoEdit() {
        Double rsd = 0.0;

        for (CuerpoPedido dp : detallePedidoSelect) {
            rsd = rsd + dp.getTotalConDescuento();
        }

        BigDecimal rsBD = new BigDecimal(rsd);

        BigDecimal rsBDU = rsBD.setScale(2, rsBD.ROUND_HALF_DOWN);
        return rsBDU.toString();
    }


    public void editarPedido() {

        Pedidos pedido = new Pedidos();


    }

    public void editaPedido(VProcesodepedidos pedido) {
        List<DetallePedidos> dpl = depedfl.ObtenerDetallePedido(pedido.getTerritorio(), pedido.getNumeroPedido());
        List<CuerpoPedido> cue = new ArrayList<>();
        detallePedidoSelect = new ArrayList<>();
        datosRepartoSelec = cdrdl.find(pedido.getConsultorCodigo());

        for (DetallePedidos dp : dpl) {

            String prodCodE = dp.getDetallePedidosPK().getProductoCodigo();
            String prodOferE = dp.getDetallePedidosPK().getOfertaDetallePedido();
            try {
                VprecioProgramaF produc = vppffl.obtenerProductoCodigoAndOferta(dp.getDetallePedidosPK().getProductoCodigo(), pedido.getProgramaCodigo(), dp.getDetallePedidosPK().getOfertaDetallePedido());
                CuerpoPedido cp = new CuerpoPedido();

                cp.setCantidad(dp.getCantidad());
                cp.setProductoCodigo(dp.getDetallePedidosPK().getProductoCodigo());
                cp.setProductoPrecioConDescuento(produc.getPrecioProgramaConDescuento().doubleValue());
                cp.setProductoPrecioSinDescuento(produc.getPrecioProgramaSinDescuento().doubleValue());
                cp.setProdutoOferta(produc.getNombreOferta());
                cp.setProductoNombre(produc.getProductoNombre());
                cp.setProdutoOfertaCodigo(produc.getOfertaCodigo());
                cp.setTotalConDescuento(dp.getConDescuento().doubleValue());
                cp.setTotalSinDescuento(dp.getSinDescuentto().doubleValue());

                cue.add(cp);
            } catch (Exception e) {
                System.out.println(dp.getDetallePedidosPK().toString());
                System.out.println(dp.getDetallePedidosPK().toString());
                // System.err.println(e);
            }
        }
        detallePedidoSelect = cue;
        rutas = rrfl.rutaRepartoListasAndTipo(pedido.getTerritorio(), pedido.getTipoReparto());
    }

    public void mensajes(String tipo) {
        String summary = "";

        if (tipo.equals("tipoPago")) {
            summary = pedidoSelect.getPedidoReparto() ? "Credito" : "Contado";
        } else if (tipo.equals("tipoDespacho")) {

            if (!pedidoSelect.getPedidoReparto()) {
                summary = "Despacho";
            } else {
                summary = "Reparto";
                // sucursal = sfl.find("02");

            }
        }

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(summary));
    }

    public void ZonaTipoReparto(VProcesodepedidos v) {
        rutas = rrfl.rutaRepartoListasAndTipo(v.getTerritorio(), getTipoPedidoPedido());
    }

    public void fillReportSalas(VProcesodepedidos p) throws JRException {

        List<CuerpoPedido> dcp = new ArrayList<>();

        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy hh:mm a");

        List<DetallePedidos> detp = new ArrayList<>();

        detp = depedfl.ObtenerDetallePedido(p.getTerritorio(), p.getNumeroPedido());

        for (DetallePedidos cp : detp) {

            CuerpoPedido dpp = new CuerpoPedido();

            dpp.setCantidad(cp.getCantidad());
            dpp.setProductoCodigo(cp.getDetallePedidosPK().getProductoCodigo());
            dpp.setProductoPrecioConDescuento(cp.getConDescuento().doubleValue());
            dpp.setProductoPrecioSinDescuento(cp.getSinDescuentto().doubleValue());
            dpp.setProdutoOferta(ofFl.find(cp.getDetallePedidosPK().getOfertaDetallePedido()).getOfertaDescripcion());
            dpp.setProductoNombre(proFl.find(cp.getDetallePedidosPK().getProductoCodigo()).getProductoNombre());
            dcp.add(dpp);
        }

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(dcp);
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/pedidosConsultorSalas.jasper");
        Map parametros = new HashMap();
        parametros.put("totalConDescuesto", p.getFacturaTotalConDescuento().toString());
        parametros.put("totalSinDescuesto", p.getFacturaTotalSinDescuento().toString());
        parametros.put("consultor_nombre", cflo.ObtenerNombreCompleto(p.getConsultorCodigo()));
        parametros.put("consultor_codigo", p.getConsultorCodigo());
        parametros.put("territorio", p.getTerritorio());
        parametros.put("rutaReparto", p.getObservacionesReparto());
        parametros.put("observaciones", p.getObservaciones());
        parametros.put("usuarioCredito", ufl.find(p.getUsuarioApruebaPed()).getNombreEmpleado());
        parametros.put("fechaAprovado", fmt.format(p.getTiempoAprobado()));
        parametros.put("numeroPedidoCorr", p.getTerritorio() + " " + p.getNumeroPedido());
        parametros.put("repartoUbicacion", rrfl.busquedaRuta(p.getPedidoCorrelativoReparto()).getDireccion());

        jasperPrint = JasperFillManager.fillReport(reportPath, parametros, beanCollectionDataSource);
    }

    public void fillReport(VProcesodepedidos p) throws JRException {

        DatosCosultoresCompletos cliente = dccfl.busquedaDato(p.getConsultorCodigo());
        List<CuerpoPedido> dcp = new ArrayList<>();
        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy hh:mm a");

        List<DetallePedidos> detp = new ArrayList<>();

        detp = depedfl.ObtenerDetallePedido(p.getTerritorio(), p.getNumeroPedido());

        for (DetallePedidos cp : detp) {

            CuerpoPedido dpp = new CuerpoPedido();

            dpp.setCantidad(cp.getCantidad());
            dpp.setProductoCodigo(cp.getDetallePedidosPK().getProductoCodigo());
            dpp.setProductoPrecioConDescuento(cp.getConDescuento().doubleValue());
            dpp.setProductoPrecioSinDescuento(cp.getSinDescuentto().doubleValue());
            dpp.setProdutoOferta(ofFl.find(cp.getDetallePedidosPK().getOfertaDetallePedido()).getOfertaDescripcion());
            dpp.setProductoNombre(proFl.find(cp.getDetallePedidosPK().getProductoCodigo()).getProductoNombre());
            dcp.add(dpp);
        }

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(dcp);
        //String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/etiquetas.jrxml");
        //JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);

        String reportPath = "/opt/reportesJasper/ .jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("totalConDescuesto", p.getFacturaTotalConDescuento().toString());
        parametros.put("totalSinDescuesto", p.getFacturaTotalSinDescuento().toString());
        parametros.put("consultor_nombre", cflo.ObtenerNombreCompleto(p.getConsultorCodigo()));
        parametros.put("consultor_codigo", p.getConsultorCodigo());
        parametros.put("territorio", p.getTerritorio());
        parametros.put("programaCod", p.getProgramaCodigo());
        parametros.put("saldoAnterior", cliente.getCargoPendiente().toString());
        if (!p.getObservaciones().isEmpty()) {
            parametros.put("observaciones", p.getObservaciones());
        } else {
            parametros.put("observaciones", "---");
        }

        parametros.put("tipoPedido", validaEstado(p.getAprobado()));
        parametros.put("fechaAprovado", fmt.format(p.getTiempoAprobado()));
        parametros.put("usuarioCredito", ufl.find(p.getUsuarioApruebaPed()).getNombreEmpleado());
        parametros.put("numeroPedidoCorr", p.getTerritorio() + p.getNumeroPedido());
        parametros.put("noped", p.getNumeracionDiaria().toString());

        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }

    public void openPDF(VProcesodepedidos p) throws IOException, JRException {

        if (false) {
            vprofl.actualizaImpreso(p);
        }

        CreaPDF(p);

        System.out.println(p.getConsultorCodigo());
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");

        System.out.println("direccion = " + realPath);

        File source = new File("/opt/pedidos/" + p.getId() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/" + p.getId() + ".pdf");
        archiNuevoPdf = "./pdf/" + p.getId() + ".pdf";
        FileUtils.copyFile(source, dest, false);

        //ppfl.editaImpresion(p.getIdpp());
    }

    public void anulaPedido(VProcesodepedidos pedido) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("anulado"));
        vprofl.actualizaAnula(pedido);

    }

    public void cambiarTerritorio() {

        if (getSucursaleCambio().equals("02")) {
            propeddfl.cambiaDeSucursal(vsecl.getNumeroPedido(), getSucursaleCambio(), vsecl.getTerritorio(), 1);
        } else {
            propeddfl.cambiaDeSucursal(vsecl.getNumeroPedido(), getSucursaleCambio(), vsecl.getTerritorio(), 2);
        }

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Cambiado de Sala"));

    }

    public void CreaPDF(VProcesodepedidos p) throws JRException, IOException {

        if (p.getPedidoReparto()) {
            fillReportSalas(p);
        } else {
            fillReport(p);
        }

        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/" + p.getId() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }


    public void obtenerProducto() {

        if (productoCodigo.length() == 0) {

        } else if (productoCodigo.length() == 5 || productoCodigo.length() == 4) {

            List<VprecioProgramaF> ofertasProductos = vppffl.obtenerProductoPorCodigoPedido(productoCodigo, programaCodigo);
            ofertas = new ArrayList<>();

            if (ofertasProductos.isEmpty()) {


                ofertasProductos = vppffl.OfertaParaFacturta(productoCodigo, programaCodigo);

                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);
                    }

                    validaListaOfertas = ofertasProductos.size() < 1;
                    nombreProducto = ofertasProductos.get(0).getProductoNombre();
                    producto = ofertasProductos.get(0);
                    productos = ofertasProductos;
                }


            } else {
                for (VprecioProgramaF ofertasProducto : ofertasProductos) {

                    ofertas.add(ofertasProducto);
                }

                validaListaOfertas = ofertasProductos.size() < 1;
                nombreProducto = ofertasProductos.get(0).getProductoNombre();
                producto = ofertasProductos.get(0);
                productos = ofertasProductos;
            }

        } else {

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Codigo de producto Incorrecto", "ingrese codigo correto");
            PrimeFaces.current().dialog().showMessageDynamic(message);

        }

    }

    public void obtenerProducto(String productoSel) {

        List<VprecioProgramaF> ofertasProductos = vppffl.obtenerProductoPorCodigo(productoSel, programaCodigo);
        ofertas = new ArrayList<>();

        for (VprecioProgramaF ofertasProducto : ofertasProductos) {
            ofertas.add(ofertasProducto);
        }

        validaListaOfertas = ofertasProductos.size() < 1;
        nombreProducto = ofertasProductos.get(0).getProductoNombre();
        producto = ofertasProductos.get(0);
        this.productoCodigo = producto.getProductoCodigo();

    }

    public List<VprecioProgramaF> complete(String query) {

        List<VprecioProgramaF> q = new ArrayList<>();
        List<VprecioProgramaF> rs = new ArrayList<>();

        q = vppffl.obtenerProductoLikeNombre(query, programaCodigo);

        productos = q;
        return q;
    }

    public void seteaVariables2() {

        try {

            if (producto.getProductoCodigo() != null) {
                obtenerProducto(producto.getProductoCodigo());
            }
            // this.productoSelect = producto;
        } catch (Exception e) {

        }

    }

    public void cambiaProductoOferta() {
        this.producto = oferta;
    }

    public void borrar() {
        this.producto = new VprecioProgramaF();
        this.productoCodigo = new String();
        this.oferta = new VprecioProgramaF();
        this.cantidadString = new String();
        this.ofertas = new ArrayList<VprecioProgramaF>();
        pedido = new CuerpoPedido();
    }

    public void createNew() {
        //nuevoProducto();
        if (detallePedidoSelect.isEmpty()) {
            detallePedidoSelect.add(pedido);
        } else if (validaExistenciaPedido()) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DUPLICADO", "El producto Ya esta en la Factura");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        } else {
            detallePedidoSelect.add(pedido);
            pedido = new CuerpoPedido();
            Collections.reverse(detallePedidoSelect);

        }
        this.producto = new VprecioProgramaF();
    }

    public String reinit() {
        pedido = new CuerpoPedido();
        return null;
    }

    public void nuevoProducto() {
        // Integer cantidad = getCantidad();

        CuerpoPedido cue = new CuerpoPedido();

        BigDecimal sd = getProducto().getPrecioProgramaSinDescuento();
        BigDecimal cd = getProducto().getPrecioProgramaConDescuento();

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

        cue.setCantidad(cantidad);
        cue.setProductoCodigo(getProducto().getProductoCodigo());
        cue.setProductoNombre(getProducto().getProductoNombre());
        cue.setProdutoOferta(getProducto().getNombreOferta());
        cue.setProdutoOfertaCodigo(getProducto().getOfertaCodigo());
        cue.setProductoPrecioSinDescuento(sd.doubleValue());
        cue.setProductoPrecioConDescuento(cd.doubleValue());
        cue.setTotalSinDescuento(Math.rint(totalSinDescuesto * 100) / 100);
        cue.setTotalConDescuento(Math.rint(totalConDescuento * 100) / 100);

        this.pedido = cue;

        setPedido(cue);
    }


    public void editaPedidoGuarda() {
        Pedidos pedg = new Pedidos();
        PedidosPK pedgPK = new PedidosPK();

        //--------------------------
        pedgPK.setNumeroPedido(pedidoSel.getNumeroPedido());
        pedgPK.setTerritorio(pedidoSel.getTerritorio());
        //---------------------

        pedg = pedfl.find(pedgPK);
        pedg.setPedidoReparto(pedidoSel.getPedidoReparto());
        pedg.setSucursal(pedidoSel.getSucursal());
        pedg.setTipoReparto(pedidoSel.getTipoReparto());
        pedg.setPedidoCorrelativoReparto(pedidoSel.getPedidoCorrelativoReparto());
        pedg.setObservaciones(pedidoSel.getObservaciones());
        pedg.setFacturaTotalConDescuento(new BigDecimal(totalSinDescuentoEdit()));
        pedg.setFacturaTotalSinDescuento(new BigDecimal(totalSinDescuentoEdit()));
        pedfl.edit(pedg);
        pedfl.borraDetallePedido(pedgPK);
        if (pedidoSel.getTipoReparto() == 2) {
            cdrdl.edit(datosRepartoSelec);
        }

        for (CuerpoPedido cue : detallePedidoSelect) {

            DetallePedidos dpg = new DetallePedidos();
            DetallePedidosPK dpgk = new DetallePedidosPK();

            dpgk.setNumeroPedido(pedgPK.getNumeroPedido());
            dpgk.setTerritorioe(pedgPK.getTerritorio());
            dpgk.setOfertaDetallePedido(cue.getProdutoOfertaCodigo());
            dpgk.setProductoCodigo(cue.getProductoCodigo());

            dpg.setCantidad(cue.getCantidad());
            dpg.setConDescuento(new BigDecimal(cue.getProductoPrecioConDescuento() * cue.getCantidad()));
            dpg.setSinDescuentto(new BigDecimal(cue.getProductoPrecioSinDescuento() * cue.getCantidad()));
            dpg.setDetallePedidosPK(dpgk);

            depedfl.guardarDetallePedido(dpg);
        }
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Pedido Editado " + pedg.getConsultorCodigo(), "Pedido Numero: " + pedgPK.getNumeroPedido()));
        System.out.println("guardaPedido");

    }

    public boolean validaExistenciaPedido() {

        for (CuerpoPedido i : detallePedidoSelect) {

            boolean out = i.getProductoCodigo().equals(producto.getProductoCodigo()) && i.getProdutoOfertaCodigo().equals(oferta.getOfertaCodigo());

            if (out) {
                return true;
            }

        }
        return false;
    }
}
