Mostrar un datatable dentro de un dialogo

Deseamos que al dar clic en la fila carga el detalle de una entidad relacionada. los detalles de la factura.

Pagina xhtml.

En el datatable usamos un ajax para invocar el metodo procesar.

<p:dataTable id="facturaDataTable" var="item" 
                                         value="#{facturaController.facturaDataModel}" 

                                         selectionMode="single" 
                                         widgetVar="facturaDataTable"
                                         selection="#{facturaController.facturaSelected}"
                                         filteredValue="#{facturaController.facturaFiltered}"
                                         rowKey="#{item.idfactura}"
                                         rows="12" paginator="true" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                         rowsPerPageTemplate="5,10,15" emptyMessage="#{msg.nohayregistrosconesecriterio}" reflow="true">
                                <f:facet name="header">
                                    <p:outputPanel>


                                        <div class="searchLoader">
                                            <p:graphicImage  name="/img/search-loader.gif"/>
                                        </div>
                                        <input type="text" jsf:id="globalFilter" jsf:onkeyup="PF('facturaDataTable').filter()" 
                                               class="search" placeholder="#{msg['boton.search']}"/>               
                                    </p:outputPanel>
                                </f:facet>

                                <p:ajax event="rowSelect" update=":form:facturaDetaill :form:detallefacturaDataTable"
                                        listener="#{facturaController.procesar(facturaController.facturaSelected)}"
                                        oncomplete="PF('facturaDialog').show()"  />

Método que implementa la operación

public String  procesar(Factura factura){
        try {
            System.out.println("............procesar"+factura.getIdfactura());
                    detalledefacturaList = detalledefacturaFacade.findByIdfacturaDetalles(factura);

                    if (detalledefacturaList == null || detalledefacturaList.isEmpty()) {
                        System.out.println("-------no tiene detalles");
                        JsfUtil.addWarningMessage("Esta factura no tiene detalles");
                        return"";
                    } else {
                        System.out.println("------tiene detalles size() "+detalledefacturaList.size());
                        detalledefacturaDataModel = new DetalledefacturaDataModel(detalledefacturaList);
                        detalledefacturaFiltered = detalledefacturaList;

                    }

        } catch (Exception e) {
            JsfUtil.addErrorMessage("procesar() " + e.getLocalizedMessage());
        }
        return "";
    }

Código completo del Controller

/*
 * 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.javscaz.fiscaljsd.controller;

import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.avbravoutils.printer.Printer;
import com.javscaz.fiscaljsd.controller.datamodel.DetalledefacturaDataModel;
import com.javscaz.fiscaljsd.controller.datamodel.FacturaDataModel;
import com.javscaz.fiscaljsd.controller.interfaces.IController;
import com.javscaz.fiscaljsd.controller.util.ResourcesFiles;
import com.javscaz.fiscaljsd.reportes.FacturarproductosPrint;
import com.javscaz.pilarjsd.ejb.DetalledefacturaFacade;
import com.javscaz.pilarjsd.ejb.FacturaFacade;
import com.javscaz.pilarjsd.entity.Detalledefactura;
import com.javscaz.pilarjsd.entity.Factura;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import javax.inject.Inject;
import javax.swing.JOptionPane;

import org.primefaces.context.RequestContext;
import tfhka.PrinterException;

/**
 *
 * @author avbravo
 */
@Named
@ViewScoped
//@SessionScoped
public class FacturaController implements Serializable, IController {

    private static final long serialVersionUID = 1L;
    private FacturaDataModel facturaDataModel;
    private DetalledefacturaDataModel detalledefacturaDataModel;
    List<FacturarproductosPrint> listFacturarproductosPrint = new ArrayList<>();
    @Inject
    ImpresorafiscalController impresorafiscalController;
    @Inject
    FacturaFacade facturaFacade;
    @Inject
    DetalledefacturaFacade detalledefacturaFacade;

    List<Factura> facturaList;
    List<Factura> facturaFiltered;

    List<Detalledefactura> detalledefacturaList;
    List<Detalledefactura> detalledefacturaFiltered;

    Factura factura = new Factura();
    Factura facturaSelected = new Factura();
    Detalledefactura detalledefacturaSelected = new Detalledefactura();

    @Inject
    ResourcesFiles rf;
    @Inject
    Printer printer;

    public DetalledefacturaFacade getDetalledefacturaFacade() {
        return detalledefacturaFacade;
    }

    public void setDetalledefacturaFacade(DetalledefacturaFacade detalledefacturaFacade) {
        this.detalledefacturaFacade = detalledefacturaFacade;
    }

    public Detalledefactura getDetalledefacturaSelected() {
        return detalledefacturaSelected;
    }

    public void setDetalledefacturaSelected(Detalledefactura detalledefacturaSelected) {
        this.detalledefacturaSelected = detalledefacturaSelected;
    }

    public DetalledefacturaDataModel getDetalledefacturaDataModel() {
        return detalledefacturaDataModel;
    }

    public void setDetalledefacturaDataModel(DetalledefacturaDataModel detalledefacturaDataModel) {
        this.detalledefacturaDataModel = detalledefacturaDataModel;
    }

