BillBean.java 5.47 KB
package fi.insomnia.bortal.beans;

import java.io.ByteArrayOutputStream;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal;
import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal.Right;
import fi.insomnia.bortal.beanutil.AuthorisationBeanLocal.RightType;
import fi.insomnia.bortal.beanutil.PdfPrinter;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.BillFacade;
import fi.insomnia.bortal.facade.BillLineFacade;
import fi.insomnia.bortal.facade.EventFacade;
import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.BillLine;
import fi.insomnia.bortal.model.Discount;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.User;

/**
 * Session Bean implementation class BillBean
 */
@Stateless
public class BillBean implements BillBeanLocal {

    private static final Logger logger = LoggerFactory.getLogger(BillBean.class);

    private static final MathContext MATHCONTEXT_TWOSCALE = new MathContext(2);;

    @EJB
    private BillFacade billFacade;

    @EJB
    private UserBeanLocal userBean;

    @EJB
    private SecurityBeanLocal secubean;

    @EJB
    private AuthorisationBeanLocal authbean;
    @EJB
    private EventBeanLocal eventbean;
    @EJB
    private EventFacade eventfacade;
    @EJB
    private BillLineFacade billLineFacade;
    @PersistenceContext
    private EntityManager em;

    /**
     * Default constructor.
     */
    public BillBean() {
        // TODO Auto-generated constructor stub
    }

    public Bill findById(int id) {
        LanEvent event = eventbean.getCurrentEvent();
        if (id <= 0) {
            return null;
        }
        Bill bill = billFacade.find(event.getId(), id);
        User currentuser = userBean.getCurrentUser();

        if (!currentuser.equals(bill.getUser())) {
            userBean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ, "User tried to print the bill with insufficient rights. Bill id: ", bill);
        }
        return bill;

    }

    @Override
    public ByteArrayOutputStream getPdfBillStream(Bill bill) {
        if (bill == null) {
            return null;
        }
        if (bill.getBillNumber() == null || bill.getBillNumber() <= 0) {
            generateBillNumber(bill);
        }
        return new PdfPrinter(bill).output();
    }

    private void generateBillNumber(Bill bill) {
        if (bill.getBillNumber() == null || bill.getBillNumber() == 0) {
            LanEvent currEvent = eventbean.getCurrentEvent();
            Integer billnr = billFacade.getBiggestBillNumber(currEvent);
            if (billnr == null || billnr < currEvent.getNextBillNumber()) {
                billnr = currEvent.getNextBillNumber();
            } else {
                ++billnr;
            }
            bill.setBillNumber(billnr);
            billFacade.merge(bill);
        }

    }

    @Override
    public Bill createEmptyBill(User shoppingUser) {

        if (shoppingUser != null && !userBean.isCurrentUser(shoppingUser)) {
            userBean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "User tried to shop to ", shoppingUser, " another without sufficient rights");
        }

        if (shoppingUser == null) {
            shoppingUser = userBean.getCurrentUser();
        }
        LanEvent event = eventbean.getCurrentEvent();
        Bill ret = new Bill(event, shoppingUser);
        billFacade.create(ret);
        ret.setUser(shoppingUser);
        em.flush();
        logger.debug("Created bill with id {} and user {}", ret.getId(), ret.getUser());
        return ret;
    }

    @Override
    public BillLine addProductToBill(Bill bill, Product product, BigDecimal count) {
        // If bill number > 0 bill has been sent and extra privileges are needed
        // to modify.
        boolean iscurrent = userBean.isCurrentUser(bill.getUser());
        Integer billnr = bill.getBillNumber();
        if (!iscurrent || billnr != null) {
            userBean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "User tried to modify bill ", bill, "without sufficient permissions");
        }
        BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat());
        billLineFacade.create(line);

        for (Discount disc : product.getDiscounts()) {
            if (disc.isActive() && count.compareTo(disc.getAmountMax()) <= 0 && count.compareTo(disc.getAmountMin()) >= 0) {
                BigDecimal disccounts = count;
                if (disc.getMaxNum().compareTo(disccounts) >= 0) {
                    disccounts = disc.getMaxNum();
                }
                BillLine discountLine = new BillLine(bill, disc.getShortdesc(), product.getUnitName(), disccounts,
                        product.getPrice().subtract(product.getPrice().multiply(disc.getPercentage(), MATHCONTEXT_TWOSCALE)).negate(),
                        product.getVat().subtract(product.getVat().multiply(disc.getPercentage(), MATHCONTEXT_TWOSCALE)).negate());
                billLineFacade.create(discountLine);
            }
        }

        em.flush();
        return line;
    }

}