Commit cbdc411d by Juho Juopperi

Merge branch 'master' of gitlab.codecrew.fi:codecrew/moya into vectorama2015

2 parents 6ab4f3bd 37c5d8d0
Showing with 936 additions and 439 deletions
......@@ -27,11 +27,13 @@ import java.util.List;
import javax.ejb.Local;
import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.exceptions.BillException;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.utilities.SearchResult;
@Local
public interface BillBeanLocal {
......@@ -59,9 +61,13 @@ public interface BillBeanLocal {
List<Bill> find(EventUser user);
Bill expireBill(Bill bill);
Bill addProductToBill(Bill bill, Product product, BigDecimal count, FoodWave foodwave);
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;
import javax.ejb.Local;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Feedback;
import fi.codecrew.moya.model.GameID;
......@@ -37,7 +38,6 @@ import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.UserApproval;
import fi.codecrew.moya.model.UserImage;
import fi.codecrew.moya.util.MailMessage;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
......
......@@ -41,4 +41,6 @@ public interface VerkkomaksutFiBeanLocal {
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 @@
* future versions of the Software.
*
*/
package fi.codecrew.moya.util;
package fi.codecrew.moya.entitysearch;
import java.math.BigDecimal;
import java.util.ArrayList;
......
......@@ -30,39 +30,31 @@ import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.EJBException;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beanutil.PdfPrinter;
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.ShopPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission;
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.BillLineFacade;
import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.PlaceSlotFacade;
import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.BillLine;
import fi.codecrew.moya.model.Discount;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.FoodWave;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.PlaceSlot;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.ProductFlag;
import fi.codecrew.moya.utilities.jpa.GenericFacade;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
/**
......@@ -385,4 +377,21 @@ public class BillBean implements BillBeanLocal {
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;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.MapPermission;
import org.apache.commons.codec.binary.Hex;
......@@ -90,7 +91,6 @@ import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.UserApproval;
import fi.codecrew.moya.model.UserImage;
import fi.codecrew.moya.util.MailMessage;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.I18n;
import fi.codecrew.moya.utilities.PasswordFunctions;
import fi.codecrew.moya.utilities.SearchQuery;
......
......@@ -363,15 +363,32 @@ public class VerkkomaksutFiBean implements VerkkomaksutFiBeanLocal {
}
@Override
@RolesAllowed(BillPermission.S_WRITE_ALL)
public Map<Integer, String> getAuthcodeForBills(List<Bill> bills) {
Map<Integer, String> ret = new HashMap<>();
if (isSvmEnabled() && permbean.hasPermission(BillPermission.WRITE_ALL)) {
String merchantId = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_ID).getTextvalue();
String merchantPassword = eventPrivatePropertyFacade.getPropertyForEvent(LanEventPrivatePropertyKey.VERKKOMAKSU_MERCHANT_PASSWORD).getTextvalue();
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;
}
@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 @@
*/
package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
......@@ -27,10 +28,18 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.model.Bill_;
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.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
@Stateless
@LocalBean
......@@ -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() {
// SELECT max(b.billNumber) from Bill b where b.event = :event
CriteriaBuilder cb = getEm().getCriteriaBuilder();
......@@ -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;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.DatabaseHasCompare;
import fi.codecrew.moya.enums.DatabaseValueCompare;
import fi.codecrew.moya.facade.callbacks.EventLimiter;
......@@ -52,7 +53,6 @@ import fi.codecrew.moya.model.EventUser_;
import fi.codecrew.moya.model.LanEvent;
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.SearchResult;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
......@@ -182,8 +182,8 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
}
From<?, EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
From<?, EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);
From<?, EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class, true);
From<?, EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class,false);
listCQuery.select(listRoot);
countCQuery.select(cb.count(countRoot));
......
......@@ -52,7 +52,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
private static List<SingularAttribute<User, String>> SEARCHATTRS;
static List<SingularAttribute<User, String>> getAttrlist() {
public static List<SingularAttribute<User, String>> getAttrlist() {
if (SEARCHATTRS == null)
{
ArrayList<SingularAttribute<User, String>> buildAttrs = new ArrayList<SingularAttribute<User, String>>();
......
......@@ -45,7 +45,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC
}
@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()) {
return;
}
......
......@@ -39,7 +39,7 @@ public class EventLimiter implements FacadeCallback<EventUser> {
}
@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));
}
......
......@@ -45,7 +45,7 @@ public class EventUserAccountSaldoPredicate implements FacadeCallback<EventUser>
}
@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);
Root<AccountEvent> acRoot = subq.from(AccountEvent.class);
subq.where(cb.equal(acRoot.get(AccountEvent_.user), root));
......
......@@ -46,7 +46,7 @@ public class EventUserCardStateFilter implements FacadeCallback<EventUser> {
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())
{
for (CardState s : states)
......
......@@ -32,7 +32,7 @@ import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public class EventUserPlacegroupPredicate implements FacadeCallback<EventUser> {
@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)));
}
......
......@@ -66,7 +66,7 @@ public class EventUserRolefilter implements FacadeCallback<EventUser> {
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())
{
HashSet<Integer> roleids = new HashSet<Integer>();
......
......@@ -41,9 +41,9 @@ public class EventuserToUserWrapper implements FacadeCallback<EventUser> {
}
@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) {
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
}
@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()) {
return;
}
......
......@@ -53,8 +53,10 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T
}
@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();
// Check if returntype is entity or are we for example counting results
if (!ModelInterface.class.isAssignableFrom(rettype)) {
......
......@@ -61,7 +61,7 @@ public abstract class PathStringSearchPredicateCreator<T extends ModelInterface,
}
@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()) {
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 {
return null;
}
public static Integer getBillnrFromReference(LanEvent event, Integer reference) {
return (reference / 10) - event.getReferenceNumberBase();
}
public Integer getReferenceNumber()
{
return BillUtils.createReferenceNumber(getReferenceNumberBase());
......
......@@ -34,7 +34,6 @@ import fi.codecrew.moya.utilities.jpa.ModelInterface;
public class GenericEntity extends EntityEquals implements ModelInterface, EntityMeta {
private static final long serialVersionUID = -9041737052951021560L;
public static final String ID_COLUMN = "id";
@Id
@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 {
this.sortDirection = direction;
}
public int getFirstElement() {
return page * pagesize;
}
public int getPage() {
return page;
}
......
......@@ -30,5 +30,5 @@ public interface FacadeCallback<C extends ModelInterface> {
// void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root,
// 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> {
private final Class<C> entClass;
// private static final Logger logger =
// LoggerFactory.getLogger(GenericFacade.class);
public GenericFacade(Class<C> entityClass) {
this.entClass = entityClass;
}
......@@ -115,35 +112,6 @@ public abstract class GenericFacade<C extends ModelInterface> {
* vain ko. tapahtumaan / käyttäjään / muuhun olioon liittyvät Jos oikeasti
* 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) {
K ret = null;
......@@ -155,21 +123,6 @@ public abstract class GenericFacade<C extends ModelInterface> {
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
// näin... :(
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) {
......@@ -209,29 +162,28 @@ public abstract class GenericFacade<C extends ModelInterface> {
CriteriaQuery<C> listCQuery = cb.createQuery(getEntityClass());
CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);
searchCallbacks(listCQuery, list);
searchCallbacks(listCQuery, list, true);
Path<C> countRoot = searchCallbacks(countCQuery, list);
countCQuery.select(cb.count(countRoot));
Path<C> countRoot = searchCallbacks(countCQuery, list, false);
countCQuery.select(cb.count(countRoot.get(ModelInterface.ID_COLUMN)));
TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
TypedQuery<C> listQ = getEm().createQuery(listCQuery);
if (search.getPagesize() > 0) {
listQ.setFirstResult(search.getPage() * search.getPagesize());
listQ.setMaxResults(search.getPagesize());
}
return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult());
}
protected From<?, C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) {
return searchCallbacks(cq, list, getEntityClass());
protected From<?, C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list, boolean isFullQuery) {
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);
ArrayList<Predicate> predicates = handlePredicates(cq, list, root);
ArrayList<Predicate> predicates = handlePredicates(cq, list, root, isFullQuery);
if (!predicates.isEmpty()) {
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
cq.where(preds);
......@@ -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();
ArrayList<Predicate> predicates = new ArrayList<Predicate>();
for (FacadeCallback<T> fc : list) {
if (fc != null) {
fc.exec(cb, cq, root, predicates);
fc.exec(cb, cq, root, predicates, isFullQuery);
}
}
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.
*
......
......@@ -21,6 +21,7 @@ package fi.codecrew.moya.utilities.jpa;
import java.io.Serializable;
public interface ModelInterface extends Serializable {
public static final String ID_COLUMN = "id";
Integer getId();
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:bills="http://java.sun.com/jsf/composite/cditools/bills"
xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"
>
<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:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{billListView.initUsersBills}" />
</f:metadata>
<ui:define name="content">
<bills:list />
<p:outputPanel rendered="#{placeGroupView.useEticket}" >
<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)}" 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:button outcome="/place/myEtickets" value="#{i18n['placegroup.showEticket']}" />
</p>
</p:outputPanel>
<br /><br />
<br />
<br />
</ui:define>
</ui:composition>
</h:body>
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:bills="http://java.sun.com/jsf/composite/cditools/bills"
xmlns:f="http://java.sun.com/jsf/core"
>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{billListView.initAllBills}" />
</f:metadata>
<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:composition>
</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' ?>
<!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:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" xmlns:tools="http://java.sun.com/jsf/composite/tools">
<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: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:implementation>
<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']}">
<h:outputText value="#{(empty wra.user.nick)?'----':wra.user.nick}" />
......
......@@ -12,7 +12,7 @@
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<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>
</plugin>
</plugins>
......@@ -24,7 +24,7 @@
<artifactId>moya-beans-client</artifactId>
<version>1.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
......@@ -32,10 +32,9 @@
</dependency>
<dependency>
<groupId>org.primefaces.extensions</groupId>
<groupId>org.primefaces.themes</groupId>
<artifactId>all-themes</artifactId>
<version>1.0.8</version>
<type>pom</type>
<version>${primefaces.themeversion}</version>
</dependency>
<dependency>
......
......@@ -20,26 +20,29 @@ package fi.codecrew.moya.rest;
import java.io.IOException;
import java.security.Principal;
import java.util.Collection;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.print.attribute.standard.Media;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
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.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
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.LoggerFactory;
......@@ -47,15 +50,28 @@ import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
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.PrintedCardRestPojo;
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.UserReservationRoot;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.utilities.SearchResult;
import sun.security.provider.certpath.OCSPResponse;
@RequestScoped
@Path("/user")
......
......@@ -96,28 +96,25 @@ public class PlacemapRestViewV1 {
}
@GET
@Path("{id}/hilightedPlaces/{userid}")
public Response getHilightedPlaces(@PathParam("id") Integer mapId, @PathParam("userid") Integer userId)
{
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();
}
EventUser user = userbean.findByUserId(userId,false);
EventUser user = userbean.findByUserId(userId, false);
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
@Path("{id}/places")
public SimplePlacelistRoot getPlaces(@PathParam("id") Integer mapId)
......
......@@ -20,28 +20,32 @@ package fi.codecrew.moya.web.cdiview.shop;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
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.EventBeanLocal;
import fi.codecrew.moya.beans.VerkkomaksutFiBeanLocal;
import fi.codecrew.moya.bortal.views.BillSummary;
import fi.codecrew.moya.entitysearch.BillSearchQuery;
import fi.codecrew.moya.enums.apps.BillPermission;
import fi.codecrew.moya.exceptions.BillException;
import fi.codecrew.moya.model.Bill;
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.cdiview.GenericCDIView;
import fi.codecrew.moya.web.helpers.LazyEntityDataModel;
@Named
@ConversationScoped
......@@ -56,59 +60,73 @@ public class BillListView extends GenericCDIView {
@SelectedUser
private transient EventUser user;
private Bill selectedBill;
@EJB
private transient BillBeanLocal billbean;
@EJB
private EventBeanLocal eventbean;
private transient ListDataModel<Bill> bills;
// private transient ListDataModel<Bill> bills;
//
private boolean writeBill;
private ArrayList<BillSummary> billsummary;
private boolean showPayButtons = false;
public String showPayButtonsAction()
{
if (super.hasPermission(BillPermission.WRITE_ALL))
{
showPayButtons = true;
}
return null;
}
@EJB
private VerkkomaksutFiBeanLocal paytrailBean;
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() {
if (super.requirePermissions(BillPermission.READ_ALL)) {
if (super.requirePermissions(BillPermission.READ_ALL) && lazyBillList == null) {
beginConversation();
List<Bill> billList = billbean.findAll();
bills = new ListDataModel<Bill>(billList);
logger.info("Initializing lazyList");
lazyBillList = new LazyBillDataModel(true);
writeBill = permbean.hasPermission(BillPermission.WRITE_ALL);
if (paytrailBean.isSvmEnabled()) {
setPaytrailMerchantId(paytrailBean.getMerchantId());
paytrailAuthcodes = paytrailBean.getAuthcodeForBills(billList);
if (paytrailBean.isSvmEnabled() && writeBill) {
paytrailMerchantId = paytrailBean.getMerchantId();
}
// List<Bill> billList = billbean.findAll();
// bills = new ListDataModel<Bill>(billList);
// if (paytrailBean.isSvmEnabled()) {
// setPaytrailMerchantId(paytrailBean.getMerchantId());
// paytrailAuthcodes = paytrailBean.getAuthcodeForBills(billList);
// }
}
}
public Object[] getPaytrailAuthcodes() {
Object[] retarr = null;
if (paytrailAuthcodes != null)
{
Set<Entry<Integer, String>> ret = paytrailAuthcodes.entrySet();
retarr = ret.toArray();
}
return retarr;
public String getPaytrailAuthcodeForSelected() {
return paytrailBean.getAuthcodeForBill(selectedBill);
}
public String getAuthcodeForBill(Integer id) {
return paytrailAuthcodes.get(id);
}
// public Object[] getPaytrailAuthcodes() {
// 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()
{
......@@ -120,7 +138,9 @@ public class BillListView extends GenericCDIView {
public void initUsersBills() {
if (requirePermissions(BillPermission.VIEW_OWN, permbean.isLoggedIn())) {
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);
}
......@@ -130,7 +150,8 @@ public class BillListView extends GenericCDIView {
if (permbean.hasPermission(BillPermission.WRITE_ALL)) {
try {
billbean.markPaid(bills.getRowData(), Calendar.getInstance(), false);
Bill bill = lazyBillList.getRowData();
billbean.markPaid(bill, Calendar.getInstance(), false);
} catch (BillException x) {
throw new RuntimeException(x);
}
......@@ -142,15 +163,15 @@ public class BillListView extends GenericCDIView {
return null;
}
public void setBills(ListDataModel<Bill> bills) {
this.bills = bills;
}
public ListDataModel<Bill> getBills() {
return bills;
}
// public void setBills(ListDataModel<Bill> bills) {
// this.bills = bills;
// }
//
// public ListDataModel<Bill> getBills() {
//
// return bills;
// }
//
public boolean isCanWriteBill() {
return writeBill;
}
......@@ -183,4 +204,54 @@ public class BillListView extends GenericCDIView {
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;
import fi.codecrew.moya.beans.OrgRoleBeanLocal;
import fi.codecrew.moya.beans.RoleBeanLocal;
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.OrgRole;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
......
......@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.RoleBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.BortalApplication;
import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.enums.apps.UserPermission;
......@@ -41,7 +42,6 @@ import fi.codecrew.moya.model.ApplicationPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.helpers.BortalApplicationWrapper;
......
......@@ -33,10 +33,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.User;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.ModelInterface;
......
......@@ -16,12 +16,12 @@ import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.beans.VipBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.VipPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Vip;
import fi.codecrew.moya.model.VipProduct;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
......
......@@ -19,13 +19,14 @@
package fi.codecrew.moya.web.flow;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView;
import fi.codecrew.moya.web.cdiview.user.UserView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -33,6 +34,7 @@ import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.List;
@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;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.LectureBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.entitysearch.UserSearchQuery;
import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Lecture;
import fi.codecrew.moya.model.LectureGroup;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.user.UserView;
......
......@@ -72,7 +72,7 @@ bill.billMarkedPaidMail.subject = Bill marked paid
bill.billNumber = Order number
bill.billPaidDate = Paid date
bill.cancel = Cancel bill
bill.checkPaytrail = Check payment
bill.checkPaytrail = Check payment status
bill.deliveryTerms = Delivery terms
bill.edit = edit
bill.expires = Expires
......@@ -119,6 +119,7 @@ billedit.billnotfound = Bill not found. Select again.
billine.linePrice = Total (inc. vat)
billine.name = Ticket
billine.product = Product
billine.quantity = Quantityicket
billine.referencedProduct = Referenced product
billine.save = Save
......
......@@ -32,7 +32,8 @@
<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>
<primefaces.version>5.2</primefaces.version>
<primefaces.themeversion>1.0.10</primefaces.themeversion>
</properties>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!