    public List<Detalledefactura> getDetalledefacturaList() {
        return detalledefacturaList;
    }

    public void setDetalledefacturaList(List<Detalledefactura> detalledefacturaList) {
        this.detalledefacturaList = detalledefacturaList;
    }

    public List<Detalledefactura> getDetalledefacturaFiltered() {
        return detalledefacturaFiltered;
    }

    public void setDetalledefacturaFiltered(List<Detalledefactura> detalledefacturaFiltered) {
        this.detalledefacturaFiltered = detalledefacturaFiltered;
    }

    public List<Factura> getFacturaList() {
        return facturaList;
    }

    public void setFacturaList(List<Factura> facturaList) {
        this.facturaList = facturaList;
    }

    public List<Factura> getFacturaFiltered() {
        return facturaFiltered;
    }

    public void setFacturaFiltered(List<Factura> facturaFiltered) {
        this.facturaFiltered = facturaFiltered;
    }

    public Factura getFactura() {
        return factura;
    }

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

    public Factura getFacturaSelected() {
        return facturaSelected;
    }

    public void setFacturaSelected(Factura facturaSelected) {
        this.facturaSelected = facturaSelected;
    }

    public FacturaDataModel getFacturaDataModel() {
        return facturaDataModel;
    }

    public void setFacturaDataModel(FacturaDataModel facturaDataModel) {
        this.facturaDataModel = facturaDataModel;
    }

    /**
     * Creates a new instance of FacturaController
     */

    public String  procesar(Factura factura){
        try {
            System.out.println("............procesar"+factura.getIdfactura());
                    detalledefacturaList = detalledefacturaFacade.findByIdfacturaDetalles(factura);

                    if (detalledefacturaList == null || detalledefacturaList.isEmpty()) {
                        System.out.println("-------no tiene detalles");
                        JsfUtil.addWarningMessage("Esta factura no tiene detalles");
                        return"";
                    } else {
                        System.out.println("------tiene detalles size() "+detalledefacturaList.size());
                        detalledefacturaDataModel = new DetalledefacturaDataModel(detalledefacturaList);
                        detalledefacturaFiltered = detalledefacturaList;

                    }

        } catch (Exception e) {
            JsfUtil.addErrorMessage("procesar() " + e.getLocalizedMessage());
        }
        return "";
    }
    @PostConstruct
    public void init() {
        try {
            System.out.println("----init()");
            facturaList = new ArrayList<>();
            facturaFiltered = new ArrayList<>();
            detalledefacturaList = new ArrayList<>();
            detalledefacturaFiltered = new ArrayList<>();

            String idfactura = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("idfactura");
            if (idfactura != null) {
                System.out.println("=========(idfactura != null)===========");
                List<Factura> list = facturaFacade.findByIdfactura(Integer.parseInt(idfactura));
                if (!list.isEmpty()) {
                    factura = list.get(0);
                    detalledefacturaList = detalledefacturaFacade.findByIdfacturaDetalles(factura);

                    if (detalledefacturaList == null || detalledefacturaList.isEmpty()) {

                        JsfUtil.addWarningMessage("Esta factura no tiene detalles");
                        return;
                    } else {
                        detalledefacturaDataModel = new DetalledefacturaDataModel(detalledefacturaList);
                        detalledefacturaFiltered = detalledefacturaList;

                    }

                }
//              factura = facturaFacade.find(id);
//               if (optional.isPresent()) {
//                   factura = optional.get();
//               }
//
                FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().put("idfactura", null);
            } else {
                System.out.println("=========(idfactura == null)===========");
//                facturaList = facturaFacade.findAll();
                facturaList = facturaFacade.findByImpreso("no");
                facturaFiltered = facturaList;

                facturaDataModel = new FacturaDataModel(facturaList);
            }

        } catch (Exception e) {
            JsfUtil.addErrorMessage("init() " + e.getLocalizedMessage());
        }

    }

    public FacturaController() {
    }

    @Override
    public String prepareNew() {
        factura = new Factura();
        return "";
    }

    @Override
    public void reset() {

        RequestContext.getCurrentInstance().reset(":form:content");
        prepareNew();
    }

