package com.refresh.pos.techicalservices.sale; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import android.content.ContentValues; import com.refresh.pos.domain.DateTimeStrategy; import com.refresh.pos.domain.inventory.LineItem; import com.refresh.pos.domain.inventory.Product; import com.refresh.pos.domain.sale.QuickLoadSale; import com.refresh.pos.domain.sale.Sale; import com.refresh.pos.techicalservices.Database; import com.refresh.pos.techicalservices.DatabaseContents; /** * DAO used by android for Sale process. * * @author Refresh Team * */ public class SaleDaoAndroid implements SaleDao { Database database; public SaleDaoAndroid(Database database) { this.database = database; } @Override public Sale initiateSale(String startTime) { ContentValues content = new ContentValues(); content.put("start_time", startTime.toString()); content.put("status", "ON PROCESS"); content.put("payment", "n/a"); content.put("total", "0.0"); content.put("orders", "0"); content.put("end_time", startTime.toString()); int id = database.insert(DatabaseContents.TABLE_SALE.toString(), content); return new Sale(id,startTime); } @Override public void endSale(Sale sale, String endTime) { ContentValues content = new ContentValues(); content.put("_id", sale.getId()); content.put("status", "ENDED"); content.put("payment", "n/a"); content.put("total", sale.getTotal()); content.put("orders", sale.getOrders()); content.put("start_time", sale.getStartTime()); content.put("end_time", endTime); database.update(DatabaseContents.TABLE_SALE.toString(), content); } @Override public int addLineItem(int saleId, LineItem lineItem) { ContentValues content = new ContentValues(); content.put("sale_id", saleId); content.put("product_id", lineItem.getProduct().getId()); content.put("quantity", lineItem.getQuantity()); content.put("unit_price", lineItem.getPriceAtSale()); int id = database.insert(DatabaseContents.TABLE_SALE_LINEITEM.toString(), content); return id; } @Override public void updateLineItem(int saleId, LineItem lineItem) { ContentValues content = new ContentValues(); content.put("_id", lineItem.getId()); content.put("sale_id", saleId); content.put("product_id", lineItem.getProduct().getId()); content.put("quantity", lineItem.getQuantity()); content.put("unit_price", lineItem.getPriceAtSale()); database.update(DatabaseContents.TABLE_SALE_LINEITEM.toString(), content); } @Override public List<Sale> getAllSale() { return getAllSale(" WHERE status = 'ENDED'"); } @Override public List<Sale> getAllSaleDuring(Calendar start, Calendar end) { String startBound = DateTimeStrategy.getSQLDateFormat(start); String endBound = DateTimeStrategy.getSQLDateFormat(end); List<Sale> list = getAllSale(" WHERE end_time BETWEEN '" + startBound + " 00:00:00' AND '" + endBound + " 23:59:59' AND status = 'ENDED'"); return list; } /** * This method get all Sale *BUT* no LineItem will be loaded. * @param condition * @return */ public List<Sale> getAllSale(String condition) { String queryString = "SELECT * FROM " + DatabaseContents.TABLE_SALE + condition; List<Object> objectList = database.select(queryString); List<Sale> list = new ArrayList<Sale>(); for (Object object: objectList) { ContentValues content = (ContentValues) object; list.add(new QuickLoadSale( content.getAsInteger("_id"), content.getAsString("start_time"), content.getAsString("end_time"), content.getAsString("status"), content.getAsDouble("total"), content.getAsInteger("orders") ) ); } return list; } /** * This load complete data of Sale. * @param id Sale ID. * @return Sale of specific ID. */ @Override public Sale getSaleById(int id) { String queryString = "SELECT * FROM " + DatabaseContents.TABLE_SALE + " WHERE _id = " + id; List<Object> objectList = database.select(queryString); List<Sale> list = new ArrayList<Sale>(); for (Object object: objectList) { ContentValues content = (ContentValues) object; list.add(new Sale( content.getAsInteger("_id"), content.getAsString("start_time"), content.getAsString("end_time"), content.getAsString("status"), getLineItem(content.getAsInteger("_id"))) ); } return list.get(0); } @Override public List<LineItem> getLineItem(int saleId) { String queryString = "SELECT * FROM " + DatabaseContents.TABLE_SALE_LINEITEM + " WHERE sale_id = " + saleId; List<Object> objectList = database.select(queryString); List<LineItem> list = new ArrayList<LineItem>(); for (Object object: objectList) { ContentValues content = (ContentValues) object; int productId = content.getAsInteger("product_id"); String queryString2 = "SELECT * FROM " + DatabaseContents.TABLE_PRODUCT_CATALOG + " WHERE _id = " + productId; List<Object> objectList2 = database.select(queryString2); List<Product> productList = new ArrayList<Product>(); for (Object object2: objectList2) { ContentValues content2 = (ContentValues) object2; productList.add(new Product(productId, content2.getAsString("name"), content2.getAsString("barcode"), content2.getAsDouble("unit_price"))); } list.add(new LineItem(content.getAsInteger("_id") , productList.get(0), content.getAsInteger("quantity"), content.getAsDouble("unit_price"))); } return list; } @Override public void clearSaleLedger() { database.execute("DELETE FROM " + DatabaseContents.TABLE_SALE); database.execute("DELETE FROM " + DatabaseContents.TABLE_SALE_LINEITEM); } @Override public void cancelSale(Sale sale,String endTime) { ContentValues content = new ContentValues(); content.put("_id", sale.getId()); content.put("status", "CANCELED"); content.put("payment", "n/a"); content.put("total", sale.getTotal()); content.put("orders", sale.getOrders()); content.put("start_time", sale.getStartTime()); content.put("end_time", endTime); database.update(DatabaseContents.TABLE_SALE.toString(), content); } @Override public void removeLineItem(int id) { database.delete(DatabaseContents.TABLE_SALE_LINEITEM.toString(), id); } }