// uniCenta oPOS - Touch Friendly Point Of Sale // Copyright (c) 2009-2013 uniCenta & previous Openbravo POS works // http://www.unicenta.net/unicentaopos // // This file is part of uniCenta oPOS // // uniCenta oPOS is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // uniCenta oPOS is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with uniCenta oPOS. If not, see <http://www.gnu.org/licenses/>. package com.openbravo.pos.panels; import com.openbravo.basic.BasicException; import com.openbravo.data.loader.*; import com.openbravo.format.Formats; import com.openbravo.pos.forms.AppLocal; import com.openbravo.pos.forms.AppView; import com.openbravo.pos.util.StringUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.swing.table.AbstractTableModel; /** * * @author adrianromero */ public class PaymentsModel { private String m_sHost; private int m_iSeq; private Date m_dDateStart; private Date m_dDateEnd; private Integer m_iPayments; private Double m_dPaymentsTotal; private java.util.List<PaymentsLine> m_lpayments; // JG 9 Nov 12 private Integer m_iCategorySalesRows; private Double m_dCategorySalesTotalUnits; private Double m_dCategorySalesTotal; private java.util.List<CategorySalesLine> m_lcategorysales; // end private final static String[] PAYMENTHEADERS = {"Label.Payment", "label.totalcash"}; private Integer m_iSales; private Double m_dSalesBase; private Double m_dSalesTaxes; private java.util.List<SalesLine> m_lsales; private final static String[] SALEHEADERS = {"label.taxcash", "label.totalcash"}; private PaymentsModel() { } public static PaymentsModel emptyInstance() { PaymentsModel p = new PaymentsModel(); p.m_iPayments = new Integer(0); p.m_dPaymentsTotal = new Double(0.0); // JG 16 May 2013 use diamond inference p.m_lpayments = new ArrayList<>(); // JG 9 Nov 12 p.m_iCategorySalesRows = new Integer(0); p.m_dCategorySalesTotalUnits = new Double(0.0); p.m_dCategorySalesTotal = new Double(0.0); p.m_lcategorysales = new ArrayList<>(); // end p.m_iSales = null; p.m_dSalesBase = null; p.m_dSalesTaxes = null; // JG 16 May 2013 use diamond inference p.m_lsales = new ArrayList<>(); return p; } public static PaymentsModel loadInstance(AppView app) throws BasicException { PaymentsModel p = new PaymentsModel(); // Propiedades globales p.m_sHost = app.getProperties().getHost(); p.m_iSeq = app.getActiveCashSequence(); p.m_dDateStart = app.getActiveCashDateStart(); p.m_dDateEnd = null; // JG 9 Nov 12 // Product category Sales Object[] valcategorysales = (Object []) new StaticSentence(app.getSession() , "SELECT COUNT(*), SUM(TICKETLINES.UNITS), SUM((TICKETLINES.PRICE + TICKETLINES.PRICE * TAXES.RATE ) * TICKETLINES.UNITS) " + "FROM TICKETLINES, TICKETS, RECEIPTS, TAXES " + "WHERE TICKETLINES.TICKET = TICKETS.ID AND TICKETS.ID = RECEIPTS.ID AND TICKETLINES.TAXID = TAXES.ID AND TICKETLINES.PRODUCT IS NOT NULL AND RECEIPTS.MONEY = ? " + "GROUP BY RECEIPTS.MONEY" , SerializerWriteString.INSTANCE , new SerializerReadBasic(new Datas[] {Datas.INT, Datas.DOUBLE, Datas.DOUBLE})) .find(app.getActiveCashIndex()); if (valcategorysales == null) { p.m_iCategorySalesRows = new Integer(0); p.m_dCategorySalesTotalUnits = new Double(0.0); p.m_dCategorySalesTotal = new Double(0.0); } else { p.m_iCategorySalesRows = (Integer) valcategorysales[0]; p.m_dCategorySalesTotalUnits = (Double) valcategorysales[1]; p.m_dCategorySalesTotal= (Double) valcategorysales[2]; } List categorys = new StaticSentence(app.getSession() , "SELECT a.NAME, sum(c.UNITS), sum(c.UNITS * (c.PRICE + (c.PRICE * d.RATE))) " + "FROM CATEGORIES as a " + "LEFT JOIN PRODUCTS as b on a.id = b.CATEGORY " + "LEFT JOIN TICKETLINES as c on b.id = c.PRODUCT " + "LEFT JOIN TAXES as d on c.TAXID = d.ID " + "LEFT JOIN RECEIPTS as e on c.TICKET = e.ID " + "WHERE e.MONEY = ? " + "GROUP BY a.NAME" , SerializerWriteString.INSTANCE , new SerializerReadClass(PaymentsModel.CategorySalesLine.class)) //new SerializerReadBasic(new Datas[] {Datas.STRING, Datas.DOUBLE})) .list(app.getActiveCashIndex()); if (categorys == null) { p.m_lcategorysales = new ArrayList(); } else { p.m_lcategorysales = categorys; } // end // Pagos Object[] valtickets = (Object []) new StaticSentence(app.getSession() , "SELECT COUNT(*), SUM(PAYMENTS.TOTAL) " + "FROM PAYMENTS, RECEIPTS " + "WHERE PAYMENTS.RECEIPT = RECEIPTS.ID AND RECEIPTS.MONEY = ?" , SerializerWriteString.INSTANCE , new SerializerReadBasic(new Datas[] {Datas.INT, Datas.DOUBLE})) .find(app.getActiveCashIndex()); if (valtickets == null) { p.m_iPayments = new Integer(0); p.m_dPaymentsTotal = new Double(0.0); } else { p.m_iPayments = (Integer) valtickets[0]; p.m_dPaymentsTotal = (Double) valtickets[1]; } List l = new StaticSentence(app.getSession() , "SELECT PAYMENTS.PAYMENT, SUM(PAYMENTS.TOTAL) " + "FROM PAYMENTS, RECEIPTS " + "WHERE PAYMENTS.RECEIPT = RECEIPTS.ID AND RECEIPTS.MONEY = ? " + "GROUP BY PAYMENTS.PAYMENT" , SerializerWriteString.INSTANCE , new SerializerReadClass(PaymentsModel.PaymentsLine.class)) //new SerializerReadBasic(new Datas[] {Datas.STRING, Datas.DOUBLE})) .list(app.getActiveCashIndex()); if (l == null) { p.m_lpayments = new ArrayList(); } else { p.m_lpayments = l; } // Sales Object[] recsales = (Object []) new StaticSentence(app.getSession(), "SELECT COUNT(DISTINCT RECEIPTS.ID), SUM(TICKETLINES.UNITS * TICKETLINES.PRICE) " + "FROM RECEIPTS, TICKETLINES WHERE RECEIPTS.ID = TICKETLINES.TICKET AND RECEIPTS.MONEY = ?", SerializerWriteString.INSTANCE, new SerializerReadBasic(new Datas[] {Datas.INT, Datas.DOUBLE})) .find(app.getActiveCashIndex()); if (recsales == null) { p.m_iSales = null; p.m_dSalesBase = null; } else { p.m_iSales = (Integer) recsales[0]; p.m_dSalesBase = (Double) recsales[1]; } // Taxes Object[] rectaxes = (Object []) new StaticSentence(app.getSession(), "SELECT SUM(TAXLINES.AMOUNT) " + "FROM RECEIPTS, TAXLINES WHERE RECEIPTS.ID = TAXLINES.RECEIPT AND RECEIPTS.MONEY = ?" , SerializerWriteString.INSTANCE , new SerializerReadBasic(new Datas[] {Datas.DOUBLE})) .find(app.getActiveCashIndex()); if (rectaxes == null) { p.m_dSalesTaxes = null; } else { p.m_dSalesTaxes = (Double) rectaxes[0]; } List<SalesLine> asales = new StaticSentence(app.getSession(), "SELECT TAXCATEGORIES.NAME, SUM(TAXLINES.AMOUNT) " + "FROM RECEIPTS, TAXLINES, TAXES, TAXCATEGORIES WHERE RECEIPTS.ID = TAXLINES.RECEIPT AND TAXLINES.TAXID = TAXES.ID AND TAXES.CATEGORY = TAXCATEGORIES.ID " + "AND RECEIPTS.MONEY = ?" + "GROUP BY TAXCATEGORIES.NAME" , SerializerWriteString.INSTANCE , new SerializerReadClass(PaymentsModel.SalesLine.class)) .list(app.getActiveCashIndex()); if (asales == null) { // JG 16 May 2013 use diamond inference p.m_lsales = new ArrayList<>(); } else { p.m_lsales = asales; } return p; } public int getPayments() { return m_iPayments.intValue(); } public double getTotal() { return m_dPaymentsTotal.doubleValue(); } public String getHost() { return m_sHost; } public int getSequence() { return m_iSeq; } public Date getDateStart() { return m_dDateStart; } public void setDateEnd(Date dValue) { m_dDateEnd = dValue; } public Date getDateEnd() { return m_dDateEnd; } public String printHost() { // return m_sHost; return StringUtils.encodeXML(m_sHost); } public String printSequence() { return Formats.INT.formatValue(m_iSeq); } public String printDateStart() { return Formats.TIMESTAMP.formatValue(m_dDateStart); } public String printDateEnd() { return Formats.TIMESTAMP.formatValue(m_dDateEnd); } public String printPayments() { return Formats.INT.formatValue(m_iPayments); } public String printPaymentsTotal() { return Formats.CURRENCY.formatValue(m_dPaymentsTotal); } public List<PaymentsLine> getPaymentLines() { return m_lpayments; } public int getSales() { return m_iSales == null ? 0 : m_iSales.intValue(); } public String printSales() { return Formats.INT.formatValue(m_iSales); } public String printSalesBase() { return Formats.CURRENCY.formatValue(m_dSalesBase); } public String printSalesTaxes() { return Formats.CURRENCY.formatValue(m_dSalesTaxes); } public String printSalesTotal() { return Formats.CURRENCY.formatValue((m_dSalesBase == null || m_dSalesTaxes == null) ? null : m_dSalesBase + m_dSalesTaxes); } public List<SalesLine> getSaleLines() { return m_lsales; } // JG 9 Nov 12 public double getCategorySalesRows() { return m_iCategorySalesRows.intValue(); } public String printCategorySalesRows() { return Formats.INT.formatValue(m_iCategorySalesRows); } public double getCategorySalesTotalUnits() { return m_dCategorySalesTotalUnits.doubleValue(); } public String printCategorySalesTotalUnits() { return Formats.DOUBLE.formatValue(m_dCategorySalesTotalUnits); } public double getCategorySalesTotal() { return m_dCategorySalesTotal.doubleValue(); } public String printCategorySalesTotal() { return Formats.CURRENCY.formatValue(m_dCategorySalesTotal); } public List<CategorySalesLine> getCategorySalesLines() { return m_lcategorysales; } // end public AbstractTableModel getPaymentsModel() { return new AbstractTableModel() { @Override public String getColumnName(int column) { return AppLocal.getIntString(PAYMENTHEADERS[column]); } @Override public int getRowCount() { return m_lpayments.size(); } @Override public int getColumnCount() { return PAYMENTHEADERS.length; } @Override public Object getValueAt(int row, int column) { PaymentsLine l = m_lpayments.get(row); switch (column) { case 0: return l.getType(); case 1: return l.getValue(); default: return null; } } }; } // JG 9 Nov 12 // Products category sales class public static class CategorySalesLine implements SerializableRead { private String m_CategoryName; private Double m_CategoryUnits; private Double m_CategorySum; @Override public void readValues(DataRead dr) throws BasicException { m_CategoryName = dr.getString(1); m_CategoryUnits = dr.getDouble(2); m_CategorySum = dr.getDouble(3); } public String printCategoryName() { return m_CategoryName; } public String printCategoryUnits() { return Formats.DOUBLE.formatValue(m_CategoryUnits); } public Double getCategoryUnits() { return m_CategoryUnits; } public String printCategorySum() { return Formats.CURRENCY.formatValue(m_CategorySum); } public Double getCategorySum() { return m_CategorySum; } } // end public static class SalesLine implements SerializableRead { private String m_SalesTaxName; private Double m_SalesTaxes; @Override public void readValues(DataRead dr) throws BasicException { m_SalesTaxName = dr.getString(1); m_SalesTaxes = dr.getDouble(2); } public String printTaxName() { return m_SalesTaxName; } public String printTaxes() { return Formats.CURRENCY.formatValue(m_SalesTaxes); } public String getTaxName() { return m_SalesTaxName; } public Double getTaxes() { return m_SalesTaxes; } } public AbstractTableModel getSalesModel() { return new AbstractTableModel() { @Override public String getColumnName(int column) { return AppLocal.getIntString(SALEHEADERS[column]); } @Override public int getRowCount() { return m_lsales.size(); } @Override public int getColumnCount() { return SALEHEADERS.length; } @Override public Object getValueAt(int row, int column) { SalesLine l = m_lsales.get(row); switch (column) { case 0: return l.getTaxName(); case 1: return l.getTaxes(); default: return null; } } }; } public static class PaymentsLine implements SerializableRead { private String m_PaymentType; private Double m_PaymentValue; @Override public void readValues(DataRead dr) throws BasicException { m_PaymentType = dr.getString(1); m_PaymentValue = dr.getDouble(2); } public String printType() { return AppLocal.getIntString("transpayment." + m_PaymentType); } public String getType() { return m_PaymentType; } public String printValue() { return Formats.CURRENCY.formatValue(m_PaymentValue); } public Double getValue() { return m_PaymentValue; } } }