/*
 * 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.FacadeCosmos.DetalleProcesoPedidoFacadeLocal;
import com.cosmodas.FacadeCosmos.GeneralesFacadeLocal;
import com.cosmodas.FacadeCosmos.OfertasFacadeLocal;
import com.cosmodas.FacadeCosmos.PedidosFacadeLocal;
import com.cosmodas.FacadeCosmos.PrecioprogramaFacadeLocal;
import com.cosmodas.FacadeCosmos.ProcesoPedidosFacadeLocal;
import com.cosmodas.FacadeCosmos.ProductosFacadeLocal;
import com.cosmodas.FacadeCosmos.RutaRepartoFacadeLocal;
import com.cosmodas.EntCosmos.Consultores;
import com.cosmodas.EntCosmos.Precioprograma;
import com.cosmodas.EntCosmos.PrecioprogramaPK;
import com.cosmodas.EntCosmos.Productos;
import com.cosmodas.EntCosmos.DetalleProcesoPedido;
import com.cosmodas.EntCosmos.DetalleProcesoPedidoPK;
import com.cosmodas.EntCosmos.ProcesoPedidos;
import com.cosmodas.EntCosmos.RutaReparto;
import com.cosmodas.validaciones.DetalleOfertaValida;

import java.awt.event.ActionEvent;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPrintServiceExporter;
import net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter;
import org.primefaces.PrimeFaces;

/**
 * @author obper
 */
@ManagedBean(name = "pedidoConsultor", eager = true)
@ViewScoped
public class PedidoConsultor implements Serializable {
//----------------------------EJB----------------------------

    @EJB
    PedidosFacadeLocal daoPedidos;
    @EJB
    PrecioprogramaFacadeLocal precioprogramaFacadeLocal;
    @EJB
    OfertasFacadeLocal ofertasFacadeLocal;
    @EJB
    ProductosFacadeLocal productosFacadeLocal;
    @EJB
    ProductosFacadeLocal prodlocal;
    @EJB
    ProcesoPedidosFacadeLocal ppfl;
    @EJB
    DetalleProcesoPedidoFacadeLocal dppfl;
    @EJB
    RutaRepartoFacadeLocal rrfl;
    @EJB
    GeneralesFacadeLocal gfl;
//----------------------VARIABLES-------------------------------

    private String consultorCodigo;
    private String consultorNombre;
    private String territorio;
    private String rutaReparto;
    private String productoCodigo;
    private String producto;
    private String oferta;
    private String precio;
    private String cantidadString;
    private String dirPed;
    private String codigoRuta;
    private String observacion;
    private int cantidad;
    private boolean contado;
    private Consultores consultor;
    private List<Productos> productos;
    private Productos productoSelect;

    //--------------------------------------------------------------
    private String sumaTotalSinDescuento;
    private String sumaTotalConDescuento;
    private CuerpoPedido pedido;
    private List<CuerpoPedido> detallePedido;
    private List<DetalleOfertaValida> listOfertas;
    private String primeraOferta;
    private Productos producto1;
    private List<Precioprograma> precioProg;
    private List ofertasActivas;
    private List<Productos> listaProductos;
    private List<RutaReparto> rutas;
    private List<String> listaDeProductos;
    private JasperPrint jasperPrint;

    // private obtenerPrograma obj = new obtenerPrograma();
//-------------------------sesion-------------------------------
//----------------------VARIABLES-------------------------------
//---------------------GETS & SETS----------------------
    public String getCodigoRuta() {
        return codigoRuta;
    }

    public void setCodigoRuta(String codigoRuta) {
        this.codigoRuta = codigoRuta;
    }

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

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

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

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

    public Productos getProductoSelect() {
        return productoSelect;
    }

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

    public String getDirPed() {
        return dirPed;
    }

    public void setDirPed(String dirPed) {
        this.dirPed = dirPed;
    }

    public String getProductoCodigo() {
        return productoCodigo;
    }

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

    public String getProducto() {
        return producto;
    }

    public void setProducto(String producto) {
//        try {
//            
//
//        if(producto.isEmpty()){
//        }else{
//        setProductoCodigo(porNombre(producto));}
//        this.producto = producto;
//                } catch (Exception e) {
//        }
    }

