Commit 6adad270 by Tuomas Riihimäki

Place Slot stuff.

1 parent 229bef52
......@@ -118,6 +118,6 @@ public interface PlaceBeanLocal {
List<Product> getMapProducts(EventMap map);
List<PlaceSlot> getFreePlaceslots(EventUser user);
List<PlaceSlot> getFreePlaceslots(EventUser user, Product product);
}
......@@ -238,6 +238,17 @@ public class PlaceBean implements PlaceBeanLocal {
if (!place.isTaken() || (permbean.hasPermission(MapPermission.MANAGE_OTHERS) && permbean.getCurrentUser().equals(place.getCurrentUser()))) {
if (place.isBuyable() || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
if (place.getProduct().getProductFlags().contains(ProductFlag.PREPAID_CREDIT)) {
// TODO: We should check there is enough credits...
} else {
List<PlaceSlot> slots = placeSlotFacade.findFreePlaceSlots(user, place.getProduct());
if (slots != null && !slots.isEmpty()) {
PlaceSlot slot = slots.get(0);
slot.setPlace(place);
slot.setUsed(new Date());
}
}
if (!place.isBuyable()) {
place.setBuyable(true);
}
......@@ -546,6 +557,11 @@ public class PlaceBean implements PlaceBeanLocal {
}
place.setCurrentUser(null);
place.setReleaseTime(null);
PlaceSlot slot = placeSlotFacade.findSlotForPlace(place);
if (slot != null) {
slot.setPlace(null);
slot.setUsed(null);
}
return true;
......@@ -705,12 +721,12 @@ public class PlaceBean implements PlaceBeanLocal {
}
@Override
public List<PlaceSlot> getFreePlaceslots(EventUser user) {
public List<PlaceSlot> getFreePlaceslots(EventUser user, Product product) {
user = eventUserFacade.reload(user);
if (!permbean.isCurrentUser(user) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS))
throw new EJBAccessException("User " + permbean.getCurrentUser() + "tried to fetch free places for user " + user);
return placeSlotFacade.findFreePlaceSlots(user);
return placeSlotFacade.findFreePlaceSlots(user, product);
}
@Override
......
......@@ -51,6 +51,7 @@ import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.GroupMembershipFacade;
import fi.codecrew.moya.facade.InventoryEventFacade;
import fi.codecrew.moya.facade.PlaceFacade;
import fi.codecrew.moya.facade.PlaceSlotFacade;
import fi.codecrew.moya.facade.ProductFacade;
import fi.codecrew.moya.facade.UserFacade;
import fi.codecrew.moya.model.AccountEvent;
......@@ -137,6 +138,9 @@ public class ProductBean implements ProductBeanLocal {
@EJB
private GroupMembershipFacade gmfacade;
@EJB
private PlaceSlotFacade slotfacade;
private static final Logger logger = LoggerFactory.getLogger(ProductBean.class);
/**
......@@ -198,6 +202,7 @@ public class ProductBean implements ProductBeanLocal {
@Override
public HashMap<Integer, BigDecimal> getProductLimit(Map<Integer, BigDecimal> prodCounts, EventUser user)
{
Set<Role> userroles = new HashSet<Role>(userbean.findUsersRoles(user));
HashMap<Integer, BigDecimal> ret = new HashMap<Integer, BigDecimal>();
for (Entry<Integer, BigDecimal> pc : prodCounts.entrySet())
......@@ -206,6 +211,18 @@ public class ProductBean implements ProductBeanLocal {
BigDecimal lim = getPrivateProductLimit(prod, user, prodCounts, userroles);
ret.put(prod.getId(), lim);
// logger.info("Added product limit {} to {}", lim, prod);
if (!prod.getProductFlags().contains(ProductFlag.PREPAID_CREDIT))
{
if (prod.getPlaces() != null && !prod.getPlaces().isEmpty()) {
int totalcount = prod.getPlaces().size();
Long boughtSlots = slotfacade.totalSlotcount(prod);
int freeCount = totalcount - boughtSlots.intValue();
logger.info("Prodlimit totcnt {}, bought {}, free {}, prod {}", totalcount, boughtSlots, freeCount, prod);
ret.put(prod.getId(), BigDecimal.valueOf(freeCount));
}
}
}
return ret;
}
......
......@@ -38,6 +38,7 @@ import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PlaceSlot;
import fi.codecrew.moya.model.PlaceSlot_;
import fi.codecrew.moya.model.Product;
@Stateless
@LocalBean
......@@ -57,23 +58,48 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
* Returns placeslots this user can use.
*
* @param user
* @param product
* @return
*/
public List<PlaceSlot> findFreePlaceSlots(EventUser user) {
public List<PlaceSlot> findFreePlaceSlots(EventUser user, Product product) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PlaceSlot> q = cb.createQuery(PlaceSlot.class);
Root<PlaceSlot> root = q.from(PlaceSlot.class);
Path<Bill> bill = root.get(PlaceSlot_.bill);
q.where(cb.equal(bill.get(Bill_.user), user),
cb.isNotNull(bill.get(Bill_.paidDate)),
cb.isNull(root.get(PlaceSlot_.used))
cb.isNull(root.get(PlaceSlot_.used)),
cb.equal(root.get(PlaceSlot_.product), product)
);
return getEm().createQuery(q).getResultList();
}
// private List<PlaceSlot> getSlotsForUser(EventUser u) {
//
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<PlaceSlot> cq = cb.createQuery(PlaceSlot.class);
//
// }
public PlaceSlot findSlotForPlace(Place place) {
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_.place), place));
PlaceSlot slot = super.getSingleNullableResult(getEm().createQuery(q));
return slot;
}
public Long totalSlotcount(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));
q.where(cb.equal(root.get(PlaceSlot_.product), prod));
Long count = super.getSingleNullableResult(getEm().createQuery(q));
return count;
}
}
......@@ -22,7 +22,8 @@
action="#{ajaxMapView.placeClicked()}" />
</h:form>
<p:dialog rendered="#{ajaxMapView.isMgmtPermission()}" visible="#{!empty ajaxMapView.place}" id="fbdiag">
<p:dialog rendered="#{ajaxMapView.isMgmtPermission()}"
visible="#{!empty ajaxMapView.place}" id="fbdiag">
Clicked place name : #{ajaxMapView.place.name};
<h:link rendered="#{!empty ajaxMapView.place}" outcome="/place/edit">
<f:param name="placeid" value="#{ajaxMapView.place.id}" />
......@@ -34,9 +35,10 @@
<h:outputScript target="head" library="seatjs" name="d3-tip.js" />
<h:outputScript target="head" library="seatjs" name="seatmap.js" />
<h:outputStylesheet library="seatjs" name="placemap.css" />
<button onclick="px.update()" >Update</button><br/>
<svg id="seatmap" style="margin: auto; border: 1px solid black;"
width="#{ajaxMapView.map.width}px" height="#{ajaxMapView.map.height}px" />
width="#{ajaxMapView.map.width}px"
height="#{ajaxMapView.map.height}px" />
<script type="text/javascript">
px = placemap({
element : document.getElementById("seatmap"),
......@@ -45,7 +47,7 @@
onclick : function(d) {
px.update();
//alert(d);
#{ajaxMapView.isMgmtPermission()?'placeClicker([{name: \'placeId\', value: d}])':''}
// #{ajaxMapView.isMgmtPermission()?'placeClicker([{name: \'placeId\', value: d}])':''}
return false;
}
});
......
......@@ -20,12 +20,15 @@ import javax.ws.rs.core.Response.ResponseBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.model.EventMap;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.rest.pojo.placemap.PlacemapMapRootPojo;
import fi.codecrew.moya.rest.pojo.placemap.SimplePlacePojo;
import fi.codecrew.moya.rest.pojo.placemap.SimplePlacelistRoot;
import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.user.UserView;
@RequestScoped
......@@ -38,6 +41,12 @@ public class PlacemapRestViewV1 {
private PlaceBeanLocal placebean;
private static final Logger logger = LoggerFactory.getLogger(PlacemapRestViewV1.class);
@EJB
private PermissionBeanLocal permbean;
@Inject
private UserView userView;
// @GET
// @Path("/maps")
// public PlacemapMapRootPojo getMaps()
......@@ -50,7 +59,7 @@ public class PlacemapRestViewV1 {
@POST
@Path("/place/{id}/reserve")
public void reservePlace() {
logger .warn("Reserving not yet implemented");
logger.warn("Reserving not yet implemented");
}
@GET
......@@ -70,7 +79,7 @@ public class PlacemapRestViewV1 {
EventMap map = placebean.findMap(id);
byte[] data = map.getMapData();
ResponseBuilder ret = Response.ok(data, "image/png");
ret.expires(new Date(System.currentTimeMillis() + 6*60*60*1000));
ret.expires(new Date(System.currentTimeMillis() + 6 * 60 * 60 * 1000));
return ret.build();
}
......@@ -81,34 +90,42 @@ public class PlacemapRestViewV1 {
{
EventMap map = placebean.findMap(mapId);
return SimplePlacelistRoot.wrap(map.getPlaces(), null);
EventUser user = null;
if (userView != null) {
user = userView.getSelectedUser();
}
return SimplePlacelistRoot.wrap(map.getPlaces(), user);
}
@GET
@Path("/place/{place}")
public SimplePlacelistRoot getPlace(@PathParam("place") Integer placeId)
{
List <Place> thisplace = new ArrayList<Place>();
List<Place> thisplace = new ArrayList<Place>();
thisplace.add(placebean.find(placeId));
return SimplePlacelistRoot.wrap(thisplace, eventuser.getSelectedUser());
return SimplePlacelistRoot.wrap(thisplace, permbean.getCurrentUser());
}
@POST
@Path("/place/{place}")
public SimplePlacelistRoot setPlace(@PathParam("place") Integer placeId)
public SimplePlacelistRoot togglePlaceReservation(@PathParam("place") Integer placeId)
{
EventUser user = null;
if (userView != null) {
user = userView.getSelectedUser();
}
Place p = placebean.find(placeId);
if (p.isReservedFor(eventuser.getSelectedUser()))
{
if (p.isReservedFor(user)) {
placebean.releasePlace(p);
} else if (p.isBuyable() && !p.isTaken()) {
placebean.reservePlace(p, user);
}
else if (p.isBuyable() && !p.isTaken())
{
placebean.reservePlace(p, eventuser.getSelectedUser());
}
p = placebean.find(placeId);
List <Place> thisplace = new ArrayList<Place>();
List<Place> thisplace = new ArrayList<Place>();
thisplace.add(p);
return SimplePlacelistRoot.wrap(thisplace, eventuser.getSelectedUser());
return SimplePlacelistRoot.wrap(thisplace, user);
}
}
......@@ -142,7 +142,7 @@ public class PlaceView extends GenericCDIView {
logger.debug("Did not have enought credits to reserve place! required {} , got {}", price, balance);
} else {
List<PlaceSlot> placeslots = placebean.getFreePlaceslots(user);
List<PlaceSlot> placeslots = placebean.getFreePlaceslots(user, place.getProduct());
canReserve = placeslots.size() > 0;
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!