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

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

import javax.ejb.EJB;
import javax.ejb.Stateless;

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.LanEvent;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.User;

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

    @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;

    /**
     * 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);

        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);
        return line;
    }

}