package com.refresh.pos.techicalservices.inventory; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.util.Log; import com.refresh.pos.domain.inventory.Product; import com.refresh.pos.domain.inventory.ProductLot; import com.refresh.pos.techicalservices.Database; import com.refresh.pos.techicalservices.DatabaseContents; /** * DAO used by android for Inventory. * * @author Refresh Team * */ public class InventoryDaoAndroid implements InventoryDao { private Database database; /** * Constructs InventoryDaoAndroid. * @param database database for use in InventoryDaoAndroid. */ public InventoryDaoAndroid(Database database) { this.database = database; } @Override public int addProduct(Product product) { ContentValues content = new ContentValues(); content.put("name", product.getName()); content.put("barcode", product.getBarcode()); content.put("unit_price", product.getUnitPrice()); content.put("status", "ACTIVE"); int id = database.insert(DatabaseContents.TABLE_PRODUCT_CATALOG.toString(), content); ContentValues content2 = new ContentValues(); content2.put("_id", id); content2.put("quantity", 0); database.insert(DatabaseContents.TABLE_STOCK_SUM.toString(), content2); return id; } /** * Converts list of object to list of product. * @param objectList list of object. * @return list of product. */ private List<Product> toProductList(List<Object> objectList) { List<Product> list = new ArrayList<Product>(); for (Object object: objectList) { ContentValues content = (ContentValues) object; list.add(new Product( content.getAsInteger("_id"), content.getAsString("name"), content.getAsString("barcode"), content.getAsDouble("unit_price")) ); } return list; } @Override public List<Product> getAllProduct() { return getAllProduct(" WHERE status = 'ACTIVE'"); } /** * Returns list of all products in inventory. * @param condition specific condition for getAllProduct. * @return list of all products in inventory. */ private List<Product> getAllProduct(String condition) { String queryString = "SELECT * FROM " + DatabaseContents.TABLE_PRODUCT_CATALOG.toString() + condition + " ORDER BY name"; List<Product> list = toProductList(database.select(queryString)); return list; } /** * Returns product from inventory finds by specific reference. * @param reference reference value. * @param value value for search. * @return list of product. */ private List<Product> getProductBy(String reference, String value) { String condition = " WHERE " + reference + " = " + value + " ;"; return getAllProduct(condition); } /** * Returns product from inventory finds by similar name. * @param reference reference value. * @param value value for search. * @return list of product. */ private List<Product> getSimilarProductBy(String reference, String value) { String condition = " WHERE " + reference + " LIKE '%" + value + "%' ;"; return getAllProduct(condition); } @Override public Product getProductByBarcode(String barcode) { List<Product> list = getProductBy("barcode", barcode); if (list.isEmpty()) return null; return list.get(0); } @Override public Product getProductById(int id) { return getProductBy("_id", id+"").get(0); } @Override public boolean editProduct(Product product) { ContentValues content = new ContentValues(); content.put("_id", product.getId()); content.put("name", product.getName()); content.put("barcode", product.getBarcode()); content.put("status", "ACTIVE"); content.put("unit_price", product.getUnitPrice()); return database.update(DatabaseContents.TABLE_PRODUCT_CATALOG.toString(), content); } @Override public int addProductLot(ProductLot productLot) { ContentValues content = new ContentValues(); content.put("date_added", productLot.getDateAdded()); content.put("quantity", productLot.getQuantity()); content.put("product_id", productLot.getProduct().getId()); content.put("cost", productLot.unitCost()); int id = database.insert(DatabaseContents.TABLE_STOCK.toString(), content); int productId = productLot.getProduct().getId(); ContentValues content2 = new ContentValues(); content2.put("_id", productId); content2.put("quantity", getStockSumById(productId) + productLot.getQuantity()); Log.d("inventory dao android","" + getStockSumById(productId) + " " + productId + " " +productLot.getQuantity() ); database.update(DatabaseContents.TABLE_STOCK_SUM.toString(), content2); return id; } @Override public List<Product> getProductByName(String name) { return getSimilarProductBy("name", name); } @Override public List<Product> searchProduct(String search) { String condition = " WHERE name LIKE '%" + search + "%' OR barcode LIKE '%" + search + "%' ;"; return getAllProduct(condition); } /** * Returns list of all ProductLot in inventory. * @param condition specific condition for get ProductLot. * @return list of all ProductLot in inventory. */ private List<ProductLot> getAllProductLot(String condition) { String queryString = "SELECT * FROM " + DatabaseContents.TABLE_STOCK.toString() + condition; List<ProductLot> list = toProductLotList(database.select(queryString)); return list; } /** * Converts list of object to list of ProductLot. * @param objectList list of object. * @return list of ProductLot. */ private List<ProductLot> toProductLotList(List<Object> objectList) { List<ProductLot> list = new ArrayList<ProductLot>(); for (Object object: objectList) { ContentValues content = (ContentValues) object; int productId = content.getAsInteger("product_id"); Product product = getProductById(productId); list.add( new ProductLot(content.getAsInteger("_id"), content.getAsString("date_added"), content.getAsInteger("quantity"), product, content.getAsDouble("cost")) ); } return list; } @Override public List<ProductLot> getProductLotByProductId(int id) { return getAllProductLot(" WHERE product_id = " + id); } @Override public List<ProductLot> getProductLotById(int id) { return getAllProductLot(" WHERE _id = " + id); } @Override public List<ProductLot> getAllProductLot() { return getAllProductLot(""); } @Override public int getStockSumById(int id) { String queryString = "SELECT * FROM " + DatabaseContents.TABLE_STOCK_SUM + " WHERE _id = " + id; List<Object> objectList = (database.select(queryString)); ContentValues content = (ContentValues) objectList.get(0); int quantity = content.getAsInteger("quantity"); Log.d("inventoryDaoAndroid", "stock sum of "+ id + " is " + quantity); return quantity; } @Override public void updateStockSum(int productId, double quantity) { ContentValues content = new ContentValues(); content.put("_id", productId); content.put("quantity", getStockSumById(productId) - quantity); database.update(DatabaseContents.TABLE_STOCK_SUM.toString(), content); } @Override public void clearProductCatalog() { database.execute("DELETE FROM " + DatabaseContents.TABLE_PRODUCT_CATALOG); } @Override public void clearStock() { database.execute("DELETE FROM " + DatabaseContents.TABLE_STOCK); database.execute("DELETE FROM " + DatabaseContents.TABLE_STOCK_SUM); } @Override public void suspendProduct(Product product) { ContentValues content = new ContentValues(); content.put("_id", product.getId()); content.put("name", product.getName()); content.put("barcode", product.getBarcode()); content.put("status", "INACTIVE"); content.put("unit_price", product.getUnitPrice()); database.update(DatabaseContents.TABLE_PRODUCT_CATALOG.toString(), content); } }