Commit 1d4beab5 by Tuomas Riihimäki

Merge branch 'master' into 'master'

Ulkoasujuttuja and discount by role ja fixi siihen

Ulkoasujutukkeita, discount by role, sekä kaksi fixicommittia siihen.

Reviewed-by: tuomari
2 parents 32b14a07 125281d6
package fi.codecrew.moya.beans; package fi.codecrew.moya.beans;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -27,7 +29,9 @@ import fi.codecrew.moya.facade.EventUserFacade; ...@@ -27,7 +29,9 @@ import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.model.AccountEvent; import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.Bill; import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.BillLine; import fi.codecrew.moya.model.BillLine;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.LanEvent; import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventPropertyKey; import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
...@@ -68,6 +72,9 @@ public class BillBean implements BillBeanLocal { ...@@ -68,6 +72,9 @@ public class BillBean implements BillBeanLocal {
private EventUserFacade eventUserFacade; private EventUserFacade eventUserFacade;
@EJB @EJB
private ProductPBean productPBean; private ProductPBean productPBean;
@EJB
private DiscountBean discountBean;
/** /**
* Default constructor. * Default constructor.
...@@ -304,5 +311,38 @@ public class BillBean implements BillBeanLocal { ...@@ -304,5 +311,38 @@ public class BillBean implements BillBeanLocal {
bill.markExpired(); bill.markExpired();
return bill; return bill;
} }
@Override
public Bill addProductToBill(Bill bill, Product product, BigDecimal count) {
return this.addProductToBill(bill, product, count, null);
}
@Override
public Bill addProductToBill(Bill bill, Product product, BigDecimal count, FoodWave foodwave) {
// If bill number > 0 bill has been sent and extra privileges are needed
// to modify.
// if (!iscurrent || billnr != null) {
// permbean.fatalPermission(BillPermission.WRITE_ALL,
// "User tried to modify bill ", bill,
// "without sufficient permissions");
// }
if (bill.getBillLines() == null) {
bill.setBillLines(new ArrayList<BillLine>());
}
bill.getBillLines().add(new BillLine(bill, product, count, foodwave));
for (Discount disc : discountBean.getActiveDiscountsByProduct(product, count, bill.getSentDate(), bill.getUser())) {
bill.getBillLines().add(new BillLine(bill, product, disc, count));
}
return bill;
}
} }
package fi.codecrew.moya.beans; package fi.codecrew.moya.beans;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.codecrew.moya.facade.DiscountFacade; import fi.codecrew.moya.facade.DiscountFacade;
import fi.codecrew.moya.facade.EventFacade;
import fi.codecrew.moya.facade.ProductFacade;
import fi.codecrew.moya.beans.DiscountBeanLocal;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.model.Discount; import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Role;
/** /**
* Session Bean implementation class DiscountBean * Session Bean implementation class DiscountBean
*/ */
@Stateless @Stateless
@LocalBean
public class DiscountBean implements DiscountBeanLocal { public class DiscountBean implements DiscountBeanLocal {
@EJB @EJB
private DiscountFacade discountfacade; private DiscountFacade discountfacade;
@EJB @EJB
private EventBeanLocal eventbean; private UserBean userBean;
@EJB
private ProductFacade productfacade;
@EJB
private EventFacade eventfacade;
public DiscountBean() { public DiscountBean() {
} }
...@@ -36,6 +39,35 @@ public class DiscountBean implements DiscountBeanLocal { ...@@ -36,6 +39,35 @@ public class DiscountBean implements DiscountBeanLocal {
return ret; return ret;
} }
@Override
public List<Discount> getActiveDiscountsByProduct(Product product, BigDecimal quantity, Calendar time, EventUser user) {
ArrayList<Discount> ret = new ArrayList<Discount>();
for (Discount d : product.getDiscounts()) {
if (d.isActive() &&
(d.getValidTo() == null || d.getValidTo().after(time)) &&
(d.getValidFrom() == null || d.getValidFrom().before(time)) &&
(d.getAmountMax().compareTo(BigDecimal.ZERO) == 0 || quantity.compareTo(d.getAmountMax()) <= 0) &&
(d.getAmountMin().compareTo(BigDecimal.ZERO) == 0 || quantity.compareTo(d.getAmountMin()) >= 0)) {
// plaah, there is role, must do stuff
if (d.getRole() != null) {
for (Role role : userBean.localFindUsersRoles(user)) {
if (d.getRole().equals(role)) {
ret.add(d);
}
}
} else {
ret.add(d);
}
}
}
return ret;
}
// @Override // @Override
// public Discount create(String discountdesc) { // public Discount create(String discountdesc) {
// LanEvent ev = eventbean.getCurrentEvent(); // LanEvent ev = eventbean.getCurrentEvent();
......
...@@ -151,7 +151,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -151,7 +151,7 @@ public class PlaceBean implements PlaceBeanLocal {
for (Entry<Product, Integer> entry : mockmap.entrySet()) { for (Entry<Product, Integer> entry : mockmap.entrySet()) {
logger.debug("Adding to price {} of {}", entry.getValue(), entry.getKey().getName()); logger.debug("Adding to price {} of {}", entry.getValue(), entry.getKey().getName());
if (entry.getKey() != null) { if (entry.getKey() != null) {
total = total.add(productBean.calculateTotal(entry.getKey(), new BigDecimal(entry.getValue()), now)); total = total.add(productBean.calculateTotal(entry.getKey(), new BigDecimal(entry.getValue()), now, user));
} }
} }
return total; return total;
......
...@@ -91,6 +91,7 @@ public class ProductBean implements ProductBeanLocal { ...@@ -91,6 +91,7 @@ public class ProductBean implements ProductBeanLocal {
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
@EJB @EJB
private BillLineFacade billLineFacade; private BillLineFacade billLineFacade;
@EJB @EJB
private ProductPBean productPBean; private ProductPBean productPBean;
...@@ -99,6 +100,9 @@ public class ProductBean implements ProductBeanLocal { ...@@ -99,6 +100,9 @@ public class ProductBean implements ProductBeanLocal {
@EJB @EJB
private PlaceBean placebean; private PlaceBean placebean;
@EJB
private DiscountBean discountBean;
private static final Logger logger = LoggerFactory.getLogger(ProductBean.class); private static final Logger logger = LoggerFactory.getLogger(ProductBean.class);
...@@ -285,12 +289,12 @@ public class ProductBean implements ProductBeanLocal { ...@@ -285,12 +289,12 @@ public class ProductBean implements ProductBeanLocal {
} }
@Override @Override
public BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date) { public BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date, EventUser user) {
if (product == null || quantity == null) { if (product == null || quantity == null) {
throw new RuntimeException("Some parameter is null!"); throw new RuntimeException("Some parameter is null!");
} }
BigDecimal total = product.getPrice(); BigDecimal total = product.getPrice();
for (Discount d : product.getActiveDiscounts(quantity, date)) { for (Discount d : discountBean.getActiveDiscountsByProduct(product, quantity, date, user)) {
total = total.multiply(d.getPercentage()); total = total.multiply(d.getPercentage());
} }
return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity); return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity);
......
...@@ -30,6 +30,9 @@ public class ProductPBean { ...@@ -30,6 +30,9 @@ public class ProductPBean {
@EJB @EJB
private PermissionBean permbean; private PermissionBean permbean;
@EJB
private DiscountBean discountBean;
@EJB @EJB
private AccountEventFacade accounteventfacade; private AccountEventFacade accounteventfacade;
private static final Logger logger = LoggerFactory private static final Logger logger = LoggerFactory
...@@ -73,7 +76,7 @@ public class ProductPBean { ...@@ -73,7 +76,7 @@ public class ProductPBean {
} }
BigDecimal unitPrice = product.getPrice().negate(); BigDecimal unitPrice = product.getPrice().negate();
List<Discount> discounts = product.getActiveDiscounts(quantity, date); List<Discount> discounts = discountBean.getActiveDiscountsByProduct(product, quantity, date, user);
for (Discount d : discounts) { for (Discount d : discounts) {
unitPrice = unitPrice.multiply(d.getPercentage()); unitPrice = unitPrice.multiply(d.getPercentage());
} }
......
package fi.codecrew.moya.beans; package fi.codecrew.moya.beans;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -10,6 +11,8 @@ import javax.ejb.Local; ...@@ -10,6 +11,8 @@ import javax.ejb.Local;
import fi.codecrew.moya.bortal.views.BillSummary; import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.model.Bill; import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.Product;
@Local @Local
public interface BillBeanLocal { public interface BillBeanLocal {
...@@ -37,5 +40,9 @@ public interface BillBeanLocal { ...@@ -37,5 +40,9 @@ public interface BillBeanLocal {
List<Bill> find(EventUser user); List<Bill> find(EventUser user);
Bill expireBill(Bill bill); Bill expireBill(Bill bill);
Bill addProductToBill(Bill bill, Product product, BigDecimal count, FoodWave foodwave);
Bill addProductToBill(Bill bill, Product product, BigDecimal count);
} }
package fi.codecrew.moya.beans; package fi.codecrew.moya.beans;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.codecrew.moya.model.Discount; import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product;
@Local @Local
public interface DiscountBeanLocal { public interface DiscountBeanLocal {
Discount save(Discount discount); Discount save(Discount discount);
public List<Discount> getActiveDiscountsByProduct(Product product, BigDecimal quantity, Calendar time, EventUser user);
} }
...@@ -47,7 +47,7 @@ public interface ProductBeanLocal { ...@@ -47,7 +47,7 @@ public interface ProductBeanLocal {
Discount save(Discount discount); Discount save(Discount discount);
BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date); BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date, EventUser user);
HashMap<Integer, BigDecimal> getProductLimit(Map<Integer, BigDecimal> prodCounts, EventUser user); HashMap<Integer, BigDecimal> getProductLimit(Map<Integer, BigDecimal> prodCounts, EventUser user);
......
...@@ -347,28 +347,6 @@ public class Bill extends GenericEntity { ...@@ -347,28 +347,6 @@ public class Bill extends GenericEntity {
return delayIntrest; return delayIntrest;
} }
public void addProduct(Product product, BigDecimal count) {
this.addProduct(product, count, null);
}
public void addProduct(Product product, BigDecimal count, FoodWave foodwave) {
// If bill number > 0 bill has been sent and extra privileges are needed
// to modify.
// if (!iscurrent || billnr != null) {
// permbean.fatalPermission(BillPermission.WRITE_ALL,
// "User tried to modify bill ", bill,
// "without sufficient permissions");
// }
if (this.billLines == null) {
billLines = new ArrayList<BillLine>();
}
this.getBillLines().add(new BillLine(this, product, count, foodwave));
for (Discount disc : product.getActiveDiscounts(count, sentDate)) {
this.getBillLines().add(new BillLine(this, product, disc, count));
}
}
public void setBillNumber(Integer billNumber) { public void setBillNumber(Integer billNumber) {
this.billNumber = billNumber; this.billNumber = billNumber;
} }
......
...@@ -162,21 +162,6 @@ public class Product extends GenericEntity { ...@@ -162,21 +162,6 @@ public class Product extends GenericEntity {
return tot; return tot;
} }
// TODO: alennukset lasketaan täällä. HUOMHUOM!!
public List<Discount> getActiveDiscounts(BigDecimal quantity, Calendar time) {
ArrayList<Discount> ret = new ArrayList<Discount>();
for (Discount d : getDiscounts()) {
if (d.isActive() &&
(d.getValidTo() == null || d.getValidTo().after(time)) &&
(d.getValidFrom() == null || d.getValidFrom().before(time)) &&
quantity.compareTo(d.getAmountMax()) <= 0 &&
quantity.compareTo(d.getAmountMin()) >= 0) {
ret.add(d);
}
}
return ret;
}
public BigDecimal getInventoryCount() { public BigDecimal getInventoryCount() {
BigDecimal ret = new BigDecimal(0); BigDecimal ret = new BigDecimal(0);
......
...@@ -31,6 +31,12 @@ ...@@ -31,6 +31,12 @@
<h:inputText id="code" value="#{productView.discount.code}" /> <h:inputText id="code" value="#{productView.discount.code}" />
<h:message for="code" /> <h:message for="code" />
<h:outputLabel for="role" value="#{i18n['discount.role']}:" />
<h:selectOneMenu id="role" value="#{productView.discount.role}" converter="#{roleConverter}">
<f:selectItems var="role" itemLabel="#{role.name}" value="#{roleDataView.rolesWithEmpty}" />
</h:selectOneMenu>
<h:message for="role" />
<h:outputLabel for="amountMin" value="#{i18n['discount.amountMin']}:" /> <h:outputLabel for="amountMin" value="#{i18n['discount.amountMin']}:" />
<h:inputText id="amountMin" value="#{productView.discount.amountMin}" required="true" /> <h:inputText id="amountMin" value="#{productView.discount.amountMin}" required="true" />
<h:message for="amountMin" /> <h:message for="amountMin" />
...@@ -54,6 +60,8 @@ ...@@ -54,6 +60,8 @@
<h:outputLabel for="active" value="#{i18n['discount.active']}" /> <h:outputLabel for="active" value="#{i18n['discount.active']}" />
<h:selectBooleanCheckbox id="active" value="#{productView.discount.active}" /> <h:selectBooleanCheckbox id="active" value="#{productView.discount.active}" />
<h:message for="active" /> <h:message for="active" />
</h:panelGrid> </h:panelGrid>
......
...@@ -40,10 +40,9 @@ ...@@ -40,10 +40,9 @@
<h:commandButton action="#{productShopView.addMinusOne}" value="#{i18n['productshop.minusOne']}"> <h:commandButton action="#{productShopView.addMinusOne}" value="#{i18n['productshop.minusOne']}">
<f:ajax render="@form" /> <f:ajax render="@form" />
</h:commandButton> </h:commandButton>
<h:inputText size="4" id="cartcount" value="#{cart.count}"> <h:outputText id="cartcount" escape="false" value="&nbsp;&nbsp;#{cart.count}&nbsp;&nbsp;">
<f:convertNumber maxIntegerDigits="2" minFractionDigits="0" /> <f:convertNumber maxIntegerDigits="2" minFractionDigits="0" />
<f:ajax render="@form" event="valueChange" listener="#{productShopView.updateAllCartLimits()}" /> </h:outputText>
</h:inputText>
<h:commandButton action="#{productShopView.addOne}" value="#{i18n['productshop.plusOne']}"> <h:commandButton action="#{productShopView.addOne}" value="#{i18n['productshop.plusOne']}">
<f:ajax render="@form" /> <f:ajax render="@form" />
</h:commandButton> </h:commandButton>
......
...@@ -45,10 +45,9 @@ ...@@ -45,10 +45,9 @@
<h:outputText value="#{i18n['shop.count']}" /> <h:outputText value="#{i18n['shop.count']}" />
</f:facet> </f:facet>
<p:inplace> <p:inplace>
<p:inputText value="#{prods.count}" size="4"> <h:outputText value="#{prods.count}" size="4">
<f:ajax event="valueChange" render="@form" />
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" /> <f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</p:inputText> </h:outputText>
</p:inplace> </p:inplace>
</p:column> </p:column>
......
...@@ -148,6 +148,9 @@ h1 { ...@@ -148,6 +148,9 @@ h1 {
width: 200px; width: 200px;
} }
nav { nav {
min-width: 200px; min-width: 200px;
background: white; background: white;
...@@ -193,3 +196,13 @@ aside { ...@@ -193,3 +196,13 @@ aside {
th, td { th, td {
padding: 5px; padding: 5px;
} }
#header_center {
position: relative;
text-align: right;
}
#selectLanguage {
padding-left: 10px;
padding-top: 10px;
}
...@@ -79,21 +79,15 @@ ...@@ -79,21 +79,15 @@
</h:link> </h:link>
</div> </div>
<div id="header_center" class="flex1"> <div id="header_center" class="flex1">
<div>
<h:form id="selectLanguage">
<p:selectOneButton id="langselect" styleClass="languageSelector" value="#{sessionStore.locale}" onchange="this.form.submit()" converter="#{localeConverter}">
<f:selectItems value="#{localeSelectorView.availableLocales}" var="loc" itemValue="#{loc.locale}" itemLabel="#{loc.locale.displayName}" />
</p:selectOneButton>
</h:form>
</div>
<ui:fragment rendered="#{layoutView.canManageContent}"> <ui:fragment rendered="#{layoutView.canManageContent}">
<div> <div>
<h:form> <h:form>
<h:outputLabel for="manageBtn" value="#{i18n['content.showContentEditLinks']}" /> <h:outputLabel for="manageBtn" value="#{i18n['content.showContentEditLinks']}" />
<h:selectBooleanCheckbox value="#{sessionStore.manageContentLinks}" onclick="this.form.submit()" /> <h:selectBooleanCheckbox value="#{sessionStore.manageContentLinks}" onclick="this.form.submit()" />
</h:form> </h:form>
</div> </div>
</ui:fragment> </ui:fragment>
</div> </div>
<div id="header_right"> <div id="header_right">
...@@ -115,6 +109,14 @@ ...@@ -115,6 +109,14 @@
</nav> </nav>
<section id="main" class="flex2"> <section id="main" class="flex2">
<div class="container top"> <div class="container top">
<h:form id="selectLanguage">
<p:selectOneButton id="langselect" styleClass="languageSelector" value="#{sessionStore.locale}" onchange="this.form.submit()" converter="#{localeConverter}">
<f:selectItems value="#{localeSelectorView.availableLocales}" var="loc" itemValue="#{loc.locale}" itemLabel="#{loc.locale.displayName}" />
</p:selectOneButton>
</h:form>
<h:link rendered="#{layoutView.manageContent}" styleClass="editorlink" value="#{i18n['layout.editTop']}" outcome="/pages/manage"> <h:link rendered="#{layoutView.manageContent}" styleClass="editorlink" value="#{i18n['layout.editTop']}" outcome="/pages/manage">
<f:param name="pagename" value="#{layoutView.pagepath}:top" /> <f:param name="pagename" value="#{layoutView.pagepath}:top" />
</h:link> </h:link>
......
...@@ -23,6 +23,7 @@ import fi.codecrew.moya.model.FoodWave; ...@@ -23,6 +23,7 @@ import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.user.UserView; import fi.codecrew.moya.web.cdiview.user.UserView;
import fi.codecrew.moya.web.helper.ProductShopItemHelper;
import fi.codecrew.moya.web.helpers.ProductShopItem; import fi.codecrew.moya.web.helpers.ProductShopItem;
@Named @Named
...@@ -36,6 +37,9 @@ public class FoodWaveFoodView extends GenericCDIView { ...@@ -36,6 +37,9 @@ public class FoodWaveFoodView extends GenericCDIView {
@EJB @EJB
private FoodWaveBeanLocal foodWaveBean; private FoodWaveBeanLocal foodWaveBean;
@Inject
private ProductShopItemHelper psiHelper;
@EJB @EJB
EventBeanLocal eventBean; EventBeanLocal eventBean;
...@@ -66,7 +70,7 @@ public class FoodWaveFoodView extends GenericCDIView { ...@@ -66,7 +70,7 @@ public class FoodWaveFoodView extends GenericCDIView {
foodWave = foodWaveBean.findFoodwave(getFoodwaveid()); foodWave = foodWaveBean.findFoodwave(getFoodwaveid());
logger.debug("Foodwave {}", foodWave); logger.debug("Foodwave {}", foodWave);
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productGTList(foodWave.getTemplate().getProducts())); shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productGTList(foodWave.getTemplate().getProducts(), userview.getUser()));
this.beginConversation(); this.beginConversation();
} }
...@@ -99,7 +103,8 @@ public class FoodWaveFoodView extends GenericCDIView { ...@@ -99,7 +103,8 @@ public class FoodWaveFoodView extends GenericCDIView {
public String add(Integer count) { public String add(Integer count) {
ProductShopItem item = getShoppingcart().getRowData(); ProductShopItem item = getShoppingcart().getRowData();
item.setCount(item.getCount().add(BigDecimal.valueOf(count))); psiHelper.setProductShopItemCount(item, item.getCount().add(BigDecimal.valueOf(count)));
System.out.println("foobar" + item.getCount()); System.out.println("foobar" + item.getCount());
return null; return null;
} }
...@@ -133,7 +138,7 @@ public class FoodWaveFoodView extends GenericCDIView { ...@@ -133,7 +138,7 @@ public class FoodWaveFoodView extends GenericCDIView {
for (ProductShopItem shopitem : shoppingcart) { for (ProductShopItem shopitem : shoppingcart) {
if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) { if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) {
bill.addProduct(shopitem.getProduct(), shopitem.getCount(), getFoodWave()); billBean.addProductToBill(bill, shopitem.getProduct(), shopitem.getCount(), getFoodWave());
} }
} }
logger.warn("Committing shoppingcart for user {}. Cart prize: {}", userview.getSelectedUser().getWholeName(), bill.getTotalPrice()); logger.warn("Committing shoppingcart for user {}. Cart prize: {}", userview.getSelectedUser().getWholeName(), bill.getTotalPrice());
...@@ -198,4 +203,12 @@ public class FoodWaveFoodView extends GenericCDIView { ...@@ -198,4 +203,12 @@ public class FoodWaveFoodView extends GenericCDIView {
this.billEditView = billEditView; this.billEditView = billEditView;
} }
public ProductShopItemHelper getPsiHelper() {
return psiHelper;
}
public void setPsiHelper(ProductShopItemHelper psiHelper) {
this.psiHelper = psiHelper;
}
} }
...@@ -31,6 +31,7 @@ import fi.codecrew.moya.web.annotations.SelectedUser; ...@@ -31,6 +31,7 @@ import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView; import fi.codecrew.moya.web.cdiview.reader.ReaderView;
import fi.codecrew.moya.web.cdiview.user.UserView; import fi.codecrew.moya.web.cdiview.user.UserView;
import fi.codecrew.moya.web.helper.ProductShopItemHelper;
import fi.codecrew.moya.web.helpers.ProductShopItem; import fi.codecrew.moya.web.helpers.ProductShopItem;
@Named @Named
...@@ -53,6 +54,8 @@ public class ProductShopView extends GenericCDIView { ...@@ -53,6 +54,8 @@ public class ProductShopView extends GenericCDIView {
@EJB @EJB
private transient EventBeanLocal eventbean; private transient EventBeanLocal eventbean;
public void cashChanged() public void cashChanged()
{ {
payInstant = false; payInstant = false;
...@@ -78,6 +81,18 @@ public class ProductShopView extends GenericCDIView { ...@@ -78,6 +81,18 @@ public class ProductShopView extends GenericCDIView {
@Inject @Inject
private BillEditView billEditView; private BillEditView billEditView;
@Inject
private ProductShopItemHelper psiHelper;
public ProductShopItemHelper getPsiHelper() {
return psiHelper;
}
public void setPsiHelper(ProductShopItemHelper psiHelper) {
this.psiHelper = psiHelper;
}
private boolean hasLimits = false; private boolean hasLimits = false;
private boolean blip = false; private boolean blip = false;
private ListDataModel<ProductShopItem> boughtItems; private ListDataModel<ProductShopItem> boughtItems;
...@@ -94,7 +109,7 @@ public class ProductShopView extends GenericCDIView { ...@@ -94,7 +109,7 @@ public class ProductShopView extends GenericCDIView {
public void initBillView() { public void initBillView() {
if (requirePermissions(ShopPermission.LIST_USERPRODUCTS) if (requirePermissions(ShopPermission.LIST_USERPRODUCTS)
&& shoppingcart == null) { && shoppingcart == null) {
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts())); shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts(), user));
updateCartLimits(null); updateCartLimits(null);
logger.debug("Initialized billing shoppingcart to {}", shoppingcart); logger.debug("Initialized billing shoppingcart to {}", shoppingcart);
this.beginConversation(); this.beginConversation();
...@@ -137,7 +152,7 @@ public class ProductShopView extends GenericCDIView { ...@@ -137,7 +152,7 @@ public class ProductShopView extends GenericCDIView {
public void initShopView() { public void initShopView() {
if (requirePermissions(ShopPermission.SHOP_TO_OTHERS) && shoppingcart == null) { if (requirePermissions(ShopPermission.SHOP_TO_OTHERS) && shoppingcart == null) {
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productGTList(productBean.findForStaffshop())); shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productGTList(productBean.findForStaffshop(), user));
updateCartLimits(null); updateCartLimits(null);
LanEventProperty cashdefault = eventbean.getProperty(LanEventPropertyKey.SHOP_DEFAULT_CASH); LanEventProperty cashdefault = eventbean.getProperty(LanEventPropertyKey.SHOP_DEFAULT_CASH);
...@@ -151,7 +166,8 @@ public class ProductShopView extends GenericCDIView { ...@@ -151,7 +166,8 @@ public class ProductShopView extends GenericCDIView {
public String add(Integer count) { public String add(Integer count) {
ProductShopItem item = shoppingcart.getRowData(); ProductShopItem item = shoppingcart.getRowData();
item.setCount(item.getCount().add(BigDecimal.valueOf(count)));
psiHelper.setProductShopItemCount(item, item.getCount().add(BigDecimal.valueOf(count)));
updateCartLimits(item); updateCartLimits(item);
return null; return null;
...@@ -196,7 +212,7 @@ public class ProductShopView extends GenericCDIView { ...@@ -196,7 +212,7 @@ public class ProductShopView extends GenericCDIView {
// Update the updated cart first // Update the updated cart first
if (item != null) { if (item != null) {
BigDecimal l = limits.get(item.getProduct().getId()); BigDecimal l = limits.get(item.getProduct().getId());
if (item.updateLimit(l)) { if (psiHelper.updateProductShopItemLimit(item, l)) {
updateCartLimits(null); updateCartLimits(null);
return; return;
} }
...@@ -207,14 +223,16 @@ public class ProductShopView extends GenericCDIView { ...@@ -207,14 +223,16 @@ public class ProductShopView extends GenericCDIView {
if (l != null) { if (l != null) {
hasLimits = true; hasLimits = true;
} }
n.updateLimit(l);
psiHelper.updateProductShopItemLimit(n,l);
} }
} }
public String removeBought() { public String removeBought() {
ProductShopItem row = boughtItems.getRowData(); ProductShopItem row = boughtItems.getRowData();
row.setCount(row.getCount().subtract(BigDecimal.ONE));
psiHelper.setProductShopItemCount(row, row.getCount().subtract(BigDecimal.ONE));
updateCartLimits(row); updateCartLimits(row);
return null; return null;
...@@ -284,7 +302,7 @@ public class ProductShopView extends GenericCDIView { ...@@ -284,7 +302,7 @@ public class ProductShopView extends GenericCDIView {
for (ProductShopItem shopitem : shoppingcart) { for (ProductShopItem shopitem : shoppingcart) {
if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) { if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) {
bill.addProduct(shopitem.getProduct(), shopitem.getCount()); billbean.addProductToBill(bill, shopitem.getProduct(), shopitem.getCount());
} }
} }
billbean.createBill(bill); billbean.createBill(bill);
......
package fi.codecrew.moya.web.helper;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.HashMap;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Named;
import fi.codecrew.moya.beans.DiscountBeanLocal;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.helpers.ProductShopItem;
@Named
@ConversationScoped
public class ProductShopItemHelper extends GenericCDIView {
/**
*
*/
private static final long serialVersionUID = 1L;
@EJB
private DiscountBeanLocal discountBean;
public void setProductShopItemCount(ProductShopItem item, BigDecimal count) {
if (count == null || count.compareTo(BigDecimal.ZERO) < 0)
{
count = BigDecimal.ZERO;
}
item.setInternalCount(count);
item.setInternalPrice(item.getProduct().getPrice().abs().multiply(count));
item.setInternalDiscounts(discountBean.getActiveDiscountsByProduct(item.getProduct(),count, Calendar.getInstance(), item.getUser()) );
item.setInternalDiscountValues(new HashMap<Integer, BigDecimal>());
for (Discount d : item.getDiscounts())
{
BigDecimal newprice = item.getPrice().multiply(d.getPercentage());
item.getInternalDiscountValues().put(d.getId(), item.getPrice().subtract(newprice));
item.setInternalPrice(newprice);
}
}
public boolean updateProductShopItemLimit(ProductShopItem item, BigDecimal limitValue) {
if (limitValue != null && limitValue.compareTo(BigDecimal.ZERO) < 0)
{
this.setProductShopItemCount(item, item.getCount().add(limitValue));
if (item.getCount().compareTo(BigDecimal.ZERO) < 0) {
this.setProductShopItemCount(item,BigDecimal.ZERO);
}
item.setLimit(BigDecimal.ZERO);
return true;
}
item.setLimit(limitValue);
return false;
}
}
...@@ -2,8 +2,6 @@ package fi.codecrew.moya.web.helpers; ...@@ -2,8 +2,6 @@ package fi.codecrew.moya.web.helpers;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -11,6 +9,7 @@ import org.slf4j.Logger; ...@@ -11,6 +9,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.codecrew.moya.model.Discount; import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
public class ProductShopItem { public class ProductShopItem {
...@@ -23,6 +22,7 @@ public class ProductShopItem { ...@@ -23,6 +22,7 @@ public class ProductShopItem {
private Map<Integer, BigDecimal> discountValues; private Map<Integer, BigDecimal> discountValues;
private BigDecimal price; private BigDecimal price;
private BigDecimal limit; private BigDecimal limit;
private EventUser user;
public BigDecimal getCreditPrice() public BigDecimal getCreditPrice()
{ {
...@@ -42,12 +42,13 @@ public class ProductShopItem { ...@@ -42,12 +42,13 @@ public class ProductShopItem {
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
public ProductShopItem(Product prod) { public ProductShopItem(Product prod, EventUser user) {
super(); super();
this.user = user;
this.product = prod; this.product = prod;
id = this.product.getId(); id = this.product.getId();
setCount(BigDecimal.ZERO); setInternalCount(BigDecimal.ZERO);
setInternalPrice(BigDecimal.ZERO);
} }
/** /**
...@@ -56,21 +57,21 @@ public class ProductShopItem { ...@@ -56,21 +57,21 @@ public class ProductShopItem {
* @param findForStaffshop * @param findForStaffshop
* @return * @return
*/ */
public static List<ProductShopItem> productGTList(List<Product> products) { public static List<ProductShopItem> productGTList(List<Product> products, EventUser user) {
List<ProductShopItem> ret = new ArrayList<ProductShopItem>(); List<ProductShopItem> ret = new ArrayList<ProductShopItem>();
for (Product prod : products) { for (Product prod : products) {
if (prod.getPrice().compareTo(BigDecimal.ZERO) >= 0) { if (prod.getPrice().compareTo(BigDecimal.ZERO) >= 0) {
ret.add(new ProductShopItem(prod)); ret.add(new ProductShopItem(prod, user));
} }
} }
return ret; return ret;
} }
public static List<ProductShopItem> productList(List<Product> products) { public static List<ProductShopItem> productList(List<Product> products, EventUser user) {
List<ProductShopItem> ret = new ArrayList<ProductShopItem>(); List<ProductShopItem> ret = new ArrayList<ProductShopItem>();
for (Product prod : products) { for (Product prod : products) {
ret.add(new ProductShopItem(prod)); ret.add(new ProductShopItem(prod, user));
} }
return ret; return ret;
...@@ -80,36 +81,35 @@ public class ProductShopItem { ...@@ -80,36 +81,35 @@ public class ProductShopItem {
return this.product; return this.product;
} }
public void setCount(BigDecimal count) { /**
* DO NOT USE THIS.
if (count == null || count.compareTo(BigDecimal.ZERO) < 0) *
{ * Use ProductShopIteHelper.setProductShopItemCount instead.
count = BigDecimal.ZERO; * @param count
} */
public void setInternalCount(BigDecimal count) {
this.count = count; this.count = count;
price = product.getPrice().abs().multiply(count);
discounts = product.getActiveDiscounts(count, Calendar.getInstance());
discountValues = new HashMap<Integer, BigDecimal>();
for (Discount d : discounts)
{
BigDecimal newprice = price.multiply(d.getPercentage());
discountValues.put(d.getId(), price.subtract(newprice));
price = newprice;
}
} }
public void setInternalPrice(BigDecimal price) {
this.price = price;
}
public List<Discount> getDiscounts() public List<Discount> getDiscounts()
{ {
return discounts; return discounts;
} }
public void setInternalDiscounts(List<Discount> discounts) {
this.discounts = discounts;
}
public BigDecimal getDiscount(Integer discId) public BigDecimal getDiscount(Integer discId)
{ {
return discountValues.get(discId); return discountValues.get(discId);
} }
public BigDecimal getPrice() public BigDecimal getPrice()
{ {
return price; return price;
...@@ -138,19 +138,19 @@ public class ProductShopItem { ...@@ -138,19 +138,19 @@ public class ProductShopItem {
return limit; return limit;
} }
public boolean updateLimit(BigDecimal limitValue) { public EventUser getUser() {
return user;
}
if (limitValue != null && limitValue.compareTo(BigDecimal.ZERO) < 0) public void setUser(EventUser user) {
{ this.user = user;
logger.info("product limit {}, count {}", limitValue, count); }
setCount(getCount().add(limitValue));
if (count.compareTo(BigDecimal.ZERO) < 0) { public Map<Integer, BigDecimal> getInternalDiscountValues() {
setCount(BigDecimal.ZERO); return discountValues;
} }
limit = BigDecimal.ZERO;
return true; public void setInternalDiscountValues(Map<Integer, BigDecimal> discountValues) {
} this.discountValues = discountValues;
limit = limitValue;
return false;
} }
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!