Skip to main content

Múltiples referencias entre colecciones MongoDB + EJBMoordb

En algunas ocasiones necesitamos establecer múltiples referencias entre los mismos documentos.


  • Por ejemplo imaginemos que deseamos manejar múltiples Usuarios con roles diferentes en la que se asignaran , estos pueden tener un orden diferente en base al formulario donde se utilicen.
  • Usaremos un List<Usuario> en el Entity
  • No usaremos <p:autocomplete/> multiples, ya que los elementos dependerán del tipo de orden, este indicar a que corresponden los usuarios almacenados.
  • Usaremos autocomplete individuales.
   <p:outputLabel value="#{msg['field.encargadobodega']}"/>
                          <e:autocompleteusuario_rol listener="#{orden.handleSelect}"
                                                   value="#{ordenController.encargadobodeda}"
                                                   itemLabel=" #{p.nombre}"                                                                                               
                                                   field="nombre"
                                                   dropdown="true"
                                                   required="true"
                                                   fromstart="true"
                                                   minQueryLength="0"
                                                   size="45"
                                                   rolValue="ENCARGADOBODEGA"

                                                   />

                        <p:outputLabel value="#{msg['field.encargadotienda']}"/>
                          <e:autocompleteusuario_rol listener="#{orden.handleSelect}"
                                                   value="#{ordenController.encargadotienda}"
                                                   itemLabel=" #{p.nombre}"                                                                                               
                                                   field="nombre"
                                                   dropdown="true"
                                                   required="true"
                                                   fromstart="true"
                                                   minQueryLength="0"
                                                   size="45"
                                                   rolValue="ENCARGADOTIENDA"/>


Imaginemos que tenemos dos Entitys




Las posibles reglas para los valores que almacenaremos en List<Usuario> usuario.





public class Orden {

    @Id
    private Integer idorden;
    private Date fecha;
    private String tipoorden;
    private String subtipoorden;
    private String observacion;
    private Integer idemisor;
    private String tipoemisor;

    @Referenced(documment = "Almacen", repository = "com.avbravo.storeejb.repository.AlmacenRepository",
            field = "idalmacen", javatype = "Integer", lazy = false)
    private Almacen almacen;

    @Referenced(documment = "Usuario", repository = "com.avbravo.storeejb.repository.UsuarioRepository",
            field = "username", javatype = "String", lazy = false)
    private List<Usuario> usuario;
    private String activo;

    @Embedded
    private List<UserInfo> userInfo;

    public Orden() {
    }
}


public class Usuario {

    @Id
    private String username;
    private String nombre;
    private String apellido;
    private String password;
    private String email;
    private String telefono;
    private Double porcentajecomision;
    private String activo;
    private String direccion;
 
   @Referenced(documment = "Almacen",
            repository = "com.avbravo.storeejb.repository.AlmacenRepository",
            field = "idalmacen", javatype = "Integer", lazy = false)
    private List<Almacen> almacen;


    @Referenced(documment = "Rol", repository = "com.avbravo.storeejb.repository.RolRepository",
            field = "idrol", javatype = "String", lazy = false)
    private List<Rol> rol;

    @Referenced(documment = "Empresa", repository = "com.avbravo.storeejb.repository.EmpresaRepository",
            field = "idempresa", javatype = "Integer", lazy = false)
    private Empresa empresa;

    @Embedded
    private List<UserInfo> userInfo;

    public Usuario() {
    }

}

Por ejemplo:

  • Si el tipo de orden es de Proveedor a Bodega solo almacenamos un usuario que corresponde al encargado de Bodega.
  • Si es una orden de Bodega a Tienda almacenamos el encargado de Tienda, Encargado de Bodega y Chofer, todos estos corresponden a documentos en la colección Usuario.
  • Según las opciones que se seleccionen se mostrara uno u otro usuario.



Agregar leyenda




Formulario 1


  • La posición 0 del List<Usuario> representa a quien autoriza
  • La posición 1 del List<Usuario> representa al encargado de bodega


si realizamos una consulta en MongoDB





