com.floreantpos.print.DrawerpullReportService.java Source code

Java tutorial

Introduction

Here is the source code for com.floreantpos.print.DrawerpullReportService.java

Source

/**
 * ************************************************************************
 * * The contents of this file are subject to the MRPL 1.2
 * * (the  "License"),  being   the  Mozilla   Public  License
 * * Version 1.1  with a permitted attribution clause; you may not  use this
 * * file except in compliance with the License. You  may  obtain  a copy of
 * * the License at http://www.floreantpos.org/license.html
 * * 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.
 * * The Original Code is FLOREANT POS.
 * * The Initial Developer of the Original Code is OROCUBE LLC
 * * All portions are Copyright (C) 2015 OROCUBE LLC
 * * All Rights Reserved.
 * ************************************************************************
 */
package com.floreantpos.print;

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import com.floreantpos.config.TerminalConfig;
import com.floreantpos.main.Application;
import com.floreantpos.model.CashDrawer;
import com.floreantpos.model.CashDropTransaction;
import com.floreantpos.model.CashTransaction;
import com.floreantpos.model.CreditCardTransaction;
import com.floreantpos.model.CurrencyBalance;
import com.floreantpos.model.DebitCardTransaction;
import com.floreantpos.model.DrawerPullReport;
import com.floreantpos.model.GiftCertificateTransaction;
import com.floreantpos.model.Gratuity;
import com.floreantpos.model.PayOutTransaction;
import com.floreantpos.model.PosTransaction;
import com.floreantpos.model.RefundTransaction;
import com.floreantpos.model.Terminal;
import com.floreantpos.model.Ticket;
import com.floreantpos.model.TicketDiscount;
import com.floreantpos.model.dao.CashDropTransactionDAO;
import com.floreantpos.model.dao.GenericDAO;
import com.floreantpos.model.dao.PayOutTransactionDAO;
import com.floreantpos.model.dao.RefundTransactionDAO;
import com.floreantpos.model.dao.TicketDAO;
import com.floreantpos.model.util.RefundSummary;
import com.floreantpos.model.util.TransactionSummary;
import com.floreantpos.util.NumberUtil;

public class DrawerpullReportService {

