Maestro-Detalle Orden de Proveedor a Bodega

  • 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.

Fields

  • 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;

addFila()

  • 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 "";
    }

save()

  • 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 "";
    }

Formulario .xhtml

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>

Código formulario .xhtml

<?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>

Nota:

Ver OrdenController.java

Last updated