Commit 6adad270 by Tuomas Riihimäki

Place Slot stuff.

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