Commit 3d49424b by Liv Haapala

Merge branch 'master' of gitlab.codecrew.fi:codecrew/moya

2 parents 24f62b44 f689b093
Showing with 441 additions and 171 deletions
package fi.codecrew.moya.beans;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
......@@ -27,7 +29,9 @@ import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.BillLine;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.Product;
......@@ -69,6 +73,9 @@ public class BillBean implements BillBeanLocal {
@EJB
private ProductPBean productPBean;
@EJB
private DiscountBean discountBean;
/**
* Default constructor.
*/
......@@ -305,4 +312,37 @@ public class BillBean implements BillBeanLocal {
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;
}
}
......@@ -35,6 +35,9 @@ public class BootstrapBean implements BootstrapBeanLocal {
dbUpdates.add(new String[] { "ALTER TABLE site_page_content ADD COLUMN locale varchar(10)" });
dbUpdates.add(new String[] { "ALTER TABLE products ALTER COLUMN vat TYPE NUMERIC(4,3)" });
dbUpdates.add(new String[] { "ALTER TABLE actionlog_messages DROP COLUMN crew" });
dbUpdates.add(new String[] { "delete from application_permissions where application ilike '%terminal%'" });
}
@EJB
......
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.LocalBean;
import javax.ejb.Stateless;
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.EventUser;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Role;
/**
* Session Bean implementation class DiscountBean
*/
@Stateless
@LocalBean
public class DiscountBean implements DiscountBeanLocal {
@EJB
private DiscountFacade discountfacade;
@EJB
private EventBeanLocal eventbean;
@EJB
private ProductFacade productfacade;
@EJB
private EventFacade eventfacade;
private UserBean userBean;
public DiscountBean() {
}
......@@ -36,6 +39,35 @@ public class DiscountBean implements DiscountBeanLocal {
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
// public Discount create(String discountdesc) {
// LanEvent ev = eventbean.getCurrentEvent();
......
......@@ -188,6 +188,22 @@ public class EventBean implements EventBeanLocal {
return eventPropertyFacade.find(getCurrentEvent(), property);
}
@Override
public long getPropertyLong(LanEventPropertyKey property)
{
LanEventProperty retProp = eventPropertyFacade.find(getCurrentEvent(), property);
long ret = 0;
if (retProp == null) {
ret = Long.parseLong(property.getDefaultvalue());
} else {
ret = retProp.getLongValue();
}
return ret;
}
@Override
public String getPropertyString(LanEventPropertyKey property)
{
......
......@@ -81,9 +81,9 @@ import fi.codecrew.moya.model.User;
SpecialPermission.S_USER,
SpecialPermission.S_ANONYMOUS,
TerminalPermission.S_CASHIER_TERMINAL,
TerminalPermission.S_CUSTOMER_TERMINAL,
TerminalPermission.S_SELFHELP_TERMINAL,
TerminalPermission.S_INFO_TERMINAL,
TerminalPermission.S_USER_TERMINAL,
TerminalPermission.S_ADMIN_TERMINAL,
CompoPermission.S_MANAGE,
CompoPermission.S_VOTE,
......
......@@ -151,7 +151,7 @@ public class PlaceBean implements PlaceBeanLocal {
for (Entry<Product, Integer> entry : mockmap.entrySet()) {
logger.debug("Adding to price {} of {}", entry.getValue(), entry.getKey().getName());
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;
......
......@@ -91,6 +91,7 @@ public class ProductBean implements ProductBeanLocal {
private EventBeanLocal eventbean;
@EJB
private BillLineFacade billLineFacade;
@EJB
private ProductPBean productPBean;
......@@ -100,6 +101,9 @@ public class ProductBean implements ProductBeanLocal {
@EJB
private PlaceBean placebean;
@EJB
private DiscountBean discountBean;
private static final Logger logger = LoggerFactory.getLogger(ProductBean.class);
/**
......@@ -285,12 +289,12 @@ public class ProductBean implements ProductBeanLocal {
}
@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) {
throw new RuntimeException("Some parameter is null!");
}
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());
}
return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity);
......
......@@ -30,6 +30,9 @@ public class ProductPBean {
@EJB
private PermissionBean permbean;
@EJB
private DiscountBean discountBean;
@EJB
private AccountEventFacade accounteventfacade;
private static final Logger logger = LoggerFactory
......@@ -73,7 +76,7 @@ public class ProductPBean {
}
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) {
unitPrice = unitPrice.multiply(d.getPercentage());
}
......
package fi.codecrew.moya.beans;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
......@@ -10,6 +11,8 @@ import javax.ejb.Local;
import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.Product;
@Local
public interface BillBeanLocal {
......@@ -38,4 +41,8 @@ public interface BillBeanLocal {
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;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import javax.ejb.Local;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product;
@Local
public interface DiscountBeanLocal {
Discount save(Discount discount);
public List<Discount> getActiveDiscountsByProduct(Product product, BigDecimal quantity, Calendar time, EventUser user);
}
......@@ -36,4 +36,6 @@ public interface EventBeanLocal {
LanEventPrivateProperty saveOrCreatePrivateProperty(LanEventPrivateProperty privateProperty);
long getPropertyLong(LanEventPropertyKey property);
}
......@@ -47,7 +47,7 @@ public interface ProductBeanLocal {
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);
......
......@@ -195,24 +195,35 @@ public class Bill extends GenericEntity {
return total;
}
public Bill(LanEvent event, EventUser user) {
this(event);
public Bill(LanEvent event, EventUser user, Calendar expires) {
this(event, expires);
this.setUser(user);
this.setAddr1(user.getUser().getFirstnames() + " " + user.getUser().getLastname());
this.setAddr2(user.getUser().getAddress());
this.setAddr3(user.getUser().getZip() + " " + user.getUser().getTown());
}
public Bill(LanEvent event) {
public Bill(LanEvent event, Calendar expires) {
this();
this.expires = expires;
this.event = event;
}
public Bill(LanEvent event, EventUser user, long expireTimeHours) {
this(event, user, Calendar.getInstance());
this.expires.setTimeInMillis((System.currentTimeMillis() + (expireTimeHours*60*60 * 1000 )));
}
public Bill(LanEvent event, long expireTimeHours) {
this(event, Calendar.getInstance());
this.expires.setTimeInMillis((System.currentTimeMillis() + (expireTimeHours*60*60 * 1000 )));
}
public Bill() {
super();
this.expires = Calendar.getInstance();
this.expires.setTimeInMillis((System.currentTimeMillis() + 1814400000l)); // 3vk
this.expires.setTimeInMillis((System.currentTimeMillis() + 1209600000)); // 2vk
}
public Calendar getDueDate() {
......@@ -347,28 +358,6 @@ public class Bill extends GenericEntity {
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) {
this.billNumber = billNumber;
}
......
......@@ -17,6 +17,7 @@ public enum LanEventPropertyKey {
CHECK_BILL_STATS_PERMISSION(Type.BOOL, null),
GATHER_OTHER_BILL_INFO(Type.BOOL, null),
ALLOW_BILLING(Type.BOOL, null),
BILL_EXPIRE_HOURS(Type.LONG, "168"),
TEMPLATE_PROPERTY1(Type.TEXT, null),
TEMPLATE_PROPERTY2(Type.TEXT, null),
TEMPLATE_PROPERTY3(Type.TEXT, null),
......@@ -26,7 +27,7 @@ public enum LanEventPropertyKey {
;
private enum Type {
TEXT, DATE, DATA, BOOL
TEXT, DATE, DATA, BOOL, LONG
};
private final String defaultvalue;
......@@ -48,6 +49,10 @@ public enum LanEventPropertyKey {
return Type.BOOL.equals(type);
}
public boolean isLong() {
return Type.LONG.equals(type);
}
private LanEventPropertyKey(Type t, String def)
{
this.type = t;
......
......@@ -162,21 +162,6 @@ public class Product extends GenericEntity {
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() {
BigDecimal ret = new BigDecimal(0);
......
......@@ -74,5 +74,8 @@
<dependent-module archiveName="commons-logging-1.1.1.jar" deploy-path="/lib" handle="module:/classpath/var/M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="moya-terminal-web-0.2.0.war" deploy-path="/" handle="module:/resource/MoyaTerminalWeb/MoyaTerminalWeb">
<dependency-type>uses</dependency-type>
</dependent-module>
</wb-module>
</project-modules>
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd"
version="7">
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd" version="7">
<display-name>moya-ear</display-name>
<module>
<ejb>moya-beans-0.2.0.jar</ejb>
......@@ -19,5 +16,13 @@
<context-root>/EventMgmt</context-root>
</web>
</module>
<module>
<web>
<web-uri>moya-terminal-web-0.2.0.war</web-uri>
<context-root>/MoyaTerminalWeb</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
\ No newline at end of file
......@@ -97,6 +97,12 @@
<artifactId>commons-digester</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>fi.codecrew.moya</groupId>
<artifactId>moya-terminal-web</artifactId>
<version>0.2.0</version>
<type>war</type>
</dependency>
</dependencies>
<repositories>
......
......@@ -5,6 +5,6 @@
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<property name="java-output-path" value="/MoyaEventMgmtWeb/build/classes"/>
<property name="context-root" value="moya-mgmt-web"/>
<property name="component.inclusion.patterns" value="WEB-INF/lib/javamelody-core*,WEB-INF/lib/primefaces*,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*"/>
<property name="component.inclusion.patterns" value="WEB-INF/lib/prettyfaces-core*,WEB-INF/lib/javamelody-core*,WEB-INF/lib/primefaces*,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*"/>
</wb-module>
</project-modules>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MoyaTerminalWeb</display-name>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.wtf</welcome-file>
<welcome-file>index.jsf</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
......@@ -13,11 +19,12 @@
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.wtf</url-pattern>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
......@@ -26,25 +33,63 @@
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<!--
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-name>PrimefacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-name>PrimefacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
-->
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>certificate</realm-name>
</login-config>
<security-constraint>
<display-name>Forbidden resource</display-name>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/layout/*</url-pattern>
<url-pattern>/resources/tools/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Thou shall not read the sources or use utils directly
</description>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<display-name>Resource that needs cert auth</display-name>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>/info/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>TERMINAL/INFO</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!--
<security-constraint>
<display-name>Resource that needs cert auth</display-name>
<web-resource-collection>
<web-resource-name>BortalTerminalWebResource</web-resource-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.wtf</url-pattern>
<url-pattern>*.jsf</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>TERMINAL</role-name>
......@@ -52,7 +97,9 @@
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</security-constraint> -->
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
......
......@@ -39,5 +39,15 @@
<artifactId>moya-beans-client</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -17,7 +17,7 @@ import fi.codecrew.moya.clientutils.BortalLocalContextHolder;
import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.model.EventUser;
@Named()
@Named(value="terminalSessionHandler")
@RequestScoped
public class SessionHandler {
......
package fi.codecrew.moya.terminal.view;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
......@@ -8,10 +9,11 @@ import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.enums.apps.TerminalPermission;
@Named
@RequestScoped
public class RedirectView {
@EJB
PermissionBeanLocal permissionBean;
private PermissionBeanLocal permissionBean;
public void redirectByPermissions() throws Exception {
FacesContext fcont = FacesContext.getCurrentInstance();
......
package fi.codecrew.moya.terminal.view;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.PermissionBeanLocal;
@Named
@RequestScoped
public class TestView implements Serializable {
private static final long serialVersionUID = -2872232867536069020L;
private static final Logger logger = LoggerFactory.getLogger(TestView.class);
@EJB
private transient PermissionBeanLocal permissionBean;
public String getPrincipal() {
logger.debug("PermissionBean: {}", permissionBean);
return permissionBean.getPrincipal();
}
}
......@@ -11,16 +11,16 @@ import fi.codecrew.moya.enums.BortalApplication;
*/
public enum TerminalPermission implements IAppPermission {
CASHIER, // ("Access cashier terminal functions"),
CUSTOMER, // ("Access client terminal functions"),
SELFHELP, // ("Self help terminal")
INFO,
USER,
ADMIN,
;
// public static final String S_TERMINAL = "TERMINAL";
public static final String S_CASHIER_TERMINAL = "TERMINAL/CASHIER";
public static final String S_CUSTOMER_TERMINAL = "TERMINAL/CUSTOMER";
public static final String S_SELFHELP_TERMINAL = "TERMINAL/SELFHELP";
public static final String S_INFO_TERMINAL = "TERMINAL/INFO";
public static final String S_USER_TERMINAL = "TERMINAL/USER";
public static final String S_ADMIN_TERMINAL = "TERMINAL/ADMIN";
private final String fullName;
private final String key;
......
......@@ -22,6 +22,5 @@
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
......@@ -80,6 +80,7 @@
<h:outputText rendered="#{prop.key.text}" value="#{prop.textvalue}" />
<h:outputText rendered="#{prop.key.boolean and prop.booleanValue}" value="true" />
<h:outputText rendered="#{prop.key.boolean and ( not prop.booleanValue)}" value="false" />
<h:outputText rendered="#{prop.key.long}" value="#{prop.longValue}" />
<h:outputText rendered="#{prop.key.date}" value="#{prop.dateValue}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
......@@ -131,6 +132,12 @@
<h:selectBooleanCheckbox rendered="#{eventPropertyView.property.key.boolean}" id="booleanval" value="#{eventPropertyView.property.booleanValue}" />
<h:message rendered="#{eventPropertyView.property.key.boolean}" for="booleanval" />
<h:outputLabel rendered="#{eventPropertyView.property.key.long}" for="longval" value="#{i18n['lanEventProperty.longValue']}" />
<h:inputText rendered="#{eventPropertyView.property.key.long}" id="longval" value="#{eventPropertyView.property.longValue}" >
<f:convertNumber type="number" />
</h:inputText>
<h:message rendered="#{eventPropertyView.property.key.long}" for="longval" />
</h:panelGrid>
<h:commandButton action="#{eventPropertyView.saveProperty}" value="#{i18n['lanEventProperty.save']}" />
</h:form>
......
......@@ -31,6 +31,12 @@
<h:inputText id="code" value="#{productView.discount.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:inputText id="amountMin" value="#{productView.discount.amountMin}" required="true" />
<h:message for="amountMin" />
......@@ -56,6 +62,8 @@
<h:message for="active" />
</h:panelGrid>
<h:commandButton id="commitbtn" action="#{cc.attrs.commitaction}" value="#{cc.attrs.commitvalue}" />
......
......@@ -40,10 +40,9 @@
<h:commandButton action="#{productShopView.addMinusOne}" value="#{i18n['productshop.minusOne']}">
<f:ajax render="@form" />
</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:ajax render="@form" event="valueChange" listener="#{productShopView.updateAllCartLimits()}" />
</h:inputText>
</h:outputText>
<h:commandButton action="#{productShopView.addOne}" value="#{i18n['productshop.plusOne']}">
<f:ajax render="@form" />
</h:commandButton>
......
......@@ -45,10 +45,9 @@
<h:outputText value="#{i18n['shop.count']}" />
</f:facet>
<p:inplace>
<p:inputText value="#{prods.count}" size="4">
<f:ajax event="valueChange" render="@form" />
<h:outputText value="#{prods.count}" size="4">
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</p:inputText>
</h:outputText>
</p:inplace>
</p:column>
......
......@@ -148,6 +148,9 @@ h1 {
width: 200px;
}
nav {
min-width: 200px;
background: white;
......@@ -193,3 +196,13 @@ aside {
th, td {
padding: 5px;
}
#header_center {
position: relative;
text-align: right;
}
#selectLanguage {
padding-left: 10px;
padding-top: 10px;
}
......@@ -79,13 +79,7 @@
</h:link>
</div>
<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}">
<div>
<h:form>
......@@ -115,6 +109,14 @@
</nav>
<section id="main" class="flex2">
<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">
<f:param name="pagename" value="#{layoutView.pagepath}:top" />
</h:link>
......
......@@ -20,9 +20,11 @@ import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.user.UserView;
import fi.codecrew.moya.web.helper.ProductShopItemHelper;
import fi.codecrew.moya.web.helpers.ProductShopItem;
@Named
......@@ -37,6 +39,9 @@ public class FoodWaveFoodView extends GenericCDIView {
@EJB
private FoodWaveBeanLocal foodWaveBean;
@Inject
private ProductShopItemHelper psiHelper;
@EJB
EventBeanLocal eventBean;
......@@ -66,7 +71,7 @@ public class FoodWaveFoodView extends GenericCDIView {
foodWave = foodWaveBean.findFoodwave(getFoodwaveid());
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();
}
......@@ -99,7 +104,8 @@ public class FoodWaveFoodView extends GenericCDIView {
public String add(Integer count) {
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());
return null;
}
......@@ -128,12 +134,12 @@ public class FoodWaveFoodView extends GenericCDIView {
* @return
*/
public Bill createBillFromShoppingcart() {
Bill bill = new Bill(eventBean.getCurrentEvent(), userview.getSelectedUser());
Bill bill = new Bill(eventBean.getCurrentEvent(), userview.getSelectedUser(), eventBean.getPropertyLong(LanEventPropertyKey.BILL_EXPIRE_HOURS));
bill.setOurReference(eventBean.getCurrentEvent().getName());
for (ProductShopItem shopitem : shoppingcart) {
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());
......@@ -198,4 +204,12 @@ public class FoodWaveFoodView extends GenericCDIView {
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;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView;
import fi.codecrew.moya.web.cdiview.user.UserView;
import fi.codecrew.moya.web.helper.ProductShopItemHelper;
import fi.codecrew.moya.web.helpers.ProductShopItem;
@Named
......@@ -53,6 +54,8 @@ public class ProductShopView extends GenericCDIView {
@EJB
private transient EventBeanLocal eventbean;
public void cashChanged()
{
payInstant = false;
......@@ -78,6 +81,18 @@ public class ProductShopView extends GenericCDIView {
@Inject
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 blip = false;
private ListDataModel<ProductShopItem> boughtItems;
......@@ -94,7 +109,7 @@ public class ProductShopView extends GenericCDIView {
public void initBillView() {
if (requirePermissions(ShopPermission.LIST_USERPRODUCTS)
&& shoppingcart == null) {
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts()));
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts(), user));
updateCartLimits(null);
logger.debug("Initialized billing shoppingcart to {}", shoppingcart);
this.beginConversation();
......@@ -137,7 +152,7 @@ public class ProductShopView extends GenericCDIView {
public void initShopView() {
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);
LanEventProperty cashdefault = eventbean.getProperty(LanEventPropertyKey.SHOP_DEFAULT_CASH);
......@@ -151,7 +166,8 @@ public class ProductShopView extends GenericCDIView {
public String add(Integer count) {
ProductShopItem item = shoppingcart.getRowData();
item.setCount(item.getCount().add(BigDecimal.valueOf(count)));
psiHelper.setProductShopItemCount(item, item.getCount().add(BigDecimal.valueOf(count)));
updateCartLimits(item);
return null;
......@@ -196,7 +212,7 @@ public class ProductShopView extends GenericCDIView {
// Update the updated cart first
if (item != null) {
BigDecimal l = limits.get(item.getProduct().getId());
if (item.updateLimit(l)) {
if (psiHelper.updateProductShopItemLimit(item, l)) {
updateCartLimits(null);
return;
}
......@@ -207,14 +223,16 @@ public class ProductShopView extends GenericCDIView {
if (l != null) {
hasLimits = true;
}
n.updateLimit(l);
psiHelper.updateProductShopItemLimit(n,l);
}
}
public String removeBought() {
ProductShopItem row = boughtItems.getRowData();
row.setCount(row.getCount().subtract(BigDecimal.ONE));
psiHelper.setProductShopItemCount(row, row.getCount().subtract(BigDecimal.ONE));
updateCartLimits(row);
return null;
......@@ -278,13 +296,13 @@ public class ProductShopView extends GenericCDIView {
return null;
}
Bill bill = new Bill(eventbean.getCurrentEvent(), user);
Bill bill = new Bill(eventbean.getCurrentEvent(), user, eventbean.getPropertyLong(LanEventPropertyKey.BILL_EXPIRE_HOURS));
bill.setNotes(otherInfo);
bill.setOurReference(eventbean.getCurrentEvent().getName());
for (ProductShopItem shopitem : shoppingcart) {
if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) {
bill.addProduct(shopitem.getProduct(), shopitem.getCount());
billbean.addProductToBill(bill, shopitem.getProduct(), shopitem.getCount());
}
}
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;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -11,6 +9,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product;
public class ProductShopItem {
......@@ -23,6 +22,7 @@ public class ProductShopItem {
private Map<Integer, BigDecimal> discountValues;
private BigDecimal price;
private BigDecimal limit;
private EventUser user;
public BigDecimal getCreditPrice()
{
......@@ -42,12 +42,13 @@ public class ProductShopItem {
return BigDecimal.ZERO;
}
public ProductShopItem(Product prod) {
public ProductShopItem(Product prod, EventUser user) {
super();
this.user = user;
this.product = prod;
id = this.product.getId();
setCount(BigDecimal.ZERO);
setInternalCount(BigDecimal.ZERO);
setInternalPrice(BigDecimal.ZERO);
}
/**
......@@ -56,21 +57,21 @@ public class ProductShopItem {
* @param findForStaffshop
* @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>();
for (Product prod : products) {
if (prod.getPrice().compareTo(BigDecimal.ZERO) >= 0) {
ret.add(new ProductShopItem(prod));
ret.add(new ProductShopItem(prod, user));
}
}
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>();
for (Product prod : products) {
ret.add(new ProductShopItem(prod));
ret.add(new ProductShopItem(prod, user));
}
return ret;
......@@ -80,24 +81,18 @@ public class ProductShopItem {
return this.product;
}
public void setCount(BigDecimal count) {
if (count == null || count.compareTo(BigDecimal.ZERO) < 0)
{
count = BigDecimal.ZERO;
}
/**
* DO NOT USE THIS.
*
* Use ProductShopIteHelper.setProductShopItemCount instead.
* @param count
*/
public void setInternalCount(BigDecimal 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()
......@@ -105,11 +100,16 @@ public class ProductShopItem {
return discounts;
}
public void setInternalDiscounts(List<Discount> discounts) {
this.discounts = discounts;
}
public BigDecimal getDiscount(Integer discId)
{
return discountValues.get(discId);
}
public BigDecimal getPrice()
{
return price;
......@@ -138,19 +138,19 @@ public class ProductShopItem {
return limit;
}
public boolean updateLimit(BigDecimal limitValue) {
public EventUser getUser() {
return user;
}
if (limitValue != null && limitValue.compareTo(BigDecimal.ZERO) < 0)
{
logger.info("product limit {}, count {}", limitValue, count);
setCount(getCount().add(limitValue));
if (count.compareTo(BigDecimal.ZERO) < 0) {
setCount(BigDecimal.ZERO);
public void setUser(EventUser user) {
this.user = user;
}
limit = BigDecimal.ZERO;
return true;
public Map<Integer, BigDecimal> getInternalDiscountValues() {
return discountValues;
}
limit = limitValue;
return false;
public void setInternalDiscountValues(Map<Integer, BigDecimal> discountValues) {
this.discountValues = discountValues;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!