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

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

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.EjbPermissionDeniedException;
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()))
            if (!authbean.isAuthorised(currentuser, Right.ADMIN, RightType.READ)) {
                {
                    secubean.logPermissionDenied(currentuser,
                            "User tried to print the bill with insufficient rights. Bill id: " + bill);
                    return null;
                }
            }

        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) throws EjbPermissionDeniedException {

        if (shoppingUser != null && userBean.hasCurrentUserPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE)) {
            String msg = new StringBuilder("User tried to shop to ").append(shoppingUser.getId()).append(" another without sufficient rights").toString();
            throw new EjbPermissionDeniedException(secubean, userBean.getCurrentUser(), msg);
        }
        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) {
        // TODO: Lähetettyä laskua ei saa kaikki muokata!
        // TODO: Jos ei olla tekemässä omaa laskua tarkistetaan onko riittävät
        // oikeudet.

        BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat());
        billLineFacade.create(line);
        return line;
    }

}