Commit 3dee93f4 by Tuukka Kivilahti

ruokatilauskorjauksia pukkaa

1 parent 117cd4c8
......@@ -24,5 +24,6 @@ public enum SecurityLogType {
genericMessage,
accountEvent,
verkkomaksu,
bill,
}
......@@ -40,6 +40,7 @@ import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beanutil.PdfPrinter;
import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.enums.apps.BillPermission;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission;
import fi.codecrew.moya.facade.BillFacade;
import fi.codecrew.moya.facade.BillLineFacade;
......@@ -93,6 +94,9 @@ public class BillBean implements BillBeanLocal {
@EJB
private DiscountBean discountBean;
@EJB
private LoggingBeanLocal logbean;
/**
* Default constructor.
......@@ -228,16 +232,21 @@ public class BillBean implements BillBeanLocal {
SpecialPermission.S_VERKKOMAKSU_CHECK })
public Bill markPaid(Bill bill, Calendar when) {
bill = billFacade.reload(bill);
if (bill.getAccountEvent() != null || bill.getPaidDate() != null) {
logbean.logMessage(SecurityLogType.bill, permbean.getCurrentUser(), "Trying to doublemark bill paid");
throw new EJBException("Bill already marked paid!");
}
if (bill.isFoowavePaymentOver())
if (bill.isFoowavePaymentOver() && !permbean.hasPermission(ShopPermission.MANAGE_FOODWAVES))
{
logbean.logMessage(SecurityLogType.bill, permbean.getCurrentUser(), "FoodwaveClosed and marking bill for it paid");
throw new EJBException("Trying to mark paid a closed or left foodwave");
}
bill = billFacade.reload(bill);
Product creditproduct = productBean.findCreditProduct();
EventUser user = bill.getUser();
......@@ -271,6 +280,8 @@ public class BillBean implements BillBeanLocal {
}
}
/*
MailMessage msg = new MailMessage();
String subject = MessageFormat.format(eventbean.getPropertyString(LanEventPropertyKey.BILL_PAID_MAIL_SUBJECT), user.getEvent().getName());
......@@ -280,9 +291,12 @@ public class BillBean implements BillBeanLocal {
msg.setMessage(content);
msg.setTo(bill.getUser().getUser());
utilbean.sendMail(msg);
*/
eventUserFacade.flush();
logbean.logMessage(SecurityLogType.bill, permbean.getCurrentUser(), "Marking bill paid, for user: ", bill.getUser().getId(),"BillId: ",bill.getId());
eventUserFacade.evict(bill.getUser());
return bill;
}
......
......@@ -238,8 +238,13 @@ public class BootstrapBean implements BootstrapBeanLocal {
// tai saadaan poikkeuksia nyrkillä kurkusta .
dbUpdates.add(new String[] {
"DELETE FROM product_productflags where productflags = 'PREPAID_INSTANT_CREATE'"
});
dbUpdates.add(new String[] {
"ALTER TABLE food_wave_templates ADD COLUMN wait_payments_minutes integer DEFAULT null;",
});
} // start_time timestamp without time zone,
......
......@@ -36,6 +36,7 @@ import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
/**
*
......@@ -44,220 +45,246 @@ import javax.persistence.TemporalType;
@Table(name = "food_waves")
public class FoodWave extends GenericEntity {
private static final long serialVersionUID = 9221716203467295049L;
private static final long serialVersionUID = 9221716203467295049L;
@Column(name = "wave_name", nullable = false)
private String name;
@Lob
@Column(name = "wave_description")
private String description;
@Column(name = "wave_time")
@Temporal(TemporalType.TIMESTAMP)
private Date time;
@Column(name = "max_foods")
private Integer maximumFoods;
@Column(name = "wave_closed", nullable = false, columnDefinition = "boolean default false")
private boolean closed = false;
@OneToMany(mappedBy = "foodWave")
private List<AccountEvent> accountEvents;
@OneToMany(mappedBy = "foodwave")
private List<BillLine> billLines;
@ManyToOne
@JoinColumn(name = "template_id", referencedColumnName = "id", nullable = false)
private FoodWaveTemplate template;
public FoodWave() {
super();
}
public FoodWave(String waveName, boolean waveClosed) {
super();
this.name = waveName;
this.closed = waveClosed;
}
public String getName() {
return name;
}
public void setName(String waveName) {
this.name = waveName;
}
public String getDescription() {
return description;
}
public void setDescription(String waveDescription) {
this.description = waveDescription;
}
public Date getTime() {
return time;
}
public void setTime(Date waveTime) {
this.time = waveTime;
}
public boolean getClosed() {
return closed;
}
public boolean isClosed() {
return closed;
}
public void setClosed(boolean waveClosed) {
this.closed = waveClosed;
}
public void toggleClosed() {
this.closed = !isClosed();
}
public List<AccountEvent> getAccountEvents() {
return accountEvents;
}
public void setAccountEvents(List<AccountEvent> accountEventList) {
this.accountEvents = accountEventList;
}
public void setTemplate(FoodWaveTemplate template) {
this.template = template;
}
public FoodWaveTemplate getTemplate() {
return template;
}
public boolean isFull() {
if(getMaximumFoods() <= 0) {
return false;
}
if(getReservedCount() >= getMaximumFoods()) {
return true;
}
return false;
}
/**
* Check if foodwave is orderable
*
* That means that it's not closed, full and it's in future
*
* @return
*/
public boolean isOrderable() {
if (isClosed()) {
return false;
}
if (getTime().before(new Date())) {
return false;
}
if (isFull()) {
return false;
}
return true;
}
public List<Product> getOrderedProducts() {
List<Product> retlist = new ArrayList<Product>();
if (getAccountEvents() != null) {
for (AccountEvent ae : getAccountEvents()) {
if (!retlist.contains(ae.getProduct())) {
retlist.add(ae.getProduct());
}
}
}
return retlist;
}
public List<BillLine> getBillLines() {
return billLines;
}
public Integer getMaximumFoods() {
if(maximumFoods == null) {
return 0;
}
return maximumFoods;
}
public void setBillLines(List<BillLine> billLines) {
this.billLines = billLines;
}
public Integer getReservedCount() {
Integer retval = 0;
retval += getOrderedCount();
retval += getUnpaidCount();
return retval;
}
public void setMaximumFoods(Integer maximumFoods) {
this.maximumFoods = maximumFoods;
}
public Integer getUnpaidCount() {
Integer ret = 0;
for (BillLine line : getBillLines()) {
if (!line.getBill().isPaid()) {
ret += line.getQuantity().intValue();
}
}
return ret;
}
public Integer getOrderedCount() {
Integer ret = 0;
if (getAccountEvents() != null) {
for(AccountEvent ae : getAccountEvents()) {
ret += ae.getQuantity().intValue();
}
}
return ret;
}
public boolean isDelivered() {
if (getAccountEvents() != null && getReservedCount() != 0) {
for(AccountEvent ae : getAccountEvents()) {
if (ae.isEventDelivered()) {
return true;
}
}
return false;
}
return true;
}
}
@Column(name = "wave_name", nullable = false)
private String name;
@Lob
@Column(name = "wave_description")
private String description;
@Column(name = "wave_time")
@Temporal(TemporalType.TIMESTAMP)
private Date time;
@Column(name = "max_foods")
private Integer maximumFoods;
@Column(name = "wave_closed", nullable = false, columnDefinition = "boolean default false")
private boolean closed = false;
@OneToMany(mappedBy = "foodWave")
private List<AccountEvent> accountEvents;
@OneToMany(mappedBy = "foodwave")
private List<BillLine> billLines;
@ManyToOne
@JoinColumn(name = "template_id", referencedColumnName = "id", nullable = false)
private FoodWaveTemplate template;
public FoodWave() {
super();
}
public FoodWave(String waveName, boolean waveClosed) {
super();
this.name = waveName;
this.closed = waveClosed;
}
public String getName() {
return name;
}
public void setName(String waveName) {
this.name = waveName;
}
public String getDescription() {
return description;
}
public void setDescription(String waveDescription) {
this.description = waveDescription;
}
public Date getTime() {
return time;
}
public void setTime(Date waveTime) {
this.time = waveTime;
}
public boolean getClosed() {
return closed;
}
public boolean isClosed() {
return closed;
}
public void setClosed(boolean waveClosed) {
this.closed = waveClosed;
}
public void toggleClosed() {
this.closed = !isClosed();
}
public List<AccountEvent> getAccountEvents() {
return accountEvents;
}
public void setAccountEvents(List<AccountEvent> accountEventList) {
this.accountEvents = accountEventList;
}
public void setTemplate(FoodWaveTemplate template) {
this.template = template;
}
public FoodWaveTemplate getTemplate() {
return template;
}
public boolean isFull() {
if (getMaximumFoods() <= 0) {
return false;
}
if (getReservedCount() >= getMaximumFoods()) {
return true;
}
return false;
}
/**
* Check if foodwave is orderable
*
* That means that it's not closed, full and it's in future
*
* @return
*/
public boolean isOrderable() {
if (isClosed()) {
return false;
}
if (getTime().before(new Date())) {
return false;
}
if (isFull()) {
return false;
}
return true;
}
public List<Product> getOrderedProducts() {
List<Product> retlist = new ArrayList<Product>();
if (getAccountEvents() != null) {
for (AccountEvent ae : getAccountEvents()) {
if (!retlist.contains(ae.getProduct())) {
retlist.add(ae.getProduct());
}
}
}
return retlist;
}
public List<BillLine> getBillLines() {
return billLines;
}
public Integer getMaximumFoods() {
if (maximumFoods == null) {
return 0;
}
return maximumFoods;
}
public void setBillLines(List<BillLine> billLines) {
this.billLines = billLines;
}
public Integer getReservedCount() {
Integer retval = 0;
retval += getOrderedCount();
retval += getUnpaidCount();
return retval;
}
public void setMaximumFoods(Integer maximumFoods) {
this.maximumFoods = maximumFoods;
}
public Integer getUnpaidCount() {
Integer ret = 0;
for (BillLine line : getBillLines()) {
if (!line.getBill().isPaid()) {
ret += line.getQuantity().intValue();
}
}
return ret;
}
public Integer getOrderedCount() {
Integer ret = 0;
if (getAccountEvents() != null) {
for (AccountEvent ae : getAccountEvents()) {
ret += ae.getQuantity().intValue();
}
}
return ret;
}
public Integer getDeliveredCount() {
Integer delCount = new Integer(0);
if (getAccountEvents() != null && getReservedCount() != 0) {
for (AccountEvent ae : getAccountEvents()) {
if (ae.isEventDelivered()) {
delCount++;
}
}
}
return delCount;
}
public boolean isDelivered() {
if (getAccountEvents() != null && getReservedCount() != 0) {
for (AccountEvent ae : getAccountEvents()) {
if (!ae.isEventDelivered()) {
return false;
}
}
}
return true;
}
@Transient
public Date getLastPaymentTime() {
return new Date(getTime().getTime() + (getTemplate().getWaitPaymentsMinutes().longValue() * 60l * 1000l));
}
public boolean isPaymentOver() {
// add this magical "wait payments this amount of minutes" to foodwave
Date endDate = new Date(getTime().getTime() + (getTemplate().getWaitPaymentsMinutes().longValue() * 60l * 1000l));
if (isClosed() || endDate.before(new Date())) {
return true;
}
return false;
}
}
......@@ -66,6 +66,9 @@ public class FoodWaveTemplate extends GenericEntity {
@Column(name = "max_foods")
private Integer maximumFoods;
@Column(name = "wait_payments_minutes")
private Integer waitPaymentsMinutes = 0;
public FoodWaveTemplate() {
}
......@@ -135,4 +138,16 @@ public class FoodWaveTemplate extends GenericEntity {
return returnList;
}
public Integer getWaitPaymentsMinutes() {
if(waitPaymentsMinutes == null)
waitPaymentsMinutes = 0;
return waitPaymentsMinutes;
}
public void setWaitPaymentsMinutes(Integer waitPaymentsMinutes) {
this.waitPaymentsMinutes = waitPaymentsMinutes;
}
}
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:products="http://java.sun.com/jsf/composite/cditools/products"
xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:products="http://java.sun.com/jsf/composite/cditools/products" xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition
template="#{sessionHandler.template}">
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:viewParam name="id" value="#{foodWaveView.templateId}" />
<f:event type="preRenderView"
listener="#{foodWaveView.initEditTemplate()}" />
<f:event type="preRenderView" listener="#{foodWaveView.initEditTemplate()}" />
</f:metadata>
<ui:define name="title">
......@@ -27,58 +18,46 @@
<p:panel header="#{i18n['foodwavetemplate.edit']}">
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="name"
value="#{i18n['foodwave.template.name']}" />
<h:outputLabel for="name" value="#{i18n['foodwave.template.name']}" />
<h:inputText id="name" value="#{foodWaveView.template.name}" />
<h:message for="name" />
<h:outputLabel for="desc"
value="#{i18n['foodwave.template.description']}" />
<h:inputText id="desc"
value="#{foodWaveView.template.description}" />
<h:outputLabel for="desc" value="#{i18n['foodwave.template.description']}" />
<h:inputText id="desc" value="#{foodWaveView.template.description}" />
<h:message for="desc" />
<h:outputLabel for="overtime" value="#{i18n['foodwave.template.waitPaymentsMinutes']}" />
<p:spinner id="overtime" value="#{foodWaveView.template.waitPaymentsMinutes}" suffix="#{i18n['suffix.minutes']}" min="0" />
<h:message for="overtime" />
<h:outputText value=" " />
<h:commandButton action="#{foodWaveView.saveTemplate()}"
value="#{i18n['foodwavetemplate.save']}" />
<h:commandButton action="#{foodWaveView.saveTemplate()}" value="#{i18n['foodwavetemplate.save']}" />
</h:panelGrid>
</h:form>
<h:form>
<h:selectOneMenu value="#{foodWaveView.currentProduct}"
converter="#{productConverter}">
<f:selectItems value="#{foodWaveView.products}" var="product"
itemLabel="#{product.name}"></f:selectItems>
<h:selectOneMenu value="#{foodWaveView.currentProduct}" converter="#{productConverter}">
<f:selectItems value="#{foodWaveView.products}" var="product" itemLabel="#{product.name}"></f:selectItems>
</h:selectOneMenu>
<p:commandButton value="#{i18n['foodwavetemplate.addproduct']}"
actionListener="#{foodWaveView.addProductToTemplate}"
ajax="false" />
<p:commandButton value="#{i18n['foodwavetemplate.addproduct']}" actionListener="#{foodWaveView.addProductToTemplate}" ajax="false" />
</h:form>
<h:form>
<h:panelGrid columns="4">
<h:outputText value="#{i18n['foodwavetemplate.productname']}" />
<h:outputText
value="#{i18n['foodwavetemplate.productdescription']}" />
<h:outputText value="#{i18n['foodwavetemplate.productdescription']}" />
<h:outputText value="#{i18n['foodwavetemplate.price']}" />
<h:outputText value="&nbsp;" />
<h:inputText id="productname"
value="#{foodWaveView.currentProduct.name}" />
<h:inputText id="productdescription"
value="#{foodWaveView.currentProduct.description}" />
<h:inputText id="price"
value="#{foodWaveView.currentProduct.price}" />
<h:inputText id="productname" value="#{foodWaveView.currentProduct.name}" />
<h:inputText id="productdescription" value="#{foodWaveView.currentProduct.description}" />
<h:inputText id="price" value="#{foodWaveView.currentProduct.price}" />
<p:commandButton value="#{i18n['foodwavetemplate.addproduct']}"
actionListener="#{foodWaveView.addProductToTemplate}"
ajax="false" />
<p:commandButton value="#{i18n['foodwavetemplate.addproduct']}" actionListener="#{foodWaveView.addProductToTemplate}" ajax="false" />
</h:panelGrid>
</h:form>
<h:form>
<p:dataTable name="productTable" id="productTable"
value="#{foodWaveView.template.products}" var="product"
editable="true">
<p:dataTable name="productTable" id="productTable" value="#{foodWaveView.template.products}" var="product" editable="true">
<p:ajax event="rowEdit" listener="#{foodWaveView.onEdit}" />
......@@ -89,20 +68,17 @@
<h:outputText value="#{product.name}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{product.name}" style="width:100%"
required="true" requiredMessage="Name required" />
<p:inputText value="#{product.name}" style="width:100%" required="true" requiredMessage="Name required" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column
headerText="#{i18n['foodwavetemplate.productdescription']}">
<p:column headerText="#{i18n['foodwavetemplate.productdescription']}">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{product.description}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{product.description}" style="width:100%"
required="true" requiredMessage="Description required" />
<p:inputText value="#{product.description}" style="width:100%" required="true" requiredMessage="Description required" />
</f:facet>
</p:cellEditor>
</p:column>
......@@ -112,52 +88,38 @@
<h:outputText value="#{product.price}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{product.price}" style="width:100%"
required="true" requiredMessage="Price required" />
<p:inputText value="#{product.price}" style="width:100%" required="true" requiredMessage="Price required" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="#{i18n['foodwavetemplate.editRow']}"
style="width:20px">
<p:column style="width:20px">
<p:rowEditor />
</p:column>
<p:column headerText="#{i18n['foodwavetemplate.actions']}"
style="width:20px;">
<p:commandButton
value="#{i18n['foodwavetemplate.removeFromList']}"
action="#{foodWaveView.removeProductFromList(product)}"
update="productTable" />
<p:column style="width:70px">
<p:commandButton value="#{i18n['foodwavetemplate.removeFromList']}" action="#{foodWaveView.removeProductFromList(product)}" update="productTable" />
</p:column>
</p:dataTable>
<h:commandButton action="#{foodWaveView.saveTemplate()}"
value="#{i18n['foodwavetemplate.savetemplate']}" />
<h:commandButton action="#{foodWaveView.saveTemplate()}" value="#{i18n['foodwavetemplate.savetemplate']}" />
<!-- -->
</h:form>
</h:form>
</p:panel>
<h:form>
<p:panel header="#{i18n['foodwavetemplate.createwave']}">
<h:panelGrid columns="3">
<h:outputLabel for="waveName"
value="#{i18n['foodwavetemplate.waveName']}" />
<h:inputText id="waveName"
value="#{foodWaveView.selectedFoodWave.name}" />
<h:outputLabel for="waveName" value="#{i18n['foodwavetemplate.waveName']}" />
<h:inputText id="waveName" value="#{foodWaveView.selectedFoodWave.name}" />
<h:message for="waveName" />
<h:outputLabel for="waveMaxFoods"
value="#{i18n['foodwavetemplate.maxfoods']}" />
<h:inputText id="waveMaxFoods"
value="#{foodWaveView.selectedFoodWave.maximumFoods}" />
<h:outputLabel for="waveMaxFoods" value="#{i18n['foodwavetemplate.maxfoods']}" />
<h:inputText id="waveMaxFoods" value="#{foodWaveView.selectedFoodWave.maximumFoods}" />
<h:message for="waveMaxFoods" />
<h:outputLabel for="startTime"
value="#{i18n['foodwavetemplate.startTime']}" />
<p:calendar id="startTime" value="#{foodWaveView.startDate}"
pattern="dd.MM.yyyy HH:mm" />
<h:outputLabel for="startTime" value="#{i18n['foodwavetemplate.startTime']}" />
<p:calendar id="startTime" value="#{foodWaveView.startDate}" pattern="dd.MM.yyyy HH:mm" />
<h:message for="startTime" />
</h:panelGrid>
<h:commandButton action="#{foodWaveView.createFoodwave()}"
value="#{i18n['foodwavetemplate.createFoodwave']}" />
<h:commandButton action="#{foodWaveView.createFoodwave()}" value="#{i18n['foodwavetemplate.createFoodwave']}" />
</p:panel>
</h:form>
</ui:define>
......
......@@ -64,6 +64,13 @@
</f:facet>
<h:outputText value="#{foodwave.unpaidCount}" />
</p:column>
<p:column styleClass="text-center">
<f:facet name="header">
<h:outputText value="${i18n['foodWave.deliveredCount']}" />
</f:facet>
<h:outputText value="#{foodwave.deliveredCount}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['foodWave.totalReserved']}" />
......
......@@ -12,8 +12,8 @@
<h1>#{foodWaveView.selectedFoodWave.name}</h1>
</ui:define>
<ui:define name="content">
<h:form>
<p:dataTable styleClass="bordertable" value="#{foodWaveView.accountEventLines}" var="acc_line" sortBy="#{acc_line.user.nick}">
<h:form id="accountEventList">
<p:dataTable styleClass="bordertable" value="#{foodWaveView.accountEventLines}" var="acc_line" sortBy="#{acc_line.user.nick}" rowStyleClass="#{acc_line.eventDelivered?'success':null}">
<f:facet name="header">
<h:outputLabel value="#{i18n['foodWave.accountevents']}" />
</f:facet>
......@@ -43,9 +43,7 @@
<f:facet name="header">
<h:outputLabel value="#{i18n['acc_line.eventuser']}" />
</f:facet>
<h:link outcome="/useradmin/edit" value="#{acc_line.user.wholeName}">
<f:param name="userid" value="#{acc_line.user.id}" />
</h:link>
<h:outputText outcome="/useradmin/edit" value="#{acc_line.user.wholeName}" />
</p:column>
<p:column sortBy="#{acc_line.user.nick}">
<f:facet name="header">
......@@ -60,7 +58,7 @@
<h:outputLabel value="#{i18n['accountEvent.delivered']}" />
</f:facet>
<h:outputText rendered="#{acc_line.eventDelivered}" value="#{i18n['accountEvent.delivered']}" />
<h:commandButton rendered="#{not acc_line.eventDelivered}" value="#{i18n['accountEvent.deliver']}" action="#{foodWaveView.deliverAccountEvent}" />
<p:commandButton rendered="#{not acc_line.eventDelivered}" value="#{i18n['accountEvent.deliver']}" actionListener="#{foodWaveView.deliverAccountEvent}" update=":billList :accountEventList" />
</p:column>
</p:dataTable>
......@@ -68,69 +66,60 @@
<br></br>
<br></br>
<h:form>
<p:dataTable styleClass="bordertable" value="#{foodWaveView.billLines}" var="bill_line" sortBy="#{bill_line.bill.user.nick}">
<h:form id="billList">
<p:dataTable styleClass="bordertable" value="#{foodWaveView.bills}" var="bill" sortBy="#{bill.user.nick}">
<f:facet name="header">
<h:outputLabel value="#{i18n['foodWave.billLines']}" />
</f:facet>
<p:column sortBy="#{bill_line.bill.sentDate.getTime()}">
<p:column sortBy="#{bill.sentDate.getTime()}">
<f:facet name="header">
<h:outputLabel value="#{i18n['billLine.time']}" />
</f:facet>
<h:outputText value="#{bill_line.bill.sentDate.getTime()}">
<h:outputText value="#{bill.sentDate.getTime()}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" />
</h:outputText>
</p:column>
<p:column sortBy="#{bill_line.quantity}">
<p:column sortBy="#{bill.totalQuantity}">
<f:facet name="header">
<h:outputLabel value="#{i18n['billLine.quantity']}" />
</f:facet>
<h:outputText style="text-align: center;" value="#{bill_line.quantity}">
<h:outputText style="text-align: center;" value="#{bill.totalQuantity}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</p:column>
<p:column sortBy="#{bill_line.name}">
<p:column sortBy="#{billLine.eventuser}">
<f:facet name="header">
<h:outputLabel value="#{i18n['billLine.product']}" />
<h:outputLabel value="#{i18n['bill.products']}" />
</f:facet>
<h:outputText value="#{bill_line.name}" />
<h:outputText value="#{bill.productSummary}" />
</p:column>
<p:column sortBy="#{bill_line.bill.user.wholeName}">
<p:column sortBy="#{bill.user.wholeName}">
<f:facet name="header">
<h:outputLabel value="#{i18n['billLine.eventuser']}" />
</f:facet>
<h:link outcome="/useradmin/edit" value="#{bill_line.bill.user.wholeName}">
<f:param name="userid" value="#{bill_line.bill.user.user.id}" />
<h:link outcome="/useradmin/edit" value="#{bill.user.wholeName}">
<f:param name="userid" value="#{bill.user.user.id}" />
</h:link>
</p:column>
<p:column sortBy="#{bill_line.bill.user.nick}">
<p:column sortBy="#{bill.user.user.id}">
<f:facet name="header">
<h:outputLabel value="#{i18n['billLine.nick']}" />
</f:facet>
<h:link outcome="/useradmin/edit" value="#{bill_line.bill.user.nick}">
<f:param name="userid" value="#{bill_line.bill.user.user.id}" />
<h:link outcome="/useradmin/edit" value="#{bill.user.nick}">
<f:param name="userid" value="#{bill.user.user.id}" />
</h:link>
</p:column>
<p:column sortBy="#{bill_line.linePrice}">
<f:facet name="header">
<h:outputLabel value="#{i18n['billLine.price']}" />
</f:facet>
<h:outputText style="text-align: center;" value="#{bill_line.linePrice}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</p:column>
<p:column sortBy="#{bill_line.bill.totalPrice}">
<p:column sortBy="#{bill.totalPrice}">
<f:facet name="header">
<h:outputLabel value="#{i18n['bill.totalprice']}" />
</f:facet>
<h:outputText style="text-align: center;" value="#{bill_line.bill.totalPrice}">
<h:outputText style="text-align: center;" value="#{bill.totalPrice}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" />
</h:outputText>
</p:column>
<p:column>
<h:commandButton value="#{i18n['bill.markPaid']}" action="#{foodWaveView.markBillPaid}" />
<p:commandButton value="#{i18n['bill.markPaid']}" actionListener="#{foodWaveView.markBillPaid}" update=":billList :accountEventList" />
</p:column>
<!--
<p:column>
......@@ -155,6 +144,21 @@
</h:outputText>
</div>
<div>
<h:outputLabel value="#{i18n['foodwave.ordersBefore']}: " />
<h:outputText value="#{foodWaveView.selectedFoodWave.time}" >
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" />
</h:outputText>
</div>
<div>
<h:outputLabel value="#{i18n['foodwave.foodwaveLastBillPayTime']}: " />
<h:outputText value="#{foodWaveView.selectedFoodWave.lastPaymentTime}" >
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" />
</h:outputText>
</div>
<p:dataTable var="summ" value="#{foodWaveView.productSummaries}">
<p:column>
<f:facet name="header">
......
......@@ -33,6 +33,7 @@ bill.expires = Expires
bill.isExpired = Bill is expired
bill.markPaid.show = Show Mark paid -buttons
bill.notes.title = Lis\u00E4tietoja
bill.products = Tuotteet
bill.save = Save
bill.showPayButtons = Show pay buttons
......@@ -159,8 +160,13 @@ eventorg.create = Create
eventorg.title = Tapahtuman tiedot
foodWave.closeNow = Close now
foodWave.deliveredCount = Luovutetut
foodWave.openNow = Open now
foodwave.foodwaveLastBillPayTime = Maksut viimeist\u00E4\u00E4n
foodwave.ordersBefore = Tilaukset ennen
foodwave.template.waitPaymentsMinutes = Verkkomaksujen odotusaika
game.active = Aktiivinen
game.codecount = Avattuja
game.codes.available = Lisenssikoodit
......@@ -361,6 +367,8 @@ subnavi.info = Info
success = Onnistui
suffix.minutes = min
topnavi.adminlectures = Kurssit ja luennot
topnavi.license = Lisenssikoodit
topnavi.userlectures = Kurssit ja luennot
......
......@@ -88,6 +88,7 @@ bill.payer = Payer
bill.paymentTime = Payment time
bill.paymentTime.now = Now
bill.printBill = Print bill
bill.products = Products
bill.receiverAddress = Receiver address
bill.referenceNumberBase = Reference number base
bill.referencenumber = Reference nr.
......@@ -405,8 +406,9 @@ food = Food
foodWave.accountevents = Accountevents
foodWave.activeFoodWaves = Active Foodwaves
foodWave.billLines = Pending Online Payments
foodWave.billLines = Pending Payments
foodWave.closeNow = Close now
foodWave.deliveredCount = Delivered
foodWave.deliveredFoodWaves = Delivered Foodwaves
foodWave.description = Foodwave description
foodWave.list = Active Foodwaves
......@@ -431,8 +433,10 @@ foodshop.total = Total
foodwave.buyInPrice = Buy In Price
foodwave.foodwaveBuyInPrice = Total buy in price
foodwave.foodwaveLastBillPayTime = Last payments time
foodwave.markPaid = Foodwave marked paid
foodwave.orders = Foodwave Orders
foodwave.ordersBefore = Orders before
foodwave.price = Foodwave price
foodwave.summaryView = Foodwave Summary
foodwave.template.basicinfo = Template Information
......@@ -441,6 +445,7 @@ foodwave.template.edit.title = Foodwave Template Editor
foodwave.template.list.title = Foodwave Templates
foodwave.template.name = Name
foodwave.template.selectproducts = Products
foodwave.template.waitPaymentsMinutes = Webpayments waittime
foodwave.totalCount = Amount
foodwave.totalPrice = Customer Price
......@@ -1244,6 +1249,8 @@ subnavi.roles = Roles
success = Success
suffix.minutes = min
supernavi.admin = Adminview
supernavi.user = Userview
......
......@@ -88,6 +88,7 @@ bill.payer = Maksaja
bill.paymentTime = Maksuehdot
bill.paymentTime.now = Heti
bill.printBill = Tulosta lasku
bill.products = Tuotteet
bill.receiverAddress = Kauppiaan osoite
bill.referenceNumberBase = Viitenumeropohja
bill.referencenumber = Viitenumero
......@@ -406,8 +407,9 @@ food = Ruoka
foodWave.accountevents = Maksetut tilaukset
foodWave.activeFoodWaves = Aktiiviset Ruokatilaukset
foodWave.billLines = Maksamattomat Verkkomaksut
foodWave.billLines = Maksamattomat maksut
foodWave.closeNow = Sulje nyt
foodWave.deliveredCount = Toimitetut
foodWave.deliveredFoodWaves = Toimitetut Ruokatilaukset
foodWave.description = Ruokatilauksen kuvaus
foodWave.list = Ruokatilaukset
......@@ -432,8 +434,10 @@ foodshop.total = Yhteens\u00E4
foodwave.buyInPrice = Sis\u00E4\u00E4nostohinta
foodwave.foodwaveBuyInPrice = Sis\u00E4\u00E4nostohinta
foodwave.foodwaveLastBillPayTime = Maksut viimeist\u00E4\u00E4n
foodwave.markPaid = Merkitty maksetuksi
foodwave.orders = Maksetut Tilaukset
foodwave.ordersBefore = Tilaukset ennen
foodwave.price = Tilausten kokonaishinta
foodwave.summaryView = Ruokatilauksen Yhteenveto
foodwave.template.basicinfo = Template Infot
......@@ -442,6 +446,7 @@ foodwave.template.edit.title = Foodwave Template Editori
foodwave.template.list.title = Ruokatilaus Templatet
foodwave.template.name = Nimi
foodwave.template.selectproducts = Tuotteet
foodwave.template.waitPaymentsMinutes = Verkkomaksujen odotusaika
foodwave.totalCount = M\u00E4\u00E4r\u00E4
foodwave.totalPrice = Asiakkaan Hinta
......@@ -1227,6 +1232,8 @@ subnavi.roles = Roolit
success = Onnistui
suffix.minutes = min
supernavi.admin = Yll\u00E4piton\u00E4kym\u00E4
supernavi.user = K\u00E4ytt\u00E4j\u00E4n\u00E4kym\u00E4
......
......@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.TreeSet;
......@@ -76,12 +77,13 @@ public class FoodWaveView extends GenericCDIView {
private Date startDate;
private Product currentProduct;
private ListDataModel<BillLine> billLines;
//private ListDataModel<BillLine> billLines;
// private List<BillLine> unpaidBills;
private Integer foodWaveId;
private ListDataModel<AccountEvent> accountEventLines;
private ListDataModel<FoodWave> foodWaves;
private ListDataModel<Bill> bills;
private static final Logger logger = LoggerFactory.getLogger(FoodWaveView.class);
public List<Product> getProducts() {
......@@ -175,7 +177,7 @@ public class FoodWaveView extends GenericCDIView {
public List<FoodwaveProductSummary> getProductSummaries() {
System.out.println("..asdfasdf");
HashMap<Product, FoodwaveProductSummary> pmap = new HashMap<Product, FoodwaveProductSummary>();
for (AccountEvent ae : getSelectedFoodWave().getAccountEvents()) {
......@@ -221,6 +223,10 @@ public class FoodWaveView extends GenericCDIView {
}
return ret.negate();
}
public BigDecimal getFoodwaveBuyInPrice()
{
......@@ -246,12 +252,14 @@ public class FoodWaveView extends GenericCDIView {
// }
public String markBillPaid() {
if (permbean.hasPermission(BillPermission.WRITE_ALL) && getBillLines().isRowAvailable()) {
Bill b = getBillLines().getRowData().getBill();
if (permbean.hasPermission(BillPermission.WRITE_ALL) && bills != null && bills.isRowAvailable()) {
Bill b = bills.getRowData();
b = billbean.markPaid(b, Calendar.getInstance());
foodWaveId = selectedFoodWave.getId();
selectedFoodWave = null;
bills = null;
initFoodWaveOrderList();
}
......@@ -259,8 +267,8 @@ public class FoodWaveView extends GenericCDIView {
}
public String deliverAccountEvent() {
if (getAccountEventLines().isRowAvailable()) {
AccountEvent e = getAccountEventLines().getRowData();
if (accountEventLines != null && accountEventLines.isRowAvailable()) {
AccountEvent e = accountEventLines.getRowData();
e = productbeanlocal.markDelivered(e, Calendar.getInstance());
foodWaveId = selectedFoodWave.getId();
selectedFoodWave = null;
......@@ -271,27 +279,28 @@ public class FoodWaveView extends GenericCDIView {
}
public void initFoodWaveOrderList() {
if (super.requirePermissions(ShopPermission.MANAGE_FOODWAVES) && selectedFoodWave == null) {
selectedFoodWave = foodWaveBean.findFoodwave(foodWaveId);
logger.debug("Got foodwave {} with id {}", selectedFoodWave, foodWaveId);
this.setAccountEventLines(new ListDataModel<AccountEvent>(selectedFoodWave.getAccountEvents()));
List<BillLine> tmpLines = new ArrayList<BillLine>();
super.beginConversation();
}
HashSet<Bill> billList = new HashSet<Bill>();
for (BillLine line : selectedFoodWave.getBillLines()) {
if (!line.getBill().isPaid()) {
tmpLines.add(line);
}
for (BillLine line : getSelectedFoodWave().getBillLines()) {
if (!line.getBill().isPaid()) {
billList.add(line.getBill());
}
setBillLines(new ListDataModel<BillLine>(tmpLines));
setAccountEventLines(new ListDataModel<AccountEvent>(selectedFoodWave.getAccountEvents()));
super.beginConversation();
}
bills = new ListDataModel<Bill>(new ArrayList<Bill>(billList));
accountEventLines = new ListDataModel<AccountEvent>(getSelectedFoodWave().getAccountEvents());
}
public String saveTemplate()
......@@ -315,7 +324,6 @@ public class FoodWaveView extends GenericCDIView {
}
public FoodWave getSelectedFoodWave() {
// System.out.println("APOFKASFASFASFASFASFASFASFASFASFKJIOJIO");
return selectedFoodWave;
}
......@@ -351,13 +359,10 @@ public class FoodWaveView extends GenericCDIView {
this.foodWaveId = foodWaveId;
}
public ListDataModel<BillLine> getBillLines() {
return billLines;
public ListDataModel<Bill> getBills() {
return bills;
}
public void setBillLines(ListDataModel<BillLine> billLines) {
this.billLines = billLines;
}
public void setFoodWaves(ListDataModel<FoodWave> foodWaves) {
this.foodWaves = foodWaves;
......@@ -366,15 +371,12 @@ public class FoodWaveView extends GenericCDIView {
public ListDataModel<FoodWave> getFoodWaves() {
return foodWaves;
}
public ListDataModel<AccountEvent> getAccountEventLines() {
return accountEventLines;
}
public void setAccountEventLines(ListDataModel<AccountEvent> accountEventLines) {
this.accountEventLines = accountEventLines;
}
/*
* public List<BillLine> getUnpaidBills() { return unpaidBills; }
*
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!