Relaciones con atributos no Referenciados

Formularios new.xhtml, view.xtml

Al dar clic en Ganga ocultamos los otros autocomplete

Debe cumplir las condiciones:

  • No se pueden crear referencias a otros entitys, porque solo se podrá almacenar uno en un momento indicado. En el ejemplo el chofer esta asignado a una Bodega o una Ganga o una Tienda, no puede estar asignados a todas, por lo tanto no seria adecuado crear los @Referenced, ya que necesitariamos asignarle uno existente de cada entity que fuesemos a relacionar.

  • Podemos usar autocomplete con dropdown = true

  • Usamos un <b:flyOutMenu> para mostrar la lista correspondiente a cada entity que deseamos relacionar por los atributos.

  • Los autocomplete deben ser renderizados en base al atributo esbodega, esganga, estienda correspondiente.

  • En ese ejemplo se mostrara como relacionar Bodega o Ganga o Tienda, con Chofer mediante los atributos:

  • tipoalmacen que indicara si es bodega, tienda o ganga

  • idalmacen: almacena el valor del idbodega, idtienda o idganga.

  • En el controller creamos atributo para cada entity relacionado

     Tienda tienda = new Tienda();
    Bodega bodega = new Bodega();
    Ganga ganga = new Ganga();
  • Definimos atributos boolean

    private Boolean esbodega = false;
    private Boolean estienda = true;
    private Boolean esganga = false;
  • Crear el metodo public String onUbicacionChange(String almacen) para validar la seleccion del <b:flyOutMenu>

  • En el método save() validar si esbodega, esganga o estienda para asignar los valores correspondientes en los atributos: tipoalmacen, idalmacen.

  • Crear el mètodo public String nombreLugar(Chofer chofer) , para devolver el nombre correspondiente.

En el list

  • Invocar el metodo que devuelve el tipo y id correspondiente.

  <b:dataTableColumn value="#{choferController.nombreLugar(item)}" label="#{msg['field.ubicacion']}" />
 <b:dataTable value="#{choferController.choferDataModel}"
                             var="item"
                             id="dataTable2"
                             paginated="false"
                             onpage="console.log('page');">

                    <b:dataTableColumn value="#{item.idchofer}" label="#{msg['field.idchofer']}"/>
                    <b:dataTableColumn value="#{item.nombre}" label="#{msg['field.nombre']}" />

                  <b:dataTableColumn value="#{item.telefono}" label="#{msg['field.telefono']}" />
                    <b:dataTableColumn value="#{item.tipoalmacen}" label="#{msg['field.tipo']}" />
                   <b:dataTableColumn value="#{choferController.nombreLugar(item)}" label="#{msg['field.ubicacion']}" />

                    <b:dataTableColumn label="">

                        <a:column

                            edit="#{choferController.prepare('view',item)}"
                            delete="#{choferController.delete(item,false)}"
                            rendered="#{applicationMenu.chofer.delete}"
                            />
                    </b:dataTableColumn>

                </b:dataTable>

Entity

Datos

Se almacena en la siguiente estructura.

