Commit a392afcb by Tuukka Kivilahti

Merge branch 'queue' into 'master'

Placeslot viewing

Add placeslots as list to admin view of users places

See merge request !164
2 parents 0adebf2f 4ef5e555
...@@ -124,4 +124,6 @@ public interface PlaceBeanLocal { ...@@ -124,4 +124,6 @@ public interface PlaceBeanLocal {
List<PlaceSlot> getFreePlaceslots(EventUser u, EventMap map); List<PlaceSlot> getFreePlaceslots(EventUser u, EventMap map);
List<PlaceSlot> getPlaceslots(EventUser user);
} }
...@@ -128,7 +128,6 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -128,7 +128,6 @@ public class PlaceBean implements PlaceBeanLocal {
@EJB @EJB
private PlaceSlotFacade placeSlotFacade; private PlaceSlotFacade placeSlotFacade;
@Override @Override
@RolesAllowed(MapPermission.S_MANAGE_MAPS) @RolesAllowed(MapPermission.S_MANAGE_MAPS)
public Place mergeChanges(Place place) { public Place mergeChanges(Place place) {
...@@ -255,7 +254,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -255,7 +254,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 if(!permbean.hasPermission(MapPermission.MANAGE_OTHERS)) { // we still can reserve places to other people } 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;
...@@ -617,7 +616,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -617,7 +616,7 @@ public class PlaceBean implements PlaceBeanLocal {
PlaceSlot slot = placeSlotFacade.findSlotForPlace(place); PlaceSlot slot = placeSlotFacade.findSlotForPlace(place);
// remove also slot from place // remove also slot from place
if(slot != null) { if (slot != null) {
slot.setPlace(null); slot.setPlace(null);
place.setReserverSlot(null); place.setReserverSlot(null);
} }
...@@ -759,17 +758,15 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -759,17 +758,15 @@ public class PlaceBean implements PlaceBeanLocal {
List<GroupMembership> gmems = gmemfacade.findMemberOrCreator(user); List<GroupMembership> gmems = gmemfacade.findMemberOrCreator(user);
List<Place> places = new ArrayList<>(); List<Place> places = new ArrayList<>();
for(GroupMembership gm : gmems) { for (GroupMembership gm : gmems) {
if(gm.getPlaceReservation() != null) { if (gm.getPlaceReservation() != null) {
// places with no user belongs to creator // places with no user belongs to creator
if(gm.getUser() == null || !printOnlyOwn) { if (gm.getUser() == null || !printOnlyOwn) {
places.add(gm.getPlaceReservation()); places.add(gm.getPlaceReservation());
} else if(user.equals(gm.getUser())) { } else if (user.equals(gm.getUser())) {
places.add(gm.getPlaceReservation()); places.add(gm.getPlaceReservation());
} }
...@@ -794,4 +791,13 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -794,4 +791,13 @@ public class PlaceBean implements PlaceBeanLocal {
return placeSlotFacade.findFreePlaceSlots(user, map); return placeSlotFacade.findFreePlaceSlots(user, map);
} }
@Override
public List<PlaceSlot> getPlaceslots(EventUser user) {
if (!permbean.isCurrentUser(user) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
throw new EJBAccessException("User " + permbean.getCurrentUser() + "tried to get slots for user " + user);
}
return placeSlotFacade.finForUser(user);
}
} }
...@@ -35,6 +35,7 @@ import org.slf4j.Logger; ...@@ -35,6 +35,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal; import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.LoggingBeanLocal;
import fi.codecrew.moya.model.EventMap; import fi.codecrew.moya.model.EventMap;
import fi.codecrew.moya.model.EventMap_; import fi.codecrew.moya.model.EventMap_;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
...@@ -44,6 +45,7 @@ import fi.codecrew.moya.model.PlaceSlot; ...@@ -44,6 +45,7 @@ import fi.codecrew.moya.model.PlaceSlot;
import fi.codecrew.moya.model.Place_; import fi.codecrew.moya.model.Place_;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Product_; import fi.codecrew.moya.model.Product_;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
@Stateless @Stateless
@LocalBean @LocalBean
...@@ -57,6 +59,9 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> { ...@@ -57,6 +59,9 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
@EJB @EJB
private PlaceSlotFacade placeslotfacade; private PlaceSlotFacade placeslotfacade;
@EJB
private LoggingBeanLocal logbean;
public PlaceFacade() { public PlaceFacade() {
super(Place.class); super(Place.class);
...@@ -77,6 +82,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> { ...@@ -77,6 +82,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
int updated = 0; int updated = 0;
for (Place p : q.getResultList()) { for (Place p : q.getResultList()) {
logger.debug("Releasing place {} at automagic timed place check.", p); logger.debug("Releasing place {} at automagic timed place check.", p);
final EventUser cu = p.getCurrentUser();
if (p.checkReleased()) { if (p.checkReleased()) {
PlaceSlot slot = placeslotfacade.findSlotForPlace(p); PlaceSlot slot = placeslotfacade.findSlotForPlace(p);
...@@ -84,6 +90,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> { ...@@ -84,6 +90,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
slot.setPlace(null); slot.setPlace(null);
slot.setUsed(null); slot.setUsed(null);
} }
logbean.sendMessage(MoyaEventType.PLACE_ERROR, cu, "Automatically release unlocked place ", p.getName());
++updated; ++updated;
} }
} }
......
...@@ -103,6 +103,14 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> { ...@@ -103,6 +103,14 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
return slot; return slot;
} }
public List<PlaceSlot> finForUser(EventUser user) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PlaceSlot> q = cb.createQuery(PlaceSlot.class);
Root<PlaceSlot> root = q.from(PlaceSlot.class);
q.where(cb.equal(root.get(PlaceSlot_.bill).get(Bill_.user), user));
return getEm().createQuery(q).getResultList();
}
public Long findUnusedSlotsCount(Product prod) { public Long findUnusedSlotsCount(Product prod) {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class); CriteriaQuery<Long> q = cb.createQuery(Long.class);
...@@ -161,4 +169,5 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> { ...@@ -161,4 +169,5 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
return getEm().createQuery(q).getResultList(); return getEm().createQuery(q).getResultList();
} }
} }
<!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:c="http://java.sun.com/jsp/jstl/core" <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:f="http://java.sun.com/jsf/core"> xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:body> <h:body>
<ui:composition template="#{sessionHandler.template}"> <ui:composition template="#{sessionHandler.template}">
<ui:param name="thispage" value="page.place.mygroups" /> <ui:param name="thispage" value="page.place.mygroups" />
...@@ -20,8 +25,10 @@ ...@@ -20,8 +25,10 @@
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
<h:outputText rendered="#{empty placeGroupView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" /> <h:outputText rendered="#{empty placeGroupView.groupMemberships}"
<h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform"> value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{!empty placeGroupView.groupMemberships}"
id="placelistform">
<h:dataTable value="#{placeGroupView.groupMemberships}" var="member"> <h:dataTable value="#{placeGroupView.groupMemberships}" var="member">
<h:column> <h:column>
...@@ -34,27 +41,34 @@ ...@@ -34,27 +41,34 @@
<f:facet name="header"> <f:facet name="header">
<h:outputText value="#{i18n['placegroupview.token']}" /> <h:outputText value="#{i18n['placegroupview.token']}" />
</f:facet> </f:facet>
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" /> <h:outputText rendered="#{empty member.user}"
<h:outputText rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" /> value="#{member.inviteToken}" />
<h:outputText rendered="#{!empty member.user}"
value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
</h:column> </h:column>
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:outputText value="#{i18n['placegroupview.groupCreator']}" /> <h:outputText value="#{i18n['placegroupview.groupCreator']}" />
</f:facet> </f:facet>
<h:outputText value="#{member.placeGroup.creator.firstnames} #{member.placeGroup.creator.lastname} (#{member.placeGroup.creator.nick})" /> <h:outputText
value="#{member.placeGroup.creator.firstnames} #{member.placeGroup.creator.lastname} (#{member.placeGroup.creator.nick})" />
</h:column> </h:column>
<h:column> <h:column>
<h:commandButton rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull}" action="#{placeGroupView.releasePlace()}" <h:commandButton
rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull}"
action="#{placeGroupView.releasePlace()}"
value="#{i18n['placegroupview.releasePlace']}" /> value="#{i18n['placegroupview.releasePlace']}" />
</h:column> </h:column>
</h:dataTable> </h:dataTable>
</h:form> </h:form>
<p> <p>
<input type="button" onclick="location.replace('#{request.contextPath}/PlaceGroupPdf?eventuserId=#{placeGroupView.user.id}');" value="#{i18n['placegroup.printPdf']}" /> <input type="button"
onclick="location.replace('#{request.contextPath}/PlaceGroupPdf?eventuserId=#{placeGroupView.user.id}');"
value="#{i18n['placegroup.printPdf']}" />
</p> </p>
<h2>#{i18n['placetoken.pageHeader']}</h2> <h2>#{i18n['placetoken.pageHeader']}</h2>
...@@ -62,9 +76,37 @@ ...@@ -62,9 +76,37 @@
<h:form id="placeTokenForm"> <h:form id="placeTokenForm">
<h:outputLabel value="#{i18n['placetoken.token']}:" /> <h:outputLabel value="#{i18n['placetoken.token']}:" />
<h:inputText value="#{tokenView.token}" /> <h:inputText value="#{tokenView.token}" />
<h:commandButton id="commitbtn" action="#{tokenView.saveToken()}" value="#{i18n['placetoken.commit']}" /> <h:commandButton id="commitbtn" action="#{tokenView.saveToken()}"
value="#{i18n['placetoken.commit']}" />
</h:form> </h:form>
<h2>Place slots</h2>
<p:dataTable var="slot" value="#{placeGroupView.placeslots}">
<p:column headerText="#{i18n['placeslot.state']}">
<h:outputText
value="#{slot.bill.expired ? i18n['placeslot.state.expired'] : ( slot.bill.paid ? i18n['placeslot.state.paid'] : i18n['placeslot.state.notPaid'])}" />
</p:column>
<p:column headerText="#{i18n['placeslot.product']}">
<h:outputText value="#{slot.product.name}" />
</p:column>
<p:column headerText="#{i18n['placeslot.place']}">
<h:outputText rendered="#{!empty slot.place}"
value="#{slot.place.name}" />
</p:column>
<p:column headerText="#{i18n['placeslot.used']}">
<h:outputText value="#{slot.used}">
<f:convertDateTime timeZone="#{sessionHandler.timezone}"
pattern="#{sessionHandler.shortDatetimeFormat}" />
</h:outputText>
</p:column>
<p:column headerText="#{i18n['placeslot.bill']}">
<h:link outcome="/bill/showBill"
value="#{i18n['bill.billNumber']}: #{slot.bill.id}">
<f:param name="billid" value="#{slot.bill.id}" />
</h:link>
</p:column>
</p:dataTable>
......
...@@ -30,6 +30,7 @@ import javax.inject.Inject; ...@@ -30,6 +30,7 @@ import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import fi.codecrew.moya.beans.EventBeanLocal; import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal; import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission; import fi.codecrew.moya.enums.apps.MapPermission;
...@@ -58,10 +59,10 @@ public class PlacegroupView extends GenericCDIView { ...@@ -58,10 +59,10 @@ public class PlacegroupView extends GenericCDIView {
private transient PlaceGroupBeanLocal placegroupBean; private transient PlaceGroupBeanLocal placegroupBean;
@EJB @EJB
UserBeanLocal userBean; private UserBeanLocal userBean;
@EJB @EJB
EventBeanLocal eventBean; private EventBeanLocal eventBean;
@Inject @Inject
private InviteView inviteView; private InviteView inviteView;
...@@ -75,6 +76,8 @@ public class PlacegroupView extends GenericCDIView { ...@@ -75,6 +76,8 @@ public class PlacegroupView extends GenericCDIView {
private transient ListDataModel<GroupMembership> memberlist; private transient ListDataModel<GroupMembership> memberlist;
private Map<Integer, String> inviteMails = new HashMap<>(); private Map<Integer, String> inviteMails = new HashMap<>();
@EJB
private PlaceBeanLocal placeslotBean;
public String editGroup() { public String editGroup() {
setGroup(placegroups.getRowData()); setGroup(placegroups.getRowData());
...@@ -83,7 +86,6 @@ public class PlacegroupView extends GenericCDIView { ...@@ -83,7 +86,6 @@ public class PlacegroupView extends GenericCDIView {
return "/place/editGroup"; return "/place/editGroup";
} }
public boolean isUseEticket() { public boolean isUseEticket() {
return eventBean.getPropertyBoolean(LanEventPropertyKey.USE_ETICKET); return eventBean.getPropertyBoolean(LanEventPropertyKey.USE_ETICKET);
} }
...@@ -99,12 +101,12 @@ public class PlacegroupView extends GenericCDIView { ...@@ -99,12 +101,12 @@ public class PlacegroupView extends GenericCDIView {
return false; return false;
// if you are sitting on place, or can modify other users, then you can possibly modify this place // if you are sitting on place, or can modify other users, then you can possibly modify this place
if(permbean.isCurrentUser(row.getUser()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS) ) if (permbean.isCurrentUser(row.getUser()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return true; return true;
// or you are the creator, and no-one is sitting on the place // or you are the creator, and no-one is sitting on the place
if(row.getUser() == null && permbean.isCurrentUser(row.getPlaceGroup().getCreator())) if (row.getUser() == null && permbean.isCurrentUser(row.getPlaceGroup().getCreator()))
return true; return true;
return false; return false;
...@@ -112,13 +114,13 @@ public class PlacegroupView extends GenericCDIView { ...@@ -112,13 +114,13 @@ public class PlacegroupView extends GenericCDIView {
public boolean isShowCancelInviteCurrent() { public boolean isShowCancelInviteCurrent() {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if(row == null) if (row == null)
return false; return false;
if(!isCanModifyCurrent()) if (!isCanModifyCurrent())
return false; return false;
if((row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty())) if ((row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
return true; return true;
return false; return false;
...@@ -126,22 +128,21 @@ public class PlacegroupView extends GenericCDIView { ...@@ -126,22 +128,21 @@ public class PlacegroupView extends GenericCDIView {
public boolean isCanSendInviteCurrent() { public boolean isCanSendInviteCurrent() {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if(row == null) if (row == null)
return false; return false;
if(!isCanModifyCurrent()) if (!isCanModifyCurrent())
return false; return false;
if(isCurrentReleaseAllowed()) if (isCurrentReleaseAllowed())
return false; return false;
if(row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty()) if (row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty())
return true; return true;
return false; return false;
} }
public boolean isCurrentMemberUserNotNull() { public boolean isCurrentMemberUserNotNull() {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if (row != null && row.getUser() != null) if (row != null && row.getUser() != null)
...@@ -149,42 +150,43 @@ public class PlacegroupView extends GenericCDIView { ...@@ -149,42 +150,43 @@ public class PlacegroupView extends GenericCDIView {
return false; return false;
} }
public List<PlaceSlot> getPlaceslots()
{
return placeslotBean.getPlaceslots(user);
}
public boolean isCurrentReleaseAllowed() { public boolean isCurrentReleaseAllowed() {
//placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and //placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if(row == null || row.getUser() == null) if (row == null || row.getUser() == null)
return false; return false;
if(!isCanModifyCurrent()) if (!isCanModifyCurrent())
return false; return false;
if(row.getEnteredEvent() != null && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) if (row.getEnteredEvent() != null && !permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return false; return false;
// change for assembly // change for assembly
// TODO: kun lantrekit on ohi niin kato tää logiikka niin että koko "vapauta" -napin konseptista luovutaan ja pelkästään maililla paikansiirto. // TODO: kun lantrekit on ohi niin kato tää logiikka niin että koko "vapauta" -napin konseptista luovutaan ja pelkästään maililla paikansiirto.
if(isPrintOnlyOwn()) if (isPrintOnlyOwn())
return false; return false;
// And ofcourse you can free it, if you are superadmin // And ofcourse you can free it, if you are superadmin
if(permbean.hasPermission(MapPermission.MANAGE_OTHERS)) if (permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return true; return true;
// if it's your own place, and you are sitting on it, you can free it // if it's your own place, and you are sitting on it, you can free it
if(permbean.isCurrentUser(row.getPlaceGroup().getCreator()) && permbean.isCurrentUser(row.getUser())) if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) && permbean.isCurrentUser(row.getUser()))
return true; return true;
return false; return false;
} }
public ListDataModel<GroupMembership> getGroupMemberships() { public ListDataModel<GroupMembership> getGroupMemberships() {
memberlist = new ListDataModel<GroupMembership>(placegroupBean.getMembershipsAndCreations(user)); memberlist = new ListDataModel<GroupMembership>(placegroupBean.getMembershipsAndCreations(user));
return memberlist; return memberlist;
...@@ -261,7 +263,7 @@ public class PlacegroupView extends GenericCDIView { ...@@ -261,7 +263,7 @@ public class PlacegroupView extends GenericCDIView {
public void sendInvite() { public void sendInvite() {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if(!isCanModifyCurrent()) { if (!isCanModifyCurrent()) {
this.addFaceMessage("invite.permissionDenied"); this.addFaceMessage("invite.permissionDenied");
} }
...@@ -285,18 +287,17 @@ public class PlacegroupView extends GenericCDIView { ...@@ -285,18 +287,17 @@ public class PlacegroupView extends GenericCDIView {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if(row != null) { if (row != null) {
return inviteMails.get(row.getId()); return inviteMails.get(row.getId());
} }
return null; return null;
} }
public void setInviteMail(String inviteMail) { public void setInviteMail(String inviteMail) {
GroupMembership row = memberlist.getRowData(); GroupMembership row = memberlist.getRowData();
if(row != null) { if (row != null) {
inviteMails.put(row.getId(), inviteMail); inviteMails.put(row.getId(), inviteMail);
} }
} }
......
...@@ -950,6 +950,16 @@ placegroupview.reservationName = Place ...@@ -950,6 +950,16 @@ placegroupview.reservationName = Place
placegroupview.reservationProduct = Ticket placegroupview.reservationProduct = Ticket
placegroupview.token = Placecode / user placegroupview.token = Placecode / user
placeslot.bill = Bill
placeslot.place = Place
placeslot.product = Slot product
placeslot.showBill = Show bill
placeslot.state = State
placeslot.state.notPaid = Not paid
placeslot.state.paid = Paid
placeslot.stateExpired = Expired
placeslot.used = Used
placetoken.commit = Associate token placetoken.commit = Associate token
placetoken.pageHeader = Add token placetoken.pageHeader = Add token
placetoken.placelist = My places placetoken.placelist = My places
......
...@@ -933,6 +933,16 @@ placegroupview.reservationName = Paikka ...@@ -933,6 +933,16 @@ placegroupview.reservationName = Paikka
placegroupview.reservationProduct = Lippu placegroupview.reservationProduct = Lippu
placegroupview.token = Paikkakoodi / k\u00E4ytt\u00E4j\u00E4 placegroupview.token = Paikkakoodi / k\u00E4ytt\u00E4j\u00E4
placeslot.bill = Lasku
placeslot.place = Paikka
placeslot.product = Tuote
placeslot.showBill = N\u00E4yt\u00E4 lasku
placeslot.state = Tila
placeslot.state.notPaid = Ei maksettu
placeslot.state.paid = Maksettu
placeslot.stateExpired = Vanhentunut
placeslot.used = K\u00E4ytetty
placetoken.commit = Liit\u00E4 placetoken.commit = Liit\u00E4
placetoken.pageHeader = Lis\u00E4\u00E4 konepaikkakoodi placetoken.pageHeader = Lis\u00E4\u00E4 konepaikkakoodi
placetoken.placelist = Omat paikat placetoken.placelist = Omat paikat
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!