Relaciones con atributos no Referenciados
Last updated
Was this helpful?
Last updated
Was this helpful?
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.
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
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"
}
]
<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"
/>
<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"
/>
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;
}
Ver ChoferController.java