OrdenController.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.avbravo.store.controller;

// <editor-fold defaultstate="collapsed" desc="imports">
import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.avbravoutils.printer.Printer;
import com.avbravo.ejbjmoordb.interfaces.IController;
import com.avbravo.ejbjmoordb.services.RevisionHistoryServices;
import com.avbravo.ejbjmoordb.services.UserInfoServices;
import com.avbravo.storeejb.repository.AutoincrementableStoreejbRepository;

import com.avbravo.storeejb.datamodel.OrdenDataModel;
import com.avbravo.storeejb.repository.OrdenRepository;
import com.avbravo.storeejb.repository.RevisionHistoryStoreejbRepository;
import com.avbravo.storeejb.entity.Orden;
import com.avbravo.storeejb.services.OrdenServices;
import com.avbravo.store.util.ResourcesFiles;
import com.avbravo.storeejb.datamodel.OrdendetalleDataModel;
import com.avbravo.storeejb.entity.Articulo;
import com.avbravo.storeejb.entity.Bodega;
import com.avbravo.storeejb.entity.Ganga;
import com.avbravo.storeejb.entity.Interno;
import com.avbravo.storeejb.entity.Inventario;
import com.avbravo.storeejb.entity.Ordendetalle;
import com.avbravo.storeejb.entity.Proveedor;
import com.avbravo.storeejb.entity.Tienda;
import com.avbravo.storeejb.repository.ArticuloRepository;
import com.avbravo.storeejb.repository.InventarioRepository;
import com.avbravo.storeejb.repository.InventariodetalleRepository;
import com.avbravo.storeejb.repository.OrdendetalleRepository;
import com.avbravo.storeejb.services.ArticuloServices;
import com.avbravo.storeejb.services.AutoincrementableStoreejbServices;
import com.avbravo.storeejb.services.EmisorReceptorServices;
import com.avbravo.storeejb.services.InventarioServices;
import com.avbravo.storeejb.services.LookupStoreejbServices;

import java.util.ArrayList;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.component.UIComponent;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.faces.context.FacesContext;
import org.bson.Document;
import org.primefaces.context.RequestContext;
import org.primefaces.event.CellEditEvent;
import org.primefaces.event.SelectEvent;
// </editor-fold>

/**
 *
 * @authoravbravo
 */
@Named
@ViewScoped
public class OrdenController implements Serializable, IController {
// <editor-fold defaultstate="collapsed" desc="fields">  

    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(OrdenController.class.getName());
//    @Inject
//private transient ExternalContext externalContext;
    private Boolean writable = false;
    //DataModel
    private OrdenDataModel ordenDataModel;
    private OrdendetalleDataModel ordendetalleDataModel;

    Integer page = 1;
    Integer rowPage = 25;
    List<Integer> pages = new ArrayList<>();
    //

    //Entity
    Orden orden;
    Orden ordenSelected;
    Ordendetalle ordendetalle;
    Ordendetalle ordendetalleSelected;

    Proveedor proveedorSelected;
    Bodega bodegaSelected;
    Tienda tiendaSelected;
    Ganga gangaSelected;
    Interno internoSelected;

    //List
    List<Orden> ordenList = new ArrayList<>();
    List<Orden> ordenFiltered = new ArrayList<>();
    List<Ordendetalle> ordendetalleList = new ArrayList<>();
    List<Ordendetalle> ordendetalleFiltered = new ArrayList<>();

    //Repository
    @Inject
    AutoincrementableStoreejbRepository autoincrementableRepository;
    @Inject
    ArticuloRepository articuloRepository;
    @Inject
    InventarioRepository inventarioRepository;
    @Inject
    InventariodetalleRepository inventariodetalleRepository;
    @Inject
    OrdenRepository ordenRepository;
    @Inject
    OrdendetalleRepository ordendetalleRepository;

    @Inject
    RevisionHistoryStoreejbRepository revisionHistoryStoreejbRepository;