    public String getOferta() {
        return oferta;
    }

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

    public String getPrecio() {
        return precio;
    }

    public void setPrecio(String precio) {
        this.precio = precio;
    }

    public String getCantidadString() {
        return cantidadString;
    }

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

    public int getCantidad() {
        return cantidad;
    }

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

    public boolean isContado() {
        return contado;
    }

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

    public CuerpoPedido getPedido() {
        return pedido;
    }

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

    public List<CuerpoPedido> getDetallePedido() {
        return detallePedido;
    }

    public void setDetallePedido(List<CuerpoPedido> detallePedido) {
        this.detallePedido = detallePedido;
    }

    public Consultores getConsultor() {
        return consultor;
    }

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

    public List<DetalleOfertaValida> getListOfertas() {
        return listOfertas;
    }

    public void setListOfertas(List<DetalleOfertaValida> listOfertas) {
        this.listOfertas = listOfertas;
    }

    public String getPrimeraOferta() {
        return primeraOferta;
    }

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

    public Productos getProducto1() {
        return producto1;
    }

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

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

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

    public List getOfertasActivas() {
        return ofertasActivas;
    }

    public void setOfertasActivas(List ofertasActivas) {
        this.ofertasActivas = ofertasActivas;
    }

    public List<Productos> getListaProductos() {
        return listaProductos;
    }

    public void setListaProductos(List<Productos> listaProductos) {
        this.listaProductos = listaProductos;
    }

    public List<String> getListaDeProductos() {
        return listaDeProductos;
    }

    public void setListaDeProductos(List<String> listaDeProductos) {
        this.listaDeProductos = listaDeProductos;
    }

    public String getSumaTotalSinDescuento() {
        TotalSinDescuentos();
        return sumaTotalSinDescuento;
    }

    public void setSumaTotalSinDescuento(String sumaTotalSinDescuento) {
        this.sumaTotalSinDescuento = sumaTotalSinDescuento;
    }

    public String getSumaTotalConDescuento() {
        TotalConDescuentos();
        return sumaTotalConDescuento;
    }

    public void setSumaTotalConDescuento(String sumaTotalConDescuento) {
        this.sumaTotalConDescuento = sumaTotalConDescuento;
    }

    //------------------------------------------------------------------------------    
    public String getObservacion() {
        return observacion;
    }

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

    public String getConsultorCodigo() {
        return consultorCodigo;
    }

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

    public String getConsultorNombre() {
        return consultorNombre;
    }

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

    public String getTerritorio() {
        return territorio;
    }

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

    public String getRutaReparto() {
        return rutaReparto;
    }

    public void setRutaReparto(String rutaReparto) {
        this.rutaReparto = rutaReparto;
    }

    public void campoVacio() {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Campo Vacio", "ingrese dato Respectivo");
        PrimeFaces.current().dialog().showMessageDynamic(message);
        setConsultorCodigo(" ");

    }

    public void asignaVariables() {
        if (!consultorCodigo.isEmpty() | consultorCodigo.length() == 6) {

            setConsultor(daoPedidos.buscarConsultor(consultorCodigo));
            String nombre = consultor.getConsultorNombre1() + " " + consultor.getConsultorNombre2() + " " + consultor.getConsultorApellido1() + " " + consultor.getConsultorApellido2();
            String terri = consultor.getTerritorioCodigo().getCodigoTerritorio();
            setConsultorNombre(nombre);
            setTerritorio(terri);
            setRutas(rrfl.rutaRepartoListas(terri));
        }
    }

    //------------------------------------------------------
    public boolean validaExistenciaPedido() {

        boolean out = false;
        List<CuerpoPedido> q = new ArrayList<>();
        q = getDetallePedido();
        for (CuerpoPedido i : q) {
            if (i.getProductoCodigo().equals(getProductoCodigo())) {
                out = true;
            } else {
                out = false;
            }
        }
        return out;
    }