    @Override
    public String save() {
//        try {
//
//          List<Factura> list= facturaFacade.findByIdfactura(factura.getIdfactura());
//
//            if (optional.isPresent()) {
//                JsfUtil.warningDialog(rf.getMensaje("info.message"), rf.getMensaje("warning.idexist"));
//                return null;
//            }
//
//            if (facturaFacade.save(factura)) {
//                JsfUtil.addS/*
 * 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.javscaz.fiscaljsd.controller;

import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.avbravoutils.printer.Printer;
import com.javscaz.fiscaljsd.controller.datamodel.DetalledefacturaDataModel;
import com.javscaz.fiscaljsd.controller.datamodel.FacturaDataModel;
import com.javscaz.fiscaljsd.controller.interfaces.IController;
import com.javscaz.fiscaljsd.controller.util.ResourcesFiles;
import com.javscaz.fiscaljsd.reportes.FacturarproductosPrint;
import com.javscaz.pilarjsd.ejb.DetalledefacturaFacade;
import com.javscaz.pilarjsd.ejb.FacturaFacade;
import com.javscaz.pilarjsd.entity.Detalledefactura;
import com.javscaz.pilarjsd.entity.Factura;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import javax.inject.Inject;
import javax.swing.JOptionPane;

import org.primefaces.context.RequestContext;
import tfhka.PrinterException;

/**
 *
 * @author avbravo
 */
@Named
@ViewScoped
//@SessionScoped
public class FacturaController implements Serializable, IController {

    private static final long serialVersionUID = 1L;
    private FacturaDataModel facturaDataModel;
    private DetalledefacturaDataModel detalledefacturaDataModel;
    List<FacturarproductosPrint> listFacturarproductosPrint = new ArrayList<>();
    @Inject
    ImpresorafiscalController impresorafiscalController;
    @Inject
    FacturaFacade facturaFacade;
    @Inject
    DetalledefacturaFacade detalledefacturaFacade;

    List<Factura> facturaList;
    List<Factura> facturaFiltered;

    List<Detalledefactura> detalledefacturaList;
    List<Detalledefactura> detalledefacturaFiltered;

    Factura factura = new Factura();
    Factura facturaSelected = new Factura();
    Detalledefactura detalledefacturaSelected = new Detalledefactura();

    @Inject
    ResourcesFiles rf;
    @Inject
    Printer printer;

    public DetalledefacturaFacade getDetalledefacturaFacade() {
        return detalledefacturaFacade;
    }

    public void setDetalledefacturaFacade(DetalledefacturaFacade detalledefacturaFacade) {
        this.detalledefacturaFacade = detalledefacturaFacade;
    }

    public Detalledefactura getDetalledefacturaSelected() {
        return detalledefacturaSelected;
    }

    public void setDetalledefacturaSelected(Detalledefactura detalledefacturaSelected) {
        this.detalledefacturaSelected = detalledefacturaSelected;
    }

    public DetalledefacturaDataModel getDetalledefacturaDataModel() {
        return detalledefacturaDataModel;
    }

    public void setDetalledefacturaDataModel(DetalledefacturaDataModel detalledefacturaDataModel) {
        this.detalledefacturaDataModel = detalledefacturaDataModel;
    }

    public List<Detalledefactura> getDetalledefacturaList() {
        return detalledefacturaList;
    }

    public void setDetalledefacturaList(List<Detalledefactura> detalledefacturaList) {
        this.detalledefacturaList = detalledefacturaList;
    }

    public List<Detalledefactura> getDetalledefacturaFiltered() {
        return detalledefacturaFiltered;
    }

    public void setDetalledefacturaFiltered(List<Detalledefactura> detalledefacturaFiltered) {
        this.detalledefacturaFiltered = detalledefacturaFiltered;
    }

    public List<Factura> getFacturaList() {
        return facturaList;
    }

    public void setFacturaList(List<Factura> facturaList) {
        this.facturaList = facturaList;
    }

    public List<Factura> getFacturaFiltered() {
        return facturaFiltered;
    }

    public void setFacturaFiltered(List<Factura> facturaFiltered) {
        this.facturaFiltered = facturaFiltered;
    }

    public Factura getFactura() {
        return factura;
    }

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

    public Factura getFacturaSelected() {
        return facturaSelected;
    }

    public void setFacturaSelected(Factura facturaSelected) {
        this.facturaSelected = facturaSelected;
    }

    public FacturaDataModel getFacturaDataModel() {
        return facturaDataModel;
    }

    public void setFacturaDataModel(FacturaDataModel facturaDataModel) {
        this.facturaDataModel = facturaDataModel;
    }

    /**
     * Creates a new instance of FacturaController
     */

    public String  procesar(Factura factura){
        try {
            System.out.println("............procesar"+factura.getIdfactura());
                    detalledefacturaList = detalledefacturaFacade.findByIdfacturaDetalles(factura);

                    if (detalledefacturaList == null || detalledefacturaList.isEmpty()) {
                        System.out.println("-------no tiene detalles");
                        JsfUtil.addWarningMessage("Esta factura no tiene detalles");
                        return"";
                    } else {
                        System.out.println("------tiene detalles size() "+detalledefacturaList.size());
                        detalledefacturaDataModel = new DetalledefacturaDataModel(detalledefacturaList);
                        detalledefacturaFiltered = detalledefacturaList;

                    }

        } catch (Exception e) {
            JsfUtil.addErrorMessage("procesar() " + e.getLocalizedMessage());
        }
        return "";
    }
    @PostConstruct
    public void init() {
        try {
            System.out.println("----init()");
            facturaList = new ArrayList<>();
            facturaFiltered = new ArrayList<>();
            detalledefacturaList = new ArrayList<>();
            detalledefacturaFiltered = new ArrayList<>();

            String idfactura = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("idfactura");
            if (idfactura != null) {
                System.out.println("=========(idfactura != null)===========");
                List<Factura> list = facturaFacade.findByIdfactura(Integer.parseInt(idfactura));
                if (!list.isEmpty()) {
                    factura = list.get(0);
                    detalledefacturaList = detalledefacturaFacade.findByIdfacturaDetalles(factura);

                    if (detalledefacturaList == null || detalledefacturaList.isEmpty()) {

                        JsfUtil.addWarningMessage("Esta factura no tiene detalles");
                        return;
                    } else {
                        detalledefacturaDataModel = new DetalledefacturaDataModel(detalledefacturaList);
                        detalledefacturaFiltered = detalledefacturaList;

                    }

                }
//              factura = facturaFacade.find(id);
//               if (optional.isPresent()) {
//                   factura = optional.get();
//               }
//
                FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().put("idfactura", null);
            } else {
                System.out.println("=========(idfactura == null)===========");
//                facturaList = facturaFacade.findAll();
                facturaList = facturaFacade.findByImpreso("no");
                facturaFiltered = facturaList;

                facturaDataModel = new FacturaDataModel(facturaList);
            }

        } catch (Exception e) {
            JsfUtil.addErrorMessage("init() " + e.getLocalizedMessage());
        }

    }

    public FacturaController() {
    }

    @Override
    public String prepareNew() {
        factura = new Factura();
        return "";
    }

    @Override
    public void reset() {

        RequestContext.getCurrentInstance().reset(":form:content");
        prepareNew();
    }

    @Override
    public String save() {
//        try {
//
//          List<Factura> list= facturaFacade.findByIdfactura(factura.getIdfactura());
//
//            if (optional.isPresent()) {
//                JsfUtil.warningDialog(rf.getMensaje("info.message"), rf.getMensaje("warning.idexist"));
//                return null;
//            }
//
//            if (facturaFacade.save(factura)) {
//                JsfUtil.addSuccessMessage(rf.getMensaje("info.save"));
//            } else {
//                JsfUtil.addSuccessMessage("save() " + facturaFacade.getException().toString());
//            }
//        } catch (Exception e) {
//            JsfUtil.addErrorMessage("save()" + e.getLocalizedMessage());
//        }
        return "";
    }

    @Override
    public String prepareEdit() {

        return "/pages/factura/view.xhtml";

    }

    public String ajax(Factura factura){
        try {
            System.out.println("---> ajax");
            System.out.println("-.....> idfactura "+factura.getIdfactura());
            //procesar(factura.getIdfactura().toString());

        } catch (Exception e) {
            JsfUtil.addErrorMessage("ajax() "+e.getLocalizedMessage());
        }
        return " ";
    }
    public String prepareEdit(Factura factura) {
        this.factura = factura;
        return "/pages/factura/view.xhtml";

    }

    @Override
    public String edit() {
//        try {
//            facturaFacade.update(factura);
//
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.update"));
//
//        } catch (Exception e) {
//            JsfUtil.addErrorMessage(e.getLocalizedMessage());
//        }
        return "";
    }

    @Override
    public String delete() {
//        if (facturaFacade.delete("idfactura", factura.getIdfactura())) {
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.delete"));
//            factura = new Factura();
//        }
        return "/pages/factura/list.xhtml";
    }

    @Override
    public String remove() {

//        if (facturaFacade.delete("idfactura", factura.getIdfactura())) {
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.delete"));
//        }
        return "";
    }

    @Override
    public String deleteAll() {
//        if (facturaFacade.deleteAll() != 0) {
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.delete"));
//
//        }
        return "";
    }

    @Override
    public String print() {
        try {

            if (!impresorafiscalController.getAbierto()) {
                JsfUtil.addErrorMessage("Conecte la impresora");
                return "";
            }

            imprimirFactura(factura);
//            List<Factura> list = new ArrayList<>();
//            list.add(factura);
//            String ruta = "/resources/reportes/factura/factura.jasper";
//            HashMap parameters = new HashMap();
//// parameters.put("P_parametro", "valor");
//
//            printer.imprimir(list, ruta, parameters);
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("imprimir() " + ex.getLocalizedMessage());
        }
        return null;
    }

    @Override
    public String printAll() {
        try {
            List<Factura> list = new ArrayList<>();
            if (facturaFiltered.isEmpty()) {
                list = facturaList;
            } else {
                list = facturaFiltered;
            }

            String ruta = "/resources/reportes/factura/factura.jasper";
            HashMap parameters = new HashMap();
// parameters.put("P_parametro", "valor");

            printer.imprimir(list, ruta, parameters);
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("imprimir() " + ex.getLocalizedMessage());
        }
        return null;
    }

    private void imprimirFactura(Factura factura) {
        try {
            listFacturarproductosPrint.removeAll(listFacturarproductosPrint);

            if (detalledefacturaList.isEmpty()) {
                JsfUtil.addWarningMessage("Esta factura no tiene detalles");
//                imprimirFacturaVehiculo(factura);
            } else {
                for (Detalledefactura r : detalledefacturaList) {
                    FacturarproductosPrint fp = new FacturarproductosPrint();
                    if (!r.getIdproducto().getIdproducto().equals("xx")) {
                        fp.setNombredeproducto(r.getIdproducto().getNombre());
                        fp.setIdproducto(r.getIdproducto().getIdproducto());
                    } else {
                        fp.setNombredeproducto(r.getIdservicio().getDescripciondeservicio());
                        fp.setIdproducto(r.getIdservicio().getIdservicio());
                    }

//                    fp.setNombredeproducto(r.getIdproducto().getNombre());
//                    fp.setIdproducto(r.getIdproducto().getIdproducto());
                    fp.setCantidad(r.getCantidad());
                    fp.setPreciounitario(r.getPreciodeventa());
                    fp.setTotal(r.getSubtotal());

                    listFacturarproductosPrint.add(fp);
                }
                if (listFacturarproductosPrint.isEmpty()) {
                    JsfUtil.addWarningMessage("No hay registros de facturas...");
                    return;
                } else {
                    fiscal(listFacturarproductosPrint);
                }
            }

        } catch (Exception e) {
            JsfUtil.addWarningMessage("imprimirFactura()" + e.getLocalizedMessage());
        }
    }

    private void fiscal(List<FacturarproductosPrint> list) throws PrinterException {
        try {

            impresorafiscalController.getImpresora().SendCmd("jS*" + factura.getIdcliente().getNombre());

            impresorafiscalController.getImpresora().SendCmd("jR*" + factura.getIdcliente().getIdcliente());

            for (FacturarproductosPrint ffis : list) {

                int pu_ent = (int) ffis.getPreciounitario().doubleValue();
                double pu_dec = Math.rint((ffis.getPreciounitario() - pu_ent) * 100) / 100;
                String c1 = conversor(String.valueOf(pu_ent), "preciounitario");
                String c2 = c1 + String.valueOf(pu_dec).substring(2, String.valueOf(pu_dec).length()) + "00";

                if (c2.length() > 10) {
                    c2 = c2.substring(0, 10);
                }
                /*Preparamos la cadena de la cantidad*/
                int ca_ent = (int) ffis.getCantidad().doubleValue();
                double ca_dec = Math.rint((ffis.getCantidad() - ca_ent) * 100) / 100;

                String c3 = conversor(String.valueOf(ca_ent), "cantidad");
                String c4 = c3 + String.valueOf(ca_dec).substring(2, String.valueOf(ca_dec).length()) + "000";

                String cadena = c2 + c4;

                if (cadena.length() > 18) {
                    cadena = cadena.substring(0, 18);

                }

                impresorafiscalController.getImpresora().SendCmd("!" + cadena + ffis.getNombredeproducto());

            }

            switch (factura.getIdformadepago().getFormadepago().toUpperCase().trim()) {
                case "EFECTIVO":

                    impresorafiscalController.getImpresora().SendCmd("101");

                    break;

                case "CHEQUE":

                    impresorafiscalController.getImpresora().SendCmd("105");

                    break;

                case "T.DEBITO":

                    impresorafiscalController.getImpresora().SendCmd("109");

                    break;

                case "T.CREDITO":

                    impresorafiscalController.getImpresora().SendCmd("109");

                    break;

                case "CREDITO":

                    impresorafiscalController.getImpresora().SendCmd("116");

                default:
                    JsfUtil.addWarningMessage("No tiene forma de pago valida " + factura.getIdformadepago().getFormadepago());

            }
            JsfUtil.addWarningMessage("Documento impreso");
            //actualizo el estatus de la factura
            factura.setImpreso("si");
            facturaFacade.edit(factura);

            //impresora.CloseFpctrl();
        } catch (Exception e) {
            JsfUtil.addWarningMessage("fiscal()" + e.getLocalizedMessage());
        }
    }

    public static Double redondear(Double n, Integer decimales) {
        Double r = 0.0;
        try {
            switch (decimales) {
                case 1:
                    r = (double) Math.round(n * 10) / 10;

                    break;

                case 2:
                    r = (double) Math.round(n * 100) / 100;
                    break;
                case 3:
                    r = (double) Math.round(n * 1000) / 1000;
                    break;
                case 4:
                    r = (double) Math.round(n * 10000) / 10000;
                    break;
            }

            return r;
        } catch (Exception e) {
            JsfUtil.addWarningMessage("redondear() " + e.getLocalizedMessage());
        }
        return r;
    }

    public static String conversor(String d, String tipo) {
        try {
            Integer tam = d.length();
            String r = "";
            switch (tipo) {

                case "preciounitario":

                    if (tam != 8) {
                        for (int i = 0; i < 8 - tam; i++) {
                            r += "0";
                        }
                        d = r + d;
                    }

                    break;
                case "cantidad":

                    if (tam != 5) {
                        for (int i = 0; i < 5 - tam; i++) {
                            r += "0";
                        }
                        d = r + d;
                    }

                    break;
            }

        } catch (Exception e) {
            JsfUtil.addWarningMessage("conversor() " + e.getLocalizedMessage().toString());

        }
        return d;
    }

}
uccessMessage(rf.getMensaje("info.save"));
//            } else {
//                JsfUtil.addSuccessMessage("save() " + facturaFacade.getException().toString());
//            }
//        } catch (Exception e) {
//            JsfUtil.addErrorMessage("save()" + e.getLocalizedMessage());
//        }
        return "";
    }