    //Services
    //Atributos para busquedas
    @Inject
    EmisorReceptorServices emisorReceptorServices;
    @Inject
    AutoincrementableStoreejbServices autoincrementableStoreejbServices;
    @Inject
    ArticuloServices articuloServices;
    @Inject
    InventarioServices inventarioServices;
    @Inject
    LookupStoreejbServices lookupStoreejbServices;
    @Inject
    RevisionHistoryServices revisionHistoryServices;
    @Inject
    UserInfoServices userInfoServices;
    @Inject
    OrdenServices ordenServices;
    @Inject
    ResourcesFiles rf;
    @Inject
    Printer printer;
    @Inject
    LoginController loginController;

    //List of Relations
    //Repository of Relations
    // </editor-fold>
// <editor-fold defaultstate="collapsed" desc="getter/setter">
    public List<Integer> getPages() {

        return ordenRepository.listOfPage(rowPage);
    }

    public void setPages(List<Integer> pages) {
        this.pages = pages;
    }

    public EmisorReceptorServices getEmisorReceptorServices() {
        return emisorReceptorServices;
    }

    public void setEmisorReceptorServices(EmisorReceptorServices emisorReceptorServices) {
        this.emisorReceptorServices = emisorReceptorServices;
    }

    public ArticuloServices getArticuloServices() {
        return articuloServices;
    }

    public void setArticuloServices(ArticuloServices articuloServices) {
        this.articuloServices = articuloServices;
    }

    public List<Ordendetalle> getOrdendetalleList() {
        return ordendetalleList;
    }

    public void setOrdendetalleList(List<Ordendetalle> ordendetalleList) {
        this.ordendetalleList = ordendetalleList;
    }

    public OrdendetalleDataModel getOrdendetalleDataModel() {
        return ordendetalleDataModel;
    }

    public void setOrdendetalleDataModel(OrdendetalleDataModel ordendetalleDataModel) {
        this.ordendetalleDataModel = ordendetalleDataModel;
    }

    public Ordendetalle getOrdendetalle() {
        return ordendetalle;
    }

    public void setOrdendetalle(Ordendetalle ordendetalle) {
        this.ordendetalle = ordendetalle;
    }

    public Ordendetalle getOrdendetalleSelected() {
        return ordendetalleSelected;
    }

    public void setOrdendetalleSelected(Ordendetalle ordendetalleSelected) {
        this.ordendetalleSelected = ordendetalleSelected;
    }

    public Tienda getTiendaSelected() {
        return tiendaSelected;
    }

    public void setTiendaSelected(Tienda tiendaSelected) {
        this.tiendaSelected = tiendaSelected;
    }

    public List<Ordendetalle> getOrdendetalleFiltered() {
        return ordendetalleFiltered;
    }

    public void setOrdendetalleFiltered(List<Ordendetalle> ordendetalleFiltered) {
        this.ordendetalleFiltered = ordendetalleFiltered;
    }

    public Proveedor getProveedorSelected() {
        return proveedorSelected;
    }

    public void setProveedorSelected(Proveedor proveedorSelected) {
        this.proveedorSelected = proveedorSelected;
    }

    public Bodega getBodegaSelected() {
        return bodegaSelected;
    }

    public void setBodegaSelected(Bodega bodegaSelected) {
        this.bodegaSelected = bodegaSelected;
    }

    public Ganga getGangaSelected() {
        return gangaSelected;
    }

    public void setGangaSelected(Ganga gangaSelected) {
        this.gangaSelected = gangaSelected;
    }

    public Interno getInternoSelected() {
        return internoSelected;
    }

    public void setInternoSelected(Interno internoSelected) {
        this.internoSelected = internoSelected;
    }

    public LookupStoreejbServices getLookupStoreejbServices() {
        return lookupStoreejbServices;
    }

