Commit 37c5d8d0 by Juho Juopperi

Merge branch 'billpagination' into 'master'

Bill pagination

Implement pagination and search for bill list.
Assembly size bill list may crash browser.. \o/

Also bump primefaces to 5.2

See merge request !288
2 parents a62bd764 3a0d9f84
Showing with 931 additions and 434 deletions
...@@ -27,11 +27,13 @@ import java.util.List; ...@@ -27,11 +27,13 @@ import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.codecrew.moya.bortal.views.BillSummary; import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.exceptions.BillException; import fi.codecrew.moya.exceptions.BillException;
import fi.codecrew.moya.model.Bill; import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave; import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.utilities.SearchResult;
@Local @Local
public interface BillBeanLocal { public interface BillBeanLocal {
...@@ -64,4 +66,8 @@ public interface BillBeanLocal { ...@@ -64,4 +66,8 @@ public interface BillBeanLocal {
Bill addProductToBill(Bill bill, Product product, BigDecimal count); Bill addProductToBill(Bill bill, Product product, BigDecimal count);
SearchResult<Bill> findAll(BillSearchQuery q);
SearchResult<Bill> findUsers(BillSearchQuery q);
} }
...@@ -25,6 +25,7 @@ import java.util.List; ...@@ -25,6 +25,7 @@ import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Feedback; import fi.codecrew.moya.model.Feedback;
import fi.codecrew.moya.model.GameID; import fi.codecrew.moya.model.GameID;
...@@ -37,7 +38,6 @@ import fi.codecrew.moya.model.User; ...@@ -37,7 +38,6 @@ import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.UserApproval; import fi.codecrew.moya.model.UserApproval;
import fi.codecrew.moya.model.UserImage; import fi.codecrew.moya.model.UserImage;
import fi.codecrew.moya.util.MailMessage; import fi.codecrew.moya.util.MailMessage;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery; import fi.codecrew.moya.utilities.SearchQuery;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
......
...@@ -41,4 +41,6 @@ public interface VerkkomaksutFiBeanLocal { ...@@ -41,4 +41,6 @@ public interface VerkkomaksutFiBeanLocal {
Map<Integer, String> getAuthcodeForBills(List<Bill> bills); Map<Integer, String> getAuthcodeForBills(List<Bill> bills);
String getAuthcodeForBill(Bill selectedBill);
} }
/*
* Copyright Codecrew Ry
*
* All rights reserved.
*
* This license applies to any software containing a notice placed by the
* copyright holder. Such software is herein referred to as the Software.
* This license covers modification, distribution and use of the Software.
*
* Any distribution and use in source and binary forms, with or without
* modification is not permitted without explicit written permission from the
* copyright owner.
*
* A non-exclusive royalty-free right is granted to the copyright owner of the
* Software to use, modify and distribute all modifications to the Software in
* future versions of the Software.
*
*/
package fi.codecrew.moya.entitysearch;
import java.util.Map;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.utilities.SearchQuery;
public class BillSearchQuery extends SearchQuery {
private static final long serialVersionUID = -522847840222858146L;
private final Map<String, Object> filters;
private EventUser user;
public BillSearchQuery(int first, int pageSize, String sortField, QuerySortOrder sort, Map<String, Object> filters) {
super((int) first / pageSize, pageSize, sortField, null, sort);
this.filters = filters;
}
public Map<String, Object> getFilters() {
return filters;
}
public EventUser getUser() {
return user;
}
public void setUser(EventUser user) {
this.user = user;
}
}
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* future versions of the Software. * future versions of the Software.
* *
*/ */
package fi.codecrew.moya.util; package fi.codecrew.moya.entitysearch;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
......
...@@ -30,39 +30,31 @@ import javax.annotation.security.DeclareRoles; ...@@ -30,39 +30,31 @@ import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed; import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.EJBAccessException; import javax.ejb.EJBAccessException;
import javax.ejb.EJBException;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beanutil.PdfPrinter; import fi.codecrew.moya.beanutil.PdfPrinter;
import fi.codecrew.moya.bortal.views.BillSummary; import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.enums.apps.BillPermission; import fi.codecrew.moya.enums.apps.BillPermission;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission; import fi.codecrew.moya.enums.apps.SpecialPermission;
import fi.codecrew.moya.exceptions.BillException; import fi.codecrew.moya.exceptions.BillException;
import fi.codecrew.moya.exceptions.BillExceptionAlreadyPaid;
import fi.codecrew.moya.exceptions.BillExceptionNotEnoughtCredits;
import fi.codecrew.moya.facade.BillFacade; import fi.codecrew.moya.facade.BillFacade;
import fi.codecrew.moya.facade.BillLineFacade; import fi.codecrew.moya.facade.BillLineFacade;
import fi.codecrew.moya.facade.EventUserFacade; import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.PlaceSlotFacade; import fi.codecrew.moya.facade.PlaceSlotFacade;
import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.Bill; import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.BillLine; import fi.codecrew.moya.model.BillLine;
import fi.codecrew.moya.model.Discount; import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave; import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.LanEvent; import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.PlaceSlot; import fi.codecrew.moya.model.PlaceSlot;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.ProductFlag; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.GenericFacade;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType; import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
/** /**
...@@ -385,4 +377,21 @@ public class BillBean implements BillBeanLocal { ...@@ -385,4 +377,21 @@ public class BillBean implements BillBeanLocal {
return bill; return bill;
} }
@Override
@RolesAllowed(BillPermission.S_READ_ALL)
public SearchResult<Bill> findAll(BillSearchQuery q) {
return billFacade.find(q);
}
@RolesAllowed(BillPermission.S_VIEW_OWN)
public SearchResult<Bill> findUsers(BillSearchQuery q) {
if (q.getUser() == null) {
q.setUser(permbean.getCurrentUser());
} else if (!permbean.hasPermission(BillPermission.VIEW_OWN) && !permbean.isCurrentUser(q.getUser())) {
throw new EJBAccessException("Tried to fetch bills for wrong user");
}
return billFacade.find(q);
}
} }
...@@ -48,6 +48,7 @@ import javax.imageio.ImageIO; ...@@ -48,6 +48,7 @@ import javax.imageio.ImageIO;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.MapPermission; import fi.codecrew.moya.enums.apps.MapPermission;
import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.binary.Hex;
...@@ -90,7 +91,6 @@ import fi.codecrew.moya.model.User; ...@@ -90,7 +91,6 @@ import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.UserApproval; import fi.codecrew.moya.model.UserApproval;
import fi.codecrew.moya.model.UserImage; import fi.codecrew.moya.model.UserImage;
import fi.codecrew.moya.util.MailMessage; import fi.codecrew.moya.util.MailMessage;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.I18n; import fi.codecrew.moya.utilities.I18n;
import fi.codecrew.moya.utilities.PasswordFunctions; import fi.codecrew.moya.utilities.PasswordFunctions;
import fi.codecrew.moya.utilities.SearchQuery; import fi.codecrew.moya.utilities.SearchQuery;
......
...@@ -363,15 +363,32 @@ public class VerkkomaksutFiBean implements VerkkomaksutFiBeanLocal { ...@@ -363,15 +363,32 @@ public class VerkkomaksutFiBean implements VerkkomaksutFiBeanLocal {
} }
@Override @Override
@RolesAllowed(BillPermission.S_WRITE_ALL)
public Map<Integer, String> getAuthcodeForBills(List<Bill> bills) { public Map<Integer, String> getAuthcodeForBills(List<Bill> bills) {
Map<Integer, String> ret = new HashMap<>(); Map<Integer, String> ret = new HashMap<>();
if (isSvmEnabled() && permbean.hasPermission(BillPermission.WRITE_ALL)) { if (isSvmEnabled() && permbean.hasPermission(BillPermission.WRITE_ALL)) {
String merchantId = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_ID).getTextvalue(); String merchantId = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_ID).getTextvalue();
String merchantPassword = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_PASSWORD).getTextvalue(); String merchantPassword = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_PASSWORD).getTextvalue();
for (Bill b : bills) { for (Bill b : bills) {
ret.put(b.getId(),PasswordFunctions.calculateMd5("&", merchantPassword, merchantId, b.getId().toString()).toUpperCase()); ret.put(b.getId(), PasswordFunctions.calculateMd5("&", merchantPassword, merchantId, b.getId().toString()).toUpperCase());
} }
} }
return ret; return ret;
} }
@Override
@RolesAllowed(BillPermission.S_WRITE_ALL)
public String getAuthcodeForBill(Bill selectedBill) {
if (selectedBill == null) {
return null;
}
final Bill b = billFacade.reload(selectedBill);
if (b == null) {
return null;
}
String merchantId = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_ID).getTextvalue();
String merchantPassword = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_PASSWORD).getTextvalue();
return PasswordFunctions.calculateMd5("&", merchantPassword, merchantId, b.getId().toString()).toUpperCase();
}
} }
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package fi.codecrew.moya.facade; package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
...@@ -27,10 +28,18 @@ import javax.persistence.criteria.CriteriaBuilder; ...@@ -27,10 +28,18 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import fi.codecrew.moya.model.Bill_;
import fi.codecrew.moya.beans.EventBeanLocal; import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.facade.callbacks.bill.BillEventPredicate;
import fi.codecrew.moya.facade.callbacks.bill.BillFilterPredicate;
import fi.codecrew.moya.facade.callbacks.bill.BillOrderPredicate;
import fi.codecrew.moya.facade.callbacks.bill.BillUserPredicate;
import fi.codecrew.moya.model.Bill; import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.Bill_;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
@Stateless @Stateless
@LocalBean @LocalBean
...@@ -44,13 +53,6 @@ public class BillFacade extends IntegerPkGenericFacade<Bill> { ...@@ -44,13 +53,6 @@ public class BillFacade extends IntegerPkGenericFacade<Bill> {
} }
// @Override
// public void create(Bill entity) {
// super.create(entity);
// userfacade.evict(entity.getUser());
//
// }
public Integer getBiggestBillNumber() { public Integer getBiggestBillNumber() {
// SELECT max(b.billNumber) from Bill b where b.event = :event // SELECT max(b.billNumber) from Bill b where b.event = :event
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
...@@ -83,4 +85,17 @@ public class BillFacade extends IntegerPkGenericFacade<Bill> { ...@@ -83,4 +85,17 @@ public class BillFacade extends IntegerPkGenericFacade<Bill> {
} }
public SearchResult<Bill> find(BillSearchQuery queryParams) {
LanEvent event = eventbean.getCurrentEvent();
List<FacadeCallback<Bill>> callbacks = new ArrayList<>();
callbacks.add(new BillEventPredicate(event));
callbacks.add(new BillFilterPredicate(event, queryParams.getFilters()));
callbacks.add(new BillOrderPredicate(queryParams));
callbacks.add(new BillUserPredicate(queryParams.getUser()));
return super.searcher(queryParams, callbacks);
}
} }
...@@ -37,6 +37,7 @@ import org.slf4j.Logger; ...@@ -37,6 +37,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.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.DatabaseHasCompare; import fi.codecrew.moya.enums.DatabaseHasCompare;
import fi.codecrew.moya.enums.DatabaseValueCompare; import fi.codecrew.moya.enums.DatabaseValueCompare;
import fi.codecrew.moya.facade.callbacks.EventLimiter; import fi.codecrew.moya.facade.callbacks.EventLimiter;
...@@ -52,7 +53,6 @@ import fi.codecrew.moya.model.EventUser_; ...@@ -52,7 +53,6 @@ import fi.codecrew.moya.model.EventUser_;
import fi.codecrew.moya.model.LanEvent; import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.User; import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.User_; import fi.codecrew.moya.model.User_;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder; import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.FacadeCallback; import fi.codecrew.moya.utilities.jpa.FacadeCallback;
...@@ -182,8 +182,8 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> { ...@@ -182,8 +182,8 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
} }
From<?, EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class); From<?, EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class, true);
From<?, EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class); From<?, EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class,false);
listCQuery.select(listRoot); listCQuery.select(listRoot);
countCQuery.select(cb.count(countRoot)); countCQuery.select(cb.count(countRoot));
......
...@@ -52,7 +52,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> { ...@@ -52,7 +52,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
private static List<SingularAttribute<User, String>> SEARCHATTRS; private static List<SingularAttribute<User, String>> SEARCHATTRS;
static List<SingularAttribute<User, String>> getAttrlist() { public static List<SingularAttribute<User, String>> getAttrlist() {
if (SEARCHATTRS == null) if (SEARCHATTRS == null)
{ {
ArrayList<SingularAttribute<User, String>> buildAttrs = new ArrayList<SingularAttribute<User, String>>(); ArrayList<SingularAttribute<User, String>> buildAttrs = new ArrayList<SingularAttribute<User, String>>();
......
...@@ -45,7 +45,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC ...@@ -45,7 +45,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates, boolean isFullQuery) {
if (searchval == null || attributes == null || attributes.isEmpty()) { if (searchval == null || attributes == null || attributes.isEmpty()) {
return; return;
} }
......
...@@ -39,7 +39,7 @@ public class EventLimiter implements FacadeCallback<EventUser> { ...@@ -39,7 +39,7 @@ public class EventLimiter implements FacadeCallback<EventUser> {
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates, boolean isFullQuery) {
predicates.add(cb.equal(root.get(EventUser_.event), ev)); predicates.add(cb.equal(root.get(EventUser_.event), ev));
} }
......
...@@ -45,7 +45,7 @@ public class EventUserAccountSaldoPredicate implements FacadeCallback<EventUser> ...@@ -45,7 +45,7 @@ public class EventUserAccountSaldoPredicate implements FacadeCallback<EventUser>
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates, boolean isFullQuery) {
Subquery<BigDecimal> subq = cq.subquery(BigDecimal.class); Subquery<BigDecimal> subq = cq.subquery(BigDecimal.class);
Root<AccountEvent> acRoot = subq.from(AccountEvent.class); Root<AccountEvent> acRoot = subq.from(AccountEvent.class);
subq.where(cb.equal(acRoot.get(AccountEvent_.user), root)); subq.where(cb.equal(acRoot.get(AccountEvent_.user), root));
......
...@@ -46,7 +46,7 @@ public class EventUserCardStateFilter implements FacadeCallback<EventUser> { ...@@ -46,7 +46,7 @@ public class EventUserCardStateFilter implements FacadeCallback<EventUser> {
this.states = statelist; this.states = statelist;
} }
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates, boolean isFullQuery) {
if (states != null && !states.isEmpty()) if (states != null && !states.isEmpty())
{ {
for (CardState s : states) for (CardState s : states)
......
...@@ -32,7 +32,7 @@ import fi.codecrew.moya.utilities.jpa.FacadeCallback; ...@@ -32,7 +32,7 @@ import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public class EventUserPlacegroupPredicate implements FacadeCallback<EventUser> { public class EventUserPlacegroupPredicate implements FacadeCallback<EventUser> {
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates, boolean isFullQuery) {
predicates.add(cb.isNotEmpty(root.get(EventUser_.groupMemberships))); predicates.add(cb.isNotEmpty(root.get(EventUser_.groupMemberships)));
} }
......
...@@ -66,7 +66,7 @@ public class EventUserRolefilter implements FacadeCallback<EventUser> { ...@@ -66,7 +66,7 @@ public class EventUserRolefilter implements FacadeCallback<EventUser> {
return checkedRoles; return checkedRoles;
} }
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates, boolean isFullQuery) {
if (roles != null && !roles.isEmpty()) if (roles != null && !roles.isEmpty())
{ {
HashSet<Integer> roleids = new HashSet<Integer>(); HashSet<Integer> roleids = new HashSet<Integer>();
......
...@@ -41,9 +41,9 @@ public class EventuserToUserWrapper implements FacadeCallback<EventUser> { ...@@ -41,9 +41,9 @@ public class EventuserToUserWrapper implements FacadeCallback<EventUser> {
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates, boolean isFullQuery) {
for (FacadeCallback<User> subcallback : callbacks) { for (FacadeCallback<User> subcallback : callbacks) {
subcallback.exec(cb, cq, root.get(EventUser_.user), predicates); subcallback.exec(cb, cq, root.get(EventUser_.user), predicates, isFullQuery);
} }
} }
......
...@@ -43,7 +43,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa ...@@ -43,7 +43,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates, boolean isFullQuery) {
if (searchstr == null || attributes == null || attributes.isEmpty()) { if (searchstr == null || attributes == null || attributes.isEmpty()) {
return; return;
} }
......
...@@ -53,7 +53,9 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T ...@@ -53,7 +53,9 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates, boolean isFullQuery) {
if (!isFullQuery)
return;
Class<?> rettype = cq.getResultType(); Class<?> rettype = cq.getResultType();
// Check if returntype is entity or are we for example counting results // Check if returntype is entity or are we for example counting results
......
...@@ -61,7 +61,7 @@ public abstract class PathStringSearchPredicateCreator<T extends ModelInterface, ...@@ -61,7 +61,7 @@ public abstract class PathStringSearchPredicateCreator<T extends ModelInterface,
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> path, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> path, List<Predicate> predicates, boolean isFullQuery) {
if (searchstr == null || attributes == null || attributes.isEmpty()) { if (searchstr == null || attributes == null || attributes.isEmpty()) {
return; return;
} }
......
package fi.codecrew.moya.facade.callbacks.bill;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.Bill_;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public class BillEventPredicate implements FacadeCallback<Bill> {
private final LanEvent event;
public BillEventPredicate(LanEvent e) {
this.event = e;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<Bill> root, List<Predicate> predicates, boolean isFullQuery) {
predicates.add(cb.equal(root.get(Bill_.event), event));
}
}
package fi.codecrew.moya.facade.callbacks.bill;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.facade.UserFacade;
import fi.codecrew.moya.facade.callbacks.EventUserSearchPredicate;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.Bill_;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public class BillFilterPredicate extends GenericBillPredicate {
private final Map<String, Object> filters;
private final LanEvent event;
private static final Logger logger = LoggerFactory.getLogger(BillFilterPredicate.class);
public BillFilterPredicate(LanEvent event, Map<String, Object> filters) {
this.filters = filters;
this.event = event;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<Bill> root, List<Predicate> predicates, boolean isFullQuery) {
filterloop: for (Entry<String, Object> f : filters.entrySet()) {
logger.info("f {} {}", f.getKey(), f.getValue());
SingularAttribute<? super Bill, ?> field = BILL_SEARCH_FIELDS.get(f.getKey());
Object val = f.getValue();
switch (f.getKey()) {
case "sentDate": {
// Not implemented, at least yet..
continue filterloop;
}
case "payer": {
logger.info("Searching user with {}", val);
EventUserSearchPredicate userSearch = new EventUserSearchPredicate(val.toString(), UserFacade.getAttrlist());
userSearch.exec(cb, cq, root.get(Bill_.user), predicates, isFullQuery);
continue filterloop;
}
case "referenceNumber": {
if (f.getValue() == null || f.getValue().toString().length() < 2) {
continue;
}
try {
int ref = Bill.getBillnrFromReference(event, Integer.valueOf(f.getValue().toString()));
if (ref < 0)
continue;
val = Integer.valueOf(ref);
} catch (Exception e) {
logger.info("Exception while parsing referencenumber {}", val);
continue;
}
break;
}
default:
}
predicates.add(cb.equal(root.get(field), val));
}
}
}
package fi.codecrew.moya.facade.callbacks.bill;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.EventUser_;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.User_;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
public class BillOrderPredicate extends GenericBillPredicate {
private final String sort;
private QuerySortOrder dir;
private static final Logger logger = LoggerFactory.getLogger(BillOrderPredicate.class);
public BillOrderPredicate(BillSearchQuery queryParams) {
this.sort = queryParams.getSort();
this.dir = queryParams.getSortDirection();
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<Bill> root, List<Predicate> predicates, boolean isFullQuery) {
if (!isFullQuery || dir == null || sort == null) {
return;
}
SingularAttribute<? super Bill, ?> s = BILL_SEARCH_FIELDS.get(sort);
if (s == null) {
logger.info("Not found bill sort!: {} dir {}", sort, dir);
return;
}
Path<?> path = root.get(s);
if (s.getJavaMember().getDeclaringClass().equals(EventUser.class)) {
path = ((Path<EventUser>) path).get(EventUser_.user).get(User_.login);
}
Order order = null;
switch (dir) {
case ASCENDING:
order = cb.asc(path);
break;
case DESCENDING:
order = cb.desc(path);
break;
default:
return;
}
cq.orderBy(order);
}
}
package fi.codecrew.moya.facade.callbacks.bill;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.Bill_;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public class BillUserPredicate implements FacadeCallback<Bill> {
private final EventUser user;
public BillUserPredicate(EventUser user) {
this.user = user;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<Bill> root, List<Predicate> predicates, boolean isFullQuery) {
if (user != null) {
predicates.add(cb.equal(root.get(Bill_.user), user));
}
}
}
package fi.codecrew.moya.facade.callbacks.bill;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.metamodel.SingularAttribute;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.Bill_;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public abstract class GenericBillPredicate implements FacadeCallback<Bill> {
public static final Map<String, SingularAttribute<? super Bill, ?>> BILL_SEARCH_FIELDS;
static {
HashMap<String, SingularAttribute<? super Bill, ?>> m = new HashMap<>();
m.put("address", Bill_.addr1);
m.put("billNumber", Bill_.billNumber);
m.put("user", Bill_.user);
m.put("sentDate", Bill_.sentDate);
m.put("payer", Bill_.user);
m.put("billNumber", Bill_.billNumber);
m.put("referenceNumber", Bill_.billNumber);
m.put("id", Bill_.id);
BILL_SEARCH_FIELDS = Collections.unmodifiableMap(m);
}
}
...@@ -185,6 +185,10 @@ public class Bill extends GenericEntity { ...@@ -185,6 +185,10 @@ public class Bill extends GenericEntity {
return null; return null;
} }
public static Integer getBillnrFromReference(LanEvent event, Integer reference) {
return (reference / 10) - event.getReferenceNumberBase();
}
public Integer getReferenceNumber() public Integer getReferenceNumber()
{ {
return BillUtils.createReferenceNumber(getReferenceNumberBase()); return BillUtils.createReferenceNumber(getReferenceNumberBase());
......
...@@ -34,7 +34,6 @@ import fi.codecrew.moya.utilities.jpa.ModelInterface; ...@@ -34,7 +34,6 @@ import fi.codecrew.moya.utilities.jpa.ModelInterface;
public class GenericEntity extends EntityEquals implements ModelInterface, EntityMeta { public class GenericEntity extends EntityEquals implements ModelInterface, EntityMeta {
private static final long serialVersionUID = -9041737052951021560L; private static final long serialVersionUID = -9041737052951021560L;
public static final String ID_COLUMN = "id";
@Id @Id
@Column(name = ID_COLUMN, nullable = false, updatable = false) @Column(name = ID_COLUMN, nullable = false, updatable = false)
......
../pom.xml
\ No newline at end of file
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fi.codecrew.moya</groupId>
<artifactId>moya</artifactId>
<name>Moya Online Youth Accumulator</name>
<packaging>pom</packaging>
<version>1.2-SNAPSHOT</version>
<modules>
<module>moya-parent</module>
<module>moya-authmodule</module>
<module>moya-cardprinter</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java-version>1.8</java-version>
<!-- plugin versions -->
<ejb-plugin-version>2.3</ejb-plugin-version>
<war-plugin-version>2.4</war-plugin-version>
<ear-plugin-version>2.9</ear-plugin-version>
<compiler-plugin-version>3.2</compiler-plugin-version>
<!-- dependency versions -->
<javaee-api-version>7.0</javaee-api-version>
<!-- EJB spec version -->
<ejb-spec-version>3.2</ejb-spec-version>
<swagger.version>1.3.12</swagger.version>
<slf4j.version>1.7.12</slf4j.version>
<logback.version>1.1.3</logback.version>
<testng.version>6.8.21</testng.version>
<javamelody.version>1.55.0</javamelody.version>
<primefaces.version>5.1</primefaces.version>
</properties>
<url>http://codecrew.fi</url>
<organization>
<name>Codecrew RY</name>
<url>http://codecrew.fi</url>
</organization>
<scm>
<connection>scm:git@gitlab.codecrew.fi:codecrew/moya.git</connection>
<url>http://gitlab.codecrew.fi</url>
</scm>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin-version}</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>iudex</id>
<url>http://iudex.fi/maven/</url>
</repository>
<repository>
<id>jvnet-nexus-releases</id>
<name>jvnet-nexus-releases</name>
<url>https://maven.java.net/content/repositories/releases/</url>
</repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
</repository>
<repository>
<id>apache.snapshots</id>
<url>http://repository.apache.org/snapshots/</url>
</repository>
<repository>
<id>clojars.org</id>
<url>http://clojars.org/repo</url>
</repository>
</repositories>
</project>
...@@ -47,6 +47,10 @@ public class SearchQuery implements Serializable { ...@@ -47,6 +47,10 @@ public class SearchQuery implements Serializable {
this.sortDirection = direction; this.sortDirection = direction;
} }
public int getFirstElement() {
return page * pagesize;
}
public int getPage() { public int getPage() {
return page; return page;
} }
......
...@@ -30,5 +30,5 @@ public interface FacadeCallback<C extends ModelInterface> { ...@@ -30,5 +30,5 @@ public interface FacadeCallback<C extends ModelInterface> {
// void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root, // void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root,
// List<Predicate> predicates); // List<Predicate> predicates);
void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<C> root, List<Predicate> predicates); void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<C> root, List<Predicate> predicates, boolean isFullQuery);
} }
...@@ -39,9 +39,6 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -39,9 +39,6 @@ public abstract class GenericFacade<C extends ModelInterface> {
private final Class<C> entClass; private final Class<C> entClass;
// private static final Logger logger =
// LoggerFactory.getLogger(GenericFacade.class);
public GenericFacade(Class<C> entityClass) { public GenericFacade(Class<C> entityClass) {
this.entClass = entityClass; this.entClass = entityClass;
} }
...@@ -115,35 +112,6 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -115,35 +112,6 @@ public abstract class GenericFacade<C extends ModelInterface> {
* vain ko. tapahtumaan / käyttäjään / muuhun olioon liittyvät Jos oikeasti * vain ko. tapahtumaan / käyttäjään / muuhun olioon liittyvät Jos oikeasti
* tarpeellinen luo funktio facadeen! * tarpeellinen luo funktio facadeen!
*/ */
// @Deprecated
// public List<C> findAll() {
// return findAll(null);
// }
//
// @Deprecated
// public List<C> findAll(String sort) {
// return findAll(0, 0, sort);
// }
//
// @Deprecated
// public List<C> findRange(int[] range) {
// CriteriaQuery<C> cq =
// getEm().getCriteriaBuilder().createQuery(getEntityClass());
// cq.select(cq.from(getEntityClass()));
// TypedQuery<C> q = getEm().createQuery(cq);
// q.setMaxResults(range[1] - range[0]);
// q.setFirstResult(range[0]);
// return q.getResultList();
// }
// @Deprecated
// public long count() {
// CriteriaQuery<Long> cq =
// getEm().getCriteriaBuilder().createQuery(Long.class);
// Root<C> rt = cq.from(getEntityClass());
// cq.select(getEm().getCriteriaBuilder().count(rt));
// TypedQuery<Long> q = getEm().createQuery(cq);
// return q.getSingleResult();
// }
protected static <K> K getSingleNullableResult(TypedQuery<K> q) { protected static <K> K getSingleNullableResult(TypedQuery<K> q) {
K ret = null; K ret = null;
...@@ -155,21 +123,6 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -155,21 +123,6 @@ public abstract class GenericFacade<C extends ModelInterface> {
return ret; return ret;
} }
// @Deprecated
// protected List<C> search(String query, String[] fields, String
// orderfield) {
// return search(0, 0, query, fields, orderfield);
// }
//
// @Deprecated
// protected SearchResult<C> searcher(int page, int pagesize, String query,
// String[] fields, String orderfield) {
// SearchResult<C> ret = new SearchResult<C>();
// ret.setResults(search(page, pagesize, query, fields, orderfield));
// ret.setResultcount(searchCount(query, fields));
// return ret;
// }
// Le fu... Tuota.. generics ei hanskaa '...' operaattoria.. tehdään siis // Le fu... Tuota.. generics ei hanskaa '...' operaattoria.. tehdään siis
// näin... :( // näin... :(
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) { protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) {
...@@ -209,29 +162,28 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -209,29 +162,28 @@ public abstract class GenericFacade<C extends ModelInterface> {
CriteriaQuery<C> listCQuery = cb.createQuery(getEntityClass()); CriteriaQuery<C> listCQuery = cb.createQuery(getEntityClass());
CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class); CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);
searchCallbacks(listCQuery, list); searchCallbacks(listCQuery, list, true);
Path<C> countRoot = searchCallbacks(countCQuery, list); Path<C> countRoot = searchCallbacks(countCQuery, list, false);
countCQuery.select(cb.count(countRoot)); countCQuery.select(cb.count(countRoot.get(ModelInterface.ID_COLUMN)));
TypedQuery<Long> countQ = getEm().createQuery(countCQuery); TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
TypedQuery<C> listQ = getEm().createQuery(listCQuery); TypedQuery<C> listQ = getEm().createQuery(listCQuery);
if (search.getPagesize() > 0) { if (search.getPagesize() > 0) {
listQ.setFirstResult(search.getPage() * search.getPagesize()); listQ.setFirstResult(search.getPage() * search.getPagesize());
listQ.setMaxResults(search.getPagesize()); listQ.setMaxResults(search.getPagesize());
} }
return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult()); return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult());
} }
protected From<?, C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) { protected From<?, C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list, boolean isFullQuery) {
return searchCallbacks(cq, list, getEntityClass()); return searchCallbacks(cq, list, getEntityClass(), isFullQuery);
} }
protected <T extends ModelInterface> From<?, T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz) { protected <T extends ModelInterface> From<?, T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz, boolean isFullQuery) {
Root<T> root = cq.from(clazz); Root<T> root = cq.from(clazz);
ArrayList<Predicate> predicates = handlePredicates(cq, list, root); ArrayList<Predicate> predicates = handlePredicates(cq, list, root, isFullQuery);
if (!predicates.isEmpty()) { if (!predicates.isEmpty()) {
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]); Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
cq.where(preds); cq.where(preds);
...@@ -241,91 +193,20 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -241,91 +193,20 @@ public abstract class GenericFacade<C extends ModelInterface> {
} }
protected <T extends ModelInterface> ArrayList<Predicate> handlePredicates(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, From<?, T> root) { protected <T extends ModelInterface> ArrayList<Predicate> handlePredicates(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, From<?, T> root, boolean isFullQuery) {
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
ArrayList<Predicate> predicates = new ArrayList<Predicate>(); ArrayList<Predicate> predicates = new ArrayList<Predicate>();
for (FacadeCallback<T> fc : list) { for (FacadeCallback<T> fc : list) {
if (fc != null) { if (fc != null) {
fc.exec(cb, cq, root, predicates); fc.exec(cb, cq, root, predicates, isFullQuery);
} }
} }
return predicates; return predicates;
} }
// @Deprecated
// protected List<C> search(int page, int pagesize, String query, String[]
// fields, String orderfield) {
//
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<C> cq = cb.createQuery(getEntityClass());
//
// Root<C> root = cq.from(getEntityClass());
//
// addPredicates(cq, root, query, fields);
//
// TypedQuery<C> q = getEm().createQuery(cq);
// if (pagesize > 0) {
// q.setFirstResult(page * pagesize);
// q.setMaxResults(pagesize);
//
// }
// List<C> ret = q.getResultList();
// return ret;
// }
//
// @Deprecated
// protected void addPredicates(CriteriaQuery<?> cq, Root<C> root, String
// query, String[] fields) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// if (query != null && !query.isEmpty() && fields != null && fields.length
// > 0) {
// List<Predicate> preds = new ArrayList<Predicate>();
// for (String field : fields) {
// Path<String> rootfield = root.get(field);
// preds.add(cb.like(cb.lower(rootfield), query));
// }
// cq.where(cb.or(preds.toArray(new Predicate[preds.size()])));
// }
//
// }
//
// @Deprecated
// protected long searchCount(String query, String[] fields) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<Long> cq = cb.createQuery(Long.class);
// Root<C> root = cq.from(getEntityClass());
//
// addPredicates(cq, root, query, fields);
// cq.select(getEm().getCriteriaBuilder().count(root));
//
// TypedQuery<Long> q = getEm().createQuery(cq);
// return q.getSingleResult();
// }
// @Deprecated
// public List<C> findAll(int page, int pagesize, String sort) {
// CriteriaBuilder cb = getEm().getCriteriaBuilder();
// CriteriaQuery<C> cq = cb.createQuery(getEntityClass());
// Root<C> root = cq.from(getEntityClass());
//
// if (sort != null) {
// cq.orderBy(cb.asc(root.get(sort)));
// }
//
// cq.select(cq.from(getEntityClass()));
// TypedQuery<C> q = getEm().createQuery(cq);
//
// if (pagesize > 0) {
// q.setFirstResult(page * pagesize);
// q.setMaxResults(pagesize);
// }
//
// return q.getResultList();
// }
/** /**
* Synchronize the persistence context to the underlying database. * Synchronize the persistence context to the underlying database.
* *
......
...@@ -21,6 +21,7 @@ package fi.codecrew.moya.utilities.jpa; ...@@ -21,6 +21,7 @@ package fi.codecrew.moya.utilities.jpa;
import java.io.Serializable; import java.io.Serializable;
public interface ModelInterface extends Serializable { public interface ModelInterface extends Serializable {
public static final String ID_COLUMN = "id";
Integer getId(); Integer getId();
......
<!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" <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:bills="http://java.sun.com/jsf/composite/cditools/bills" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:bills="http://java.sun.com/jsf/composite/cditools/bills" xmlns:p="http://primefaces.org/ui">
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}">
<f:metadata> <f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" /> <f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{billListView.initUsersBills}" /> <f:event type="preRenderView" listener="#{billListView.initUsersBills}" />
</f:metadata> </f:metadata>
<ui:define name="content"> <ui:define name="content">
<bills:list /> <h:form id="billList" styleClass="moya_datatable3">
<p:outputPanel rendered="#{placeGroupView.useEticket}" >
<p:dataTable sortBy="#{user.sentDateTime}" sortOrder="descending" sortField="sentDate" paginator="true" lazy="true" rows="100" styleClass="bordertable" id="billList" value="#{billListView.lazyBillList}" var="bill"
rowStyleClass="#{bill.expired ? 'expired' : (bill.paidDate != null ? 'paid' : null)}" expandedRow="true">
<p:column >
<f:facet name="header">
<h:outputText value="${i18n['bill.sentDate']}" />
</f:facet>
<h:outputText value="#{bill.sentDateTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column >
<f:facet name="header">
<h:outputText value="${i18n['bill.id']}" />
</f:facet>
<h:outputText value="#{bill.id}" />
</p:column>
<p:column >
<f:facet name="header">
<h:outputText value="${i18n['bill.billNumber']}" />
</f:facet>
<h:outputText value="#{bill.billNumber}" />
</p:column>
<p:column >
<f:facet name="header">
<h:outputText value="${i18n['bill.referencenumber']}" />
</f:facet>
<h:outputText value="#{bill.referenceNumberBase}">
<f:converter binding="#{referenceNumberConverter}" />
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.totalPrice']}" />
</f:facet>
<h:outputText value="#{bill.totalPrice()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" locale="#{sessionHandler.locale}" />
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.vat']}" />
</f:facet>
<h:outputText value="#{bill.totalVat()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" locale="#{sessionHandler.locale}" />
</h:outputText>
</p:column>
<p:column rendered="#{(!bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING')) or billListView.canWriteBill}">
<ui:fragment>
<a href="#{request.contextPath}/PrintBill?billid=#{bill.id}" target="_blank">#{i18n['bill.printBill']}</a>
</ui:fragment>
</p:column>
<p:column>
<h:link outcome="/bill/showBill" value="#{i18n['bill.show']}">
<f:param name="billid" value="#{bill.id}" />
</h:link>
</p:column>
<p:rowExpansion>
<p:dataList value="#{bill.billLines}" var="line">
<h:outputText value="#{line.name}" />:
<h:outputText value="#{line.quantity}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="0" />
</h:outputText>
</p:dataList>
</p:rowExpansion>
</p:dataTable>
</h:form>
<p:outputPanel rendered="#{placeGroupView.useEticket}">
<p> <p>
<p:button outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" /> <p:button outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" />
</p> </p>
</p:outputPanel> </p:outputPanel>
<br /><br /> <br />
<br />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<!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" <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:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui">
xmlns:h="http://java.sun.com/jsf/html" xmlns:bills="http://java.sun.com/jsf/composite/cditools/bills"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:body> <h:body>
<ui:composition template="#{sessionHandler.template}"> <ui:composition template="#{sessionHandler.template}">
<f:metadata> <f:metadata>
<f:event type="preRenderView" listener="#{billListView.initAllBills}" /> <f:event type="preRenderView" listener="#{billListView.initAllBills}" />
</f:metadata> </f:metadata>
<ui:define name="content"> <ui:define name="content">
<bills:list />
<h:form rendered="#{billListView.canWriteBill}">
<p:commandButton ajax="false" action="#{billListView.showPayButtonsAction()}" value="#{i18n['bill.showPayButtons']}" />
</h:form>
<h:form id="billList" styleClass="moya_datatable3">
<p:dataTable sortBy="#{user.sentDateTime}" sortOrder="descending" sortField="sentDate" paginator="true" lazy="true" rows="100" styleClass="bordertable" id="billList" value="#{billListView.lazyBillList}" var="bill"
rowStyleClass="#{bill.expired ? 'expired' : (bill.paidDate != null ? 'paid' : null)}">
<p:column width="35">
<p:commandButton ajax="true" update=":billInfoPanel" oncomplete="PF('billInfoPanel').show('#{component.clientId}');" icon="ui-icon-search" title="View">
<f:setPropertyActionListener value="#{bill}" target="#{billListView.selectedBill}" />
</p:commandButton>
</p:column>
<p:column id="payerCol" field="payer" filterBy="#{bill.user.user.id}" sortBy="#{bill.user.user.login}">
<f:facet name="header">
<h:outputText value="#{i18n['bill.payer']}" />
</f:facet>
<h:link outcome="/useradmin/edit" value="#{bill.user.user.login} #{bill.addr1}">
<f:param name="userid" value="#{bill.user.user.id}" />
</h:link>
</p:column>
<p:column field="sentDate" sortBy="#{bill.sentDateTime}">
<f:facet name="header">
<h:outputText value="${i18n['bill.sentDate']}" />
</f:facet>
<h:outputText value="#{bill.sentDateTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column field="id" filterBy="#{bill.id}" sortBy="#{bill.id}">
<f:facet name="header">
<h:outputText value="${i18n['bill.id']}" />
</f:facet>
<h:outputText value="#{bill.id}" />
</p:column>
<p:column field="billNumber" filterBy="#{bill.billNumber}" sortBy="#{bill.billNumber}">
<f:facet name="header">
<h:outputText value="${i18n['bill.billNumber']}" />
</f:facet>
<h:outputText value="#{bill.billNumber}" />
</p:column>
<p:column field="referenceNumber" filterBy="#{bill.billNumber}" sortBy="#{bill.billNumber}">
<f:facet name="header">
<h:outputText value="${i18n['bill.referencenumber']}" />
</f:facet>
<h:outputText value="#{bill.referenceNumberBase}">
<f:converter binding="#{referenceNumberConverter}" />
</h:outputText>
</p:column>
<!--
<p:column headerText="#{i18n['bill.notes']}" rendered="#{productShopView.gatherBillInfo}">
<h:outputText value="#{bill.notes}" />
</p:column>
-->
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.totalPrice']}" />
</f:facet>
<h:outputText value="#{bill.totalPrice()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" locale="#{sessionHandler.locale}" />
</h:outputText>
</p:column>
<p:column>
<h:link outcome="/bill/showBill" value="#{i18n['bill.show']}">
<f:param name="billid" value="#{bill.id}" />
</h:link>
<br />
<h:link outcome="/bill/edit" value="#{i18n['bill.edit']}">
<f:param name="billid" value="#{bill.id}" />
</h:link>
<br />
<a href="#{request.contextPath}/PrintBill?billid=#{bill.id}" target="_blank">#{i18n['bill.printBill']}</a>
</p:column>
<p:column>
<p:commandButton update="billList" onerror="location.reload(true)" rendered="#{bill.paidDate == null and billListView.showPayButtons}" action="#{billListView.markPaid()}" value="#{i18n['bill.markPaid']}" />
<h:outputText rendered="#{bill.paidDate != null}" value="#{i18n['bill.isPaid']}" />
<h:outputText rendered="#{bill.paidDate == null and !billListView.showPayButtons}" value="#{i18n['bill.isNotPaid']}" />
</p:column>
</p:dataTable>
</h:form>
<p:overlayPanel appendToBody="true" id="billInfoPanel" dynamic="false" widgetVar="billInfoPanel" showEffect="fade" hideEffect="fade" dismissable="true" showCloseIcon="true" style="width:800px;min-height:80px">
<h:panelGrid columns="2">
<h:outputText value="${i18n['bill.payer']}: " />
<h:outputText value="#{billListView.selectedBill.user.wholeName}" />
<h:outputText value="${i18n['bill.id']}: " />
<h:outputText value="#{billListView.selectedBill.id}" />
<h:outputText value="${i18n['bill.vat']}: " />
<h:outputText value="#{billListView.selectedBill.totalVat()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" locale="#{sessionHandler.locale}" />
</h:outputText>
<h:outputText value="${i18n['bill.totalPrice']}: " />
<h:outputText value="#{billListView.selectedBill.totalPrice()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" locale="#{sessionHandler.locale}" />
</h:outputText>
</h:panelGrid>
<ui:fragment rendered="#{! empty billListView.paytrailMerchantId}">
<form id="paymentcheckform" target="_blank" action="https://payment.paytrail.com/check-payment" method="post">
<input name="MERCHANT_ID" type="hidden" value="#{billListView.paytrailMerchantId}" />
<input id="paymentordernr" name="ORDER_NUMBER" type="hidden" value="#{billListView.selectedBill.id}" />
<input id="paymentauthcode" name="AUTHCODE" type="hidden" value="#{billListView.paytrailAuthcodeForSelected}" />
<input name="VERSION" type="hidden" value="2" />
<input name="submit" type="submit" value="#{i18n['bill.checkPaytrail']}" />
</form>
</ui:fragment>
<p:dataTable value="#{billListView.selectedBill.billLines}" var="line">
<p:column width="49%" headerText="#{i18n['billine.product']}">
<h:outputText value="#{line.name}" />:
</p:column>
<p:column width="17%" headerText="#{i18n['billine.quantity']}">
<h:outputText value="#{line.quantity}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:outputText>
</p:column>
<p:column width="17%" headerText="#{i18n['billine.linePrice']}">
<h:outputText value="#{line.linePrice}">
<f:convertNumber currencyCode="EUR" type="currency" minFractionDigits="0" maxFractionDigits="2" />
</h:outputText>
</p:column>
<p:column width="17%" headerText="#{i18n['billine.vat']}">
<h:outputText value="#{line.lineVat}">
<f:convertNumber currencyCode="EUR" type="currency" minFractionDigits="0" maxFractionDigits="2" />
</h:outputText>
</p:column>
</p:dataTable>
</p:overlayPanel>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"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"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
</composite:interface>
<composite:implementation>
<h:outputText rendered="#{billListView.bills.rowCount le 0}"
value="#{i18n['bills.noBills']}" />
<h:form rendered="#{billListView.canWriteBill}">
<p:commandButton ajax="false"
action="#{billListView.showPayButtonsAction()}"
value="#{i18n['bill.showPayButtons']}" />
</h:form>
<h:form rendered="#{billListView.bills.rowCount gt 0}" id="billList" styleClass="moya_datatable3">
<p:dataTable styleClass="bordertable" id="billList"
value="#{billListView.bills}" var="bill"
rowStyleClass="#{bill.expired ? 'expired' : (bill.paidDate != null ? 'paid' : null)}"
expandedRow="true">
<p:column style="width:16px"
rendered="#{billListView.bills.rowCount lt 20}">
<p:rowToggler />
</p:column>
<p:column rendered="#{billListView.canWriteBill}">
<f:facet name="header">
<h:outputText value="#{i18n['bill.payer']}" />
</f:facet>
<h:link rendered="#{billListView.canWriteBill}" outcome="/useradmin/edit" value="#{bill.user.user.login} #{bill.addr1}">
<f:param name="userid" value="#{bill.user.user.id}" />
</h:link>
<h:outputText rendered="#{not billListView.canWriteBill}"
value="#{bill.addr1}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.sentDate']}" />
</f:facet>
<h:outputText value="#{bill.sentDateTime}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}"
timeZone="#{sessionHandler.timezone}" />
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.id']}" />
</f:facet>
<h:outputText value="#{bill.id}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.billNumber']}" />
</f:facet>
<h:outputText value="#{bill.billNumber}" />
</p:column>
<p:column rendered="#{billListView.canWriteBill}">
<f:facet name="header">
<h:outputText value="${i18n['bill.referencenumber']}" />
</f:facet>
<h:outputText value="#{bill.referenceNumberBase}">
<f:converter binding="#{referenceNumberConverter}" />
</h:outputText>
</p:column>
<!--
<p:column headerText="#{i18n['bill.notes']}" rendered="#{productShopView.gatherBillInfo}">
<h:outputText value="#{bill.notes}" />
</p:column>
-->
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.totalPrice']}" />
</f:facet>
<h:outputText value="#{bill.totalPrice()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2"
minFractionDigits="2" type="currency"
locale="#{sessionHandler.locale}" />
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.vat']}" />
</f:facet>
<h:outputText value="#{bill.totalVat()}">
<f:convertNumber currencyCode="EUR" maxFractionDigits="2"
minFractionDigits="2" type="currency"
locale="#{sessionHandler.locale}" />
</h:outputText>
</p:column>
<p:column
rendered="#{(!bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING')) or billListView.canWriteBill}">
<ui:fragment>
<a href="#{request.contextPath}/PrintBill?billid=#{bill.id}"
target="_blank">#{i18n['bill.printBill']}</a>
</ui:fragment>
</p:column>
<p:column>
<h:link outcome="/bill/showBill" value="#{i18n['bill.show']}">
<f:param name="billid" value="#{bill.id}" />
</h:link>
</p:column>
<p:column rendered="#{billListView.canWriteBill}">
<h:link outcome="/bill/edit" value="#{i18n['bill.edit']}">
<f:param name="billid" value="#{bill.id}" />
</h:link>
</p:column>
<p:column rendered="#{billListView.canWriteBill}">
<p:commandButton update="billList" onerror="location.reload(true)"
rendered="#{bill.paidDate == null and billListView.showPayButtons}"
action="#{billListView.markPaid()}"
value="#{i18n['bill.markPaid']}" />
<h:outputText rendered="#{bill.paidDate != null}"
value="#{i18n['bill.isPaid']}" />
<h:outputText
rendered="#{bill.paidDate == null and !billListView.showPayButtons}"
value="#{i18n['bill.isNotPaid']}" />
</p:column>
<p:column rendered="#{!billListView.canWriteBill}">
<h:outputText rendered="#{bill.paidDate != null}"
value="#{i18n['bill.isPaid']}" />
<h:outputText rendered="#{bill.paidDate == null}"
value="#{i18n['bill.isNotPaid']}" />
</p:column>
<p:column rendered="#{billListView.canWriteBill and not empty billListView.paytrailMerchantId}">
<button onclick="showPaymentstatus('#{bill.id}'); return false;"><h:outputText value="#{i18n['bill.checkPaytrail']}" /></button>
</p:column>
<p:rowExpansion rendered="#{billListView.bills.rowCount lt 20}">
<p:dataList value="#{bill.billLines}" var="line">
<h:outputText value="#{line.name}" />:
<h:outputText value="#{line.quantity}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="0" />
</h:outputText>
</p:dataList>
</p:rowExpansion>
</p:dataTable>
</h:form>
<form id="paymentcheckform" target="_blank" action="https://payment.paytrail.com/check-payment" method="post">
<input name="MERCHANT_ID" type="hidden" value="#{billListView.paytrailMerchantId}" />
<input id="paymentordernr" name="ORDER_NUMBER" type="hidden" value="" />
<input id="paymentauthcode" name="AUTHCODE" type="hidden" value="" />
<input name="VERSION" type="hidden" value="2" />
</form>
<script type="text/javascript" >
function showPaymentstatus(id) {
$("#paymentordernr").val(id);
$("#paymentauthcode").val(authcodes[id]);
$("#paymentcheckform").submit();
return false;
}
var authcodes ={};
<ui:repeat var="ac" value="#{billListView.paytrailAuthcodes}">
<h:outputText value="authcodes['#{ac.key}'] ='#{ac.value}';" />
</ui:repeat>
</script>
</composite:implementation>
</html>
<?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: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:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" xmlns:tools="http://java.sun.com/jsf/composite/tools"> xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface> <composite:interface>
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" /> <h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<p:dataTable id="user" value="#{userSearchView.userModel}" styleClass="moya_datatable4" rows="100" var="wra" paginator="true" lazy="true"> <p:dataTable id="user" value="#{userSearchView.userModel}" styleClass="moya_datatable4" rows="100" var="wra" paginator="true" lazy="true" sortBy="sentDate" sortOrder="descending">
<p:column sortBy="#{wra.user.nick}" headerText="#{i18n['user.nick']}"> <p:column sortBy="#{wra.user.nick}" headerText="#{i18n['user.nick']}">
<h:outputText value="#{(empty wra.user.nick)?'----':wra.user.nick}" /> <h:outputText value="#{(empty wra.user.nick)?'----':wra.user.nick}" />
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<configuration> <configuration>
<warSourceDirectory>WebContent</warSourceDirectory> <warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml> <failOnMissingWebXml>false</failOnMissingWebXml>
<packagingIncludes>WEB-INF/lib/moya-restpojo*,WEB-INF/lib/primefaces*,WEB-INF/lib/*-1.0.8.jar,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*,swagger/**</packagingIncludes> <packagingIncludes>WEB-INF/lib/moya-restpojo*,WEB-INF/lib/primefaces*,WEB-INF/lib/all-themes-*.jar,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*,swagger/**</packagingIncludes>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
...@@ -32,10 +32,9 @@ ...@@ -32,10 +32,9 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.primefaces.extensions</groupId> <groupId>org.primefaces.themes</groupId>
<artifactId>all-themes</artifactId> <artifactId>all-themes</artifactId>
<version>1.0.8</version> <version>${primefaces.themeversion}</version>
<type>pom</type>
</dependency> </dependency>
<dependency> <dependency>
......
...@@ -20,26 +20,29 @@ package fi.codecrew.moya.rest; ...@@ -20,26 +20,29 @@ package fi.codecrew.moya.rest;
import java.io.IOException; import java.io.IOException;
import java.security.Principal; import java.security.Principal;
import java.util.Collection;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.print.attribute.standard.Media;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part; import javax.servlet.http.Part;
import javax.ws.rs.*; import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status;
import fi.codecrew.moya.beans.*;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -47,15 +50,28 @@ import com.wordnik.swagger.annotations.Api; ...@@ -47,15 +50,28 @@ import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation; import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam; import com.wordnik.swagger.annotations.ApiParam;
import fi.codecrew.moya.beans.CardTemplateBeanLocal;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.ReaderBeanLocal;
import fi.codecrew.moya.beans.TicketBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.UserImage;
import fi.codecrew.moya.rest.pojo.userinfo.v1.EventUserRestPojo; import fi.codecrew.moya.rest.pojo.userinfo.v1.EventUserRestPojo;
import fi.codecrew.moya.rest.pojo.userinfo.v1.PrintedCardRestPojo; import fi.codecrew.moya.rest.pojo.userinfo.v1.PrintedCardRestPojo;
import fi.codecrew.moya.rest.pojo.userinfo.v1.SimpleEventuserRoot; import fi.codecrew.moya.rest.pojo.userinfo.v1.SimpleEventuserRoot;
import fi.codecrew.moya.rest.pojo.userinfo.v1.UserReservationPlacePojo; import fi.codecrew.moya.rest.pojo.userinfo.v1.UserReservationPlacePojo;
import fi.codecrew.moya.rest.pojo.userinfo.v1.UserReservationRoot; import fi.codecrew.moya.rest.pojo.userinfo.v1.UserReservationRoot;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder; import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import sun.security.provider.certpath.OCSPResponse;
@RequestScoped @RequestScoped
@Path("/user") @Path("/user")
......
...@@ -96,28 +96,25 @@ public class PlacemapRestViewV1 { ...@@ -96,28 +96,25 @@ public class PlacemapRestViewV1 {
} }
@GET @GET
@Path("{id}/hilightedPlaces/{userid}") @Path("{id}/hilightedPlaces/{userid}")
public Response getHilightedPlaces(@PathParam("id") Integer mapId, @PathParam("userid") Integer userId) public Response getHilightedPlaces(@PathParam("id") Integer mapId, @PathParam("userid") Integer userId)
{ {
EventMap map = placebean.findMap(mapId); EventMap map = placebean.findMap(mapId);
if(!permbean.hasPermission(UserPermission.VIEW_ALL)) { if (!permbean.hasPermission(UserPermission.VIEW_ALL)) {
return Response.status(Response.Status.FORBIDDEN).entity("Try to login first!").build(); return Response.status(Response.Status.FORBIDDEN).entity("Try to login first!").build();
} }
EventUser user = userbean.findByUserId(userId,false); EventUser user = userbean.findByUserId(userId, false);
if (user == null) { if (user == null) {
return Response.status(Response.Status.BAD_REQUEST).entity("No User found for id: "+userId).build(); return Response.status(Response.Status.BAD_REQUEST).entity("No User found for id: " + userId).build();
} }
return Response.ok(PojoUtils.parseSimplePlaces(map.getPlaces(), user, permbean.hasPermission(UserPermission.VIEW_ALL), true)).build(); return Response.ok(PojoUtils.parseSimplePlaces(map.getPlaces(), user, permbean.hasPermission(UserPermission.VIEW_ALL), true)).build();
} }
@GET @GET
@Path("{id}/places") @Path("{id}/places")
public SimplePlacelistRoot getPlaces(@PathParam("id") Integer mapId) public SimplePlacelistRoot getPlaces(@PathParam("id") Integer mapId)
......
...@@ -20,28 +20,32 @@ package fi.codecrew.moya.web.cdiview.shop; ...@@ -20,28 +20,32 @@ package fi.codecrew.moya.web.cdiview.shop;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javax.management.RuntimeErrorException;
import org.primefaces.model.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.BillBeanLocal; import fi.codecrew.moya.beans.BillBeanLocal;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.VerkkomaksutFiBeanLocal; import fi.codecrew.moya.beans.VerkkomaksutFiBeanLocal;
import fi.codecrew.moya.bortal.views.BillSummary; import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.enums.apps.BillPermission; import fi.codecrew.moya.enums.apps.BillPermission;
import fi.codecrew.moya.exceptions.BillException; import fi.codecrew.moya.exceptions.BillException;
import fi.codecrew.moya.model.Bill; import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.annotations.SelectedUser; import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.helpers.LazyEntityDataModel;
@Named @Named
@ConversationScoped @ConversationScoped
...@@ -56,59 +60,73 @@ public class BillListView extends GenericCDIView { ...@@ -56,59 +60,73 @@ public class BillListView extends GenericCDIView {
@SelectedUser @SelectedUser
private transient EventUser user; private transient EventUser user;
private Bill selectedBill;
@EJB @EJB
private transient BillBeanLocal billbean; private transient BillBeanLocal billbean;
@EJB
private EventBeanLocal eventbean;
private transient ListDataModel<Bill> bills; // private transient ListDataModel<Bill> bills;
//
private boolean writeBill; private boolean writeBill;
private ArrayList<BillSummary> billsummary; private ArrayList<BillSummary> billsummary;
private boolean showPayButtons = false; private boolean showPayButtons = false;
public String showPayButtonsAction()
{
if (super.hasPermission(BillPermission.WRITE_ALL))
{
showPayButtons = true;
}
return null;
}
@EJB @EJB
private VerkkomaksutFiBeanLocal paytrailBean; private VerkkomaksutFiBeanLocal paytrailBean;
private String paytrailMerchantId; private String paytrailMerchantId;
private Map<Integer, String> paytrailAuthcodes; private LazyBillDataModel lazyBillList;
public void showPayButtonsAction()
{
if (super.hasPermission(BillPermission.WRITE_ALL)) {
showPayButtons = true;
}
}
private static final Logger logger = LoggerFactory.getLogger(BillListView.class);
public void initAllBills() { public void initAllBills() {
if (super.requirePermissions(BillPermission.READ_ALL)) { if (super.requirePermissions(BillPermission.READ_ALL) && lazyBillList == null) {
beginConversation(); beginConversation();
List<Bill> billList = billbean.findAll(); logger.info("Initializing lazyList");
bills = new ListDataModel<Bill>(billList); lazyBillList = new LazyBillDataModel(true);
writeBill = permbean.hasPermission(BillPermission.WRITE_ALL); writeBill = permbean.hasPermission(BillPermission.WRITE_ALL);
if (paytrailBean.isSvmEnabled()) { if (paytrailBean.isSvmEnabled() && writeBill) {
setPaytrailMerchantId(paytrailBean.getMerchantId()); paytrailMerchantId = paytrailBean.getMerchantId();
paytrailAuthcodes = paytrailBean.getAuthcodeForBills(billList);
} }
// List<Bill> billList = billbean.findAll();
// bills = new ListDataModel<Bill>(billList);
// if (paytrailBean.isSvmEnabled()) {
// setPaytrailMerchantId(paytrailBean.getMerchantId());
// paytrailAuthcodes = paytrailBean.getAuthcodeForBills(billList);
// }
} }
} }
public Object[] getPaytrailAuthcodes() { public String getPaytrailAuthcodeForSelected() {
Object[] retarr = null; return paytrailBean.getAuthcodeForBill(selectedBill);
if (paytrailAuthcodes != null)
{
Set<Entry<Integer, String>> ret = paytrailAuthcodes.entrySet();
retarr = ret.toArray();
}
return retarr;
} }
public String getAuthcodeForBill(Integer id) { // public Object[] getPaytrailAuthcodes() {
return paytrailAuthcodes.get(id); // Object[] retarr = null;
} // if (paytrailAuthcodes != null)
// {
// Set<Entry<Integer, String>> ret = paytrailAuthcodes.entrySet();
// retarr = ret.toArray();
// }
// return retarr;
// }
// public String getAuthcodeForBill(Integer id) {
// return paytrailAuthcodes.get(id);
// }
public void initSummaryView() public void initSummaryView()
{ {
...@@ -120,7 +138,9 @@ public class BillListView extends GenericCDIView { ...@@ -120,7 +138,9 @@ public class BillListView extends GenericCDIView {
public void initUsersBills() { public void initUsersBills() {
if (requirePermissions(BillPermission.VIEW_OWN, permbean.isLoggedIn())) { if (requirePermissions(BillPermission.VIEW_OWN, permbean.isLoggedIn())) {
beginConversation(); beginConversation();
bills = new ListDataModel<Bill>(billbean.find(user)); lazyBillList = new LazyBillDataModel(false);
// bills = new ListDataModel<Bill>(billbean.find(user));
writeBill = permbean.hasPermission(BillPermission.WRITE_ALL); writeBill = permbean.hasPermission(BillPermission.WRITE_ALL);
} }
...@@ -130,7 +150,8 @@ public class BillListView extends GenericCDIView { ...@@ -130,7 +150,8 @@ public class BillListView extends GenericCDIView {
if (permbean.hasPermission(BillPermission.WRITE_ALL)) { if (permbean.hasPermission(BillPermission.WRITE_ALL)) {
try { try {
billbean.markPaid(bills.getRowData(), Calendar.getInstance(), false); Bill bill = lazyBillList.getRowData();
billbean.markPaid(bill, Calendar.getInstance(), false);
} catch (BillException x) { } catch (BillException x) {
throw new RuntimeException(x); throw new RuntimeException(x);
} }
...@@ -142,15 +163,15 @@ public class BillListView extends GenericCDIView { ...@@ -142,15 +163,15 @@ public class BillListView extends GenericCDIView {
return null; return null;
} }
public void setBills(ListDataModel<Bill> bills) { // public void setBills(ListDataModel<Bill> bills) {
this.bills = bills; // this.bills = bills;
} // }
//
public ListDataModel<Bill> getBills() { // public ListDataModel<Bill> getBills() {
//
return bills; // return bills;
} // }
//
public boolean isCanWriteBill() { public boolean isCanWriteBill() {
return writeBill; return writeBill;
} }
...@@ -183,4 +204,54 @@ public class BillListView extends GenericCDIView { ...@@ -183,4 +204,54 @@ public class BillListView extends GenericCDIView {
this.paytrailMerchantId = paytrailMerchantId; this.paytrailMerchantId = paytrailMerchantId;
} }
public LazyBillDataModel getLazyBillList() {
return lazyBillList;
}
public void setLazyBillList(LazyBillDataModel lazyBillList) {
this.lazyBillList = lazyBillList;
}
public Bill getSelectedBill() {
return selectedBill;
}
public void setSelectedBill(Bill selectedBill) {
logger.info("Setting selected bill to {}", selectedBill);
this.selectedBill = selectedBill;
}
public class LazyBillDataModel extends LazyEntityDataModel<Bill> {
private static final long serialVersionUID = -7870775597332505494L;
private final boolean allBills;
private EventUser user;
public LazyBillDataModel(boolean allBills) {
this.allBills = allBills;
}
@Override
public List<Bill> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
logger.info("Loading with {}, {}", first, pageSize);
QuerySortOrder sort = getSort(sortOrder);
BillSearchQuery q = new BillSearchQuery(first, pageSize, sortField, sort, filters);
q.setUser(user);
SearchResult<Bill> ret;
if (allBills) {
ret = billbean.findAll(q);
} else {
ret = billbean.findUsers(q);
}
this.setRowCount((int) ret.getResultcount());
return ret.getResults();
}
@Override
protected Bill findEntity(Integer id) {
return billbean.findById(id);
}
}
} }
...@@ -32,12 +32,12 @@ import fi.codecrew.moya.beans.EventBeanLocal; ...@@ -32,12 +32,12 @@ import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.OrgRoleBeanLocal; import fi.codecrew.moya.beans.OrgRoleBeanLocal;
import fi.codecrew.moya.beans.RoleBeanLocal; import fi.codecrew.moya.beans.RoleBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.UserPermission; import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.OrgRole; import fi.codecrew.moya.model.OrgRole;
import fi.codecrew.moya.model.Role; import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User; import fi.codecrew.moya.model.User;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
......
...@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory; ...@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal; import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.RoleBeanLocal; import fi.codecrew.moya.beans.RoleBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.BortalApplication; import fi.codecrew.moya.enums.BortalApplication;
import fi.codecrew.moya.enums.apps.IAppPermission; import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.enums.apps.UserPermission; import fi.codecrew.moya.enums.apps.UserPermission;
...@@ -41,7 +42,6 @@ import fi.codecrew.moya.model.ApplicationPermission; ...@@ -41,7 +42,6 @@ import fi.codecrew.moya.model.ApplicationPermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Role; import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User; import fi.codecrew.moya.model.User;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.helpers.BortalApplicationWrapper; import fi.codecrew.moya.web.helpers.BortalApplicationWrapper;
......
...@@ -33,10 +33,10 @@ import org.slf4j.Logger; ...@@ -33,10 +33,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.UserPermission; import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.User; import fi.codecrew.moya.model.User;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder; import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.ModelInterface; import fi.codecrew.moya.utilities.jpa.ModelInterface;
......
...@@ -16,12 +16,12 @@ import fi.codecrew.moya.beans.PermissionBeanLocal; ...@@ -16,12 +16,12 @@ import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal; import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.beans.VipBeanLocal; import fi.codecrew.moya.beans.VipBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.VipPermission; import fi.codecrew.moya.enums.apps.VipPermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Vip; import fi.codecrew.moya.model.Vip;
import fi.codecrew.moya.model.VipProduct; import fi.codecrew.moya.model.VipProduct;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
......
...@@ -19,13 +19,14 @@ ...@@ -19,13 +19,14 @@
package fi.codecrew.moya.web.flow; package fi.codecrew.moya.web.flow;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.ReaderEvent; import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView; import fi.codecrew.moya.web.cdiview.reader.ReaderView;
import fi.codecrew.moya.web.cdiview.user.UserView; import fi.codecrew.moya.web.cdiview.user.UserView;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -33,6 +34,7 @@ import javax.ejb.EJB; ...@@ -33,6 +34,7 @@ import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import java.util.List; import java.util.List;
@Named @Named
......
package fi.codecrew.moya.web.helpers;
import java.util.List;
import java.util.Map;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import fi.codecrew.moya.model.GenericEntity;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
public abstract class LazyEntityDataModel<T extends GenericEntity> extends LazyDataModel<T> {
private static final long serialVersionUID = -7424836549904164915L;
@Override
public abstract List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters);
@Override
public T getRowData(String key) {
if (key == null || key.isEmpty() || key.equals("0"))
return null;
return findEntity(Integer.parseInt(key));
}
protected abstract T findEntity(Integer id);
@Override
public Object getRowKey(T entity) {
Integer ret = 0;
if (entity != null)
ret = entity.getId();
return ret;
}
protected QuerySortOrder getSort(SortOrder sortOrder) {
QuerySortOrder sort = QuerySortOrder.UNSORTED;
switch (sortOrder) {
case ASCENDING:
sort = QuerySortOrder.ASCENDING;
break;
case DESCENDING:
sort = QuerySortOrder.DESCENDING;
break;
case UNSORTED:
default:
sort = QuerySortOrder.UNSORTED;
break;
}
return sort;
}
}
...@@ -31,11 +31,11 @@ import javax.inject.Named; ...@@ -31,11 +31,11 @@ import javax.inject.Named;
import fi.codecrew.moya.beans.EventBeanLocal; import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.LectureBeanLocal; import fi.codecrew.moya.beans.LectureBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.LecturePermission; import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Lecture; import fi.codecrew.moya.model.Lecture;
import fi.codecrew.moya.model.LectureGroup; import fi.codecrew.moya.model.LectureGroup;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult; import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.user.UserView; import fi.codecrew.moya.web.cdiview.user.UserView;
......
...@@ -72,7 +72,7 @@ bill.billMarkedPaidMail.subject = Bill marked paid ...@@ -72,7 +72,7 @@ bill.billMarkedPaidMail.subject = Bill marked paid
bill.billNumber = Order number bill.billNumber = Order number
bill.billPaidDate = Paid date bill.billPaidDate = Paid date
bill.cancel = Cancel bill bill.cancel = Cancel bill
bill.checkPaytrail = Check payment bill.checkPaytrail = Check payment status
bill.deliveryTerms = Delivery terms bill.deliveryTerms = Delivery terms
bill.edit = edit bill.edit = edit
bill.expires = Expires bill.expires = Expires
...@@ -119,6 +119,7 @@ billedit.billnotfound = Bill not found. Select again. ...@@ -119,6 +119,7 @@ billedit.billnotfound = Bill not found. Select again.
billine.linePrice = Total (inc. vat) billine.linePrice = Total (inc. vat)
billine.name = Ticket billine.name = Ticket
billine.product = Product
billine.quantity = Quantityicket billine.quantity = Quantityicket
billine.referencedProduct = Referenced product billine.referencedProduct = Referenced product
billine.save = Save billine.save = Save
......
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
<logback.version>1.1.3</logback.version> <logback.version>1.1.3</logback.version>
<testng.version>6.8.21</testng.version> <testng.version>6.8.21</testng.version>
<javamelody.version>1.55.0</javamelody.version> <javamelody.version>1.55.0</javamelody.version>
<primefaces.version>5.1</primefaces.version> <primefaces.version>5.2</primefaces.version>
<primefaces.themeversion>1.0.10</primefaces.themeversion>
</properties> </properties>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!