Commit 918c544e by Tuomas Riihimäki

Kauppaviilausta,

1 parent 56bce642
Showing with 550 additions and 311 deletions
package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
......@@ -10,7 +9,6 @@ import java.util.Map.Entry;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.Stateless;
import org.slf4j.Logger;
......@@ -130,39 +128,4 @@ public class AccountEventBean implements AccountEventBeanLocal {
}
@Override
@RolesAllowed(SpecialPermission.S_USER)
public BigDecimal getAccountBalance(IUser user) {
if (user == null) {
user = permbean.getCurrentUser();
}
if (!permbean.isCurrentUser(user) && !permbean.hasPermission(UserPermission.VIEW_ACCOUNTEVENTS)) {
throw new EJBAccessException("No enough rights to view accountevents");
}
List<AccountEvent> acs = accountfacade.getAccountEvents(user);
BigDecimal ret = BigDecimal.ZERO;
if (acs != null)
{
for (AccountEvent ac : acs) {
ret = ret.add(ac.getTotal()).setScale(2, RoundingMode.HALF_UP);
}
}
return ret;
}
@Override
@RolesAllowed(SpecialPermission.S_USER)
public List<AccountEvent> getAccountEvents(IUser user) {
if (user == null) {
user = permbean.getCurrentUser();
}
if (!permbean.isCurrentUser(user) && !permbean.hasPermission(UserPermission.VIEW_ACCOUNTEVENTS)) {
throw new EJBAccessException("No enough rights to view accountevents");
}
return accountfacade.getAccountEvents(user);
}
}
......@@ -56,7 +56,7 @@ public class BillBean implements BillBeanLocal {
@EJB
private PermissionBeanLocal permbean;
@EJB
private ProductBeanLocal productBean;
private ProductBean productBean;
@EJB
private PlaceBean placebean;
......@@ -220,7 +220,7 @@ public class BillBean implements BillBeanLocal {
placebean.lockPlaceProduct(bill.getUser(), prod, bl.getQuantity());
}
productBean.createAccountEvent(prod, bl.getQuantity(), bill.getUser());
productBean.createAccountEvent(prod, bl.getQuantity(), bill.getUser(), bill.getSentDate());
}
}
......
......@@ -10,6 +10,7 @@ import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;
......@@ -34,6 +35,7 @@ import fi.insomnia.bortal.util.MailMessage;
* Session Bean implementation class CardTemplateBean
*/
@Stateless
@LocalBean
@DeclareRoles({ UserPermission.S_WRITE_ROLES })
public class CardTemplateBean implements CardTemplateBeanLocal {
......
......@@ -112,6 +112,7 @@ public class Menubean implements MenubeanLocal {
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/listCardTemplates"), UserPermission.READ_ROLES);
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/createCardTemplate"), UserPermission.WRITE_ROLES);
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/editCardTemplate"), null).setVisible(false);
adminuser.addPage(menuitemfacade.findOrCreate("/shop/shopToUser"), null).setVisible(false);
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/edit"), UserPermission.VIEW_ALL).setVisible(false);
adminuser.addPage(menuitemfacade.findOrCreate("/useradmin/changePassword"), UserPermission.VIEW_ALL).setVisible(false);
......
......@@ -122,7 +122,7 @@ public class PlaceBean implements PlaceBeanLocal {
}
private BigDecimal addAndCalcPrice(IUser user, Place newPlace) {
private BigDecimal addAndCalcPrice(EventUser user, Place newPlace) {
Set<Place> places = new HashSet<Place>();
places.addAll(placeFacade.findUsersReservations(eventBean.getCurrentEvent(), user));
......@@ -135,10 +135,11 @@ public class PlaceBean implements PlaceBeanLocal {
BigDecimal total = BigDecimal.ZERO;
Calendar now = Calendar.getInstance();
for (Entry<Product, Integer> entry : mockmap.entrySet()) {
logger.debug("Adding to price {} of {}", entry.getValue(), entry.getKey().getName());
if (entry.getKey() != null) {
total = total.add(productBean.calculateTotal(entry.getKey(), new BigDecimal(entry.getValue())));
total = total.add(productBean.calculateTotal(entry.getKey(), new BigDecimal(entry.getValue()), now));
}
}
return total;
......@@ -248,7 +249,7 @@ public class PlaceBean implements PlaceBeanLocal {
// PlaceGroup pg = pgbean.createPlaceGroup(user);
BigDecimal totalprice = addAndCalcPrice(user, null);
BigDecimal balance = acbean.getAccountBalance(user);
BigDecimal balance = user.getAccountBalance();
if (balance.compareTo(totalprice) < 0) {
logger.info("User {} Could not buy things because account balance {} is too low for purchase {}", new Object[] { user, balance, totalprice });
......
......@@ -2,12 +2,14 @@ package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.apps.ShopPermission;
......@@ -27,6 +29,7 @@ import fi.insomnia.bortal.model.Product;
* Session Bean implementation class ProductBean
*/
@Stateless
@LocalBean
@DeclareRoles({
ShopPermission.S_LIST_ALL_PRODUCTS,
ShopPermission.S_LIST_USERPRODUCTS,
......@@ -106,12 +109,12 @@ public class ProductBean implements ProductBeanLocal {
}
@Override
public BigDecimal calculateTotal(Product product, BigDecimal quantity) {
public BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date) {
if (product == null || quantity == null) {
throw new RuntimeException("Some parameter is null!");
}
BigDecimal total = product.getPrice();
for (Discount d : product.getActiveDiscounts(quantity)) {
for (Discount d : product.getActiveDiscounts(quantity, date)) {
total = total.multiply(d.getPercentage());
}
return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity);
......@@ -132,10 +135,11 @@ public class ProductBean implements ProductBeanLocal {
// return ret;
// }
@Override
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user) {
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Calendar date) {
BigDecimal unitPrice = product.getPrice().negate();
List<Discount> discounts = product.getActiveDiscounts(quantity);
List<Discount> discounts = product.getActiveDiscounts(quantity, date);
for (Discount d : discounts) {
unitPrice = unitPrice.multiply(d.getPercentage());
}
......@@ -143,6 +147,7 @@ public class ProductBean implements ProductBeanLocal {
user = eventUserFacade.find(user.getId());
AccountEvent ret = new AccountEvent(user, product, unitPrice, quantity, Calendar.getInstance());
ret.setDelivered(Calendar.getInstance());
ret.setSeller(permbean.getCurrentUser());
......@@ -152,7 +157,10 @@ public class ProductBean implements ProductBeanLocal {
// discountinstancefacade.create(discInst);
accEventdiscounts.add(new DiscountInstance(ret, d));
}
// user.getAccountEvents().add(ret);
if (user.getAccountEvents() == null) {
user.setAccountEvents(new ArrayList<AccountEvent>());
}
user.getAccountEvents().add(ret);
accounteventfacade.create(ret);
// flush changes to db.
userFacade.flush();
......@@ -186,4 +194,8 @@ public class ProductBean implements ProductBeanLocal {
return discountfacade.merge(discount);
}
@Override
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user) {
return createAccountEvent(product, quantity, user, Calendar.getInstance());
}
}
......@@ -12,6 +12,8 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.facade.ReaderEventFacade;
import fi.insomnia.bortal.facade.ReaderFacade;
import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent;
......@@ -33,6 +35,10 @@ public class ReaderBean implements ReaderBeanLocal {
private ReaderEventFacade readerEventFacade;
@EJB
private EventBeanLocal eventbean;
@EJB
private UserBeanLocal userbean;
@EJB
private CardTemplateBean cardTemplateBean;
private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);
......@@ -41,7 +47,7 @@ public class ReaderBean implements ReaderBeanLocal {
PrintedCard card = cardfacade.findByRfid(tag);
Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
logger.info("reader {}, ident {}", reader, readerIdent);
// RfidEvent revent = reventcontainer.foundTag(reader, tag);
List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
ReaderEvent ret = null;
......@@ -183,6 +189,32 @@ public class ReaderBean implements ReaderBeanLocal {
@Override
public User findTagFromAnyEvent(String value) {
return cardfacade.findLatestByRfidFromAny(value).getUser().getUser();
PrintedCard card = cardfacade.findLatestByRfidFromAny(value);
User ret = null;
if (card != null && card.getUser() != null)
{
ret = card.getUser().getUser();
}
return ret;
}
@Override
public ReaderEvent createCard(ReaderEvent event, EventUser user) {
ReaderEvent ret = null;
if (event.getPrintedCard() == null)
{
CardTemplate ct = cardTemplateBean.getUsersCardtype(user);
PrintedCard card = new PrintedCard(user, ct, null, true);
card.setRfidUid(event.getValue());
cardfacade.create(card);
ret = new ReaderEvent(Calendar.getInstance(), card, event.getReader());
card.getReaderEvents().add(event);
ret.setNotes("User associated to a card");
}
return ret;
}
}
......@@ -13,6 +13,7 @@ import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
......@@ -32,6 +33,7 @@ import fi.insomnia.bortal.model.Role;
* @author tuukka
*/
@Stateless
@LocalBean
@DeclareRoles({ UserPermission.S_READ_ROLES, UserPermission.S_WRITE_ROLES })
public class RoleBean implements RoleBeanLocal {
......
......@@ -131,7 +131,7 @@ public class UserBean implements UserBeanLocal {
@Override
public List<Role> findUsersRoles(EventUser u) {
IUser currusr = permbean.getCurrentUser();
EventUser currusr = permbean.getCurrentUser();
if (!currusr.equals(u) && !permbean.hasPermission(UserPermission.MODIFY)) {
loggerbean.logMessage(SecurityLogType.permissionDenied, permbean.getCurrentUser(), "User tried to fetc another users roles: " + u);
throw new EJBAccessException("Not enough rights to find roles");
......@@ -425,9 +425,10 @@ public class UserBean implements UserBeanLocal {
@Override
public EventUser getEventUser(User user) {
if (user != null && user.getId() != null) {
user = userFacade.find(user.getId());
if (user == null || user.getId() == null) {
return null;
}
user = userFacade.find(user.getId());
EventUser ret = eventUserFacade.find(user);
if (ret == null)
......
......@@ -50,6 +50,7 @@ public class BillFacade extends IntegerPkGenericFacade<Bill> {
CriteriaQuery<Bill> cq = cb.createQuery(Bill.class);
Root<Bill> root = cq.from(Bill.class);
cq.where(cb.equal(root.get(Bill_.event), eventbean.getCurrentEvent()));
cq.orderBy(cb.desc(root.get(Bill_.id)));
return getEm().createQuery(cq).getResultList();
}
......
......@@ -10,6 +10,9 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Reader;
......@@ -19,6 +22,7 @@ import fi.insomnia.bortal.model.Reader_;
@LocalBean
public class ReaderFacade extends IntegerPkGenericFacade<Reader> {
private static final Logger logger = LoggerFactory.getLogger(ReaderFacade.class);
@EJB
private EventBeanLocal eventbean;
......@@ -33,18 +37,19 @@ public class ReaderFacade extends IntegerPkGenericFacade<Reader> {
Root<Reader> root = cq.from(Reader.class);
cq.select(root);
TypedQuery<Reader> q = getEm().createQuery(cq);
cq.where(
cb.and(
cb.equal(root.get(Reader_.event), event),
cb.equal(root.get(Reader_.identification), reader)));
cb.equal(root.get(Reader_.event), event),
cb.equal(root.get(Reader_.identification), reader));
TypedQuery<Reader> q = getEm().createQuery(cq);
return getSingleNullableResult(q);
}
public Reader findOrCreateByIdent(String ident) {
LanEvent event = eventbean.getCurrentEvent();
Reader ret = findByIdent(event, ident);
logger.info("Tried to return reader {} from event {}", ret, event);
if (ret == null) {
ret = createIdent(this, event, ident);
}
......@@ -57,7 +62,9 @@ public class ReaderFacade extends IntegerPkGenericFacade<Reader> {
ret = new Reader(ev, ident);
ret.setDescription("Automagically created");
rf.create(ret);
logger.info("Created new reader for ident {} reader {}", ident, ev);
}
return ret;
}
......
......@@ -26,8 +26,4 @@ public interface AccountEventBeanLocal {
void shopCash(EventUser shoppingUser, Map<Product, BigDecimal>
shopMap, boolean buyInstant);
BigDecimal getAccountBalance(IUser user);
List<AccountEvent> getAccountEvents(IUser user);
}
package fi.insomnia.bortal.beans;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import javax.ejb.Local;
......@@ -23,7 +24,7 @@ public interface ProductBeanLocal {
Product findCreditProduct();
BigDecimal calculateTotal(Product key, BigDecimal value);
// BigDecimal calculateTotal(Product key, BigDecimal value);
AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user);
......@@ -37,4 +38,6 @@ public interface ProductBeanLocal {
Discount save(Discount discount);
BigDecimal calculateTotal(Product product, BigDecimal quantity, Calendar date);
}
......@@ -4,6 +4,7 @@ import java.util.List;
import javax.ejb.Local;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent;
......@@ -28,4 +29,6 @@ public interface ReaderBeanLocal {
User findTagFromAnyEvent(String value);
ReaderEvent createCard(ReaderEvent event, EventUser user);
}
......@@ -4,8 +4,6 @@
*/
package fi.insomnia.bortal.model;
import static javax.persistence.TemporalType.DATE;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
......@@ -85,8 +83,8 @@ public class Bill extends GenericEntity {
private String addr5;
@Column(nullable = false, name = "sent_time")
@Temporal(DATE)
private Date sentDate = new Date();
@Temporal(TemporalType.TIMESTAMP)
private Calendar sentDate = Calendar.getInstance();
@Column(name = "payment_time", nullable = false)
private Integer paymentTime = 0;
......@@ -199,7 +197,7 @@ public class Bill extends GenericEntity {
public Calendar getDueDate() {
Calendar dueDate = Calendar.getInstance();
dueDate.setTime(this.getSentDate());
dueDate.setTime(this.getSentDate().getTime());
dueDate.add(Calendar.DATE, this.getPaymentTime());
return dueDate;
}
......@@ -341,7 +339,7 @@ public class Bill extends GenericEntity {
}
this.getBillLines().add(new BillLine(this, product, count));
for (Discount disc : product.getActiveDiscounts(count)) {
for (Discount disc : product.getActiveDiscounts(count, sentDate)) {
this.getBillLines().add(new BillLine(this, product, disc, count));
......@@ -368,11 +366,35 @@ public class Bill extends GenericEntity {
this.paidDate = paidDate;
}
public Date getSentDate() {
public Date getSentDateTime()
{
Date ret = null;
if (sentDate != null)
{
ret = sentDate.getTime();
}
return ret;
}
public void setSentDateTime(Date date)
{
if (date == null)
{
sentDate = null;
} else {
if (sentDate == null)
{
sentDate = Calendar.getInstance();
}
sentDate.setTime(date);
}
}
public Calendar getSentDate() {
return sentDate;
}
public void setSentDate(Date sentDate) {
public void setSentDate(Calendar sentDate) {
this.sentDate = sentDate;
}
......
......@@ -58,7 +58,7 @@ public class CompoEntry extends GenericEntity {
@Column(name = "final_position")
private Integer finalPosition;
@JoinColumn(name = "current_file_id", referencedColumnName = "id")
@JoinColumn(name = "current_file_id", referencedColumnName = CompoEntryFile.ID_COLUMN)
@OneToOne
private CompoEntryFile currentFile;
......
......@@ -2,6 +2,8 @@ package fi.insomnia.bortal.model;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
......@@ -13,6 +15,8 @@ import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
*
......@@ -34,6 +38,13 @@ public class Discount extends GenericEntity {
@Column(name = "code")
private String code;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "valid_from")
private Calendar validFrom;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "valid_to")
private Calendar validTo;
@Lob
@Column(name = "details")
private String details;
......@@ -193,4 +204,66 @@ public class Discount extends GenericEntity {
this.event = event;
}
public Date getValidToTime()
{
Date ret = null;
if (validTo != null) {
ret = validTo.getTime();
}
return ret;
}
public void setValidToTime(Date date)
{
if (date == null)
{
validTo = null;
} else {
if (validTo == null) {
validTo = Calendar.getInstance();
}
validTo.setTime(date);
}
}
public Date getValidFromTime()
{
Date ret = null;
if (validFrom != null) {
ret = validFrom.getTime();
}
return ret;
}
public void setValidFromTime(Date date)
{
if (date == null)
{
validFrom = null;
} else {
if (validFrom == null) {
validFrom = Calendar.getInstance();
}
validFrom.setTime(date);
}
}
public Calendar getValidTo() {
return validTo;
}
public void setValidTo(Calendar validTo) {
this.validTo = validTo;
}
public Calendar getValidFrom() {
return validFrom;
}
public void setValidFrom(Calendar validFrom) {
this.validFrom = validFrom;
}
}
......@@ -5,6 +5,8 @@ import static javax.persistence.CascadeType.MERGE;
import static javax.persistence.CascadeType.PERSIST;
import static javax.persistence.CascadeType.REFRESH;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
......@@ -48,7 +50,7 @@ public class EventUser extends GenericEntity implements IUser {
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserNote> notes;
@ManyToMany(cascade = CascadeType.ALL)
@ManyToMany()
private List<Role> roles = new ArrayList<Role>();
@OneToMany(mappedBy = "user")
......@@ -74,15 +76,15 @@ public class EventUser extends GenericEntity implements IUser {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private List<PrintedCard> printedCards;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
@OneToMany(mappedBy = "user")
@OrderBy(AccountEvent.ID_COLUMN)
private List<AccountEvent> accountEvents;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
@OneToMany(mappedBy = "user")
@OrderBy(Bill.ID_COLUMN)
private List<Bill> bills;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "seller")
@OneToMany(mappedBy = "seller")
@OrderBy(AccountEvent.ID_COLUMN)
private List<AccountEvent> soldItems;
......@@ -440,4 +442,17 @@ public class EventUser extends GenericEntity implements IUser {
return user.getCreated();
}
public BigDecimal getAccountBalance() {
BigDecimal ret = BigDecimal.ZERO;
if (accountEvents != null)
{
for (AccountEvent ac : accountEvents) {
ret = ret.add(ac.getTotal()).setScale(2, RoundingMode.HALF_UP);
}
}
return ret;
}
}
......@@ -6,6 +6,7 @@ package fi.insomnia.bortal.model;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.persistence.CascadeType;
......@@ -27,16 +28,6 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
*/
@Entity
@Table(name = "products")
// @NamedQueries({
// @NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p"),
// @NamedQuery(name = "Product.findByProductName", query =
// "SELECT p FROM Product p WHERE p.name = :name"),
// @NamedQuery(name = "Product.findByPrice", query =
// "SELECT p FROM Product p WHERE p.price = :price"),
// @NamedQuery(name = "Product.findBySort", query =
// "SELECT p FROM Product p WHERE p.sort = :sort"),
// @NamedQuery(name = "Product.findByBarcode", query =
// "SELECT p FROM Product p WHERE p.barcode = :barcode") })
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class Product extends GenericEntity {
......@@ -66,7 +57,7 @@ public class Product extends GenericEntity {
@Column(name = "instant_shop")
private boolean prepaidInstant = false;
@JoinColumn(name = "provided_role_id", referencedColumnName = "id")
@JoinColumn(name = "provided_role_id", referencedColumnName = Role.ID_COLUMN)
@ManyToOne
private Role provides;
......@@ -79,10 +70,10 @@ public class Product extends GenericEntity {
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "product_discounts",
inverseJoinColumns = {
@JoinColumn(name = "discount_id", referencedColumnName = "id")
@JoinColumn(name = "discount_id", referencedColumnName = Discount.ID_COLUMN)
},
joinColumns = {
@JoinColumn(name = "product_id", referencedColumnName = "id")
@JoinColumn(name = "product_id", referencedColumnName = Product.ID_COLUMN)
})
private List<Discount> discounts;
......@@ -92,10 +83,10 @@ public class Product extends GenericEntity {
@ManyToMany()
@JoinTable(name = "product_foodwavetemplate",
joinColumns = {
@JoinColumn(name = "product_id", referencedColumnName = "id"),
@JoinColumn(name = "product_id", referencedColumnName = Product.ID_COLUMN),
},
inverseJoinColumns = {
@JoinColumn(name = "food_wave_template_id", referencedColumnName = "id")
@JoinColumn(name = "food_wave_template_id", referencedColumnName = FoodWaveTemplate.ID_COLUMN)
},
uniqueConstraints = {
@UniqueConstraint(columnNames = { "product_id", "food_wave_template_id" })
......@@ -133,10 +124,12 @@ public class Product extends GenericEntity {
}
// TODO: alennukset lasketaan täällä. HUOMHUOM!!
public List<Discount> getActiveDiscounts(BigDecimal quantity) {
public List<Discount> getActiveDiscounts(BigDecimal quantity, Calendar time) {
ArrayList<Discount> ret = new ArrayList<Discount>();
for (Discount d : getDiscounts()) {
if (d.isActive() &&
(d.getValidTo() == null || d.getValidTo().after(time)) &&
(d.getValidFrom() == null || d.getValidFrom().before(time)) &&
quantity.compareTo(d.getAmountMax()) <= 0 &&
quantity.compareTo(d.getAmountMin()) >= 0) {
ret.add(d);
......
......@@ -32,13 +32,6 @@ import fi.insomnia.bortal.model.salespoint.SalesEntity;
*/
@Entity
@Table(name = "readers", uniqueConstraints = { @UniqueConstraint(columnNames = { "reader_ident", "event_id" }) })
// @NamedQueries({
// @NamedQuery(name = "Reader.findAll", query = "SELECT r FROM Reader r"),
//
// @NamedQuery(name = "Reader.findByIdentification", query =
// "SELECT r FROM Reader r WHERE r.identification = :identification"),
// @NamedQuery(name = "Reader.findByDescription", query =
// "SELECT r FROM Reader r WHERE r.description = :description") })
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class Reader extends GenericEntity {
......
......@@ -7,6 +7,7 @@ import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
......@@ -36,6 +37,10 @@ public class ReaderEvent extends GenericEntity {
@Column(name = "value")
private String value;
@Lob
@Column(name = "notes")
private String notes;
@Column(nullable = false)
private Integer gamePoint = 0;
......@@ -57,6 +62,14 @@ public class ReaderEvent extends GenericEntity {
super();
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public Calendar getTime() {
return time;
}
......
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LanBortalWeb</display-name>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<servlet-mapping>
<servlet-name>PlaceMap</servlet-name>
<url-pattern>/PlaceMap</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsf</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.wtf</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserImageServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserImageServlet</servlet-name>
<url-pattern>/Userimage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserCardServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserCardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserCardServlet</servlet-name>
<url-pattern>/UserCard</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CardTemplateServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.CardTemplateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CardTemplateServlet</servlet-name>
<url-pattern>/CardTemplate</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>PlaceMap</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceMap</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
<url-pattern>*.wtf</url-pattern>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter>
<display-name>HostnameFilter</display-name>
<filter-name>HostnameFilter</filter-name>
<filter-class>fi.insomnia.bortal.HostnameFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HostnameFilter</filter-name>
<servlet-name>*</servlet-name>
</filter-mapping>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>omniarealm</realm-name>
<form-login-config>
<form-login-page>/auth/login.jsf</form-login-page>
<form-error-page>/auth/loginError.jsf</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<display-name>Forbidden resource</display-name>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/layout/*</url-pattern>
<url-pattern>/resources/tools/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Thou shall not read the sources or use utils directly</description>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<servlet>
<description></description>
<display-name>PrintBill</display-name>
<servlet-name>PrintBill</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PrintBill</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintBill</servlet-name>
<url-pattern>/PrintBill</url-pattern>
</servlet-mapping>
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
<servlet>
<description></description>
<display-name>PlaceGroupPdf</display-name>
<servlet-name>PlaceGroupPdf</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceGroupPdf</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PlaceGroupPdf</servlet-name>
<url-pattern>/PlaceGroupPdf</url-pattern>
</servlet-mapping>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>LanBortalWeb</display-name>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<servlet-mapping>
<servlet-name>PlaceMap</servlet-name>
<url-pattern>/PlaceMap</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsf</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.wtf</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserImageServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserImageServlet</servlet-name>
<url-pattern>/Userimage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserCardServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.UserCardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserCardServlet</servlet-name>
<url-pattern>/UserCard</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CardTemplateServlet</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.CardTemplateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CardTemplateServlet</servlet-name>
<url-pattern>/CardTemplate</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>PlaceMap</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceMap</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
<url-pattern>*.wtf</url-pattern>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimeFacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter>
<display-name>HostnameFilter</display-name>
<filter-name>HostnameFilter</filter-name>
<filter-class>fi.insomnia.bortal.HostnameFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HostnameFilter</filter-name>
<servlet-name>*</servlet-name>
</filter-mapping>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>omniarealm</realm-name>
<form-login-config>
<form-login-page>/auth/login.jsf</form-login-page>
<form-error-page>/auth/loginError.jsf</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<display-name>Forbidden resource</display-name>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/layout/*</url-pattern>
<url-pattern>/resources/tools/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Thou shall not read the sources or use utils directly</description>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<servlet>
<description></description>
<display-name>PrintBill</display-name>
<servlet-name>PrintBill</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PrintBill</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintBill</servlet-name>
<url-pattern>/PrintBill</url-pattern>
</servlet-mapping>
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
<servlet>
<description></description>
<display-name>PlaceGroupPdf</display-name>
<servlet-name>PlaceGroupPdf</servlet-name>
<servlet-class>fi.insomnia.bortal.servlet.PlaceGroupPdf</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PlaceGroupPdf</servlet-name>
<url-pattern>/PlaceGroupPdf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bortal</param-value>
</context-param>
</web-app>
\ No newline at end of file
......@@ -38,7 +38,7 @@
<h:inputText value="#{billEditView.bill.addr5}" />
<h:outputLabel for="sentDate" value="#{i18n['bill.sentDate']}:" />
<h:inputText id="sentDate" value="#{billEditView.bill.sentDate}">
<h:inputText id="sentDate" value="#{billEditView.bill.sentDateTime}">
<f:convertDateTime />
</h:inputText>
......
......@@ -2,7 +2,8 @@
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:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:products="http://java.sun.com/jsf/composite/cditools/products">
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:products="http://java.sun.com/jsf/composite/cditools/products"
>
<h:head>
<title></title>
</h:head>
......
<?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: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:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
</composite:interface>
......@@ -18,13 +16,16 @@
<f:facet name="header">
<h:outputText value="${i18n['bill.payer']}" />
</f:facet>
<h:outputText value="#{bill.addr1}" />
<h:link rendered="#{billListView.canWriteBill()}" outcome="/useradmin/edit" value="#{bill.addr1}">
<f:param name="userid" value="#{bill.user.user.id}" />
</h:link>
<h:outputText rendered="#{!billListView.canWriteBill()}" value="#{bill.addr1}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['bill.sentDate']}" />
</f:facet>
<h:outputText value="#{bill.sentDate.time}">
<h:outputText value="#{bill.sentDateTime}">
<f:convertDateTime dateStyle="short" />
</h:outputText>
</h:column>
......@@ -60,9 +61,9 @@
</h:link>
</h:column>
<h:column rendered="#{billListView.canWriteBill()}">
<h:commandButton rendered="#{bill.paidDate == null}" action="#{billListView.markPaid()}"
value="#{i18n['bill.markPaid']}"
/>
<h:commandButton rendered="#{bill.paidDate == null}" action="#{billListView.markPaid()}" value="#{i18n['bill.markPaid']}">
<f:ajax render="@form" />
</h:commandButton>
<h:outputText rendered="#{bill.paidDate != null}" value="#{i18n['bill.isPaid']}" />
</h:column>
......
......@@ -2,7 +2,7 @@
<!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:tools="http://java.sun.com/jsf/composite/tools">
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<composite:interface>
......@@ -21,7 +21,10 @@
<h:message for="shortdesc" />
<h:outputLabel for="percentage" value="#{i18n['discount.percentage']}:" />
<h:inputText id="percentage" value="#{productView.discount.percentage}" required="true" />
<h:inputText id="percentage" value="#{productView.discount.percentage}" required="true">
<f:validateRequired for="percentage" />
<f:validateDoubleRange maximum="1" minimum="0" />
</h:inputText>
<h:message for="percentage" />
<h:outputLabel for="code" value="#{i18n['discount.code']}:" />
......@@ -36,10 +39,18 @@
<h:inputText id="amountmax" value="#{productView.discount.amountMax}" required="true" />
<h:message for="amountmax" />
<h:outputLabel for="maxnum" value="#{i18n['discount.maxNum']}:" />
<h:inputText id="maxnum" value="#{productView.discount.maxNum}" required="true" />
<h:outputLabel for="maxnum" value="#{i18n['discount.maxNum']}:" />
<h:inputText id="maxnum" value="#{productView.discount.maxNum}" required="true" />
<h:message for="maxnum" />
<h:outputLabel for="validFrom" value="#{i18n['discount.validFrom']}:" />
<p:calendar id="validFrom" value="#{productView.discount.validFromTime}" style="simple" pattern="#{sessionHandler.datetimeFormat}" />
<h:message for="validFrom" />
<h:outputLabel for="validTo" value="#{i18n['discount.validTo']}:" />
<p:calendar id="validTo" value="#{productView.discount.validToTime}" style="simple" pattern="#{sessionHandler.datetimeFormat}" />
<h:message for="validTo" />
<h:outputLabel for="active" value="#{i18n['discount.active']}" />
<h:selectBooleanCheckbox id="active" value="#{productView.discount.active}" />
<h:message for="active" />
......
......@@ -13,7 +13,7 @@
<h:dataTable border="1" id="event" value="#{readerView.readerEvents}" var="event">
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['readerevent.']}" />
<h:outputText value="${i18n['readerevent.tagname']}" />
</f:facet>
<h:outputText rendered="#{!empty event.printedCard}" id="cardtag" value="#{event.printedCard.rfidUid}" />
......
<?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: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:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface>
<composite:attribute name="tabId" type="java.lang.String" required="true" />
</composite:interface>
......@@ -27,10 +25,16 @@
<f:param name="userid" value="#{userView.user.user.id}" />
</h:link></li>
<li class="shop"><h:link outcome="/shop/shopToUser" value="#{i18n['submenu.user.shop']}">
<f:param name="userid" value="#{userView.user.user.id}" />
</h:link></li>
<li class="accountevents"><h:link outcome="/useradmin/accountEvents" value="#{i18n['submenu.user.accountEvents']}">
<f:param name="userid" value="#{userView.user.user.id}" />
</h:link></li>
<li class="groups"><h:link outcome="/place/adminGroups" value="#{i18n['submenu.place.myGroups']}">
<f:param name="userid" value="#{userView.user.user.id}" />
</h:link></li>
......
......@@ -13,8 +13,6 @@
<ui:define name="content">
<ui:fragment rendered="#{!empty readerView.neighborUser}">
<h1>Neighbor event user found:</h1>
<h:outputText value="#{readerView.neighborUser.user.wholeName}" />
<h:form>
<h:dataTable var="card" value="#{readerView.neighborUser.printedCards}">
<h:column>
......
......@@ -2,7 +2,7 @@
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:f="http://java.sun.com/jsf/core"
xmlns:products="http://java.sun.com/jsf/composite/cditools/products" xmlns:c="http://java.sun.com/jsp/jstl/core">
xmlns:products="http://java.sun.com/jsf/composite/cditools/products" xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
......@@ -11,22 +11,37 @@
<f:event type="preRenderView" listener="#{productShopView.initShopView}" />
</f:metadata>
<ui:define name="title">
<h1>#{i18n['user.shop.title']}</h1>
<users:usertabs tabId="shop" />
</ui:define>
<ui:define name="content">
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['shop.user']}" />
<h:outputText value="#{productShopView.user.wholeName} #{productShopView.user.nick}" />
<h:outputLabel value="#{i18n['shop.accountBalance']}" />
<h:outputText value="#{productShopView.user.accountBalance}">
<f:convertNumber />
</h:outputText>
</h:panelGrid>
<h:form id="shoppingcartform">
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['shop.totalPrice']}" />
<h:outputText value="#{productShopView.totalPrice}">
<f:convertNumber />
</h:outputText>
<h:outputLabel value="#{i18n['shop.accountBalance']}" />
<h:outputText value="#{productShopView.accountBalance}">
<f:convertNumber />
</h:outputText>
<h:outputLabel value="#{i18n['shop.cash']}" />
<h:inputText value="#{productShopView.cash}">
<f:ajax render="@form" event="valueChange" />
<f:convertNumber />
</h:inputText>
</h:panelGrid>
<h:outputText value="#{i18n['product.shopInstant']}" />
<h:selectBooleanCheckbox value="#{productShopView.payInstant}" />
<h:selectBooleanCheckbox value="#{productShopView.payInstant}">
<f:ajax render="@form" execute="@form" />
</h:selectBooleanCheckbox>
<products:shop commitaction="#{productShopView.commitShoppingCart()}" items="#{productShopView.shoppingcart}" commitValue="#{i18n['productshop.commit']}" />
</h:form>
......
......@@ -17,8 +17,8 @@
</ui:define>
<ui:define name="content">
<h:outputLabel value="#{i18n['user.accountBalance']}: " for="accountbalance" />
<h:outputText id="accountbalance" value="#{userView.accountBalance}" />
<h:dataTable border="1" id="ac" value="#{userView.accountEvents}" var="ac">
<h:outputText id="accountbalance" value="#{userView.user.accountBalance}" />
<h:dataTable border="1" id="ac" value="#{userView.user.accountEvents}" var="ac">
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.productname']}" />
......
......@@ -14,7 +14,7 @@
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="invite" value="#{i18n['user.invitemail']}" />
<h:inputText id="invite" value="#{inviteView.invitemail}" required="true" />
<h:inputText id="invite" value="#{inviteView.invitemail}" size="40" required="true" />
<h:message for="invite" />
</h:panelGrid>
<h:commandButton action="#{inviteView.invite()}" value="#{i18n['user.invite']}" />
......
......@@ -18,8 +18,8 @@
</ui:define>
<ui:define name="content">
<h:outputLabel value="#{i18n['user.accountBalance']}: " for="accountbalance" />
<h:outputText id="accountbalance" value="#{userView.accountBalance}" />
<h:dataTable border="1" id="ac" value="#{userView.accountEvents}" var="ac">
<h:outputText id="accountbalance" value="#{userView.user.accountBalance}" />
<h:dataTable border="1" id="ac" value="#{userView.user.accountEvents}" var="ac">
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['accountEvent.productname']}" />
......
......@@ -29,4 +29,4 @@ productshop.minusTen = -10
productshop.plusOne = +1
productshop.plusTen = +10
user.unauthenticated = Kirjautumaton
user.unauthenticated = Kirjautumaton
......@@ -40,6 +40,7 @@ bill.deliveryTerms = Delivery terms
bill.edit = edit
bill.isPaid = Paid
bill.markPaid = Mark paid
bill.markedPaid = Bill marked paid
bill.notes = Notes
bill.noticetime = Notice time
bill.ourReference = Our reference
......@@ -84,6 +85,8 @@ discount.products = Products
discount.role = Role discount
discount.save = Save
discount.shortdesc = Description
discount.validFrom = Valid from
discount.validTo = Valid to
editplace.header = Edit place
......@@ -130,6 +133,7 @@ global.save = Save
imagefile.description = Description
imagefile.file = Imagefile
invite.emailexists = User with that email address already exists in the system.
invite.notFound = Invite invalid or already used
invite.successfull = Invite sent successfully
invite.userCreateSuccessfull = User successfully created. You can now login.
......@@ -324,7 +328,7 @@ product.prepaid = Prepaid
product.prepaidInstant = Created when prepaid is paid
product.price = Price of product
product.save = Save
product.shopInstant = Luo k\u2030teismaksu tuotteille
product.shopInstant = Create automatic cashpayment
product.sort = Sort nr
product.totalPrice = Total
product.unitName = Unit name
......@@ -368,6 +372,8 @@ role.read = (R)
role.write = (W)
shop.accountBalance = Balance
shop.cash = Cash deposit
shop.totalPrice = Price of products
shop.user = Selling to
sidebar.bill.list = My bills
......@@ -431,6 +437,7 @@ submenu.user.invite = Invite friends
submenu.user.manageuserlinks = Manage users
submenu.user.rolelinks = Manage roles
submenu.user.sendPicture = Send picture
submenu.user.shop = Shop
submenu.user.userlinks = User information
submenu.useradmin.create = Create user
submenu.useradmin.createCardTemplate = Create cardtemplate
......@@ -501,6 +508,7 @@ user.sex.FEMALE = Female
user.sex.MALE = Male
user.sex.UNDEFINED = Undefined
user.shop = Buy
user.shop.title = Shop to user
user.successfullySaved = Changes saved successfully
user.superadmin = Superadmin
user.thisIsCurrentImage = Current image
......@@ -516,6 +524,8 @@ userimage.webcam = Take picture with webcam
userlist.header = Users
userlist.search = Search
usertitle.managingUser = Shop
userview.header = Users
userview.loginstringFaulty = Username has to be atleast 2 characters long!
userview.passwordTooShort = Password has to be atleast 5 characters long!
......
......@@ -60,7 +60,7 @@ public class MapView extends GenericCDIView {
{
if (balance == null)
{
balance = acbean.getAccountBalance(user);
balance = user.getAccountBalance();
}
return balance;
}
......
......@@ -97,7 +97,7 @@ public class PlaceView extends GenericCDIView {
} else if (place.isBuyable() && !place.isTaken()) {
BigDecimal balance = acbean.getAccountBalance(permbean.getCurrentUser());
BigDecimal balance = user.getAccountBalance();
BigDecimal price = null;
if (permbean.isCurrentUser(user)) {
price = placebean.getTotalReservationPrice(place);
......
......@@ -18,6 +18,7 @@ import fi.insomnia.bortal.beans.ProductBeanLocal;
import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.model.Bill;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.web.annotations.SelectedUser;
import fi.insomnia.bortal.web.cdiview.GenericCDIView;
import fi.insomnia.bortal.web.helpers.ProductShopItem;
......@@ -46,6 +47,8 @@ public class ProductShopView extends GenericCDIView {
private boolean payInstant;
private BigDecimal cash = BigDecimal.ZERO;
private transient ListDataModel<ProductShopItem> shoppingcart;
@Inject
private BillListView billListView;
......@@ -63,7 +66,7 @@ public class ProductShopView extends GenericCDIView {
public void initShopView() {
if (requirePermissions(ShopPermission.SHOP_TO_OTHERS) && shoppingcart == null) {
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productList(productBean.listUserShoppableProducts()));
shoppingcart = new ListDataModel<ProductShopItem>(ProductShopItem.productGTList(productBean.findForStaffshop()));
logger.debug("Initialized shoppingcart to {}", shoppingcart);
this.beginConversation();
}
......@@ -77,6 +80,17 @@ public class ProductShopView extends GenericCDIView {
return null;
}
public BigDecimal getAccountBalance()
{
BigDecimal ret = user.getAccountBalance();
ret = ret.add(getCash());
ret = ret.subtract(getTotalPrice());
logger.info("User accountbalance {}, cash{}, total {}. retBalance {}", new Object[] {
user.getAccountBalance(), cash, getTotalPrice(), ret
});
return ret;
}
public BigDecimal getTotalPrice()
{
BigDecimal ret = BigDecimal.ZERO;
......@@ -106,7 +120,34 @@ public class ProductShopView extends GenericCDIView {
}
billbean.createBill(bill);
addFaceMessage("productshop.billCreated");
cash = BigDecimal.ZERO;
shoppingcart = null;
return "redirBillList";
}
public String commitShoppingCart()
{
EventUser retuser = null;
for (ProductShopItem shopitem : shoppingcart) {
if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) {
retuser = productBean.createAccountEvent(shopitem.getProduct(), shopitem.getCount(), user).getUser();
}
}
if (cash != null && cash.compareTo(BigDecimal.ZERO) != 0)
{
Product credProd = productBean.findCreditProduct();
retuser = productBean.createAccountEvent(credProd, cash, user).getUser();
}
if (user != null)
{
user = retuser;
}
shoppingcart = null;
cash = BigDecimal.ZERO;
return null;
}
public void setUser(EventUser user) {
......@@ -136,6 +177,10 @@ public class ProductShopView extends GenericCDIView {
}
public void setPayInstant(boolean payInstant) {
if (payInstant)
{
getCash();
}
this.payInstant = payInstant;
}
......@@ -150,4 +195,16 @@ public class ProductShopView extends GenericCDIView {
public void setBillListView(BillListView billListView) {
this.billListView = billListView;
}
public BigDecimal getCash() {
if (payInstant) {
cash = getTotalPrice();
logger.info("Getting instantcash as {}", cash);
}
return cash;
}
public void setCash(BigDecimal cash) {
this.cash = cash;
}
}
......@@ -42,6 +42,13 @@ public class ReaderView extends GenericCDIView {
private UserCardWrapper neighborUser;
public String createCardForUser() {
UserCardWrapper usr = userlist.getRowData();
ReaderEvent card = readerbean.createCard(event, usr.getUser());
return null;
}
public void initUserassocView() {
if (super.requirePermissions(UserPermission.CREATE_NEW) && event == null) {
event = readerbean.getEvent(eventid);
......
......@@ -20,7 +20,11 @@ public class UserCardWrapper implements Serializable {
public UserCardWrapper(User u, UserBeanLocal userbean) {
user = userbean.getEventUser(u);
printedCards = new ListDataModel<PrintedCard>(user.getPrintedCards());
List<PrintedCard> cards = null;
if (user != null) {
cards = user.getPrintedCards();
}
printedCards = new ListDataModel<PrintedCard>(cards);
}
public static ListDataModel<UserCardWrapper> initWrapper(List<User> users, UserBeanLocal userbean)
......
package fi.insomnia.bortal.web.cdiview.user;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import javax.ejb.EJB;
......@@ -16,13 +15,11 @@ import org.primefaces.model.UploadedFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.AccountEventBeanLocal;
import fi.insomnia.bortal.beans.CardTemplateBeanLocal;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.RoleBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.Role;
......@@ -67,10 +64,6 @@ public class UserView extends GenericCDIView {
@EJB
private CardTemplateBeanLocal cardBean;
private BigDecimal balance;
@EJB
private AccountEventBeanLocal acbean;
private List<AccountEvent> accountevents;
private List<Role> usersRoles;
@EJB
private RoleBeanLocal rolebean;
......@@ -110,24 +103,6 @@ public class UserView extends GenericCDIView {
return usersRoles;
}
public BigDecimal getAccountBalance()
{
if (balance == null)
{
balance = acbean.getAccountBalance(user);
}
return balance;
}
public List<AccountEvent> getAccountEvents()
{
if (accountevents == null)
{
accountevents = acbean.getAccountEvents(user);
}
return accountevents;
}
public String crop()
{
logger.info("Cropped image {}x{}", croppedImage.getLeft(), croppedImage.getTop());
......
......@@ -4,19 +4,17 @@ import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.VotingBeanLocal;
import fi.insomnia.bortal.enums.apps.CompoPermission;
import fi.insomnia.bortal.model.Compo;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.web.cdiview.GenericCDIView;
import fi.insomnia.bortal.enums.apps.CompoPermission;
@ManagedBean
@Named
@RequestScoped
public class VotingCompoListView extends GenericCDIView {
......@@ -25,14 +23,14 @@ public class VotingCompoListView extends GenericCDIView {
@EJB
private VotingBeanLocal votbean;
private Role role;
boolean curEntries;
boolean maxParts;
private static final Logger logger = LoggerFactory.getLogger(VotingCompoListView.class);
public boolean isCurEntries() {
return curEntries;
}
......@@ -49,14 +47,12 @@ public class VotingCompoListView extends GenericCDIView {
this.maxParts = maxParts;
}
public List<Compo> getCompos() {
return votbean.getCompoList();
}
public void initView() {
if(requirePermissions(CompoPermission.VIEW_COMPOS) && role == null) {
if (requirePermissions(CompoPermission.VIEW_COMPOS) && role == null) {
curEntries = true;
maxParts = true;
logger.info("Permission to view full compo listing.");
......
......@@ -2,6 +2,7 @@ package fi.insomnia.bortal.web.helpers;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -28,6 +29,24 @@ public class ProductShopItem {
setCount(BigDecimal.ZERO);
}
/**
* Return products that
*
* @param findForStaffshop
* @return
*/
public static List<ProductShopItem> productGTList(List<Product> products) {
List<ProductShopItem> ret = new ArrayList<ProductShopItem>();
for (Product prod : products) {
if (prod.getPrice().compareTo(BigDecimal.ZERO) > 0)
{
ret.add(new ProductShopItem(prod));
}
}
return ret;
}
public static List<ProductShopItem> productList(List<Product> products) {
List<ProductShopItem> ret = new ArrayList<ProductShopItem>();
for (Product prod : products) {
......@@ -49,7 +68,7 @@ public class ProductShopItem {
}
this.count = count;
price = product.getPrice().abs().multiply(count);
discounts = product.getActiveDiscounts(count);
discounts = product.getActiveDiscounts(count, Calendar.getInstance());
discountValues = new HashMap<Integer, BigDecimal>();
for (Discount d : discounts)
{
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!