    public void setLookupStoreejbServices(LookupStoreejbServices lookupStoreejbServices) {
        this.lookupStoreejbServices = lookupStoreejbServices;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getRowPage() {
        return rowPage;
    }

    public void setRowPage(Integer rowPage) {
        this.rowPage = rowPage;
    }

    public OrdenServices getOrdenServices() {
        return ordenServices;
    }

    public void setOrdenServices(OrdenServices ordenServices) {
        this.ordenServices = ordenServices;
    }

    public List<Orden> getOrdenList() {
        return ordenList;
    }

    public void setOrdenList(List<Orden> ordenList) {
        this.ordenList = ordenList;
    }

    public List<Orden> getOrdenFiltered() {
        return ordenFiltered;
    }

    public void setOrdenFiltered(List<Orden> ordenFiltered) {
        this.ordenFiltered = ordenFiltered;
    }

    public Orden getOrden() {
        return orden;
    }

    public void setOrden(Orden orden) {
        this.orden = orden;
    }

    public Orden getOrdenSelected() {
        return ordenSelected;
    }

    public void setOrdenSelected(Orden ordenSelected) {
        this.ordenSelected = ordenSelected;
    }

    public OrdenDataModel getOrdenDataModel() {
        return ordenDataModel;
    }

    public void setOrdenDataModel(OrdenDataModel ordenDataModel) {
        this.ordenDataModel = ordenDataModel;
    }

    public Boolean getWritable() {
        return writable;
    }

    public void setWritable(Boolean writable) {
        this.writable = writable;
    }

    // </editor-fold>
// <editor-fold defaultstate="collapsed" desc="constructor">
    public OrdenController() {
    }

    // </editor-fold>
// <editor-fold defaultstate="collapsed" desc="preRenderView()">
    @Override
    public String preRenderView(String action) {
        //acciones al llamar el formulario despues del init    
        return "";
    }
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="init">

    @PostConstruct
    public void init() {
        try {
            String action = loginController.get("orden");
            String id = loginController.get("idorden");
            String pageSession = loginController.get("pageorden");
            //Search
            loginController.put("searchorden", "_init");
            writable = false;

            ordenList = new ArrayList<>();
            ordenFiltered = new ArrayList<>();
            ordendetalleList = new ArrayList<>();
            ordendetalleFiltered = new ArrayList<>();
            orden = new Orden();
            ordendetalle = new Ordendetalle();
            ordendetalleSelected = new Ordendetalle();
            ordenDataModel = new OrdenDataModel(ordenList);
            ordendetalleDataModel = new OrdendetalleDataModel(ordendetalleList);

            if (id != null) {
                Optional<Orden> optional = ordenRepository.find("idorden", id);
                if (optional.isPresent()) {
                    orden = optional.get();
                    ordenSelected = orden;
                    writable = true;

                }
            }
            if (action != null && action.equals("gonew")) {
                orden = new Orden();
                ordenSelected = orden;
                writable = false;

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

        } catch (Exception e) {
            JsfUtil.errorMessage("init() " + e.getLocalizedMessage());
        }
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="reset">

    @Override
    public void reset() {

        RequestContext.getCurrentInstance().reset(":form:content");
        prepare("new");
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="prepare(String action, Object... item)">
    @Override
    public String prepare(String action, Object... item) {
        String url = "";
        try {
            loginController.put("pageorden", page.toString());
            loginController.put("orden", action);

            switch (action) {
                case "new":
                    orden = new Orden();
                    ordenSelected = new Orden();
                    proveedorSelected = new Proveedor();
                    bodegaSelected = new Bodega();
                    ordendetalleList = new ArrayList<>();
                    ordendetalleFiltered = new ArrayList<>();
                    ordendetalleDataModel = new OrdendetalleDataModel(ordendetalleList);
                    writable = false;
                    break;

                case "view":
                    if (item.length != 0) {
                        ordenSelected = (Orden) item[0];
                        orden = ordenSelected;
                        loginController.put("idorden", orden.getIdorden().toString());
                    }

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

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

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

        return url;
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="showAll">
    @Override
    public String showAll() {
        try {
            ordenList = new ArrayList<>();
            ordenFiltered = new ArrayList<>();
            ordenList = ordenRepository.findAll();
            ordenFiltered = ordenList;
            ordenDataModel = new OrdenDataModel(ordenList);

        } catch (Exception e) {
            JsfUtil.errorMessage("showAll()" + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="isNew">

    @Override
    public String isNew() {
        try {
            writable = true;
                 if(JsfUtil.isVacio(orden.getIdorden())){
                writable=false;
                return "";
            }
            Optional<Orden> optional = ordenRepository.findById(orden);
            if (optional.isPresent()) {
                writable = false;

                JsfUtil.warningMessage(rf.getAppMessage("warning.idexist"));
                return "";
            } else {
                Integer id = orden.getIdorden();
                orden = new Orden();
                orden.setIdorden(id);
                ordenSelected = new Orden();
            }

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

    @Override
    public String save() {
        return "";
    }
// <editor-fold defaultstate="collapsed" desc="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.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 "";
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="edit">
    @Override
    public String edit() {
        try {

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

            //guarda el contenido anterior
            //guarda el contenido actualizado
            revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(orden.getIdorden().toString(), loginController.getUsername(),
                    "update", "orden", ordenRepository.toDocument(orden).toString()));

            ordenRepository.update(orden);
            JsfUtil.successMessage(rf.getAppMessage("info.update"));
        } catch (Exception e) {
            JsfUtil.errorMessage("edit()" + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="delete(Object item, Boolean deleteonviewpage)">

    @Override
    public String delete(Object item, Boolean deleteonviewpage) {
        String path = "";
        try {
            orden = (Orden) item;

            ordenSelected = orden;
            if (ordenRepository.delete("idorden", orden.getIdorden())) {
                revisionHistoryStoreejbRepository.save(revisionHistoryServices.getRevisionHistory(orden.getIdorden().toString(), loginController.getUsername(), "delete", "orden", ordenRepository.toDocument(orden).toString()));
                JsfUtil.successMessage(rf.getAppMessage("info.delete"));

                if (!deleteonviewpage) {
                    ordenList.remove(orden);
                    ordenFiltered = ordenList;
                    ordenDataModel = new OrdenDataModel(ordenList);

                    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pageorden", page.toString());

                } else {
                    orden = new Orden();
                    ordenSelected = new Orden();
                    writable = false;

                }

            }

        } catch (Exception e) {
            JsfUtil.errorMessage("delete() " + e.getLocalizedMessage());
        }
        // path = deleteonviewpage ? "/pages/orden/list.xhtml" : "";
        path = "";
        return path;
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="deleteAll">
    @Override
    public String deleteAll() {
        if (ordenRepository.deleteAll() != 0) {
            JsfUtil.successMessage(rf.getAppMessage("info.delete"));
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="print">

    @Override
    public String print() {
        try {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("pageorden", page.toString());
            List<Orden> list = new ArrayList<>();
            list.add(orden);
            String ruta = "/resources/reportes/orden/details.jasper";
            HashMap parameters = new HashMap();
            // parameters.put("P_parametro", "valor");
            printer.imprimir(list, ruta, parameters);
        } catch (Exception ex) {
            JsfUtil.errorMessage("imprimir() " + ex.getLocalizedMessage());
        }
        return null;
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="printAll">

    @Override
    public String printAll() {
        try {
            List<Orden> list = new ArrayList<>();
            list = ordenRepository.findAll(new Document("idorden", 1));

            String ruta = "/resources/reportes/orden/all.jasper";
            HashMap parameters = new HashMap();
            // parameters.put("P_parametro", "valor");
            printer.imprimir(list, ruta, parameters);
        } catch (Exception ex) {
            JsfUtil.errorMessage("imprimir() " + ex.getLocalizedMessage());
        }
        return null;
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="handleSelect">

    public void handleSelect(SelectEvent event) {
        try {
            ordenList.removeAll(ordenList);
            ordenList.add(ordenSelected);
            ordenFiltered = ordenList;
            ordenDataModel = new OrdenDataModel(ordenList);
            loginController.put("searchorden", "_autocomplete");
        } catch (Exception ex) {
            JsfUtil.errorMessage("handleSelect() " + ex.getLocalizedMessage());
        }
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="last">
    @Override
    public String last() {
        try {
            page = ordenRepository.sizeOfPage(rowPage);
            move();
        } catch (Exception e) {
            JsfUtil.errorMessage("last() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="first">

    @Override
    public String first() {
        try {
            page = 1;
            move();
        } catch (Exception e) {
            JsfUtil.errorMessage("first() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="next">

    @Override
    public String next() {
        try {
            if (page < (ordenRepository.sizeOfPage(rowPage))) {
                page++;
            }
            move();
        } catch (Exception e) {
            JsfUtil.errorMessage("next() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="back">

    @Override
    public String back() {
        try {
            if (page > 1) {
                page--;
            }
            move();
        } catch (Exception e) {
            JsfUtil.errorMessage("back() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="skip(Integer page)">

    @Override
    public String skip(Integer page) {
        try {
            this.page = page;
            move();
        } catch (Exception e) {
            JsfUtil.errorMessage("skip() " + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="move">

    @Override
    public void move() {
        try {

            Document doc;
            switch (loginController.get("searchorden")) {
                case "_init":
                    ordenList = ordenRepository.findPagination(page, rowPage);

                    break;
                case "_autocomplete":
                    //no se realiza ninguna accion 
                    break;

                case "idorden":
                    doc = new Document("idorden", orden.getIdorden());
                    ordenList = ordenRepository.findFilterPagination(doc, page, rowPage, new Document("idorden", -1));
                    break;

                default:

                    ordenList = ordenRepository.findPagination(page, rowPage);
                    break;
            }

            ordenFiltered = ordenList;

            ordenDataModel = new OrdenDataModel(ordenList);

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

// <editor-fold defaultstate="collapsed" desc="clear">
    @Override
    public String clear() {
        try {
            loginController.put("searchorden", "_init");
            page = 1;
            move();
        } catch (Exception e) {
            JsfUtil.errorMessage("clear()" + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="searchBy(String string, Boolean... blns)">
    @Override
    public String searchBy(String string) {
        try {

            loginController.put("searchorden", string);

            writable = true;
            move();

        } catch (Exception e) {
            JsfUtil.errorMessage("searchBy()" + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="addFila()">

    public String addFila() {
        try {

            ordendetalle = new Ordendetalle();

            ordendetalle.setCantidad(0);
            ordendetalle.setCantidadanterioremisor(0);
            ordendetalle.setCantidadanteriorreceptor(0);
            ordendetalleList.add(ordendetalle);
            ordendetalleFiltered = ordendetalleList;
            ordendetalleDataModel = new OrdendetalleDataModel(ordendetalleList);
            //  showTotales();
        } catch (Exception e) {
            JsfUtil.errorMessage("addFila()" + e.getLocalizedMessage());
            LOG.info("addFila()" + e.getLocalizedMessage());
        }
        return "";
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="List<Articulo> completeFilter(String query)">
    public List<Articulo> completeFilter(String query) {

        List<Articulo> suggestions = new ArrayList<>();
        try {
            query = query.trim();
            if (query.length() < 1) {
                return suggestions;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");

            List<Inventario> list = new ArrayList<>();
            switch (field) {
                case "idarticulo":
                    list = inventarioRepository.findRegex("articulo.idarticulo", query, true, "id", bodegaSelected.getIdbodega(), "tipoid", "bodega", new Document(field, 1));
                    break;
                case "descripcion":
                    // Buscar en la lista de articulos y luego verificar que este existe en inventario x idbodega, xid
                    list = inventarioRepository.findRegex("articulo.idarticulo", query, true, "id", bodegaSelected.getIdbodega(), "tipoid", "bodega", new Document(field, 1));
                    break;
                default:
                    break;

            }
            if (!list.isEmpty()) {
                Boolean found = false;

                for (Inventario i : list) {

                    found = false;
                    if (!ordendetalleList.isEmpty()) {
                        for (Ordendetalle o : ordendetalleList) {
                            if (o.getArticulo() != null) {
                                if (i.getArticulo().getIdarticulo().equals(o.getArticulo().getIdarticulo())) {
                                    found = true;
                                }
                            }

                        }
                    }

                    if (!found) {
                        // le colocamos la cna
                        i.getArticulo().setCantidad(i.getCantidad());
                        suggestions.add(i.getArticulo());
                    }
                }
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("complete() " + e.getLocalizedMessage());
        }
        return suggestions;
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="List<Articulo> completeFilterFromProveedor(String query)">

    public List<Articulo> completeFilterFromProveedor(String query) {

        List<Articulo> suggestions = new ArrayList<>();
        try {
            query = query.trim();
            if (query.length() < 1) {
                return suggestions;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");

            List<Articulo> list = new ArrayList<>();
            list = articuloRepository.findRegex(field, query, true, "activo", "si", "proveedor.idproveedor", proveedorSelected.getIdproveedor(), new Document(field, 1));

            if (!list.isEmpty()) {

                Boolean found = false;

                for (Articulo i : list) {
                    found = false;
                    if (!ordendetalleList.isEmpty()) {

                        for (Ordendetalle o : ordendetalleList) {
                            if (o.getArticulo() != null) {
                                if (i.getIdarticulo().equals(o.getArticulo().getIdarticulo())) {
                                    found = true;
                                }
                            }

                        }
                    }
                    if (!found) {

                        suggestions.add(i);
                    }
                }
            }

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

    // <editor-fold defaultstate="collapsed" desc="List<Articulo> completeFilterFromBodega(String query)">
    public List<Articulo> completeFilterFromBodega(String query) {

        List<Articulo> suggestions = new ArrayList<>();
        try {
            query = query.trim();
            if (query.length() < 1) {
                return suggestions;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");

            List<Inventario> list = new ArrayList<>();
            switch (field) {
                case "idarticulo":
                    list = inventarioRepository.findRegex("articulo.idarticulo", query, true, "id", bodegaSelected.getIdbodega(), "tipoid", "bodega", new Document(field, 1));
                    break;
                case "descripcion":
                    list = inventarioServices.searchByDescripcion(field, query, bodegaSelected.getIdbodega(), "bodega");

                    break;
                default:
                    break;

            }
            if (!list.isEmpty()) {
                Boolean found = false;

                for (Inventario i : list) {

                    found = false;
                    if (!ordendetalleList.isEmpty()) {
                        for (Ordendetalle o : ordendetalleList) {
                            if (o.getArticulo() != null) {
                                if (i.getArticulo().getIdarticulo().equals(o.getArticulo().getIdarticulo())) {
                                    found = true;
                                }
                            }

                        }
                    }

                    if (!found) {
                        // le colocamos la cna
                        i.getArticulo().setCantidad(i.getCantidad());
                        suggestions.add(i.getArticulo());
                    }
                }
            }

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

    // <editor-fold defaultstate="collapsed" desc="List<Articulo> completeFilterFromTienda(String query)">
    public List<Articulo> completeFilterFromTienda(String query) {

        List<Articulo> suggestions = new ArrayList<>();
        try {
            query = query.trim();
            if (query.length() < 1) {
                return suggestions;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");

            List<Inventario> list = new ArrayList<>();
            switch (field) {
                case "idarticulo":
                    list = inventarioRepository.findRegex("articulo.idarticulo", query, true, "id", tiendaSelected.getIdtienda(), "tipoid", "tienda", new Document(field, 1));
                    break;
                case "descripcion":
                    list = inventarioServices.searchByDescripcion(field, query, tiendaSelected.getIdtienda(), "tienda");

                    break;
                default:
                    break;

            }
            if (!list.isEmpty()) {
                Boolean found = false;

                for (Inventario i : list) {

                    found = false;
                    if (!ordendetalleList.isEmpty()) {
                        for (Ordendetalle o : ordendetalleList) {
                            if (o.getArticulo() != null) {
                                if (i.getArticulo().getIdarticulo().equals(o.getArticulo().getIdarticulo())) {
                                    found = true;
                                }
                            }

                        }
                    }

                    if (!found) {
                        // le colocamos la cna
                        i.getArticulo().setCantidad(i.getCantidad());
                        suggestions.add(i.getArticulo());
                    }
                }
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("completeFilterFromTienda() " + e.getLocalizedMessage());
        }
        return suggestions;
    } // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="List<Articulo> completeFilterFromGanga(String query)">

    public List<Articulo> completeFilterFromGanga(String query) {

        List<Articulo> suggestions = new ArrayList<>();
        try {
            query = query.trim();
            if (query.length() < 1) {
                return suggestions;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");

            List<Inventario> list = new ArrayList<>();
            switch (field) {
                case "idarticulo":
                    list = inventarioRepository.findRegex("articulo.idarticulo", query, true, "id", gangaSelected.getIdganga(), "tipoid", "ganga", new Document(field, 1));
                    break;
                case "descripcion":
                    list = inventarioServices.searchByDescripcion(field, query, gangaSelected.getIdganga(), "ganga");

                    break;
                default:
                    break;

            }
            if (!list.isEmpty()) {
                Boolean found = false;

                for (Inventario i : list) {

                    found = false;
                    if (!ordendetalleList.isEmpty()) {
                        for (Ordendetalle o : ordendetalleList) {
                            if (o.getArticulo() != null) {
                                if (i.getArticulo().getIdarticulo().equals(o.getArticulo().getIdarticulo())) {
                                    found = true;
                                }
                            }

                        }
                    }

                    if (!found) {
                        // le colocamos la cna
                        i.getArticulo().setCantidad(i.getCantidad());
                        suggestions.add(i.getArticulo());
                    }
                }
            }

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

    // <editor-fold defaultstate="collapsed" desc="List<Articulo> completeFilterFromGanga(String query)">
    public List<Articulo> completeFilterFromInterno(String query) {

        List<Articulo> suggestions = new ArrayList<>();
        try {
            query = query.trim();
            if (query.length() < 1) {
                return suggestions;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");

            List<Inventario> list = new ArrayList<>();
            switch (field) {
                case "idarticulo":
                    list = inventarioRepository.findRegex("articulo.idarticulo", query, true, "id", internoSelected.getIdinterno(), "tipoid", "interno", new Document(field, 1));
                    break;
                case "descripcion":
                    list = inventarioServices.searchByDescripcion(field, query, internoSelected.getIdinterno(), "interno");

                    break;
                default:
                    break;

            }
            if (!list.isEmpty()) {
                Boolean found = false;

                for (Inventario i : list) {

                    found = false;
                    if (!ordendetalleList.isEmpty()) {
                        for (Ordendetalle o : ordendetalleList) {
                            if (o.getArticulo() != null) {
                                if (i.getArticulo().getIdarticulo().equals(o.getArticulo().getIdarticulo())) {
                                    found = true;
                                }
                            }

                        }
                    }

                    if (!found) {
                        // le colocamos la cna
                        i.getArticulo().setCantidad(i.getCantidad());
                        suggestions.add(i.getArticulo());
                    }
                }
            }

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

    // <editor-fold defaultstate="collapsed" desc="onArticuloChange()">
    public String onArticuloChange(int rowIndex, Ordendetalle ordendetalle, String subtipoorden) {
        try {
//            Articulo articulo = ordendetalle.getArticulo();
//            List<Inventario> list = new ArrayList<>();
//            Document doc;
            Integer cantidademisor = 0;
            Integer cantidadreceptor = 0;
            switch (subtipoorden) {
                //Entrada
                case "proveedorabodega":
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");

                    // no se hace nada
                    break;
                case "tiendaabodega":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), tiendaSelected.getIdtienda(), "tienda");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");

                    break;
                case "gangaabodega":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), gangaSelected.getIdganga(), "ganga");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");

                    break;
                //Salida      
                case "bodegaatienda":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), tiendaSelected.getIdtienda(), "tienda");

                    break;
                case "bodegaaganga":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), gangaSelected.getIdganga(), "ganga");

                    break;

                //MovimientoInterno
                case "internoabodega":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), internoSelected.getIdinterno(), "interno");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");

                    break;

                case "internoatienda":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), internoSelected.getIdinterno(), "interno");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), tiendaSelected.getIdtienda(), "tienda");

                    break;

                case "internoaganga":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), internoSelected.getIdinterno(), "interno");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), gangaSelected.getIdganga(), "ganga");

                    break;
                case "bodegaainterno":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), bodegaSelected.getIdbodega(), "bodega");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), internoSelected.getIdinterno(), "interno");

                    break;
                case "tiendaainterno":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), tiendaSelected.getIdtienda(), "tienda");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), internoSelected.getIdinterno(), "interno");

                    break;

                case "gangaainterno":
                    cantidademisor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), gangaSelected.getIdganga(), "ganga");
                    cantidadreceptor = inventarioServices.cantidadInventarioOf(ordendetalle.getArticulo(), internoSelected.getIdinterno(), "interno");

                    break;
                default:
                    JsfUtil.warningDialog("subtipoorden","subtipoorden: " + subtipoorden + " no se ha contemplado onArticuloChange()");
                    break;
            }

            ordendetalleList.get(rowIndex).setCantidadanterioremisor(cantidademisor);
            ordendetalleList.get(rowIndex).setCantidadanteriorreceptor(cantidadreceptor);
        } catch (Exception e) {
            JsfUtil.errorMessage("onArticuloChange() " + e.getLocalizedMessage());
        }
        return "";
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="calcularBalance">
    public Integer calcularBalance(Integer cantidad, Integer anterior, Ordendetalle item, int rowIndex) {
        Integer balance = 0;
        try {
            if (item.getArticulo() == null) {
                ordendetalleList.get(rowIndex).setCantidad(0);
                return balance;
            }
            if (cantidad > 0) {
                balance = cantidad + anterior;
            }

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

    // <editor-fold defaultstate="collapsed" desc="refresh()">
    public String refresh() {
        return "";
    }// </editor-fold>  

    // <editor-fold defaultstate="collapsed" desc="onCellEdit(CellEditEvent event) ">
    public void onCellEditFromProveedor(CellEditEvent event) {
        try {

            Object oldValue = event.getOldValue();
            Object newValue = event.getNewValue();

            Integer cantidad = ordendetalleList.get(event.getRowIndex()).getCantidad();
            Integer cantidadanteriorreceptor = ordendetalleList.get(event.getRowIndex()).getCantidadanteriorreceptor();
            Integer cantidadanterioremisor = ordendetalleList.get(event.getRowIndex()).getCantidadanterioremisor();

            Integer nuevacantidad = cantidad + cantidadanteriorreceptor;

            /// si la cantidad es mayor de cero pero no ha seleccionado un articulo
            if (ordendetalleList.get(event.getRowIndex()).getArticulo() == null) {

                ordendetalleList.get(event.getRowIndex()).setCantidad(0);

                return;
            }

        } catch (Exception e) {

            JsfUtil.errorMessage("onCellEdit() " + e.getLocalizedMessage());
        }

    }    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="onCellEdit(CellEditEvent event) ">

    public void onCellEditWithEmisor(CellEditEvent event) {
        try {

            Object oldValue = event.getOldValue();
            Object newValue = event.getNewValue();

            Integer cantidad = ordendetalleList.get(event.getRowIndex()).getCantidad();
            Integer cantidadanteriorreceptor = ordendetalleList.get(event.getRowIndex()).getCantidadanteriorreceptor();
            Integer cantidadanterioremisor = ordendetalleList.get(event.getRowIndex()).getCantidadanterioremisor();

            Integer nuevacantidad = cantidad + cantidadanteriorreceptor;

            /// si la cantidad es mayor de cero pero no ha seleccionado un articulo
            if (ordendetalleList.get(event.getRowIndex()).getArticulo() == null) {

                ordendetalleList.get(event.getRowIndex()).setCantidad(0);

                return;
            }

            if (cantidad > cantidadanterioremisor) {
                JsfUtil.warningMessage(rf.getMessage("warning.cantidadmayordisponible"));

                ordendetalleList.get(event.getRowIndex()).setCantidad(0);
            }
        } catch (Exception e) {

            JsfUtil.errorMessage("onCellEdit() " + e.getLocalizedMessage());
        }

    }    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="onRowDelete(int rowIndex)">
    public void onRowDelete(int rowIndex) {
        try {
            ordendetalleList.remove(rowIndex);
            ordendetalleFiltered = ordendetalleList;
            ordendetalleDataModel = new OrdendetalleDataModel(ordendetalleList);
        } catch (Exception e) {
            JsfUtil.errorMessage("onRowDelete() " + e.getLocalizedMessage());
        }

    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="valid()">
    private Boolean valid() {

        try {
            if (ordendetalleList.isEmpty()) {
                JsfUtil.warningMessage(rf.getMessage("warning.nohayregistrosordenes"));
                return false;
            }
            Boolean foundArticuloEmpty = false;
            Boolean foundCantidadEmpty = false;
            for (Ordendetalle o : ordendetalleList) {
                if (o.getArticulo() == null) {
                    foundArticuloEmpty = true;
                } else {
                    if (o.getCantidad() == 0) {
                        foundCantidadEmpty = true;
                    }
                }
            }
            if (foundArticuloEmpty) {
                JsfUtil.warningMessage(rf.getMessage("warning.hayarticulosvacios"));
                return false;
            }
            if (foundCantidadEmpty) {
                JsfUtil.warningMessage(rf.getMessage("warning.haycantidadescero"));
                return false;
            }
            return true;
        } catch (Exception e) {
            JsfUtil.errorMessage("valid() " + e.getLocalizedMessage());
        }
        return false;
    }
    // </editor-fold>

}

Last updated