Formulario 2:

  • La posición 0 del List<Usuario> representa a quien autoriza
  • La posición 1 del List<Usuario> representa al encargado de bodega
  • La posición 2 del List<Usuario> representa al encargado de tienda
  • La posición 3 del List<Usuario> representa al encargado de chofer
  • La posición 1 del List<Usuario> representa al encargado de ayudante




Mongodb


En el Controller

Definimos los objetos Usuario para cada autocomplete que usaremos.
  //Usuarios
    Usuario autorizado      = new Usuario();
    Usuario encargadotienda = new Usuario();
    Usuario encargadobodeda = new Usuario();
    Usuario encargadoganga  = new Usuario();
    Usuario chofer          = new Usuario();
    Usuario ayudante        = new Usuario();

creamos los get/set.

método save

  public String save(String tipoorden, String subtipoorden) {
        try {

            if (!valid()) {
                return "";
            }

            Integer identity = autoincrementableStoreejbServices.getContador("orden");
            orden.setIdorden(identity);

            orden.setFecha(JsfUtil.getFechaActual());
            orden.setTipoorden(tipoorden);
            orden.setSubtipoorden(subtipoorden);

            orden.setActivo("si");
            orden.setIdemisor(0);
            orden.setTipoemisor("");

         

            Optional<Orden> optional = ordenServices.asignarEmisorReceptorUsuarios(orden, subtipoorden, emisor, receptor, proveedorSelected,
                    autorizado,encargadotienda, encargadobodeda, encargadoganga,chofer, ayudante);
           
            if (!optional.isPresent()) {
                       return "";
            }
     
            orden = optional.get();

       
           
            orden.setUserInfo(userInfoServices.generateListUserinfo(loginController.getUsername(), "create"));
            if (ordenRepository.save(orden)) {
                revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(orden.getIdorden().toString(), loginController.getUsername(),
                        "create", "orden", ordenRepository.toDocument(orden).toString()));

                JsfUtil.successMessage(rf.getAppMessage("info.save"));

                //---
                //Guardar el detalle de la orden
                for (Ordendetalle o : ordendetalleList) {

                    Ordendetalle ordendetalle = new Ordendetalle();
                    Integer identitydetalle = autoincrementableStoreejbServices.getContador("ordendetalle");
                    ordendetalle.setIdordendetalle(identitydetalle);
                    ordendetalle.setOrden(orden);
                    ordendetalle.setArticulo(o.getArticulo());
                    ordendetalle.setCantidad(o.getCantidad());
                    if (subtipoorden.equals("proveedorabodega")) {
                        ordendetalle.setCantidadanterioremisor(0); //porque es un proveedor
                    } else {
                        ordendetalle.setCantidadanterioremisor(o.getCantidadanterioremisor());
                    }

                    ordendetalle.setCantidadanteriorreceptor(o.getCantidadanteriorreceptor());

                    ordendetalle.setUserInfo(userInfoServices.generateListUserinfo(loginController.getUsername(), "create"));
                    if (ordendetalleRepository.save(ordendetalle)) {
                        revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(ordendetalle.getIdordendetalle().toString(), loginController.getUsername(),
                                "create", "ordendetalle", ordendetalleRepository.toDocument(ordendetalle).toString()));

                    }

                    //Actualiza el inventario
                    inventarioServices.saveFromOrden(ordendetalle, subtipoorden, loginController.getUsername(), emisor, receptor, proveedorSelected);

                }
                //Limpia los datos
                orden = new Orden();
                proveedorSelected = new Proveedor();

                ordendetalleList = new ArrayList<>();
                ordendetalleFiltered = new ArrayList<>();
                ordendetalleDataModel = new OrdendetalleDataModel(ordendetalleList);
                reset();
            } else {
                JsfUtil.successMessage("save() " + ordenRepository.getException().toString());
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("save()" + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>



OrdenServices

Creamos el método para asignar el usuario en la posición correspondiente:
 public Optional<Orden> asignarEmisorReceptorUsuarios(Orden orden, String subtipoorden, Almacen emisor,
            Almacen receptor, Proveedor proveedor, Usuario autorizado, Usuario encargadotienda, Usuario encargadobodega,
            Usuario encargadoganga, Usuario chofer, Usuario ayudante) {
        try {
            List<Usuario> list = new ArrayList<>();
            orden.setAlmacen(receptor);

            if (autorizado == null || autorizado.getUsername() == null || JsfUtil.isVacio(autorizado.getUsername())) {
                JsfUtil.warningDialog("Advertencia", "Por favor seleccione la persona que Autoriza");
                return Optional.empty();
            }
            list.add(autorizado);

            if (!subtipoorden.equals("proveedorabodega") && (emisor == null || emisor.getDescripcion() == null || JsfUtil.isVacio(emisor.getDescripcion()))) {
                JsfUtil.warningDialog("Advertencia", "Por favor seleccione  el Emisor");
                return Optional.empty();
            }
            if (receptor == null || receptor.getDescripcion() == null || JsfUtil.isVacio(receptor.getDescripcion())) {
                JsfUtil.warningDialog("Advertencia", "Por favor seleccione  el Receptor");
                return Optional.empty();
            }

            orden.setAlmacen(receptor);

            switch (subtipoorden) {
                case "proveedorabodega":

                    if (proveedor == null || proveedor.getCodigo() == null || JsfUtil.isVacio(proveedor.getCodigo())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el proveedor");
                        return Optional.empty();
                    }
                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }
                    list.add(encargadobodega);

                    orden.setIdemisor(proveedor.getIdproveedor());
                    orden.setTipoemisor("proveedor");
                    orden.setUsuario(list);

                    break;
                case "tiendaabodega":

                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");

                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }

                    if (encargadotienda == null || encargadotienda.getUsername() == null || JsfUtil.isVacio(encargadotienda.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Tienda");
                        return Optional.empty();
                    }
                    if (chofer == null || chofer.getUsername() == null || JsfUtil.isVacio(chofer.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Chofer");
                        return Optional.empty();
                    }
                    if (ayudante == null || ayudante.getUsername() == null || JsfUtil.isVacio(ayudante.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ayudante");
                        return Optional.empty();
                    }

                    list.add(encargadobodega);
                    list.add(encargadotienda);
                    list.add(chofer);
                    list.add(ayudante);
                    orden.setUsuario(list);

                    break;
                case "gangaabodega":

                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");

                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }

                    if (encargadoganga == null || encargadoganga.getUsername() == null || JsfUtil.isVacio(encargadoganga.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ganga");
                        return Optional.empty();
                    }
                    if (chofer == null || chofer.getUsername() == null || JsfUtil.isVacio(chofer.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Chofer");
                        return Optional.empty();
                    }
                    if (ayudante == null || ayudante.getUsername() == null || JsfUtil.isVacio(ayudante.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ayudante");
                        return Optional.empty();
                    }

                    list.add(encargadobodega);
                    list.add(encargadoganga);
                    list.add(chofer);
                    list.add(ayudante);
                    orden.setUsuario(list);

                    break;

                //Salida   
                case "bodegaatienda":

                    orden.setIdemisor(emisor.getIdalmacen());

                    orden.setTipoemisor("almacen");
                    orden.setAlmacen(receptor);
                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }

                    if (encargadotienda == null || encargadotienda.getUsername() == null || JsfUtil.isVacio(encargadotienda.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Tienda");
                        return Optional.empty();
                    }
                    if (chofer == null || chofer.getUsername() == null || JsfUtil.isVacio(chofer.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Chofer");
                        return Optional.empty();
                    }
                    if (ayudante == null || ayudante.getUsername() == null || JsfUtil.isVacio(ayudante.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ayudante");
                        return Optional.empty();
                    }

                    list.add(encargadobodega);
                    list.add(encargadotienda);
                    list.add(chofer);
                    list.add(ayudante);
                    orden.setUsuario(list);
                    break;

                case "bodegaaganga":

                    orden.setIdemisor(emisor.getIdalmacen());

                    orden.setTipoemisor("almacen");
                    orden.setAlmacen(receptor);

                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }

                    if (encargadoganga == null || encargadoganga.getUsername() == null || JsfUtil.isVacio(encargadoganga.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ganga");
                        return Optional.empty();
                    }
                    if (chofer == null || chofer.getUsername() == null || JsfUtil.isVacio(chofer.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Chofer");
                        return Optional.empty();
                    }
                    if (ayudante == null || ayudante.getUsername() == null || JsfUtil.isVacio(ayudante.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ayudante");
                        return Optional.empty();
                    }

                    list.add(encargadobodega);
                    list.add(encargadoganga);
                    list.add(chofer);
                    list.add(ayudante);
                    orden.setUsuario(list);
                    break;

                //MovimientoInterno
                case "tiendaainterno":

                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");
                    if (encargadotienda == null || encargadotienda.getUsername() == null || JsfUtil.isVacio(encargadotienda.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Tienda");
                        return Optional.empty();
                    }

                    list.add(encargadotienda);

                    break;

                case "gangaainterno":

                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");
                    if (encargadoganga == null || encargadoganga.getUsername() == null || JsfUtil.isVacio(encargadoganga.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ganga");
                        return Optional.empty();
                    }
                    list.add(encargadoganga);
                    break;

                case "bodegaainterno":
                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");

                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }

                    if (encargadotienda == null || encargadotienda.getUsername() == null || JsfUtil.isVacio(encargadotienda.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Tienda");
                        return Optional.empty();
                    }
                    if (chofer == null || chofer.getUsername() == null || JsfUtil.isVacio(chofer.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Chofer");
                        return Optional.empty();
                    }
                    if (ayudante == null || ayudante.getUsername() == null || JsfUtil.isVacio(ayudante.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ayudante");
                        return Optional.empty();
                    }

                    list.add(encargadobodega);
                    list.add(encargadotienda);
                    list.add(chofer);
                    list.add(ayudante);
                    orden.setUsuario(list);

                    break;

                case "internoatienda":
                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");
                    if (encargadotienda == null || encargadotienda.getUsername() == null || JsfUtil.isVacio(encargadotienda.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Tienda");
                        return Optional.empty();
                    }

                    list.add(encargadotienda);
                    break;
                case "internoaganga":
                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");
                    if (encargadoganga == null || encargadoganga.getUsername() == null || JsfUtil.isVacio(encargadoganga.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ganga");
                        return Optional.empty();
                    }
                    list.add(encargadoganga);

                    break;

                case "internoabodega":
                    orden.setIdemisor(emisor.getIdalmacen());
                    orden.setTipoemisor("almacen");
                    if (encargadobodega == null || encargadobodega.getUsername() == null || JsfUtil.isVacio(encargadobodega.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Bodega");
                        return Optional.empty();
                    }

                    if (encargadotienda == null || encargadotienda.getUsername() == null || JsfUtil.isVacio(encargadotienda.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Tienda");
                        return Optional.empty();
                    }
                    if (chofer == null || chofer.getUsername() == null || JsfUtil.isVacio(chofer.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Chofer");
                        return Optional.empty();
                    }
                    if (ayudante == null || ayudante.getUsername() == null || JsfUtil.isVacio(ayudante.getUsername())) {
                        JsfUtil.warningDialog("Advertencia", "Por favor seleccione el encargado de Ayudante");
                        return Optional.empty();
                    }

                    list.add(encargadobodega);
                    list.add(encargadotienda);
                    list.add(chofer);
                    list.add(ayudante);
                    orden.setUsuario(list);
                    break;

                default:
                    JsfUtil.warningMessage("subtipoorden: " + subtipoorden + " no se ha contemplado saveFromOrden()");
                    break;

            }
        } catch (Exception e) {
            JsfUtil.successMessage("asignarEmisorReceptor() " + e.getLocalizedMessage().toString());
        }
        return Optional.of(orden);
    }
    // </editor-fold>





Comments

Popular posts from this blog

Primefaces v13

 La versión nueva de primefaces v13.0 elimina el componente <p:repeat>  Consulte los cambios en  https://github.com/primefaces/primefaces/releases/tag/13.0.0 por lo tanto si necesita una solución similar considere utilizar  <p:carousel>  o  <ui:repeat> En la versión 13 genera una excepción

Jmoordb-Core @UpdateMany y @DeleteMany

 Jmoordb-Core @UpdateMany y @DeleteMany Estoy trabajando en una versión nueva de jmoordb-core en la cual se estará implementando nuevas funcionalidades como lo son @DeleteMany y    @UpdateMany con la finalidad de hacer operaciones sobre múltiples documentos de la colección.