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 {
List<PlaceSlot> getFreePlaceslots(EventUser u, EventMap map);
List<PlaceSlot> getPlaceslots(EventUser user);
}
......@@ -128,7 +128,6 @@ public class PlaceBean implements PlaceBeanLocal {
@EJB
private PlaceSlotFacade placeSlotFacade;
@Override
@RolesAllowed(MapPermission.S_MANAGE_MAPS)
public Place mergeChanges(Place place) {
......@@ -255,7 +254,7 @@ public class PlaceBean implements PlaceBeanLocal {
logger.warn("Reserving place {} with placeslot {}", place, slot);
slot.setPlace(place);
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);
// Not enough slots to reserve place
return false;
......@@ -617,7 +616,7 @@ public class PlaceBean implements PlaceBeanLocal {
PlaceSlot slot = placeSlotFacade.findSlotForPlace(place);
// remove also slot from place
if(slot != null) {
if (slot != null) {
slot.setPlace(null);
place.setReserverSlot(null);
}
......@@ -759,17 +758,15 @@ public class PlaceBean implements PlaceBeanLocal {
List<GroupMembership> gmems = gmemfacade.findMemberOrCreator(user);
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
if(gm.getUser() == null || !printOnlyOwn) {
if (gm.getUser() == null || !printOnlyOwn) {
places.add(gm.getPlaceReservation());
} else if(user.equals(gm.getUser())) {
} else if (user.equals(gm.getUser())) {
places.add(gm.getPlaceReservation());
}
......@@ -794,4 +791,13 @@ public class PlaceBean implements PlaceBeanLocal {
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;
import org.slf4j.LoggerFactory;
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.EventUser;
......@@ -44,6 +45,7 @@ import fi.codecrew.moya.model.PlaceSlot;
import fi.codecrew.moya.model.Place_;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Product_;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
@Stateless
@LocalBean
......@@ -57,6 +59,9 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
@EJB
private PlaceSlotFacade placeslotfacade;
@EJB
private LoggingBeanLocal logbean;
public PlaceFacade() {
super(Place.class);
......@@ -77,6 +82,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
int updated = 0;
for (Place p : q.getResultList()) {
logger.debug("Releasing place {} at automagic timed place check.", p);
final EventUser cu = p.getCurrentUser();
if (p.checkReleased()) {
PlaceSlot slot = placeslotfacade.findSlotForPlace(p);
......@@ -84,6 +90,7 @@ public class PlaceFacade extends IntegerPkGenericFacade<Place> {
slot.setPlace(null);
slot.setUsed(null);
}
logbean.sendMessage(MoyaEventType.PLACE_ERROR, cu, "Automatically release unlocked place ", p.getName());
++updated;
}
}
......
......@@ -103,6 +103,14 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
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) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
......@@ -161,4 +169,5 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
return getEm().createQuery(q).getResultList();
}
}
<!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: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">
<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"
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>
<ui:composition template="#{sessionHandler.template}">
<ui:param name="thispage" value="page.place.mygroups" />
......@@ -20,8 +25,10 @@
</ui:define>
<ui:define name="content">
<h:outputText rendered="#{empty placeGroupView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform">
<h:outputText rendered="#{empty placeGroupView.groupMemberships}"
value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{!empty placeGroupView.groupMemberships}"
id="placelistform">
<h:dataTable value="#{placeGroupView.groupMemberships}" var="member">
<h:column>
......@@ -34,27 +41,34 @@
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.token']}" />
</f:facet>
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" />
<h:outputText rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
<h:outputText rendered="#{empty member.user}"
value="#{member.inviteToken}" />
<h:outputText rendered="#{!empty member.user}"
value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.groupCreator']}" />
</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: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']}" />
</h:column>
</h:dataTable>
</h:form>
<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>
<h2>#{i18n['placetoken.pageHeader']}</h2>
......@@ -62,9 +76,37 @@
<h:form id="placeTokenForm">
<h:outputLabel value="#{i18n['placetoken.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>
<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;
import javax.inject.Named;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission;
......@@ -58,10 +59,10 @@ public class PlacegroupView extends GenericCDIView {
private transient PlaceGroupBeanLocal placegroupBean;
@EJB
UserBeanLocal userBean;
private UserBeanLocal userBean;
@EJB
EventBeanLocal eventBean;
private EventBeanLocal eventBean;
@Inject
private InviteView inviteView;
......@@ -75,6 +76,8 @@ public class PlacegroupView extends GenericCDIView {
private transient ListDataModel<GroupMembership> memberlist;
private Map<Integer, String> inviteMails = new HashMap<>();
@EJB
private PlaceBeanLocal placeslotBean;
public String editGroup() {
setGroup(placegroups.getRowData());
......@@ -83,7 +86,6 @@ public class PlacegroupView extends GenericCDIView {
return "/place/editGroup";
}
public boolean isUseEticket() {
return eventBean.getPropertyBoolean(LanEventPropertyKey.USE_ETICKET);
}
......@@ -99,12 +101,12 @@ public class PlacegroupView extends GenericCDIView {
return false;
// 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;
// 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 false;
......@@ -112,13 +114,13 @@ public class PlacegroupView extends GenericCDIView {
public boolean isShowCancelInviteCurrent() {
GroupMembership row = memberlist.getRowData();
if(row == null)
if (row == null)
return false;
if(!isCanModifyCurrent())
if (!isCanModifyCurrent())
return false;
if((row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
if ((row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
return true;
return false;
......@@ -126,22 +128,21 @@ public class PlacegroupView extends GenericCDIView {
public boolean isCanSendInviteCurrent() {
GroupMembership row = memberlist.getRowData();
if(row == null)
if (row == null)
return false;
if(!isCanModifyCurrent())
if (!isCanModifyCurrent())
return false;
if(isCurrentReleaseAllowed())
if (isCurrentReleaseAllowed())
return false;
if(row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty())
if (row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty())
return true;
return false;
}
public boolean isCurrentMemberUserNotNull() {
GroupMembership row = memberlist.getRowData();
if (row != null && row.getUser() != null)
......@@ -149,42 +150,43 @@ public class PlacegroupView extends GenericCDIView {
return false;
}
public List<PlaceSlot> getPlaceslots()
{
return placeslotBean.getPlaceslots(user);
}
public boolean isCurrentReleaseAllowed() {
//placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and
GroupMembership row = memberlist.getRowData();
if(row == null || row.getUser() == null)
if (row == null || row.getUser() == null)
return false;
if(!isCanModifyCurrent())
if (!isCanModifyCurrent())
return false;
if(row.getEnteredEvent() != null && !permbean.hasPermission(MapPermission.MANAGE_OTHERS))
if (row.getEnteredEvent() != null && !permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return false;
// 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.
if(isPrintOnlyOwn())
if (isPrintOnlyOwn())
return false;
// And ofcourse you can free it, if you are superadmin
if(permbean.hasPermission(MapPermission.MANAGE_OTHERS))
if (permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return true;
// 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 false;
}
public ListDataModel<GroupMembership> getGroupMemberships() {
memberlist = new ListDataModel<GroupMembership>(placegroupBean.getMembershipsAndCreations(user));
return memberlist;
......@@ -261,7 +263,7 @@ public class PlacegroupView extends GenericCDIView {
public void sendInvite() {
GroupMembership row = memberlist.getRowData();
if(!isCanModifyCurrent()) {
if (!isCanModifyCurrent()) {
this.addFaceMessage("invite.permissionDenied");
}
......@@ -285,18 +287,17 @@ public class PlacegroupView extends GenericCDIView {
GroupMembership row = memberlist.getRowData();
if(row != null) {
if (row != null) {
return inviteMails.get(row.getId());
}
return null;
}
public void setInviteMail(String inviteMail) {
GroupMembership row = memberlist.getRowData();
if(row != null) {
if (row != null) {
inviteMails.put(row.getId(), inviteMail);
}
}
......
......@@ -950,6 +950,16 @@ placegroupview.reservationName = Place
placegroupview.reservationProduct = Ticket
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.pageHeader = Add token
placetoken.placelist = My places
......
......@@ -933,6 +933,16 @@ placegroupview.reservationName = Paikka
placegroupview.reservationProduct = Lippu
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.pageHeader = Lis\u00E4\u00E4 konepaikkakoodi
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!