{

"idchofer":"7-8",
"nombre":"Juan",
"email":"@",
"telefono":"67373",
"porcentajecomision":5.0,
"direccion":"panama",
"tipoalmacen":"tienda",
"idtipoalmacen":"3",
"activo":"si",
"userInfo":[
        {
            "iduserinfo" : "20e5135d-cd31-4bd9-87a7-c02b59834bd3",
            "username" : "avbravo",
            "datetime" : ISODate("2018-05-16T02:32:47.133Z"),
            "description" : "create"
        }

    ]

new.xhtml

<p:outputLabel  value="#{msg['field.ubicacion']}" />

                        <b:flyOutMenu width="50px">  
                            <b:navCommandLink value="#{msg['field.tienda']}"   update=":form"  action="#{choferController.onUbicacionChange('tienda')}"/>
                            <b:navCommandLink value="#{msg['field.ganga']}" update=":form"  action="#{choferController.onUbicacionChange('ganga')}"  />
                            <b:navCommandLink value="#{msg['field.bodega']}" update=":form"  action="#{choferController.onUbicacionChange('bodega')}" />
                        </b:flyOutMenu>

                      <p:outputLabel value="#{msg['field.ganga']}" rendered="#{choferController.esganga}"/>

                        <e:autocompleteganga listener="#{tiendaController.handleSelect}"
                                             value="#{choferController.ganga}"
                                             rendered="#{choferController.esganga}"
                                             dropdown="true"
                                             id="ganga"
                                             itemLabel=" #{p.ganga}"
                                             field="ganga"

                                             />

                        <p:outputLabel  value="#{msg['field.bodega']}" rendered="#{choferController.esbodega}"/>

                        <e:autocompletebodega listener="#{choferController.handleSelect}"
                                              value="#{choferController.bodega}"
                                              rendered="#{choferController.esbodega}"
                                              dropdown="true"
                                              itemLabel=" #{p.idbodega}"
                                              field="idbodega"
                                              id="bodega"

                                              />


                        <p:outputLabel value="#{msg['field.tienda']}"/>
                        <e:autocompletetienda listener="#{choferController.handleSelect}"
                                              value="#{choferController.tienda}"
                                              dropdown="true"
                                              itemLabel=" #{p.tienda}"
                                              rendered="#{choferController.estienda}"
                                              field="tienda"
                                              id="tienda"

                                              />

view.xhtml

                        <p:outputLabel  value="#{msg['field.ubicacion']}" />

                        <b:flyOutMenu width="50px">  
                            <b:navCommandLink value="#{msg['field.tienda']}"   update=":form"  action="#{choferController.onUbicacionChange('tienda')}"/>
                            <b:navCommandLink value="#{msg['field.ganga']}"  update=":form"  action="#{choferController.onUbicacionChange('ganga')}"/>
                            <b:navCommandLink value="#{msg['field.bodega']}"  update=":form"  action="#{choferController.onUbicacionChange('bodega')}"/>
                        </b:flyOutMenu>

                        <p:outputLabel value="#{msg['field.ganga']}" rendered="#{choferController.esganga}"/>

                        <e:autocompleteganga listener="#{tiendaController.handleSelect}"
                                             value="#{choferController.ganga}"
                                             rendered="#{choferController.esganga}"
                                             dropdown="true"
                                             id="ganga"
                                             itemLabel=" #{p.ganga}"
                                             field="ganga"

                                             />

                        <p:outputLabel  value="#{msg['field.bodega']}" rendered="#{choferController.esbodega}"/>

                        <e:autocompletebodega listener="#{choferController.handleSelect}"
                                              value="#{choferController.bodega}"
                                              rendered="#{choferController.esbodega}"
                                              dropdown="true"
                                              itemLabel=" #{p.idbodega}"
                                              field="idbodega"
                                              id="bodega"

                                              />


                        <p:outputLabel value="#{msg['field.tienda']}"/>
                        <e:autocompletetienda listener="#{choferController.handleSelect}"
                                              value="#{choferController.tienda}"
                                              dropdown="true"
                                              itemLabel=" #{p.tienda}"
                                              rendered="#{choferController.estienda}"
                                              field="tienda"
                                              id="tienda"

                                              />

Controller

  • Definir atributos booleanos para cada entity

  • Definir objetos de cada entity

  • Inyectar los repository y services de los entitys de referencia

  • El metodo init() inicializar el false los atributos booleanos

  • Crear objetos nuevos

  • Validar en base al tipoalmacen para buscar el entity correspondiente

  • preprare() validar el tipoalmacen

  • save() validar tipoalmacen

  • edit() validar tipoalmacen

  • nombreLugar(Chofer chofer), devuelve el nombre del lugar

    private String passwordnewrepeat;
    private Boolean esbodega = false;
    private Boolean estienda = true;
    private Boolean esganga = false;

       Tienda tienda = new Tienda();
    Bodega bodega = new Bodega();
    Ganga ganga = new Ganga();
    @Inject
    TiendaRepository tiendaRepository;
    @Inject
    BodegaRepository bodegaRepository;
    @Inject
    GangaRepository gangaRepository;


      @Inject
    BodegaServices bodegaServices;

     @Inject
    TiendaServices tiendaServices;
    @Inject
    GangaServices gangaServices;

    @PostConstruct
    public void init() {
        try {
            esbodega = false;
            estienda = false;
            esganga = false;
            String action = loginController.get("chofer");
            String id = loginController.get("idchofer");
            String pageSession = loginController.get("pagechofer");
            //Search
            loginController.put("searchchofer", "_init");
            writable = false;

            choferList = new ArrayList<>();
            choferFiltered = new ArrayList<>();
            chofer = new Chofer();
            choferDataModel = new ChoferDataModel(choferList);
            tienda = new Tienda();
            ganga = new Ganga();
            bodega = new Bodega();

            if (id != null) {
                Optional<Chofer> optional = choferRepository.find("idchofer", id);
                if (optional.isPresent()) {
                    chofer = optional.get();
                    //   chofer.setPassword(JsfUtil.desencriptar(chofer.getIdchofer()));
                    estienda = false;
                    esbodega = false;
                    esganga = false;
                    switch (chofer.getTipoalmacen().toLowerCase()) {
                        case "tienda":
                            tienda = choferServices.findTienda(chofer);
                            estienda = true;
                            almacen = "tienda";
                            almacenLabel = "Tienda";
                            break;
                        case "bodega":
                            bodega = choferServices.findBodega(chofer);
                            esbodega = true;
                            almacenLabel = "Bodega";
                            almacen = "bodega";
                            break;
                        case "ganga":
                            almacenLabel = "Ganga";
                            almacen = "Ganga";
                            ganga = choferServices.findGanga(chofer);
                            esganga = true;
                            break;
                        default:
                            break;
                    }

                    choferSelected = chofer;
                    writable = true;

                }
            }
            if (action != null && action.equals("gonew")) {
                chofer = new Chofer();
                choferSelected = chofer;
                writable = false;

            }
            if (pageSession != null) {
                page = Integer.parseInt(pageSession);
            }
            Integer c = choferRepository.sizeOfPage(rowPage);
            page = page > c ? c : page;
            move();

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



     @Override
    public String prepare(String action, Object... item) {
        String url = "";
        try {
            loginController.put("pagechofer", page.toString());
            loginController.put("chofer", action);
            switch (action) {
                case "new":
                    chofer = new Chofer();
                    choferSelected = new Chofer();

                    writable = false;
                    break;

                case "view":
                    if (item.length != 0) {
                        choferSelected = (Chofer) item[0];
                        chofer = choferSelected;
                        estienda = false;
                        esbodega = false;
                        esganga = false;
                        switch (chofer.getTipoalmacen().toLowerCase()) {
                            case "tienda":
                                tienda = choferServices.findTienda(chofer);
                                estienda = true;
                                break;
                            case "bodega":
                                bodega = choferServices.findBodega(chofer);
                                esbodega = true;
                                break;
                            case "ganga":
                                ganga = choferServices.findGanga(chofer);
                                esganga = true;
                                break;
                            default:
                                break;
                        }
                        loginController.put("idchofer", chofer.getIdchofer());
                    }

                    url = "/pages/chofer/view.xhtml";
                    break;
                case "golist":

                    url = "/pages/chofer/list.xhtml";
                    break;

                case "gonew":
                    url = "/pages/chofer/new.xhtml";
                    break;
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("prepare() " + e.getLocalizedMessage());
        }

        return url;
    }


     @Override
    public String save() {
        try {
            Optional<Chofer> optional = choferRepository.findById(chofer);
            if (optional.isPresent()) {
                JsfUtil.warningMessage(rf.getAppMessage("warning.idexist"));
                return null;
            }

            if (estienda) {
                chofer.setTipoalmacen("tienda");
                chofer.setIdalmacen(tienda.getIdtienda());
            } else {
                if (esbodega) {
                    chofer.setTipoalmacen("bodega");
                    chofer.setIdalmacen(bodega.getIdbodega());

                } else {
                    if (esganga) {
                        chofer.setTipoalmacen("ganga");
                        chofer.setIdalmacen(ganga.getIdganga());
                    } else {
                        JsfUtil.warningMessage(rf.getMessage("warning.seleccioneubicacion"));
                        return "";
                    }

                }
            }

            chofer.setUserInfo(userInfoServices.generateListUserinfo(loginController.getUsername(), "create"));
            if (choferRepository.save(chofer)) {
                revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(chofer.getIdchofer(), loginController.getUsername(),
                        "create", "chofer", choferRepository.toDocument(chofer).toString()));
                JsfUtil.successMessage(rf.getAppMessage("info.save"));
                reset();
            } else {
                JsfUtil.successMessage("save() " + choferRepository.getException().toString());
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("save()" + e.getLocalizedMessage());
        }
        return "";
    }    



    @Override
    public String edit() {
        try {
            // chofer.setPassword(JsfUtil.encriptar(chofer.getPassword()));
            if (estienda) {
                chofer.setTipoalmacen("tienda");
                chofer.setIdalmacen(tienda.getIdtienda());
            } else {
                if (esbodega) {
                    chofer.setTipoalmacen("bodega");
                    chofer.setIdalmacen(bodega.getIdbodega());

                } else {
                    if (esganga) {
                        chofer.setTipoalmacen("ganga");
                        chofer.setIdalmacen(ganga.getIdganga());
                    } else {
                        JsfUtil.warningMessage(rf.getMessage("warning.seleccioneubicacion"));
                        return "";
                    }

                }
            }
            chofer.getUserInfo().add(userInfoServices.generateUserinfo(loginController.getUsername(), "update"));

            //guarda el contenido anterior
            //guarda el contenido actualizado
            revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(chofer.getIdchofer(), loginController.getUsername(),
                    "update", "chofer", choferRepository.toDocument(chofer).toString()));

            choferRepository.update(chofer);
            JsfUtil.successMessage(rf.getAppMessage("info.update"));
        } catch (Exception e) {
            JsfUtil.errorMessage("edit()" + e.getLocalizedMessage());
        }
        return "";
    }



       public String nombreLugar(Chofer chofer) {
        String lugar = "";
        try {
            switch (chofer.getTipoalmacen().toLowerCase()) {
                case "tienda":
                    Tienda tienda = choferServices.findTienda(chofer);
                    lugar = tienda.getTienda();
                    break;
                case "bodega":
                    Bodega bodega = choferServices.findBodega(chofer);
                    lugar = bodega.getIdbodega();
                    break;
                case "ganga":
                    Ganga ganga = choferServices.findGanga(chofer);
                    lugar = ganga.getGanga();
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("");
        }
        return lugar;
    }

Nota:

Ver ChoferController.java

Last updated