Maestro-Detalle Orden de Proveedor a Bodega
Last updated
Was this helpful?
Last updated
Was this helpful?
Realiza una orden de artículos de un proveedor que se pasan a la bodega (Proveedor a Bodega)
Se registra la orden(Orden, Ordendetalle)
Afecta el Inventario (Inventario, Inventariodetalle)
Muestra un formulario donde no se valida el new
Usa datatable para agregar los detalles de la orden
Se invoca directo desde el menu u otro formulario.
Crear un autocomplete de los artículos filtrando los que estén en el inventario
Muestra dos autocomplete
El entity Inventario posee los atributos (id, tipoid) que identifican el tipo de entity para relacionar. Este usa esos atributos para crear la relación entre documentos sin usar @Referenced. De esta manera es necesario realizar las búsquedas mediante código.
Definir los atributos
Ordendetalle ordendetalle;
Ordendetalle ordendetalleSelected;
Proveedor proveedorSelected;
Bodega bodegaSelected;
Tienda tiendaSelected;
Ganga gangaSelected;
Interno internoSelected;
List<Ordendetalle> ordendetalleList = new ArrayList<>();
List<Ordendetalle> ordendetalleFiltered = new ArrayList<>();
@Inject
ArticuloServices articuloServices;
@Inject
ArticuloRepository articuloRepository;
@Inject
OrdendetalleRepository ordendetalleRepository;
Agrega una fila al datatable
public String addFila() {
try {
ordendetalle = new Ordendetalle();
ordendetalle.setCantidad(0);
ordendetalle.setCantidadanterioremisor(0);
ordendetalle.setCantidadanteriorreceptor(0);
ordendetalleList.add(ordendetalle);
// showTotales();
} catch (Exception e) {
JsfUtil.errorMessage("adOrden detalledFila()" + e.getLocalizedMessage());
LOG.info("addFila()" + e.getLocalizedMessage());
}
return "";
}
Guarda la orden en un método save(String tipoorden, String subtipoorden)
Actualiza el inventario
public String save(String tipoorden, String subtipoorden) {
try {
if (!valid()) {
return "";
}
Integer identity = autoincrementableStoreejbServices.getContador("orden");
orden.setIdorden(identity);
orden.setFecha(JsfUtil.getFechaActual());
orden.setAutorizadopor(loginController.getUsername());
orden.setTipoorden(tipoorden);
orden.setSubtipoorden(subtipoorden);
orden.setActivo("si");
orden.setIdemisor("");
orden.setTipoemisor("");
orden.setIdreceptor("");
orden.setTiporeceptor("");
//Carga los datos idemisorreceptor
orden = ordenServices.asignarEmisorReceptor(orden, subtipoorden, bodegaSelected, tiendaSelected, gangaSelected, internoSelected, proveedorSelected);
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(), bodegaSelected, tiendaSelected, gangaSelected, internoSelected, proveedorSelected);
}
//Limpia los datos
orden = new Orden();
proveedorSelected = new Proveedor();
bodegaSelected = new Bodega();
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 "";
}
Definimos
Utilizar para controlar la ediciòn
</p:cellEditor>
Utilzar <p:spinner> para las cantidades
<p:spinner value="#{item.cantidad}"
id="cantidad"
min="0"
stepFactor="#{field.stepFactor}"
required="true"
requiredMessage="#{msg['field.cantidadrequerida']}"
converterMessage="#{msg['field.invalidQuantity']}"/>
Agregar un boton para insertar nuevas filas
<p:column style="width:45px;">
<f:facet name="header">
<p:panelGrid columns="2" styleClass="form-group ui-panelgrid-blank" layout="grid">
<b:commandButton iconAwesome="fa-plus"
update=":form:datatable"
title="#{app['button.new']}"
action="#{ordenController.addFila()}"
/>
<b:commandButton iconAwesome="fa-refresh"
update=":form:datatable"
title="#{app['button.refresh']}"
action="#{ordenController.refresh()}"
/>
</p:panelGrid>
</f:facet>
<p:panelGrid columns="2" styleClass="form-group ui-panelgrid-blank" layout="grid">
<p:row>
<p:column>
<b:commandButton
iconAwesome="fa-trash-o"
title="#{app['button.delete']}"
action="#{ordenController.onRowDelete(rowIndex)}"
>
</b:commandButton>
</p:column>
</p:row>
</p:panelGrid>
</p:column>
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<ui:composition template="/layout/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:b="http://bootsfaces.net/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:a="http://xmlns.jcp.org/jsf/composite/avbravo"
xmlns:e="http://xmlns.jcp.org/jsf/composite/extensions">
<ui:define name="content">
<!--<h:outputStylesheet library="bsf" name="css/thumbnails.css"/>-->
<style>
.thumbnail { max-width: 100%; }
img.thumbnail:hover, img.thumbnail:focus {
border: 1px solid;
border-color: #428BCA;
}
</style>
<style>
.ui-datatable td:nth-child(1) div.ui-dt-c {
padding: 0 0 0 0 !important;
}
</style>
<h1>#{msg['titleview.ordenproveedorbodega']}</h1>
<hr/>
<b:form id="form" prependId="false" rendered="#{loginController.loggedIn and applicationMenu.orden.create}" onkeypress="if (event.keyCode == 13) {
return false;
}">
<h:panelGroup id="content" layout="block">
<a:messages id="msg"/>
<b:panel title="#{app['title.data']}">
<b:panelGrid id="panel" colSpans="2,10" size="xs" >
<p:outputLabel value="#{msg['field.proveedor']}"/>
<e:autocompleteproveedor listener="#{ordenController.handleSelect}"
value="#{ordenController.proveedorSelected}"
itemLabel=" #{p.razonsocial}#{p.ruc}"
size="50"
required="true"
field="razonsocial"
update=":form:content"
/>
<p:outputLabel value="#{msg['field.idbodega']}"/>
<e:autocompletebodega listener="#{ordenController.handleSelect}"
value="#{ordenController.bodegaSelected}"
itemLabel=" #{p.idbodega}"
required="true"
field="idbodega"
update=" :form:content"/>
<p:outputLabel value="#{msg['field.observacion']}" />
<b:inputTextarea value="#{ordenController.orden.observacion}" id="observacion"
required="true" label="#{msg['field.observacion']}" />
<p:outputLabel value="#{msg['field.encargadobodega']}"/>
<a:inputText value="#{ordenController.orden.encargadobodega}" id="encargadobodega"
required="true" label="#{msg['field.encargadobodega']}" />
<a:save rendered="#{applicationMenu.proveedor.create}"
save="#{ordenController.save('entrada','proveedorabodega' )}" />
<b:commandButton iconAwesome="fa-plus"
action="#{ordenController.prepare('new')}"
value="#{app['button.new']}"
title="#{app['button.new']}"
update=":form:content" >
<f:ajax />
</b:commandButton>
</b:panelGrid>
<b:tabView activeIndex="0" id="tabview"
>
<p:remoteCommand update="datatable"
action="#{ordenController.refresh()}"
name="remotedatatable"/>
<b:tab title="#{msg['tab.detalle']}">
<f:facet name="anchor"><b:iconAwesome name="address-card" /></f:facet>
<p:remoteCommand name="onCellEditTable"
update=":form:msg, datatable" />
<p:dataTable
rowIndexVar="rowIndex"
rowStyleClass="no-color"
id="datatable"
var="item"
value="#{ordenController.ordendetalleDataModel}"
editable="true"
editMode="cell"
>
<p:ajax event="cellEdit" listener="#{ordenController.onCellEditFromProveedor}"
oncomplete="onCellEditTable()"
/>
<p:column headerText="#{msg['field.idarticulo']}" style="width:95px;">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{item.articulo.idarticulo}"/></f:facet>
<f:facet name="input">
<p:autoComplete dropdown="false"
scrollHeight="250"
size="25"
emptyMessage="#{app['info.nohayregistros']}"
value="#{item.articulo}"
completeMethod="#{ordenController.completeFilterFromProveedor}"
var="p"
itemLabel=" #{p.idarticulo}"
itemValue="#{p}"
forceSelection="true">
<f:converter binding="#{articuloConverter}"/>
<f:attribute name="field" value="idarticulo"/>
<f:attribute name="fielddropdown" value="false"/>
<f:attribute name="fieldquerylenth" value="1"/>
<p:ajax event="itemSelect" listener="#{ordenController.onArticuloChange(rowIndex,item,'proveedorabodega')}"
update=":form:msg, datatable" />
<f:facet name="itemtip">
<b:row>
<b:column>
<h:outputText value="#{msg['field.descripcion']} #{p.descripcion}" />
</b:column>
</b:row>
<b:row>
<b:column>
<h:outputText value="#{msg['field.cantidad']} #{p.cantidad}" />
</b:column>
</b:row>
</f:facet>
</p:autoComplete>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="#{msg['field.articulo']}" style="width:275px;">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{item.articulo.descripcion}"/></f:facet>
<f:facet name="input">
<p:autoComplete dropdown="false"
scrollHeight="250"
size="25"
emptyMessage="#{app['info.nohayregistros']}"
value="#{item.articulo}"
completeMethod="#{ordenController.completeFilterFromProveedor}"
var="p"
itemLabel=" #{p.descripcion}"
itemValue="#{p}"
forceSelection="true">
<f:converter binding="#{articuloConverter}"/>
<f:attribute name="field" value="descripcion"/>
<f:attribute name="fielddropdown" value="false"/>
<f:attribute name="fieldquerylenth" value="1"/>
<p:ajax event="itemSelect" listener="#{ordenController.onArticuloChange(rowIndex,item,'proveedorabodega')}"
update=":form:msg, datatable" />
<f:facet name="itemtip">
<b:row>
<b:column>
<h:outputText value="#{msg['field.idarticulo']} #{p.idarticulo}" />
</b:column>
</b:row>
<b:row>
<b:column>
<h:outputText value="#{msg['field.cantidad']} #{p.cantidad}" />
</b:column>
</b:row>
</f:facet>
</p:autoComplete>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="#{msg['field.cantidad']}" style="width:45px;">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{item.cantidad}"/></f:facet>
<f:facet name="input">
<p:spinner value="#{item.cantidad}"
id="cantidad"
min="0"
stepFactor="#{field.stepFactor}"
required="true"
requiredMessage="#{msg['field.cantidadrequerida']}"
converterMessage="#{msg['field.invalidQuantity']}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="#{msg['field.anterior']}" style="width:45px;">
<h:outputText value="#{item.cantidadanteriorreceptor}"/>
</p:column>
<p:column headerText="#{msg['field.balance']}" style="width:45px;">
<h:outputText value="#{ordenController.calcularBalance(item.cantidad, item.cantidadanteriorreceptor,item,rowIndex)}"/>
</p:column>
<p:column style="width:45px;">
<f:facet name="header">
<p:panelGrid columns="2" styleClass="form-group ui-panelgrid-blank" layout="grid">
<b:commandButton iconAwesome="fa-plus"
update=":form:datatable"
title="#{app['button.new']}"
action="#{ordenController.addFila()}"
/>
<b:commandButton iconAwesome="fa-refresh"
update=":form:datatable"
title="#{app['button.refresh']}"
action="#{ordenController.refresh()}"
/>
</p:panelGrid>
</f:facet>
<p:panelGrid columns="2" styleClass="form-group ui-panelgrid-blank" layout="grid">
<p:row>
<p:column>
<b:commandButton
iconAwesome="fa-trash-o"
title="#{app['button.delete']}"
action="#{ordenController.onRowDelete(rowIndex)}"
>
</b:commandButton>
</p:column>
</p:row>
</p:panelGrid>
</p:column>
</p:dataTable>
</b:tab>
</b:tabView>
</b:panel>
</h:panelGroup>
</b:form>
<a:denegado renderedcondition="#{!loginController.loggedIn or !applicationMenu.orden.create}" />
<br/><br/><br/>
</ui:define>
</ui:composition>
Ver OrdenController.java