    @Override
    public String prepareEdit() {

        return "/pages/factura/view.xhtml";

    }

    public String ajax(Factura factura){
        try {
            System.out.println("---> ajax");
            System.out.println("-.....> idfactura "+factura.getIdfactura());
            //procesar(factura.getIdfactura().toString());

        } catch (Exception e) {
            JsfUtil.addErrorMessage("ajax() "+e.getLocalizedMessage());
        }
        return " ";
    }
    public String prepareEdit(Factura factura) {
        this.factura = factura;
        return "/pages/factura/view.xhtml";

    }

    @Override
    public String edit() {
//        try {
//            facturaFacade.update(factura);
//
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.update"));
//
//        } catch (Exception e) {
//            JsfUtil.addErrorMessage(e.getLocalizedMessage());
//        }
        return "";
    }

    @Override
    public String delete() {
//        if (facturaFacade.delete("idfactura", factura.getIdfactura())) {
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.delete"));
//            factura = new Factura();
//        }
        return "/pages/factura/list.xhtml";
    }

    @Override
    public String remove() {

//        if (facturaFacade.delete("idfactura", factura.getIdfactura())) {
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.delete"));
//        }
        return "";
    }

    @Override
    public String deleteAll() {
//        if (facturaFacade.deleteAll() != 0) {
//            JsfUtil.addSuccessMessage(rf.getMensaje("info.delete"));
//
//        }
        return "";
    }

