Commit 11ff4124 by Tuukka Kivilahti

Merge remote-tracking branch 'origin/master' into asm-placeloss

Conflicts:
	code/moya-utils/src/main/java/fi/codecrew/moya/utilities/moyamessage/MoyaEventType.java
	code/moya-web/src/main/resources/fi/codecrew/moya/resources/i18n.properties
	code/moya-web/src/main/resources/fi/codecrew/moya/resources/i18n_en.properties
	code/moya-web/src/main/resources/fi/codecrew/moya/resources/i18n_fi.properties
2 parents 46cd8c2c 09fd35b4
...@@ -106,7 +106,7 @@ public class JaasBean implements MoyaRealmBeanRemote { ...@@ -106,7 +106,7 @@ public class JaasBean implements MoyaRealmBeanRemote {
logger.info("logging in as anonymous!!!"); logger.info("logging in as anonymous!!!");
} else if (!user.checkPassword(password)) { } else if (!user.checkPassword(password)) {
secubean.sendMessage(MoyaEventType.LOGIN_FAILED, eventUser, "Login failed: wrong password for username ", username); secubean.sendMessage(MoyaEventType.LOGIN_FAILED, eventUser, "Login failed: wrong password for username: ", username);
eventUser = null; eventUser = null;
user = null; user = null;
} }
...@@ -125,6 +125,7 @@ public class JaasBean implements MoyaRealmBeanRemote { ...@@ -125,6 +125,7 @@ public class JaasBean implements MoyaRealmBeanRemote {
eventUserFacade.flush(); eventUserFacade.flush();
eventUser.setCreator(eventUser); eventUser.setCreator(eventUser);
} }
secubean.sendMessage(MoyaEventType.LOGIN_SUCCESSFULL, eventUser, "User logged in with username: '", username, "' eventuser: ", eventUser);
} else { } else {
secubean.sendMessage(MoyaEventType.LOGIN_FAILED, eventUserFacade.findByLogin(User.ANONYMOUS_LOGINNAME), "Login failed: Username not found: ", username); secubean.sendMessage(MoyaEventType.LOGIN_FAILED, eventUserFacade.findByLogin(User.ANONYMOUS_LOGINNAME), "Login failed: Username not found: ", username);
} }
...@@ -190,7 +191,7 @@ public class JaasBean implements MoyaRealmBeanRemote { ...@@ -190,7 +191,7 @@ public class JaasBean implements MoyaRealmBeanRemote {
roleset.add(UserPermission.ANYUSER.getFullName()); roleset.add(UserPermission.ANYUSER.getFullName());
if (usr == null) { if (usr == null) {
usr = permbean.getAnonEventUser(); usr = permbean.getAnonEventUser();
roleset.add(SpecialPermission.ANONYMOUS.name()); roleset.add(SpecialPermission.ANONYMOUS.name());
} }
......
...@@ -260,7 +260,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -260,7 +260,7 @@ public class PlaceBean implements PlaceBeanLocal {
logger.warn("Reserving place {} with placeslot {}", place, slot); logger.warn("Reserving place {} with placeslot {}", place, slot);
slot.setPlace(place); slot.setPlace(place);
slot.setUsed(new Date()); slot.setUsed(new Date());
} else { } else if(!permbean.hasPermission(MapPermission.MANAGE_OTHERS)) { // we still can reserve places to other people
logger.warn("Not enough slots to reserve place {}", place); logger.warn("Not enough slots to reserve place {}", place);
// Not enough slots to reserve place // Not enough slots to reserve place
return false; return false;
......
...@@ -215,10 +215,12 @@ public class ProductBean implements ProductBeanLocal { ...@@ -215,10 +215,12 @@ public class ProductBean implements ProductBeanLocal {
if (!prod.getProductFlags().contains(ProductFlag.PREPAID_CREDIT)) if (!prod.getProductFlags().contains(ProductFlag.PREPAID_CREDIT))
{ {
if (prod.getPlaces() != null && !prod.getPlaces().isEmpty()) { if (prod.getPlaces() != null && !prod.getPlaces().isEmpty()) {
int totalcount = prod.getPlaces().size();
Long boughtSlots = slotfacade.totalSlotcount(prod); Long selectableCount = placeFacade.countSelectable(prod);
int freeCount = totalcount - boughtSlots.intValue(); Long unusedSlots = slotfacade.findUnusedSlotsCount(prod);
logger.info("Prodlimit totcnt {}, bought {}, free {}, prod {}", totalcount, boughtSlots, freeCount, prod); int freeCount = selectableCount.intValue() - unusedSlots.intValue();
logger.info("Prodlimit selectable {}, unused {}, free {}, prod {}", selectableCount, unusedSlots, freeCount, prod);
ret.put(prod.getId(), BigDecimal.valueOf(freeCount)); ret.put(prod.getId(), BigDecimal.valueOf(freeCount));
} }
} }
......
...@@ -158,6 +158,22 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> { ...@@ -158,6 +158,22 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
return getEm().createQuery(cq).getResultList(); return getEm().createQuery(cq).getResultList();
} }
public Long countSelectable(Product product) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Place> root = cq.from(Place.class);
cq.select(cb.count(root));
cq.where(
cb.equal(root.get(Place_.product), product),
cb.isNull(root.get(Place_.releaseTime)),
cb.isNull(root.get(Place_.group)),
cb.isFalse(root.get(Place_.disabled))
);
return super.getSingleNullableResult(getEm().createQuery(cq));
}
public Long findCountForProduct(Product product) { public Long findCountForProduct(Product product) {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class); CriteriaQuery<Long> cq = cb.createQuery(Long.class);
...@@ -167,10 +183,14 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> { ...@@ -167,10 +183,14 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
cq.where( cq.where(
cb.equal(root.get(Place_.product), product), cb.equal(root.get(Place_.product), product),
cb.isFalse(root.get(Place_.disabled)) cb.isFalse(root.get(Place_.disabled))
); );
return super.getSingleNullableResult(getEm().createQuery(cq)); return super.getSingleNullableResult(getEm().createQuery(cq));
} }
public Long countAvailable(EventMap map) { public Long countAvailable(EventMap map) {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class); CriteriaQuery<Long> cq = cb.createQuery(Long.class);
......
...@@ -92,6 +92,27 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> { ...@@ -92,6 +92,27 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
return slot; return slot;
} }
public Long findUnusedSlotsCount(Product prod) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
Root<PlaceSlot> root = q.from(PlaceSlot.class);
q.select(cb.count(root));
Path<Bill> bill = root.get(PlaceSlot_.bill);
Path<Calendar> billexp = bill.get(Bill_.expires);
q.where(cb.equal(root.get(PlaceSlot_.product), prod),
cb.or(cb.isNull(billexp),
cb.greaterThan(billexp, Calendar.getInstance())
),
cb.isNull(root.get(PlaceSlot_.place))
);
Long count = super.getSingleNullableResult(getEm().createQuery(q));
return count;
}
public Long totalSlotcount(Product prod) { public Long totalSlotcount(Product prod) {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class); CriteriaQuery<Long> q = cb.createQuery(Long.class);
......
...@@ -11,8 +11,9 @@ public enum MoyaEventType { ...@@ -11,8 +11,9 @@ public enum MoyaEventType {
BANKING_MESSAGE(MoyaEventSource.SHOP), BANKING_MESSAGE(MoyaEventSource.SHOP),
PLACE_ERROR(MoyaEventSource.PLACEMAP), PLACE_ERROR(MoyaEventSource.PLACEMAP),
ACCOUNTEVENT_INFO(MoyaEventSource.USER), ACCOUNTEVENT_INFO(MoyaEventSource.USER),
USER_PERMISSION_VIOLATION(MoyaEventSource.USER),
INVITE_ACCEPTED(MoyaEventSource.USER), INVITE_ACCEPTED(MoyaEventSource.USER),
USER_PERMISSION_VIOLATION(MoyaEventSource.USER),
LOGIN_SUCCESSFULL(MoyaEventSource.USER),
; ;
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "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:tools="http://java.sun.com/jsf/composite/tools" xmlns:bill="http://java.sun.com/jsf/composite/cditools/bills" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> <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:tools="http://java.sun.com/jsf/composite/tools"
xmlns:bill="http://java.sun.com/jsf/composite/cditools/bills"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:body> <h:body>
...@@ -14,39 +20,51 @@ ...@@ -14,39 +20,51 @@
<h1>#{i18n['page.bill.show.header']}</h1> <h1>#{i18n['page.bill.show.header']}</h1>
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
<p:outputPanel id="billPanel"> <p:outputPanel id="billPanel">
<ui:fragment rendered="#{billEditView.bill.paid}"> <ui:fragment rendered="#{billEditView.bill.paid}">
<h:outputText value="#{i18n['bill.billIsPaid']}" /> <h:outputText value="#{i18n['bill.billIsPaid']}" />
<br /> <br />
<h:outputText value="#{i18n['bill.billPaidDate']}" />: <h:outputText value="#{i18n['bill.billPaidDate']}" />:
<h:outputText value="#{billEditView.bill.paidDate}"> <h:outputText value="#{billEditView.bill.paidDate}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" /> <f:convertDateTime pattern="#{sessionHandler.datetimeFormat}"
</h:outputText> timeZone="#{sessionHandler.timezone}" />
</ui:fragment> </h:outputText>
<br /> </ui:fragment>
<br />
<bill:showBill bill="#{billEditView.bill}" /> <bill:showBill bill="#{billEditView.bill}" />
<bill:verkkomaksubuttons rendered="#{!billEditView.bill.paid and !billEditView.bill.expired}"/> <bill:verkkomaksubuttons
rendered="#{!billEditView.bill.paid and !billEditView.bill.expired}" />
<p:outputPanel rendered="#{billEditView.bill.foodwaveBill}">
<span class="notify"><h:outputText value="#{i18n['foodshop.canBuyToCounter']}" /></span> <p:outputPanel rendered="#{billEditView.bill.foodwaveBill}">
</p:outputPanel> <span class="notify"><h:outputText
<br /> value="#{i18n['foodshop.canBuyToCounter']}" /></span>
<p:outputPanel rendered="#{!billEditView.bill.paid and !billEditView.bill.expired}"> </p:outputPanel>
<br />
<p:outputPanel
rendered="#{!billEditView.bill.paid and !billEditView.bill.expired}">
<h:form> <h:form>
<p:commandButton id="cancelbtn" actionListener="#{billEditView.expireBill()}" onerror="location.reload(true);" value="#{i18n['bill.cancel']}" update=":billPanel"> <p:commandButton id="cancelbtn"
<p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> actionListener="#{billEditView.expireBill()}"
onerror="location.reload(true);" value="#{i18n['bill.cancel']}"
update=":billPanel">
<p:confirm header="Confirmation" message="Are you sure?"
icon="ui-icon-alert" />
</p:commandButton> </p:commandButton>
</h:form> </h:form>
</p:outputPanel> </p:outputPanel>
<p:outputPanel rendered="#{billEditView.bill.user.accountBalance ge billEditView.bill.totalPrice}"> <p:outputPanel
rendered="#{billEditView.bill.user.accountBalance ge billEditView.bill.totalPrice}">
<h:form> <h:form>
<p:commandButton id="buyCreditsButton" actionListener="#{billEditView.buyWithCredits()}" onerror="location.reload(true);" value="#{i18n['bill.markPaid.credits']}" update=":billPanel"> <p:commandButton id="buyCreditsButton"
<p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> actionListener="#{billEditView.buyWithCredits()}"
onerror="location.reload(true);"
value="#{i18n['bill.markPaid.credits']}" update=":billPanel">
<p:confirm header="Confirmation" message="Are you sure?"
icon="ui-icon-alert" />
</p:commandButton> </p:commandButton>
</h:form> </h:form>
</p:outputPanel> </p:outputPanel>
......
...@@ -22,13 +22,12 @@ ...@@ -22,13 +22,12 @@
<!-- When called via ajax this needs to be already loaded! <!-- When called via ajax this needs to be already loaded!
--> -->
<script type="text/javascript" src="//payment.paytrail.com/js/payment-widget-v1.0.min.js"></script> <script type="text/javascript" src="//payment.paytrail.com/js/payment-widget-v1.0.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function initPaymentButtons() {
SV.widget.initWithToken('svmpayment', SV.widget.initWithToken('svmpayment',
'#{billEditView.verkkomaksuFiToken.token}', { '#{billEditView.verkkomaksuFiToken.token}', {
width : '800' width : '800'
}); });
}
</script> </script>
</ui:fragment> </ui:fragment>
<ui:fragment rendered="#{billEditView.checkoutFiAvailable}"> <ui:fragment rendered="#{billEditView.checkoutFiAvailable}">
......
<?xml version='1.0' encoding='UTF-8' ?> <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui"> xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:p="http://primefaces.org/ui">
<composite:interface> <composite:interface>
<composite:attribute name="items" required="true" /> <composite:attribute name="items" required="true" />
<composite:attribute name="commitValue" required="true" /> <composite:attribute name="commitValue" required="true" />
<composite:attribute name="commitaction" method-signature="java.lang.String action()" required="true" /> <composite:attribute name="commitaction"
method-signature="java.lang.String action()" required="true" />
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<!-- <h:outputScript target="head" library="script" name="jquery.min.js" /> --> <!-- <h:outputScript target="head" library="script" name="jquery.min.js" /> -->
<!-- <h:outputScript target="head" library="script" name="shopscript.js" /> --> <!-- <h:outputScript target="head" library="script" name="shopscript.js" /> -->
<h:outputScript library="primefaces" name="jquery/jquery.js" /> <h:outputScript library="primefaces" name="jquery/jquery.js" />
<p:dataTable columnClasses="nowrap,numalign,numalign,numalign,nowrap" id="billcart" value="#{cc.attrs.items}" var="cart"> <p:dataTable columnClasses="nowrap,numalign,numalign,numalign,nowrap"
id="billcart" value="#{cc.attrs.items}" var="cart">
<p:column> <p:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText id="name" value="${i18n['product.name']}" /> <h:outputText id="name" value="${i18n['product.name']}" />
...@@ -37,14 +45,18 @@ ...@@ -37,14 +45,18 @@
<h:outputText id="count" value="${i18n['product.cart.count']}" /> <h:outputText id="count" value="${i18n['product.cart.count']}" />
</f:facet> </f:facet>
<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>
<p:inputText size="2" id="cartcount" escape="false" value="#{cart.count}"> <p:inputText size="2" id="cartcount" escape="false"
<f:ajax render="@form" listener="#{productShopView.countChangeListener}" /> value="#{cart.count}">
<f:ajax render="@form"
listener="#{productShopView.countChangeListener}" />
<f:convertNumber maxFractionDigits="2" minFractionDigits="0" /> <f:convertNumber maxFractionDigits="2" minFractionDigits="0" />
</p:inputText> </p: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>
</p:column> </p:column>
...@@ -56,8 +68,9 @@ ...@@ -56,8 +68,9 @@
<f:convertNumber maxFractionDigits="2" minFractionDigits="0" /> <f:convertNumber maxFractionDigits="2" minFractionDigits="0" />
</h:outputText> </h:outputText>
</p:column> </p:column>
<p:column> <p:column headerText="#{i18n['productshop.discounts']}">
<h:dataTable styleClass="noborderTable" border="0" var="disc" value="#{cart.discounts}"> <h:dataTable styleClass="noborderTable" border="0" var="disc"
value="#{cart.discounts}">
<p:column> <p:column>
<h:outputText value="#{disc.shortdesc}" /> <h:outputText value="#{disc.shortdesc}" />
</p:column> </p:column>
...@@ -79,7 +92,9 @@ ...@@ -79,7 +92,9 @@
</p:column> </p:column>
<p:columnGroup type="footer"> <p:columnGroup type="footer">
<p:row> <p:row>
<p:column style="text-align: right;" colspan="4" footerText="#{i18n['productshop.total']}" /> <p:column style="text-align: right;"
colspan="#{productShopView.hasLimits?5:4}"
footerText="#{i18n['productshop.total']}" />
<p:column> <p:column>
<f:facet name="footer"> <f:facet name="footer">
<h:outputText value="#{productShopView.cartPrice}"> <h:outputText value="#{productShopView.cartPrice}">
...@@ -95,23 +110,30 @@ ...@@ -95,23 +110,30 @@
<br /> <br />
<h:panelGrid columns="3" rendered="#{productShopView.checkAllowStats}"> <h:panelGrid columns="3" rendered="#{productShopView.checkAllowStats}">
<h:outputText for="allowStats" value="#{i18n['bill.allowStatistics']}" /> <h:outputText for="allowStats" value="#{i18n['bill.allowStatistics']}" />
<h:selectBooleanCheckbox id="allowStats" value="#{productShopView.allowStatistics}" /> <h:selectBooleanCheckbox id="allowStats"
value="#{productShopView.allowStatistics}" />
<h:message for="allowStats" /> <h:message for="allowStats" />
</h:panelGrid> </h:panelGrid>
<br /> <br />
<h:panelGroup rendered="#{productShopView.gatherBillInfo}"> <h:panelGroup rendered="#{productShopView.gatherBillInfo}">
<h2><p:outputLabel value="#{i18n['bill.notes.title']}" /> </h2> <h2>
<p:inputTextarea cols="50" value="#{productShopView.otherInfo}" label="#{i18n['otherInfo']}" /> <p:outputLabel value="#{i18n['bill.notes.title']}" />
</h2>
<p:inputTextarea cols="50" value="#{productShopView.otherInfo}"
label="#{i18n['otherInfo']}" />
</h:panelGroup> </h:panelGroup>
<br /> <br />
<!-- Paytrail needs to initialize after the ajax call is complete --> <!-- Paytrail needs to initialize after the ajax call is complete -->
<!-- This function is to be override by the paytrail init function --> <!-- This function is to be override by the paytrail init function -->
<script type="text/javascript"> <script type="text/javascript">
function initPaymentButtons(){}; function initPaymentButtons() {
</script> };
<p:commandButton oncomplete="initPaymentButtons()" onerror="location.reload(true);" action="#{cc.attrs.commitaction}" id="commitbutton-botton" value="#{cc.attrs.commitValue}" /> </script>
<p:commandButton ajax="false" onerror="location.reload(true);"
action="#{cc.attrs.commitaction}" id="commitbutton-botton"
value="#{cc.attrs.commitValue}" />
......
...@@ -231,3 +231,8 @@ a.shopItem:active { ...@@ -231,3 +231,8 @@ a.shopItem:active {
display: none !important; display: none !important;
visibility: hidden; visibility: hidden;
} }
.noborderTable tr,.noborderTable tr td {
border: none;
padding: 0 0 1px 0;
}
...@@ -14,12 +14,7 @@ ...@@ -14,12 +14,7 @@
<ui:define name="title"> <ui:define name="title">
<h1>#{i18n['page.product.createBill.header']}</h1> <h1>#{i18n['page.product.createBill.header']}</h1>
</ui:define> </ui:define>
<ui:define name="headerdata"> <ui:define name="content">
<ui:fragment rendered="#{billEditView.verkkomaksuFiAvailable}">
<script type="text/javascript" src="//payment.paytrail.com/js/payment-widget-v1.0.min.js"></script>
</ui:fragment>
</ui:define>
<ui:define name="content">
<h:form id="billshopform"> <h:form id="billshopform">
<products:shop commitaction="#{productShopView.commitBillCart()}" items="#{productShopView.shoppingcart}" commitValue="#{i18n['productshop.commit']}" /> <products:shop commitaction="#{productShopView.commitBillCart()}" items="#{productShopView.shoppingcart}" commitValue="#{i18n['productshop.commit']}" />
......
...@@ -15,12 +15,7 @@ ...@@ -15,12 +15,7 @@
<ui:define name="title"> <ui:define name="title">
<h1>#{i18n['page.product.validateBillProducts.header']}</h1> <h1>#{i18n['page.product.validateBillProducts.header']}</h1>
</ui:define> </ui:define>
<ui:define name="headerdata">
<ui:fragment rendered="#{billEditView.verkkomaksuFiAvailable}">
<script type="text/javascript" src="//payment.paytrail.com/js/payment-widget-v1.0.min.js"></script>
</ui:fragment>
</ui:define>
<ui:define name="content"> <ui:define name="content">
<bill:showBill bill="#{billEditView.bill}" /> <bill:showBill bill="#{billEditView.bill}" />
......
...@@ -178,6 +178,8 @@ public class PlaceView extends GenericCDIView { ...@@ -178,6 +178,8 @@ public class PlaceView extends GenericCDIView {
place = p; place = p;
} }
} }
} else {
super.addFaceMessage("Cannot reserve place for user");
} }
} catch (BortalCatchableException e) { } catch (BortalCatchableException e) {
......
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net) #Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
#Sat Mar 30 17:56:44 EET 2013 #Sat Mar 30 17:56:44 EET 2013
shop.unitdiscount = Alennus
shop.customPrice = Uusi hinta
accountEvent.commit = Tallenna accountEvent.commit = Tallenna
actionlog.create.header = Create new actionmessage actionlog.create.header = Create new actionmessage
...@@ -337,6 +335,9 @@ product.description = Kuvaus ...@@ -337,6 +335,9 @@ product.description = Kuvaus
product.providedRole = Product defines role product.providedRole = Product defines role
product.returnProductEdit = Return to product: product.returnProductEdit = Return to product:
product.saved = Product saved product.saved = Product saved
product.vat = ALV-%
productFlag.CREATE_NEW_PLACE_WHEN_BOUGHT = Luo uusi paikka ostettaessa
productshop.minusOne = -1 productshop.minusOne = -1
productshop.minusTen = -10 productshop.minusTen = -10
...@@ -349,6 +350,8 @@ refresh = P\u00E4ivit\u00E4 ...@@ -349,6 +350,8 @@ refresh = P\u00E4ivit\u00E4
registerleaflet.title = Rekisteriseloste registerleaflet.title = Rekisteriseloste
required = Arvo vaaditaan
resetMail.header = Reset lost password resetMail.header = Reset lost password
resetMail.username = Username resetMail.username = Username
...@@ -364,6 +367,9 @@ roleView.showPermissioneditor = N\u00E4yt\u00E4 oikeusasetukset ...@@ -364,6 +367,9 @@ roleView.showPermissioneditor = N\u00E4yt\u00E4 oikeusasetukset
save = Tallenna save = Tallenna
shop.customPrice = Uusi hinta
shop.unitdiscount = Alennus
submenu.NotImplementedYet = Not implemented submenu.NotImplementedYet = Not implemented
submenu.admin.adduser = K\u00E4ytt\u00E4j\u00E4nlis\u00E4ys submenu.admin.adduser = K\u00E4ytt\u00E4j\u00E4nlis\u00E4ys
submenu.admin.adduser.index = K\u00E4ytt\u00E4j\u00E4nlis\u00E4ys submenu.admin.adduser.index = K\u00E4ytt\u00E4j\u00E4nlis\u00E4ys
...@@ -375,6 +381,7 @@ submenu.info.shop = Kauppa ...@@ -375,6 +381,7 @@ submenu.info.shop = Kauppa
submenu.lectureadmin.lectureParticipants = Tarkastele osallistujia submenu.lectureadmin.lectureParticipants = Tarkastele osallistujia
submenu.lectureadmin.manageLectureGroups = Hallinnoi submenu.lectureadmin.manageLectureGroups = Hallinnoi
submenu.lectures.viewLectures = Ilmoittaudu submenu.lectures.viewLectures = Ilmoittaudu
submenu.neomap.view = Paikkakartta
submenu.reports.basicStatistics = Tilastoja submenu.reports.basicStatistics = Tilastoja
subnavi.cards = \u0009\u0009 subnavi.cards = \u0009\u0009
...@@ -388,25 +395,31 @@ topnavi.adminlectures = Kurssit ja luennot ...@@ -388,25 +395,31 @@ topnavi.adminlectures = Kurssit ja luennot
topnavi.license = Lisenssikoodit topnavi.license = Lisenssikoodit
topnavi.userlectures = Kurssit ja luennot topnavi.userlectures = Kurssit ja luennot
user.cropImage = Crop user.cancelInvite = Peruuta kutsu
user.createdmessage = K\u00E4ytt\u00E4j\u00E4tunnus on luotu onnistuneesti.
user.cropImage = Crop
user.email = S\u00E4hk\u00F6postiosoite
user.emailAgain = S\u00E4hk\u00F6posti (uudelleen)
user.emailAndUsername = Email (toimii k\u00E4ytt\u00E4j\u00E4tunnuksena)
user.imageUpload.imageNotFound = Select image to upload user.imageUpload.imageNotFound = Select image to upload
user.info = K\u00E4ytt\u00E4j\u00E4 user.info = K\u00E4ytt\u00E4j\u00E4
user.invite.placeInvite.header = Liit\u00E4 paikka itsellesi
user.meta.box.title = Metadata user.meta.box.title = Metadata
user.saveUserSelectableRoles = Tallenna user.saveUserSelectableRoles = Tallenna
user.shirt.L = Unisex L user.shirt.L = Unisex L
user.shirt.LadyL = Ladyfit L user.shirt.LadyL = Ladyfit L
user.shirt.LadyM = Ladyfit M user.shirt.LadyM = Ladyfit M
user.shirt.LadyS = Ladyfit S user.shirt.LadyS = Ladyfit S
user.shirt.LadyXL = Ladyfit XL user.shirt.LadyXL = Ladyfit XL
user.shirt.LadyXS = Ladyfit XS user.shirt.LadyXS = Ladyfit XS
user.shirt.LadyXXL = Ladyfit XXL user.shirt.LadyXXL = Ladyfit XXL
user.shirt.M = Unisex M user.shirt.M = Unisex M
user.shirt.S = Unisex S user.shirt.S = Unisex S
user.shirt.XL = Unisex XL user.shirt.XL = Unisex XL
user.shirt.XXL = Unisex XXL user.shirt.XXL = Unisex XXL
user.shirt.XXXL = Unisex XXXL user.shirt.XXXL = Unisex XXXL
user.shirt.select = Valitse yksi user.shirt.select = Valitse yksi
user.shirtSize = Paidan koko user.shirtSize = Paidan koko
user.unauthenticated = Kirjautumaton user.unauthenticated = Kirjautumaton
user.userSelectableRoles = Valitse yksi user.userSelectableRoles = Valitse yksi
......
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net) #Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
#Sat Mar 30 17:56:44 EET 2013 #Sat Mar 30 17:56:44 EET 2013
...@@ -994,6 +995,7 @@ productsShopView.readBarcode = Read ...@@ -994,6 +995,7 @@ productsShopView.readBarcode = Read
productshop.billCreated = Bill created productshop.billCreated = Bill created
productshop.commit = Buy productshop.commit = Buy
productshop.discounts = Discounts
productshop.limits = Available productshop.limits = Available
productshop.minusOne = -1 productshop.minusOne = -1
productshop.minusTen = -10 productshop.minusTen = -10
...@@ -1042,6 +1044,8 @@ rejectcard.subject = Subject ...@@ -1042,6 +1044,8 @@ rejectcard.subject = Subject
rejectcard.toAddr = Email address rejectcard.toAddr = Email address
rejectcard.toName = Name rejectcard.toName = Name
required = Required
resetMail.body = You can change a forgotten password by inserting your username or email address to the field below. A link where you can change the password will be sent to the email address associated to that. resetMail.body = You can change a forgotten password by inserting your username or email address to the field below. A link where you can change the password will be sent to the email address associated to that.
resetMail.email = Email address resetMail.email = Email address
resetMail.header = Reset lost password resetMail.header = Reset lost password
...@@ -1103,6 +1107,7 @@ shop.cashback = Cashback ...@@ -1103,6 +1107,7 @@ shop.cashback = Cashback
shop.confirmCreditBuy = Are You sure ? shop.confirmCreditBuy = Are You sure ?
shop.count = Q shop.count = Q
shop.currentBalance = Current balance shop.currentBalance = Current balance
shop.customPrice = new price
shop.price = price shop.price = price
shop.product = Product shop.product = Product
shop.readBarcode = Read shop.readBarcode = Read
...@@ -1111,6 +1116,7 @@ shop.shoppingcartCommitted = Products bought ...@@ -1111,6 +1116,7 @@ shop.shoppingcartCommitted = Products bought
shop.toAccountValue = To account shop.toAccountValue = To account
shop.totalPrice = Total shop.totalPrice = Total
shop.transactionTotal = Transaction total shop.transactionTotal = Transaction total
shop.unitdiscount = Discount
shop.user = Selling to shop.user = Selling to
sidebar.bill.list = My bills sidebar.bill.list = My bills
...@@ -1197,6 +1203,7 @@ submenu.license.manageCodes = Manage codes ...@@ -1197,6 +1203,7 @@ submenu.license.manageCodes = Manage codes
submenu.license.viewCodes = View codes submenu.license.viewCodes = View codes
submenu.map.create = Create map submenu.map.create = Create map
submenu.map.list = List maps submenu.map.list = List maps
submenu.neomap.view = Map
submenu.networkassociation.index = Associations submenu.networkassociation.index = Associations
submenu.orgrole.create = Create organisationrole submenu.orgrole.create = Create organisationrole
submenu.orgrole.list = Organisation roles submenu.orgrole.list = Organisation roles
...@@ -1430,6 +1437,7 @@ user.age = Age ...@@ -1430,6 +1437,7 @@ user.age = Age
user.bank = Bank user.bank = Bank
user.bankaccount = Bank number user.bankaccount = Bank number
user.birthday = Birthday user.birthday = Birthday
user.cancelInvite = Cancel invite
user.cardPower = Usertype user.cardPower = Usertype
user.changePassword = Change password user.changePassword = Change password
user.changepassword.forUser = For user user.changepassword.forUser = For user
...@@ -1444,6 +1452,10 @@ user.edit = Edit ...@@ -1444,6 +1452,10 @@ user.edit = Edit
user.edit.gameids = Edit GameIDs user.edit.gameids = Edit GameIDs
user.edit.title = My information user.edit.title = My information
user.email = Email user.email = Email
user.emailAgain = Email (again)
user.emailAndUsername = Email (works also as username)
user.emailsunmatch = Email addresses does not match.
user.emailtooshortmessage = Email must be atleast {0} characters long.
user.firstNames = Firstname user.firstNames = Firstname
user.food.title = Choose Menu user.food.title = Choose Menu
user.foodwave.products.title = Choose Products user.foodwave.products.title = Choose Products
...@@ -1467,6 +1479,7 @@ user.insertToken = Insert token ...@@ -1467,6 +1479,7 @@ user.insertToken = Insert token
user.invalidLoginCredentials = Invalid user credentials user.invalidLoginCredentials = Invalid user credentials
user.invite = Invite user.invite = Invite
user.invite.header = Accept invitation user.invite.header = Accept invitation
user.invite.placeInvite.header = Receive sendet place
user.invitemail = Email address user.invitemail = Email address
user.lastName = Lastname user.lastName = Lastname
user.login = Login user.login = Login
...@@ -1559,12 +1572,13 @@ usertitle.managingUser = Shop ...@@ -1559,12 +1572,13 @@ usertitle.managingUser = Shop
userview.header = Users userview.header = Users
userview.invalidEmail = Invalid email address userview.invalidEmail = Invalid email address
userview.loginstringFaulty = Username has to be atleast 2 characters long\! userview.loginstringFaulty = Username has to be atleast 2 characters long!
userview.oldPasswordError = Invalid password! userview.oldPasswordError = Invalid password!
userview.passwordTooShort = Password has to be atleast {0} characters long\! userview.passwordTooShort = Password has to be atleast {0} characters long!
userview.passwordsChanged = Password changed userview.passwordsChanged = Password changed
userview.passwordsDontMatch = Passwords do not match! Please try again! userview.passwordsDontMatch = Passwords do not match! Please try again!
userview.userExists = Username already exists\! You may already have an account. userview.userExists = Username already exists! You may already have an account.
userview.userExistsByEmail = Email already exists! You may already have an account.
viewexpired.body = Please login again. viewexpired.body = Please login again.
viewexpired.title = Login expired. Please login again. viewexpired.title = Login expired. Please login again.
......
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net) #Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
#Sat Mar 30 17:56:44 EET 2013 #Sat Mar 30 17:56:44 EET 2013
...@@ -979,6 +980,7 @@ productsShopView.readBarcode = Lue ...@@ -979,6 +980,7 @@ productsShopView.readBarcode = Lue
productshop.billCreated = Lasku luotu productshop.billCreated = Lasku luotu
productshop.commit = Osta productshop.commit = Osta
productshop.discounts = Alennukset
productshop.limits = Vapaana productshop.limits = Vapaana
productshop.minusOne = -1 productshop.minusOne = -1
productshop.minusTen = -10 productshop.minusTen = -10
...@@ -1027,6 +1029,8 @@ rejectcard.subject = Viestin otsikko ...@@ -1027,6 +1029,8 @@ rejectcard.subject = Viestin otsikko
rejectcard.toAddr = S\u00E4hk\u00F6postiosoite rejectcard.toAddr = S\u00E4hk\u00F6postiosoite
rejectcard.toName = Nimi rejectcard.toName = Nimi
required = Vaaditaan
resetMail.body = Voit vaihtaa unohtuneen salasanan sy\u00F6tt\u00E4m\u00E4ll\u00E4 k\u00E4ytt\u00E4j\u00E4tunnuksesi tai tunnukseen liitetyn s\u00E4hk\u00F6postiosoitteen allaolevaan kentt\u00E4\u00E4n. Tunnukseen liitettyyn s\u00E4hk\u00F6postiosoitteeseen l\u00E4hetet\u00E4\u00E4n kertak\u00E4ytt\u00F6inen osoite jossa voit vaihtaa sy\u00F6tt\u00E4m\u00E4si k\u00E4ytt\u00E4j\u00E4tunnuksen salasanan. resetMail.body = Voit vaihtaa unohtuneen salasanan sy\u00F6tt\u00E4m\u00E4ll\u00E4 k\u00E4ytt\u00E4j\u00E4tunnuksesi tai tunnukseen liitetyn s\u00E4hk\u00F6postiosoitteen allaolevaan kentt\u00E4\u00E4n. Tunnukseen liitettyyn s\u00E4hk\u00F6postiosoitteeseen l\u00E4hetet\u00E4\u00E4n kertak\u00E4ytt\u00F6inen osoite jossa voit vaihtaa sy\u00F6tt\u00E4m\u00E4si k\u00E4ytt\u00E4j\u00E4tunnuksen salasanan.
resetMail.email = S\u00E4hk\u00F6postiosoite resetMail.email = S\u00E4hk\u00F6postiosoite
resetMail.header = Salasana unohtunut? resetMail.header = Salasana unohtunut?
...@@ -1085,6 +1089,7 @@ shop.cashback = Takaisin ...@@ -1085,6 +1089,7 @@ shop.cashback = Takaisin
shop.confirmCreditBuy = Varmastikko ? shop.confirmCreditBuy = Varmastikko ?
shop.count = Lkm shop.count = Lkm
shop.currentBalance = T\u00E4m\u00E4nhetkinen saldo shop.currentBalance = T\u00E4m\u00E4nhetkinen saldo
shop.customPrice = Uusi hinta
shop.price = Hinta shop.price = Hinta
shop.product = Tuote shop.product = Tuote
shop.readBarcode = Lue shop.readBarcode = Lue
...@@ -1092,6 +1097,7 @@ shop.shoppingcartCommitted = Tuotteet ostettu ...@@ -1092,6 +1097,7 @@ shop.shoppingcartCommitted = Tuotteet ostettu
shop.toAccountValue = Tilille shop.toAccountValue = Tilille
shop.totalPrice = Yhteens\u00E4 shop.totalPrice = Yhteens\u00E4
shop.transactionTotal = Tapahtuma yhteens\u00E4 shop.transactionTotal = Tapahtuma yhteens\u00E4
shop.unitdiscount = Alennus
shop.user = Myyd\u00E4\u00E4n shop.user = Myyd\u00E4\u00E4n
sidebar.bill.list = Omat laskut sidebar.bill.list = Omat laskut
...@@ -1177,6 +1183,7 @@ submenu.license.manageCodes = Hallinnoi lisenssej\u00E4 ...@@ -1177,6 +1183,7 @@ submenu.license.manageCodes = Hallinnoi lisenssej\u00E4
submenu.license.viewCodes = N\u00E4yt\u00E4 koodit submenu.license.viewCodes = N\u00E4yt\u00E4 koodit
submenu.map.create = Uusi kartta submenu.map.create = Uusi kartta
submenu.map.list = N\u00E4yt\u00E4 kartat submenu.map.list = N\u00E4yt\u00E4 kartat
submenu.neomap.view = Paikkakartta
submenu.networkassociation.index = Assosiaatiot submenu.networkassociation.index = Assosiaatiot
submenu.orgrole.create = Luo j\u00E4rjest\u00E4j\u00E4rooli submenu.orgrole.create = Luo j\u00E4rjest\u00E4j\u00E4rooli
submenu.orgrole.list = J\u00E4rjest\u00E4j\u00E4roolit submenu.orgrole.list = J\u00E4rjest\u00E4j\u00E4roolit
...@@ -1413,6 +1420,7 @@ user.age = Ik\u00E4 ...@@ -1413,6 +1420,7 @@ user.age = Ik\u00E4
user.bank = Pankki user.bank = Pankki
user.bankaccount = Pankkitili user.bankaccount = Pankkitili
user.birthday = Syntym\u00E4aika user.birthday = Syntym\u00E4aika
user.cancelInvite = Peruuta kutsu
user.cardPower = K\u00E4ytt\u00E4j\u00E4tyyppi user.cardPower = K\u00E4ytt\u00E4j\u00E4tyyppi
user.changePassword = Vaihda salasana user.changePassword = Vaihda salasana
user.changepassword.forUser = K\u00E4ytt\u00E4j\u00E4lle user.changepassword.forUser = K\u00E4ytt\u00E4j\u00E4lle
...@@ -1427,6 +1435,10 @@ user.edit = Muokkaa ...@@ -1427,6 +1435,10 @@ user.edit = Muokkaa
user.edit.gameids = Muokkaa peli-id merkint\u00F6j\u00E4 user.edit.gameids = Muokkaa peli-id merkint\u00F6j\u00E4
user.edit.title = Omat tiedot user.edit.title = Omat tiedot
user.email = S\u00E4hk\u00F6posti user.email = S\u00E4hk\u00F6posti
user.emailAgain = S\u00E4hk\u00F6posti (uudelleen)
user.emailAndUsername = S\u00E4hk\u00F6posti (toimii my\u00F6s k\u00E4ytt\u00E4j\u00E4tunnuksena)
user.emailsunmatch = S\u00E4hk\u00F6postiosoitteet eiv\u00E4t t\u00E4sm\u00E4\u00E4.
user.emailtooshortmessage = S\u00E4hk\u00F6postin tarvitsee olla v\u00E4hint\u00E4\u00E4n {0} merkki\u00E4 pitk\u00E4.
user.firstNames = Etunimi user.firstNames = Etunimi
user.food.title = Valitse Menu user.food.title = Valitse Menu
user.foodwave.products.title = Valitse tuotteet user.foodwave.products.title = Valitse tuotteet
...@@ -1451,6 +1463,7 @@ user.insert = Sy\u00F6t\u00E4 arvo ...@@ -1451,6 +1463,7 @@ user.insert = Sy\u00F6t\u00E4 arvo
user.invalidLoginCredentials = K\u00E4ytt\u00E4j\u00E4tunnus tai salasana v\u00E4\u00E4rin. user.invalidLoginCredentials = K\u00E4ytt\u00E4j\u00E4tunnus tai salasana v\u00E4\u00E4rin.
user.invite = Kutsu user.invite = Kutsu
user.invite.header = Luo k\u00E4ytt\u00E4j\u00E4 kutsusta user.invite.header = Luo k\u00E4ytt\u00E4j\u00E4 kutsusta
user.invite.placeInvite.header = Vastaanota l\u00E4hetetty paikka
user.invitemail = S\u00E4hk\u00F6postiosoite user.invitemail = S\u00E4hk\u00F6postiosoite
user.lastName = Sukunimi user.lastName = Sukunimi
user.login = K\u00E4ytt\u00E4j\u00E4tunnus user.login = K\u00E4ytt\u00E4j\u00E4tunnus
...@@ -1540,13 +1553,14 @@ userlist.usersWithUnusedCodes = Lista t\u00E4m\u00E4n tapahtuman k\u00E4ytt\u00E ...@@ -1540,13 +1553,14 @@ userlist.usersWithUnusedCodes = Lista t\u00E4m\u00E4n tapahtuman k\u00E4ytt\u00E
usertitle.managingUser = Kauppa usertitle.managingUser = Kauppa
userview.invalidEmail = Virheeliinen s\u00E4hk\u00F6postiosoite userview.invalidEmail = Virheellinen s\u00E4hk\u00F6postiosoite
userview.loginstringFaulty = K\u00E4ytt\u00E4j\u00E4tunnus virheellinen. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n kaksi merkki\u00E4 pitk\u00E4. userview.loginstringFaulty = K\u00E4ytt\u00E4j\u00E4tunnus virheellinen. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n kaksi merkki\u00E4 pitk\u00E4.
userview.oldPasswordError = V\u00E4\u00E4r\u00E4 salasana! userview.oldPasswordError = V\u00E4\u00E4r\u00E4 salasana!
userview.passwordTooShort = Salasana liian lyhyt. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n {0} merkki\u00E4 pitk\u00E4. userview.passwordTooShort = Salasana liian lyhyt. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n {0} merkki\u00E4 pitk\u00E4.
userview.passwordsChanged = Salasana vaihdettu userview.passwordsChanged = Salasana vaihdettu
userview.passwordsDontMatch = Salasanat eiv\u00E4t ole samat! Ole hyv\u00E4 ja sy\u00F6t\u00E4 salasanat uudelleen. userview.passwordsDontMatch = Salasanat eiv\u00E4t ole samat! Ole hyv\u00E4 ja sy\u00F6t\u00E4 salasanat uudelleen.
userview.userExists = K\u00E4ytt\u00E4j\u00E4tunnus on jo olemassa. Sinulla saattaa jo olla tunnus j\u00E4rjestelm\u00E4ss\u00E4. userview.userExists = K\u00E4ytt\u00E4j\u00E4tunnus on jo olemassa. Sinulla saattaa jo olla tunnus j\u00E4rjestelm\u00E4ss\u00E4.
userview.userExistsByEmail = S\u00E4hk\u00F6posti on jo olemassa. Sinulla saattaa jo olla tunnus j\u00E4rjestelm\u00E4ss\u00E4.
viewexpired.body = Ole hyv\u00E4 ja kirjaudu sis\u00E4\u00E4n uudelleen. viewexpired.body = Ole hyv\u00E4 ja kirjaudu sis\u00E4\u00E4n uudelleen.
viewexpired.title = N\u00E4kym\u00E4 on vanhentunut viewexpired.title = N\u00E4kym\u00E4 on vanhentunut
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!