org.openmrs.module.openhmis.inventory.api.impl.StockroomDataServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.openhmis.inventory.api.impl.StockroomDataServiceImpl.java

Source

/*
 * The contents of this file are subject to the OpenMRS Public License
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
package org.openmrs.module.openhmis.inventory.api.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.openmrs.Location;
import org.openmrs.OpenmrsObject;
import org.openmrs.module.openhmis.commons.api.PagingInfo;
import org.openmrs.module.openhmis.commons.api.entity.impl.BaseMetadataDataServiceImpl;
import org.openmrs.module.openhmis.commons.api.entity.security.IMetadataAuthorizationPrivileges;
import org.openmrs.module.openhmis.commons.api.f.Action1;
import org.openmrs.module.openhmis.inventory.api.IStockroomDataService;
import org.openmrs.module.openhmis.inventory.api.model.Item;
import org.openmrs.module.openhmis.inventory.api.model.ItemStock;
import org.openmrs.module.openhmis.inventory.api.model.ItemStockDetail;
import org.openmrs.module.openhmis.inventory.api.model.StockOperation;
import org.openmrs.module.openhmis.inventory.api.model.StockOperationTransaction;
import org.openmrs.module.openhmis.inventory.api.model.Stockroom;
import org.openmrs.module.openhmis.inventory.api.search.ItemSearch;
import org.openmrs.module.openhmis.inventory.api.search.StockOperationSearch;
import org.openmrs.module.openhmis.inventory.api.util.HibernateCriteriaConstants;
import org.openmrs.module.openhmis.inventory.api.util.PrivilegeConstants;

public class StockroomDataServiceImpl extends BaseMetadataDataServiceImpl<Stockroom>
        implements IStockroomDataService, IMetadataAuthorizationPrivileges {
    private static final int MAX_STOCKROOM_CODE_LENGTH = 255;

    @Override
    protected IMetadataAuthorizationPrivileges getPrivileges() {
        return this;
    }

    @Override
    protected void validate(Stockroom object) {
    }

    @Override
    protected Collection<? extends OpenmrsObject> getRelatedObjects(Stockroom entity) {
        ArrayList<OpenmrsObject> results = new ArrayList<OpenmrsObject>();

        results.addAll(entity.getOperations());
        results.addAll(entity.getItems());

        return results;
    }

    @Override
    public List<ItemStock> getItemsByRoom(final Stockroom stockroom, PagingInfo paging) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined");
        }

        return executeCriteria(ItemStock.class, paging, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                criteria.createAlias("item", "i");
                criteria.setResultTransformer(Criteria.ROOT_ENTITY);
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.STOCKROOM, stockroom));
            }
        }, Order.asc("i.name"));
    }

    @Override
    public List<StockOperationTransaction> getTransactionsByRoom(final Stockroom stockroom, PagingInfo paging) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined");
        }

        return executeCriteria(StockOperationTransaction.class, paging, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.STOCKROOM, stockroom));
            }
        }, Order.desc(HibernateCriteriaConstants.DATE_CREATED), Order.desc(HibernateCriteriaConstants.ID));
    }

    @Override
    public List<StockOperationTransaction> getTransactionsByRoomAndItem(final Stockroom stockroom, final Item item,
            PagingInfo paging) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined");
        }

        if (item == null) {
            throw new IllegalArgumentException("The item must be defined");
        }

        return executeCriteria(StockOperationTransaction.class, paging, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.STOCKROOM, stockroom));
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.ITEM, item));
            }
        }, Order.desc(HibernateCriteriaConstants.DATE_CREATED), Order.desc(HibernateCriteriaConstants.ID));
    }

    @Override
    public List<StockOperation> getOperations(final Stockroom stockroom, final StockOperationSearch search,
            PagingInfo paging) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined");
        }

        return executeCriteria(StockOperation.class, paging, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                if (search != null) {
                    search.updateCriteria(criteria);
                }
                criteria.add(Restrictions.or(Restrictions.eq(HibernateCriteriaConstants.SOURCE, stockroom),
                        Restrictions.eq(HibernateCriteriaConstants.DESTINATION, stockroom)));
            }
        }, Order.desc("dateChanged"), Order.desc("dateCreated"));
    }

    @Override
    public List<ItemStock> getItems(final Stockroom stockroom, final ItemSearch itemSearch, PagingInfo paging) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined.");
        }
        if (itemSearch == null) {
            throw new IllegalArgumentException("The item search must be defined.");
        }

        // To allow a method to exclude retired items from the result callers can set IncludeRetired to null
        //  and specify the retired status on the template object itself
        if (itemSearch.getIncludeRetired() != null) {
            // We want all the stockroom items regardless of if they are retired
            itemSearch.setIncludeRetired(true);
        }

        return executeCriteria(ItemStock.class, paging, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.STOCKROOM, stockroom));
                itemSearch.updateCriteria(criteria.createCriteria("item", "i"));
            }
        }, Order.asc("i.name"));
    }

    @Override
    public ItemStock getItem(Stockroom stockroom, Item item) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined.");
        }
        if (item == null) {
            throw new IllegalArgumentException("The item must be defined.");
        }

        Criteria criteria = getRepository().createCriteria(ItemStock.class);
        criteria.add(Restrictions.eq(HibernateCriteriaConstants.STOCKROOM, stockroom));
        criteria.add(Restrictions.eq(HibernateCriteriaConstants.ITEM, item));

        return getRepository().selectSingle(ItemStock.class, criteria);
    }

    @Override
    public ItemStockDetail getStockroomItemDetail(Stockroom stockroom, Item item, Date expiration,
            StockOperation batchOperation) {
        if (stockroom == null) {
            throw new IllegalArgumentException("The stockroom must be defined.");
        }
        if (item == null) {
            throw new IllegalArgumentException("The item must be defined.");
        }

        Criteria criteria = getRepository().createCriteria(ItemStockDetail.class);
        criteria.add(Restrictions.eq(HibernateCriteriaConstants.STOCKROOM, stockroom));
        criteria.add(Restrictions.eq(HibernateCriteriaConstants.ITEM, item));

        if (expiration == null) {
            criteria.add(Restrictions.isNull(HibernateCriteriaConstants.EXPIRATION));
        } else {
            criteria.add(Restrictions.eq(HibernateCriteriaConstants.EXPIRATION, expiration));
        }

        if (batchOperation == null) {
            criteria.add(Restrictions.isNull(HibernateCriteriaConstants.BATCH_OPERATION));
        } else {
            criteria.add(Restrictions.eq(HibernateCriteriaConstants.BATCH_OPERATION, batchOperation));
        }

        return getRepository().selectSingle(ItemStockDetail.class, criteria);
    }

    @Override
    public List<Stockroom> getStockroomsByLocation(Location location, boolean includeRetired) {
        return getStockroomsByLocation(location, includeRetired, null);
    }

    @Override
    public List<Stockroom> getStockroomsByLocation(final Location location, final boolean includeRetired,
            PagingInfo pagingInfo) {
        if (location == null) {
            throw new NullPointerException("The location must be defined");
        }

        return executeCriteria(Stockroom.class, pagingInfo, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.LOCATION, location));
                if (!includeRetired) {
                    criteria.add(Restrictions.eq(HibernateCriteriaConstants.RETIRED, false));
                }
            }
        }, getDefaultSort());
    }

    @Override
    public List<Stockroom> getStockrooms(Location location, String name, boolean includeRetired) {
        return getStockrooms(location, name, includeRetired, null);
    }

    @Override
    public List<Stockroom> getStockrooms(final Location location, final String name, final boolean includeRetired,
            PagingInfo pagingInfo) {
        if (location == null) {
            throw new NullPointerException("The department must be defined");
        }
        if (StringUtils.isEmpty(name)) {
            throw new IllegalArgumentException("The stockroom code must be defined.");
        }
        if (name.length() > MAX_STOCKROOM_CODE_LENGTH) {
            throw new IllegalArgumentException("The stockroom code must be less than 256 characters.");
        }

        return executeCriteria(Stockroom.class, pagingInfo, new Action1<Criteria>() {
            @Override
            public void apply(Criteria criteria) {
                criteria.add(Restrictions.eq(HibernateCriteriaConstants.LOCATION, location))
                        .add(Restrictions.ilike(HibernateCriteriaConstants.NAME, name, MatchMode.START));

                if (!includeRetired) {
                    criteria.add(Restrictions.eq(HibernateCriteriaConstants.RETIRED, false));
                }
            }
        }, getDefaultSort());
    }

    @Override
    public String getRetirePrivilege() {
        return PrivilegeConstants.MANAGE_STOCKROOMS;
    }

    @Override
    public String getSavePrivilege() {
        return PrivilegeConstants.MANAGE_STOCKROOMS;
    }

    @Override
    public String getPurgePrivilege() {
        return PrivilegeConstants.PURGE_STOCKROOMS;
    }

    @Override
    public String getGetPrivilege() {
        return PrivilegeConstants.VIEW_STOCKROOMS;
    }
}