    @Override
    public String print() {
        try {

            if (!impresorafiscalController.getAbierto()) {
                JsfUtil.addErrorMessage("Conecte la impresora");
                return "";
            }

            imprimirFactura(factura);
//            List<Factura> list = new ArrayList<>();
//            list.add(factura);
//            String ruta = "/resources/reportes/factura/factura.jasper";
//            HashMap parameters = new HashMap();
//// parameters.put("P_parametro", "valor");
//
//            printer.imprimir(list, ruta, parameters);
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("imprimir() " + ex.getLocalizedMessage());
        }
        return null;
    }

    @Override
    public String printAll() {
        try {
            List<Factura> list = new ArrayList<>();
            if (facturaFiltered.isEmpty()) {
                list = facturaList;
            } else {
                list = facturaFiltered;
            }

            String ruta = "/resources/reportes/factura/factura.jasper";
            HashMap parameters = new HashMap();
// parameters.put("P_parametro", "valor");

            printer.imprimir(list, ruta, parameters);
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("imprimir() " + ex.getLocalizedMessage());
        }
        return null;
    }

    private void imprimirFactura(Factura factura) {
        try {
            listFacturarproductosPrint.removeAll(listFacturarproductosPrint);

            if (detalledefacturaList.isEmpty()) {
                JsfUtil.addWarningMessage("Esta factura no tiene detalles");
//                imprimirFacturaVehiculo(factura);
            } else {
                for (Detalledefactura r : detalledefacturaList) {
                    FacturarproductosPrint fp = new FacturarproductosPrint();
                    if (!r.getIdproducto().getIdproducto().equals("xx")) {
                        fp.setNombredeproducto(r.getIdproducto().getNombre());
                        fp.setIdproducto(r.getIdproducto().getIdproducto());
                    } else {
                        fp.setNombredeproducto(r.getIdservicio().getDescripciondeservicio());
                        fp.setIdproducto(r.getIdservicio().getIdservicio());
                    }

//                    fp.setNombredeproducto(r.getIdproducto().getNombre());
//                    fp.setIdproducto(r.getIdproducto().getIdproducto());
                    fp.setCantidad(r.getCantidad());
                    fp.setPreciounitario(r.getPreciodeventa());
                    fp.setTotal(r.getSubtotal());

                    listFacturarproductosPrint.add(fp);
                }
                if (listFacturarproductosPrint.isEmpty()) {
                    JsfUtil.addWarningMessage("No hay registros de facturas...");
                    return;
                } else {
                    fiscal(listFacturarproductosPrint);
                }
            }

        } catch (Exception e) {
            JsfUtil.addWarningMessage("imprimirFactura()" + e.getLocalizedMessage());
        }
    }