    public static DrawerPullReport buildDrawerPullReport() throws Exception {
        Session session = null;
        try {
            Terminal terminal = Application.getInstance().refreshAndGetTerminal();
            DrawerPullReport report = new DrawerPullReport();
            report.setReportTime(new Date());

            GenericDAO dao = new GenericDAO();
            session = dao.createNewSession();

            populateNetSales(session, terminal, report);
            populateReceiptDifferential(session, terminal, report);

            //         populateGiftSection(session, terminal, report);

            //populateCashTax(session, terminal, report);

            RefundSummary refundSummary = RefundTransactionDAO.getInstance().getTotalRefundForTerminal(terminal);
            report.setRefundReceiptCount(report.getRefundReceiptCount() + refundSummary.getCount());
            report.setRefundAmount(report.getRefundAmount() + refundSummary.getAmount());

            report.setTipsPaid(TicketDAO.getInstance().getPaidGratuityAmount(terminal));

            double totalPayout = 0;
            List<PayOutTransaction> payoutTransactions = new PayOutTransactionDAO().getUnsettled(terminal);
            for (PayOutTransaction transaction : payoutTransactions) {
                totalPayout += transaction.getAmount();
            }
            report.setPayOutCount(payoutTransactions.size());
            report.setPayOutAmount(totalPayout);

            double drawerBleedAmount = 0;
            List<CashDropTransaction> cashDrops = new CashDropTransactionDAO().findUnsettled(terminal);
            for (CashDropTransaction transaction : cashDrops) {
                drawerBleedAmount += transaction.getAmount();
            }
            report.setDrawerBleedCount(cashDrops.size());
            report.setDrawerBleedAmount(drawerBleedAmount);

            report.setBeginCash(terminal.getOpeningBalance());
            report.setCashToDeposit(terminal.getCurrentBalance());

            if (TerminalConfig.isEnabledMultiCurrency()) {
                populateCurrencyBalanceSection(session, terminal, report);
            }
            populateVoidSection(session, terminal, report);
            //
            //         //gift cert
            //         criteria = session.createCriteria(GiftCertificateTransaction.class);
            //         criteria.add(Restrictions.eq(GiftCertificateTransaction.PROP_DRAWER_RESETTED, Boolean.FALSE));
            //         criteria.add(Restrictions.eq(GiftCertificateTransaction.PROP_TERMINAL, terminal));
            //         projectionList = Projections.projectionList();
            //         projectionList.add(Projections.sum(GiftCertificateTransaction.PROP_FACE_VALUE));
            //         projectionList.add(Projections.sum(GiftCertificateTransaction.PROP_CASH_BACK_AMOUNT));
            //         criteria.setProjection(projectionList);
            //         Object[] o = (Object[]) criteria.uniqueResult();
            //         if (o.length > 0 && o[0] instanceof Number) {
            //            double amount = ((Number) o[0]).doubleValue();
            //            report.setGiftCertReturnAmount(amount);
            //         }
            //         if (o.length > 1 && o[1] instanceof Number) {
            //            double amount = ((Number) o[1]).doubleValue();
            //            report.setGiftCertChangeAmount(amount);
            //         }

            //discount, coupon
            int totalDiscountCount = 0;
            double totalDiscountAmount = 0;
            double totalDiscountSales = 0;
            int totalDiscountGuest = 0;
            int totalDiscountPartySize = 0;
            int totalDiscountCheckSize = 0;
            double totalDiscountPercentage = 0;
            double totalDiscountRatio = 0;

            Criteria criteria = session.createCriteria(Ticket.class, "t"); //$NON-NLS-1$
            //criteria.add(Restrictions.eq(Ticket.PROP_CLOSED, Boolean.TRUE));
            criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE));
            criteria.add(Restrictions.eq(Ticket.PROP_REFUNDED, Boolean.FALSE));
            criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE));
            criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal));
            List list = criteria.list();

            for (Iterator iter = list.iterator(); iter.hasNext();) {
                Ticket ticket = (Ticket) iter.next();
                if (ticket.getDiscounts() != null) {
                    List<TicketDiscount> discounts = ticket.getDiscounts();
                    for (TicketDiscount discount2 : discounts) {
                        ++totalDiscountCount;
                        totalDiscountAmount += discount2.getValue();
                        totalDiscountGuest += ticket.getNumberOfGuests();
                        totalDiscountSales += ticket.getTotalAmount();
                        totalDiscountCheckSize++;
                    }
                }
            }

            totalDiscountPartySize = totalDiscountGuest;

            report.setTotalDiscountCount(totalDiscountCount);
            report.setTotalDiscountAmount(totalDiscountAmount);
            report.setTotalDiscountCheckSize(totalDiscountCheckSize);
            report.setTotalDiscountSales(totalDiscountSales);
            report.setTotalDiscountGuest(totalDiscountGuest);
            report.setTotalDiscountPartySize(totalDiscountPartySize);
            report.setTotalDiscountPercentage(totalDiscountPercentage);
            report.setTotalDiscountRatio(totalDiscountRatio);

            report.setTerminal(terminal);

            report.calculate();

            return report;
        } finally {
            if (session != null)
                session.close();
        }
    }

    private static void populateCurrencyBalanceSection(Session session, Terminal terminal,
            DrawerPullReport report) {
        Criteria criteria = session.createCriteria(CashDrawer.class);
        criteria.add(Restrictions.eq(CashDrawer.PROP_TERMINAL, terminal));
        CashDrawer cashDrawer = (CashDrawer) criteria.uniqueResult();
        if (cashDrawer != null) {
            Set<CurrencyBalance> currencyBalance = cashDrawer.getCurrencyBalanceList();
            report.addCurrencyBalances(currencyBalance);
        }
    }

    private static void populateVoidSection(Session session, Terminal terminal, DrawerPullReport report) {
        //void
        Criteria criteria = session.createCriteria(Ticket.class, "t"); //$NON-NLS-1$
        criteria.add(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.TRUE));
        criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE));
        criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal));
        List<Ticket> list = criteria.list();

        double totalWaste = 0;
        double totalVoid = 0;

        for (Iterator iter = list.iterator(); iter.hasNext();) {
            Ticket ticket = (Ticket) iter.next();
            /*DrawerPullVoidTicketEntry entry = new DrawerPullVoidTicketEntry();
            entry.setCode(ticket.getId());
            entry.setAmount(ticket.getSubtotalAmount());
            entry.setReason(ticket.getVoidReason());
            if (ticket.isWasted()) {
               entry.setHast("Yes"); //$NON-NLS-1$
            }
            else {
               entry.setHast("No"); //$NON-NLS-1$
            }
                
            report.addVoidTicketEntry(entry);*/

            totalVoid += ticket.getSubtotalAmount();
            if (ticket.isWasted()) {
                totalWaste += ticket.getSubtotalAmount();
            }
        }

        report.setTotalVoid(totalVoid);
        report.setTotalVoidWst(totalWaste);
    }

    private static void populateNetSales(Session session, Terminal terminal, DrawerPullReport report) {
        //find net sale, tax
        Criteria criteria = session.createCriteria(Ticket.class);
        criteria.add(Restrictions.gt(Ticket.PROP_PAID_AMOUNT, 0.0));
        criteria.add(Restrictions.or(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE),
                Restrictions.eq(Ticket.PROP_REFUNDED, Boolean.TRUE)));
        criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE));
        criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal));

        List<Ticket> list = criteria.list();

        if (list == null || list.size() == 0) {
            return;
        }

        int ticketCount = 0;
        double subtotal = 0;
        double discount = 0;
        double salesTax = 0;
        double salesDeliveryCharge = 0;
        double tips = 0;

        for (Ticket ticket : list) {
            ++ticketCount;

            double refundAmount = 0;
            double refundTaxAmount = 0;

            Gratuity gratuity = ticket.getGratuity();
            if (gratuity != null) {
                if (gratuity.isRefunded()) {
                    refundAmount -= gratuity.getAmount();
                } else
                    tips += gratuity.getAmount();
            }
            if (ticket.isRefunded()) {
                if (ticket.getTransactions() != null) {
                    for (PosTransaction t : ticket.getTransactions()) {
                        if (t instanceof RefundTransaction) {
                            refundAmount += NumberUtil.roundToTwoDigit(t.getAmount());
                        }
                    }
                }
                refundTaxAmount = (ticket.getTaxAmount() * refundAmount)
                        / (ticket.getSubtotalAmount() + ticket.getTaxAmount());
                refundAmount = NumberUtil.roundToTwoDigit(refundAmount - refundTaxAmount);
            }

            subtotal += ticket.getSubtotalAmount() - refundAmount;
            discount += ticket.getDiscountAmount();
            salesTax += ticket.getTaxAmount() - refundTaxAmount;
            salesDeliveryCharge += ticket.getDeliveryCharge();

        }

        report.setTicketCount(ticketCount);
        report.setNetSales(subtotal - discount);
        report.setSalesTax(NumberUtil.roundToTwoDigit(salesTax));
        report.setSalesDeliveryCharge(salesDeliveryCharge);
        report.setChargedTips(tips);
    }

    private static void populateReceiptDifferential(Session session, Terminal terminal, DrawerPullReport report) {
        //find net sale, tax
        Criteria criteria = session.createCriteria(Ticket.class);
        criteria.add(Restrictions.gt(Ticket.PROP_PAID_AMOUNT, 0.0));
        criteria.add(Restrictions.or(Restrictions.eq(Ticket.PROP_VOIDED, Boolean.FALSE),
                Restrictions.eq(Ticket.PROP_REFUNDED, Boolean.TRUE)));
        criteria.add(Restrictions.eq(Ticket.PROP_DRAWER_RESETTED, Boolean.FALSE));
        criteria.add(Restrictions.eq(Ticket.PROP_TERMINAL, terminal));

        List<Ticket> list = criteria.list();

        if (list == null || list.size() == 0) {
            return;
        }

        TicketDAO dao = TicketDAO.getInstance();

        for (Ticket ticket : list) {
            ticket = dao.loadCouponsAndTransactions(ticket.getId());

            TransactionSummary ts = calculateTransactionSummary(ticket, CashTransaction.class);
            report.setCashReceiptCount(report.getCashReceiptCount() + ts.getCount());
            report.setCashReceiptAmount(report.getCashReceiptAmount() + ts.getAmount());

            ts = calculateTransactionSummary(ticket, CreditCardTransaction.class);
            report.setCreditCardReceiptCount(report.getCreditCardReceiptCount() + ts.getCount());
            report.setCreditCardReceiptAmount(report.getCreditCardReceiptAmount() + ts.getAmount());

            ts = calculateTransactionSummary(ticket, DebitCardTransaction.class);
            report.setDebitCardReceiptCount(report.getDebitCardReceiptCount() + ts.getCount());
            report.setDebitCardReceiptAmount(report.getDebitCardReceiptAmount() + ts.getAmount());

            ts = calculateTransactionSummary(ticket, GiftCertificateTransaction.class);
            report.setGiftCertReturnCount(report.getGiftCertReturnCount() + ts.getCount());
            report.setGiftCertReturnAmount(report.getGiftCertReturnAmount() + ts.getAmount());
            report.setGiftCertChangeAmount(report.getGiftCertChangeAmount() + ts.getChangeAmount());
            report.setCashBack(report.getCashBack() + ts.getChangeAmount());
        }
    }

    private static TransactionSummary calculateTransactionSummary(Ticket ticket, Class transactionClass) {
        int count = 0;
        double total = 0;
        double changeAmount = 0;

        TransactionSummary summary = new TransactionSummary();

        Set<PosTransaction> transactions = ticket.getTransactions();
        if (transactions == null) {
            return summary;
        }

        for (PosTransaction posTransaction : transactions) {
            if (posTransaction.getClass().equals(transactionClass)) {
                ++count;
                total += posTransaction.getAmount();
                changeAmount += posTransaction.getGiftCertCashBackAmount();
            }
        }

        summary.setCount(count);
        summary.setAmount(total);
        summary.setChangeAmount(changeAmount);

        return summary;
    }

}