    public void seteaVariables() {

        String llave = getProductoCodigo();
        if (!llave.isEmpty() || llave.length() == 5) {
            traerProc(llave);
        } else {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Codigo de producto Incorrecto", "ingrese codigo correto");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }

    }

    public void seteaVariables2() {

        try {

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

        // String llave = getProductoSelect();
        if (getProductoSelect() != null) {
            traerProc(getProductoSelect().getProductoCodigo());
        }

    }

    public void traerProc(String productoCodigo) {
        setProducto1(productosFacadeLocal.find(productoCodigo));
        productoSelect = getProducto1();
        //setProducto(getProducto1().getProductoNombre());
        List<DetalleOfertaValida> de = new ArrayList<>();
        //---------------------------------------------
        String proCod = gfl.findAll().get(0).getPrograma();
        // System.out.println(obj.Prog());
        List a;
        a = precioprogramaFacadeLocal.listaOferta(productoCodigo, proCod);
        setOfertasActivas(a);
        int rowLista = a.size();
        //---------------------------------------------
        List<Precioprograma> b = new ArrayList<>();

        b = precioprogramaFacadeLocal.listaPrecioPrograma(productoCodigo, proCod);
        setPrecioProg(b);
        setPrimeraOferta(a.get(0).toString());
        List<String> l5 = new ArrayList<>();
        for (Precioprograma i : b) {
            DetalleOfertaValida j = new DetalleOfertaValida();
            j.setCodigoOferta(i.getPrecioprogramaPK().getOfertaCodigo());
            j.setNombreOferta(ofertasFacadeLocal.find(i.getPrecioprogramaPK().getOfertaCodigo()).getOfertaDescripcion());
            j.setPrecioOferta(i.getPrecioProgramaSinDescuento().toString());
            de.add(j);
        }
        setListOfertas(de);
    }

    public void nuevoProducto() {
        // Integer cantidad = getCantidad();
        PrecioprogramaPK ppk = new PrecioprogramaPK();
        ppk.setOfertaCodigo(getPrimeraOferta());
        ppk.setProductoCodigo(getProductoCodigo());
        ppk.setProgramaCodigo(gfl.findAll().get(0).getPrograma());

        CuerpoPedido cue = new CuerpoPedido();

        BigDecimal sd = precioprogramaFacadeLocal.find(ppk).getPrecioProgramaSinDescuento();
        BigDecimal cd = precioprogramaFacadeLocal.find(ppk).getPrecioProgramaConDescuento();

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

        cue.setCantidad(cantidad);
        cue.setProductoCodigo(productosFacadeLocal.find(ppk.getProductoCodigo()).getProductoCodigo());
        cue.setProductoNombre(productosFacadeLocal.find(ppk.getProductoCodigo()).getProductoNombre());
        cue.setProdutoOferta(ofertasFacadeLocal.find(ppk.getOfertaCodigo()).getOfertaDescripcion());
        cue.setProductoPrecioSinDescuento(sd.doubleValue());
        cue.setProductoPrecioConDescuento(cd.doubleValue());
        cue.setTotalSinDescuento(Math.rint(totalSinDescuesto * 100) / 100);
        cue.setTotalConDescuento(Math.rint(totalConDescuento * 100) / 100);

        System.out.println(cue.getCantidad());
        System.out.println(cue.getProdutoOferta());
        System.out.println(cue.getProductoNombre());
        this.pedido = cue;
        System.out.println(pedido.getCantidad());
        System.out.println(pedido.getProdutoOferta());
        System.out.println(pedido.getProductoNombre());

        setPedido(cue);
    }

    public List<Productos> complete(String query) {

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

        if (query.isEmpty()) {
            q = prodlocal.porNombre("Catalogo");
        } else {
            q = prodlocal.porNombre(query);
        }

        List<Precioprograma> precioPrograma = new ArrayList<>();

        String prg = gfl.findAll().get(0).getPrograma();
        for (Productos i : q) {
            if (!precioprogramaFacadeLocal.listaPrecioPrograma(i.getProductoCodigo(), prg).isEmpty()) {
                rs.add(i);
            }
        }
        productos = (rs);
        return rs;
    }

    public String porNombre(String productoNombre) {
        String prCod = null;
        if (productoNombre.isEmpty()) {
        } else {
            Productos pr = prodlocal.busquedaPorNombre(productoNombre);
            if (pr.getDiscontinuado().equals("13")) {
                System.out.println("si es discontinuados");
                discontinuado();
            } else {
                prCod = pr.getProductoCodigo();
                // setProductoCodigo(pr.getProductoCodigo());
            }
        }
        return prCod;
    }

    public void discontinuado() {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "PRODUCTO DISCONTINUADO", "No se puede tomar en inventario.");
        PrimeFaces.current().dialog().showMessageDynamic(message);
    }

    public void TotalSinDescuentos() {
        double rs = 0;
        for (CuerpoPedido i : detallePedido) {
            rs = rs + i.getTotalSinDescuento();
        }

        setSumaTotalSinDescuento(String.valueOf(Math.rint(rs * 100) / 100));
    }

    public void TotalConDescuentos() {
        double rs = 0;
        for (CuerpoPedido i : detallePedido) {
            rs = rs + i.getTotalConDescuento();
        }

        setSumaTotalConDescuento(String.valueOf(Math.rint(rs * 100) / 100));
    }

    public void borrar() {
        this.producto = new String();
        this.productoCodigo = new String();
        this.primeraOferta = new String();
        this.cantidadString = new String();
        this.listOfertas = new ArrayList<DetalleOfertaValida>();
        pedido = new CuerpoPedido();
    }

    public void fillReport() throws JRException {
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(detallePedido);
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/pedidosConsultor.jasper");
        Map parametros = new HashMap();
        parametros.put("totalConDescuesto", getSumaTotalConDescuento());
        parametros.put("totalSinDescuesto", getSumaTotalSinDescuento());
        parametros.put("consultor_nombre", getConsultorNombre());
        parametros.put("consultor_codigo", getConsultor().getConsultorCodigo());
        parametros.put("territorio", getTerritorio());
        parametros.put("observaciones", getObservacion());

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

    public void fillReportSalas() throws JRException {
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(detallePedido);
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/pedidosConsultorSalas.jasper");
        Map parametros = new HashMap();
        parametros.put("totalConDescuesto", getSumaTotalConDescuento());
        parametros.put("totalSinDescuesto", getSumaTotalSinDescuento());
        parametros.put("consultor_nombre", getConsultorNombre());
        parametros.put("consultor_codigo", getConsultor().getConsultorCodigo());
        parametros.put("territorio", getTerritorio());
        parametros.put("rutaReparto", getRutaReparto());
        parametros.put("observaciones", getObservacion());
        parametros.put("repartoUbicacion", rrfl.busquedaRuta(codigoRuta).getDireccion());
        jasperPrint = JasperFillManager.fillReport(reportPath, parametros, beanCollectionDataSource);
    }

    public void limpiarPantalla() {
        try {
            detallePedido = new ArrayList<>();
            this.consultorNombre = new String();
            this.consultorCodigo = new String();
            this.territorio = new String();
            this.observacion = new String();
            this.codigoRuta = new String();
            this.rutaReparto = new String();
            borrar();

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "CORRECTO", "CORRECTO");
            PrimeFaces.current().dialog().showMessageDynamic(message);

        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO SE PUEDE LIMPIAR PANTALLA");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }

    public void limpiarPantalla2() {
        try {
            detallePedido = new ArrayList<>();
            this.consultorNombre = new String();
            this.consultorCodigo = new String();
            this.territorio = new String();
            this.observacion = new String();
            this.codigoRuta = new String();
            this.rutaReparto = new String();
            borrar();

            //     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "CORRECTO", "CORRECTO");
            //    RequestContext.getCurrentInstance().showMessageInDialog(message);
        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO SE PUEDE LIMPIAR PANTALLA");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }

    @PostConstruct
    public void init() {
        pedido = new CuerpoPedido();
        detallePedido = new ArrayList<CuerpoPedido>();
        this.productos = new ArrayList<>();

    }

    public void createNew() {
        //nuevoProducto();
        if (detallePedido.isEmpty()) {
            detallePedido.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 {
            detallePedido.add(pedido);
            pedido = new CuerpoPedido();
        }
        this.productoSelect = new Productos();
    }

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

    public void printReport(ActionEvent actionEvent) throws JRException, IOException, PrinterException {

        FacesContext context = FacesContext.getCurrentInstance();
        try {

            fillReport();
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/pedidos/pedido-" + getConsultor().getConsultorCodigo() + ".pdf");
            //JasperPrintManager.printReport(jasperPrint, false);
            PrinterJob job = PrinterJob.getPrinterJob();
            PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
            JRPrintServiceExporter exporter;
            exporter = new JRPrintServiceExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, printRequestAttributeSet);
            exporter.exportReport();
            job.print(printRequestAttributeSet);
            context.addMessage(null, new FacesMessage("Correcto ", "si pedido ha sido impreso"));
        } catch (Exception e) {

            context.addMessage(null, new FacesMessage("Error ", "No se pudo Imprimir"));
        }

    }

    public void imprimir(ActionEvent actionEvent) throws JRException, IOException {
        fillReport();
        JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/pedidos/pedido-" + getConsultor().getConsultorCodigo() + ".pdf");

        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

        FacesContext aFacesContext = FacesContext.getCurrentInstance();
        ServletContext context = (ServletContext) aFacesContext.getExternalContext().getContext();

        String realPath = context.getRealPath("/");
        System.out.println(FacesContext.getCurrentInstance().getExternalContext().getRealPath(realPath));

//setDirPed(dir+getConsultor().getConsultorCodigo()+".pdf");
    }

    public void PDF(ActionEvent actionEvent) throws JRException, IOException {
        fillReport();
        JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/pedidos/pedido-" + getConsultor().getConsultorCodigo() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
    }

    //    public void EnviarCorreo(ActionEvent actionEvent) throws JRException, IOException {
//        try {
//            fillReportSalas();
//            JasperExportManager.exportReportToPdfFile(jasperPrint, "/tmp/pedido-" + getConsultor().getConsultorCodigo() + ".pdf");
//            JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/pedidos/pedido-" + getConsultor().getConsultorCodigo() + ".pdf");
//            setDirPed("/tmp/pedido-" + getConsultor().getConsultorCodigo() + ".pdf");
//
//            Email mail = new Email();
//            mail.imail("operez@marlenlamur-es.com", "pedido-" + getConsultor().getConsultorCodigo() + ".pdf", getTerritorio(), getDirPed(), log.getUsersAndPass().getCorreo());
//            mail.imail("programador@marlenlamur-es.com", "pedido-" + getConsultor().getConsultorCodigo() + ".pdf", getTerritorio(), getDirPed(), log.getUsersAndPass().getCorreo());
//            mail.imail("creditos@marlenlamur-es.com", "pedido-" + getConsultor().getConsultorCodigo() + ".pdf", getTerritorio(), getDirPed(), log.getUsersAndPass().getCorreo());
//            mail.imail("carias@marlenlamur-es.com", "pedido-" + getConsultor().getConsultorCodigo() + ".pdf", getTerritorio(), getDirPed(), log.getUsersAndPass().getCorreo());
//            mail.imail("jlogistica@marlenlamur-es.com", "pedido-" + getConsultor().getConsultorCodigo() + ".pdf", getTerritorio(), getDirPed(), log.getUsersAndPass().getCorreo());
//            mail.imail(log.getUsersAndPass().getCorreo(), "pedido-" + getConsultor().getConsultorCodigo() + ".pdf", getTerritorio(), getDirPed(), log.getUsersAndPass().getCorreo());
//            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Enviado", "Mensaje Enviado");
//            RequestContext.getCurrentInstance().showMessageInDialog(message);
//        } catch (Exception e) {
//            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO SE PUEDE enviar Correo");
//            RequestContext.getCurrentInstance().showMessageInDialog(message);
//        }
//
//    }
    public PedidoConsultor() {
    }

    public void CreaPDF(Integer iped, boolean reparto) throws JRException, IOException {
        if (reparto) {
            fillReportSalas();
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/" + iped + ".pdf");
        } else {
            fillReport();
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/" + iped + ".pdf");
        }

        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        //ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        // JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
    }

    public void guardarCabecera() {
        ProcesoPedidos ped = new ProcesoPedidos();
        ped.setAprobado(0);
        ped.setProgramaCodigo("JUN");
        ped.setTotalConDescuento(new BigDecimal("0.00"));
        ped.setTotalSinDescuento(new BigDecimal("0.00"));
        ped.setConsultorCodigo(consultor);
        ped.setIngresoPedido(new Date());
        ped.setTerritorio(territorio);
        ped.setDespachadoB(false);
        ped.setAnulado(false);
        ped.setObservacion(observacion);
        ped.setInicioSacadoB(true);
        ped.setFechaPedido(new Date());
        ped.setNumeracionDiaria(0);
        ped.setRepartoB(Boolean.FALSE);
        ppfl.create(ped);

        limpiarPantalla();

    }

    public void guardarCabeceraCredito() throws IOException {
        if (!consultor.equals("")) {
            ProcesoPedidos ped = new ProcesoPedidos();
            ped.setAprobado(0);
            ped.setProgramaCodigo("JUN");
            ped.setTotalConDescuento(new BigDecimal("0.00"));
            ped.setTotalSinDescuento(new BigDecimal("0.00"));
            ped.setConsultorCodigo(consultor);
            ped.setIngresoPedido(new Date());
            ped.setTerritorio(territorio);
            ped.setDespachadoB(false);
            ped.setAnulado(false);
            ped.setObservacion(observacion);
            ped.setInicioSacadoB(true);
            ped.setFechaPedido(new Date());
            ped.setNumeracionDiaria(0);
            ped.setRepartoB(Boolean.FALSE);
            ppfl.create(ped);

            limpiarPantalla2();

        }

        refreshs("pedidosCreditos.jsf");
    }

    public void guardarCabeceraCreditoReparto() throws IOException {
        if (!consultor.equals("")) {
            ProcesoPedidos ped = new ProcesoPedidos();
            ped.setAprobado(0);
            ped.setProgramaCodigo("JUN");
            ped.setTotalConDescuento(new BigDecimal("0.00"));
            ped.setTotalSinDescuento(new BigDecimal("0.00"));
            ped.setConsultorCodigo(consultor);
            ped.setIngresoPedido(new Date());
            ped.setTerritorio(territorio);
            ped.setDespachadoB(false);
            ped.setAnulado(false);
            ped.setObservacion(observacion);
            ped.setInicioSacadoB(true);
            ped.setFechaPedido(new Date());
            ped.setNumeracionDiaria(0);
            ped.setRepartoB(Boolean.TRUE);
            ppfl.create(ped);

            limpiarPantalla2();

        }

        refreshs("pedidosCreditosReparto.jsf.jsf");
    }

    public void procesarPedido(String reparto) throws JRException, IOException {

        String proNoG = "";
        boolean produc = true;

        ProcesoPedidos ped = new ProcesoPedidos();
        List<DetalleProcesoPedido> dppl = new ArrayList<>();
        boolean error = false;

        if (reparto.equals("despacho")) {

            ped.setAprobado(0);
            ped.setProgramaCodigo("JUL");
            ped.setTotalConDescuento(new BigDecimal(getSumaTotalConDescuento()));
            ped.setTotalSinDescuento(new BigDecimal(getSumaTotalSinDescuento()));
            ped.setConsultorCodigo(consultor);
            ped.setIngresoPedido(new Date());
            ped.setTerritorio(territorio);
            ped.setDespachadoB(false);
            ped.setAnulado(false);
            ped.setObservacion(observacion);
            ped.setInicioSacadoB(false);
            ped.setFechaPedido(new Date());
            ped.setNumeracionDiaria(0);
            ped.setRepartoB(Boolean.FALSE);
            ppfl.create(ped);

            for (CuerpoPedido cp : detallePedido) {

                DetalleProcesoPedido dpp = new DetalleProcesoPedido();

                try {

                    dpp.setConsultorCodigo(getConsultorCodigo());
                    dpp.setDetallePedidoCantidad(Short.valueOf(String.valueOf(cp.getCantidad())));
                    dpp.setDetallePedidoConDescuento(new BigDecimal(cp.getProductoPrecioConDescuento()));
                    dpp.setDetallePedidoSinDescuento(new BigDecimal(cp.getProductoPrecioSinDescuento()));
                    dpp.setDetallePedidoOfertaDes(cp.getProdutoOferta());
                    dpp.setDetalleProcesoPedidoPK(new DetalleProcesoPedidoPK(ped.getIdpp(), "DIC", cp.getProductoCodigo()));
                    dppl.add(dpp);
                } catch (Exception e) {
                    System.err.println("error en pedido " + e + " " + getConsultorCodigo());
                    error = true;
                    ppfl.remove(ped);
                }

            }

            if (error) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "PRODUCTOS ERROR", "Guardara un total de " + dppl.size() + " PRODUCTOS si no es asi comuniquese con sistemas");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            } else {

                for (DetalleProcesoPedido detalleProcesoPedido : dppl) {
                    try {
                        dppfl.create(detalleProcesoPedido);
                    } catch (Exception e) {
                        proNoG = detalleProcesoPedido.getDetalleProcesoPedidoPK().getProductoCodigo();
                        produc = false;

                    }

                }
                limpiarPantalla();
                refreshs("pedidosRecepcion.jsf");
            }

        } else if (reparto.equals("reparto")) {

            ped.setAprobado(0);
            ped.setProgramaCodigo("JUL");
            ped.setTotalConDescuento(new BigDecimal(getSumaTotalConDescuento()));
            ped.setTotalSinDescuento(new BigDecimal(getSumaTotalSinDescuento()));
            ped.setConsultorCodigo(consultor);
            ped.setIngresoPedido(new Date());
            ped.setTerritorio(territorio);
            ped.setDespachadoB(false);
            ped.setAnulado(false);
            ped.setObservacion(observacion);
            ped.setInicioSacadoB(false);
            ped.setFechaPedido(new Date());
            ped.setNumeracionDiaria(0);
            ped.setRepartoB(Boolean.TRUE);
            ped.setCodigoReparto(codigoRuta);
            ped.setRutaReparto(rutaReparto);
            ppfl.create(ped);

            for (CuerpoPedido cp : detallePedido) {

                DetalleProcesoPedido dpp = new DetalleProcesoPedido();

                try {
                    dpp.setConsultorCodigo(getConsultorCodigo());
                    dpp.setDetallePedidoCantidad(Short.valueOf(String.valueOf(cp.getCantidad())));
                    dpp.setDetallePedidoConDescuento(new BigDecimal(cp.getProductoPrecioConDescuento()));
                    dpp.setDetallePedidoSinDescuento(new BigDecimal(cp.getProductoPrecioSinDescuento()));
                    dpp.setDetallePedidoOfertaDes(cp.getProdutoOferta());
                    dpp.setDetalleProcesoPedidoPK(new DetalleProcesoPedidoPK(ped.getIdpp(), "DIC", cp.getProductoCodigo()));
                    dppl.add(dpp);
                } catch (Exception e) {
                    System.err.println("error en pedido " + e + " " + getConsultorCodigo());
                    error = true;
                    ppfl.remove(ped);
                }
            }

            if (error) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "PRODUCTOS ERROR", "Guardara un total de " + dppl.size() + " PRODUCTOS si no es asi comuniquese con sistemas");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            } else {
                for (DetalleProcesoPedido detalleProcesoPedido : dppl) {
                    try {
                        dppfl.create(detalleProcesoPedido);
                    } catch (Exception e) {
                        proNoG = detalleProcesoPedido.getDetalleProcesoPedidoPK().getProductoCodigo();
                        produc = false;
                    }
                }

                if (produc) {

                    limpiarPantalla();
                    refreshs("pedidosSala.jsf");

                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "PRODUCTOS ERROR", "productoMalGuardado " + dppl.size() + " PRODUCTOS si no es asi comuniquese con sistemas");
                    PrimeFaces.current().dialog().showMessageDynamic(message);
                }

            }
        }

    }

    public void refreshs(String page) throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect(page);

    }

    public void actualzaOk() {

        System.out.println("exito este es un porgrama echo por dexter");

    }

}