    private void fiscal(List<FacturarproductosPrint> list) throws PrinterException {
        try {

            impresorafiscalController.getImpresora().SendCmd("jS*" + factura.getIdcliente().getNombre());

            impresorafiscalController.getImpresora().SendCmd("jR*" + factura.getIdcliente().getIdcliente());

            for (FacturarproductosPrint ffis : list) {

                int pu_ent = (int) ffis.getPreciounitario().doubleValue();
                double pu_dec = Math.rint((ffis.getPreciounitario() - pu_ent) * 100) / 100;
                String c1 = conversor(String.valueOf(pu_ent), "preciounitario");
                String c2 = c1 + String.valueOf(pu_dec).substring(2, String.valueOf(pu_dec).length()) + "00";

                if (c2.length() > 10) {
                    c2 = c2.substring(0, 10);
                }
                /*Preparamos la cadena de la cantidad*/
                int ca_ent = (int) ffis.getCantidad().doubleValue();
                double ca_dec = Math.rint((ffis.getCantidad() - ca_ent) * 100) / 100;

                String c3 = conversor(String.valueOf(ca_ent), "cantidad");
                String c4 = c3 + String.valueOf(ca_dec).substring(2, String.valueOf(ca_dec).length()) + "000";

                String cadena = c2 + c4;

                if (cadena.length() > 18) {
                    cadena = cadena.substring(0, 18);

                }

                impresorafiscalController.getImpresora().SendCmd("!" + cadena + ffis.getNombredeproducto());

            }

            switch (factura.getIdformadepago().getFormadepago().toUpperCase().trim()) {
                case "EFECTIVO":

                    impresorafiscalController.getImpresora().SendCmd("101");

                    break;

                case "CHEQUE":

                    impresorafiscalController.getImpresora().SendCmd("105");

                    break;

                case "T.DEBITO":

                    impresorafiscalController.getImpresora().SendCmd("109");

                    break;

                case "T.CREDITO":

                    impresorafiscalController.getImpresora().SendCmd("109");

                    break;

                case "CREDITO":

                    impresorafiscalController.getImpresora().SendCmd("116");

                default:
                    JsfUtil.addWarningMessage("No tiene forma de pago valida " + factura.getIdformadepago().getFormadepago());

            }
            JsfUtil.addWarningMessage("Documento impreso");
            //actualizo el estatus de la factura
            factura.setImpreso("si");
            facturaFacade.edit(factura);

            //impresora.CloseFpctrl();
        } catch (Exception e) {
            JsfUtil.addWarningMessage("fiscal()" + e.getLocalizedMessage());
        }
    }

    public static Double redondear(Double n, Integer decimales) {
        Double r = 0.0;
        try {
            switch (decimales) {
                case 1:
                    r = (double) Math.round(n * 10) / 10;

                    break;

                case 2:
                    r = (double) Math.round(n * 100) / 100;
                    break;
                case 3:
                    r = (double) Math.round(n * 1000) / 1000;
                    break;
                case 4:
                    r = (double) Math.round(n * 10000) / 10000;
                    break;
            }

            return r;
        } catch (Exception e) {
            JsfUtil.addWarningMessage("redondear() " + e.getLocalizedMessage());
        }
        return r;
    }

    public static String conversor(String d, String tipo) {
        try {
            Integer tam = d.length();
            String r = "";
            switch (tipo) {

                case "preciounitario":

                    if (tam != 8) {
                        for (int i = 0; i < 8 - tam; i++) {
                            r += "0";
                        }
                        d = r + d;
                    }

                    break;
                case "cantidad":

                    if (tam != 5) {
                        for (int i = 0; i < 5 - tam; i++) {
                            r += "0";
                        }
                        d = r + d;
                    }

                    break;
            }

        } catch (Exception e) {
            JsfUtil.addWarningMessage("conversor() " + e.getLocalizedMessage().toString());

        }
        return d;
    }

}

CODIGO COMPLETO PAGINA .XHTML

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:b="http://bootsfaces.net/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:jsf="http://xmlns.jcp.org/jsf">

    <body>

        <ui:composition template="./../../WEB-INF/template.xhtml">
            <ui:define name="top">
                <h1>
                    #{msg['facturani.list']}
                    <small> </small>
                </h1>

            </ui:define>
            <!--
          Contenido
            -->
            <ui:define name="content">

                <h:form id="form" rendered="#{loginController.loggedIn}">
                    <h:panelGroup id="content" layout="block"> 
                        <p:messages id="msgs"/>
                        <!--
                      header del formulario
                        -->
<!--                        <div class="row form-header-2" style="padding-top: 5px;">
                            <div class="col-md-12 record-status-buttons">   

                                <p:link class="btnn btnn-primary" value="#{msg['boton.new']}" outcome="/pages/factura/create"/>
                                <p:commandButton class="btnn btnn-primary" value="#{msg['boton.print']}" process=":form:content" action="#{facturaController.printAll()}" 
                                                 ajax="false"
                                                 update=":form:content" /> 
                            </div>
                        </div>-->
                        <!--
                        body
                        -->
                        <div class="row form-body2">  

                            <!--
                            los elementos en filas
                            -->
                            <p:dataTable id="facturaDataTable" var="item" 
                                         value="#{facturaController.facturaDataModel}" 

                                         selectionMode="single" 
                                         widgetVar="facturaDataTable"
                                         selection="#{facturaController.facturaSelected}"
                                         filteredValue="#{facturaController.facturaFiltered}"
                                         rowKey="#{item.idfactura}"
                                         rows="12" paginator="true" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                         rowsPerPageTemplate="5,10,15" emptyMessage="#{msg.nohayregistrosconesecriterio}" reflow="true">
                                <f:facet name="header">
                                    <p:outputPanel>


                                        <div class="searchLoader">
                                            <p:graphicImage  name="/img/search-loader.gif"/>
                                        </div>
                                        <input type="text" jsf:id="globalFilter" jsf:onkeyup="PF('facturaDataTable').filter()" 
                                               class="search" placeholder="#{msg['boton.search']}"/>               
                                    </p:outputPanel>
                                </f:facet>

                                <p:ajax event="rowSelect" update=":form:facturaDetaill :form:detallefacturaDataTable"
                                        listener="#{facturaController.procesar(facturaController.facturaSelected)}"
                                        oncomplete="PF('facturaDialog').show()"  />

                                <p:column headerText="#{msg.idfactura}" filterBy="#{item.idfactura}" 
                                          sortBy="#{item.idfactura}"  filterMatchMode="contains"
                                          width="100px;">
                                    <h:outputText value="#{item.idfactura}" />

                                </p:column>
<!--                                <p:column headerText="#{msg.numfiscal}" filterBy="#{item.numfiscal}" 
                                          sortBy="#{item.numfiscal}"  filterMatchMode="contains" 
                                          width="100px;">
                                    <h:outputText value="#{item.numfiscal}" />

                                </p:column>-->
                                <p:column headerText="#{msg.cliente}" filterBy="#{item.idcliente}" sortBy="#{item.idcliente}"  filterMatchMode="contains" >
                                    <h:outputText value="#{item.idcliente.nombre}" />

                                </p:column>
                                <p:column headerText="#{msg.cedula}" filterBy="#{item.idcliente}" sortBy="#{item.idcliente}"  filterMatchMode="contains" >
                                    <h:outputText value="#{item.idcliente.idcliente}" />

                                </p:column>
                                <p:column headerText="#{msg.impreso}" filterBy="#{item.impreso}" 
                                          sortBy="#{item.impreso}" filterMatchMode="contains"
                                          width="100px;">
                                    <h:outputText value="#{item.impreso}" />
                                </p:column>
                                <p:column headerText="#{msg.fecha}" filterBy="#{item.fecha}" sortBy="#{item.fecha}" >
                                    <h:outputText value="#{item.fecha}" >

                                        <f:convertDateTime pattern="dd/MM/yyyy" />
                                    </h:outputText>
                                </p:column>


                            </p:dataTable>

                            <p:dialog header="#{msg['factura.list']}" widgetVar="facturaDialog"  width="450" height="450"
                                      modal="true" showEffect="fade" hideEffect="fade" resizable="false" responsive="true">
                                <p:outputPanel id="facturaDetaill" style="text-align:center;">

                                    <p:panel header="Fatura">

                                    <p:panelGrid  columns="2" rendered="#{not empty facturaController.facturaSelected}" layout="grid" styleClass="ui-panelgrid-blank">


                                        <p:outputLabel value="#{msg.idfactura}" style="font-weight: bold"/>
                                        <p:outputLabel value="#{facturaController.facturaSelected.idfactura}" />

                                        <p:outputLabel value="#{msg.impreso}" style="font-weight: bold"/>
                                        <p:outputLabel value="#{facturaController.facturaSelected.impreso}" />

                                        <p:commandButton id="btn2" value="#{msg['boton.edit']}"
                                                         class="btnn btnn-primary"
                                                         icon="fa fa-edit Fs14 White"  style="max-width:150px;"
                                                         oncomplete="PF('historialDialog').hide()"
                                                         title="#{msg['boton.edit']}"
                                                         update=":form:msgs"
                                                         action="#{facturaController.prepareEdit(facturaController.facturaSelected)}"
                                                         >

                                            <f:param name="idfactura" value="#{facturaController.facturaSelected.idfactura}"/>
                                        </p:commandButton>


                                    </p:panelGrid>
                                        </p:panel>
                                          <p:dataTable id="detallefacturaDataTable" var="item2" 
                                                         value="#{facturaController.detalledefacturaDataModel}" 

                                                         selectionMode="single" 
                                                         widgetVar="detallefacturaDataTable"
                                                         selection="#{facturaController.detalledefacturaSelected}"

                                                         rowKey="#{item.idfactura}"
                                                         rows="25" paginator="true" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                                         rowsPerPageTemplate="5,10,15" emptyMessage="#{msg.nohayregistrosconesecriterio}" reflow="true">
                                                <f:facet name="header">
<!--                                                    <p:outputPanel>


                                                        <div class="searchLoader">
                                                            <p:graphicImage  name="/img/search-loader.gif"/>
                                                        </div>
                                                        <input type="text" jsf:id="globalFilter" jsf:onkeyup="PF('detallefacturaDataTable').filter()" class="search" placeholder="#{msg['boton.search']}"/>               
                                                    </p:outputPanel>-->
                                                </f:facet>



                                                <p:column headerText="#{msg.idproducto}" filterBy="#{item2.idproducto.idproducto}" sortBy="#{item2.idproducto.idproducto}"  filterMatchMode="contains" >
                                                    <h:outputText value="#{item2.idproducto.idproducto}" />

                                                </p:column>

                                                <p:column headerText="#{msg.cantidad}" filterBy="#{item2.cantidad}" sortBy="#{item2.cantidad}"  filterMatchMode="contains" >
                                                    <h:outputText value="#{item2.cantidad}" />

                                                </p:column>
                                                <p:column headerText="#{msg.preciodeventa}" filterBy="#{item2.preciodeventa}" sortBy="#{item2.preciodeventa}"  filterMatchMode="contains" >
                                                    <h:outputText value="#{item2.preciodeventa}" />

                                                </p:column>
                                                <p:column headerText="#{msg.subtotal}" filterBy="#{item2.subtotal}" sortBy="#{item2.subtotal}"  filterMatchMode="contains" >
                                                    <h:outputText value="#{item2.subtotal}" />

                                                </p:column>

                                            </p:dataTable>
                                </p:outputPanel>
                            </p:dialog>

                        </div>


                    </h:panelGroup>

                </h:form>

            </ui:define>

        </ui:composition>

    </body>
</html>

Last updated