AccountEvent.java 5.65 KB
/*
 * 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.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Account event contains the money / credit traffic for the user. Each row
 * references a Product entity.
 */

@Entity
@Table(name = "account_events")
public class AccountEvent extends GenericEntity {

	private static final long serialVersionUID = 2588419823225148100L;

	@Column(name = "cash", nullable = false)
	private boolean cash = false;
	/**
	 * What 1 unit of this product costs.
	 */
	@Column(name = "unit_price", nullable = false, precision = 24, scale = 4)
	private BigDecimal unitPrice;

	/**
	 * The units of the product, eg 1.345 (l), 5 (units) 888.32 (g)..
	 */
	@Column(name = "quantity", nullable = false, precision = 24, scale = 4)
	private BigDecimal quantity;

	/**
	 * The time this AccountEvent is created.
	 */
	@Column(name = "event_time", nullable = false)
	@Temporal(TemporalType.TIMESTAMP)
	private Calendar eventTime = Calendar.getInstance();

	/**
	 * Is the product delivered to the user.
	 */
	@Column(name = "delivered")
	@Temporal(TemporalType.TIMESTAMP)
	private Calendar delivered;

	/**
	 * If this AccountEvent is a product in foodwace, this field is a reference
	 * to that foodwave.
	 */

	@JoinColumn(name = "food_wave_id", referencedColumnName = FoodWave.ID_COLUMN)
	@ManyToOne
	private FoodWave foodWave;

	/**
	 * The product user has acquired and this this AccountEvent is a reference
	 * to.
	 */
	@JoinColumn(name = "product_id", referencedColumnName = Product.ID_COLUMN, nullable = false)
	@ManyToOne(optional = false)
	private Product product;

	/**
	 * The user that bought the products.
	 */
	@JoinColumn(name = "eventuser_id", referencedColumnName = EventUser.ID_COLUMN, nullable = false)
	@ManyToOne(optional = false)
	private EventUser user;

	/**
	 * Who sold the items to the user.
	 */
	@JoinColumn(name = "seller_eventuser_id", referencedColumnName = EventUser.ID_COLUMN)
	@ManyToOne(optional = true)
	private EventUser seller;

	/**
	 * What discounts user has for this account event. Some magic is applied to
	 * calculate these.. :)
	 */
	@OneToMany(mappedBy = "accountEvent", cascade = CascadeType.ALL)
	private List<DiscountInstance> discountInstances = new ArrayList<DiscountInstance>();

	/**
	 * When user has paid a bill a Account event for product "Credit" is created
	 * and reference to that bill is here..
	 */
	@OneToOne(mappedBy = "accountEvent")
	private Bill bill;

	@Lob
	private String description;

	public BigDecimal getTotal() {
		return getQuantity().multiply(getUnitPrice());
	}

	public AccountEvent() {
	}

	public AccountEvent(EventUser u, Product prod, BigDecimal unitPrice, BigDecimal quantity, Calendar eventTime) {
		if (!u.getEvent().equals(prod.getEvent())) {
			throw new RuntimeException("User and product are not in the same event!");
		}
		this.setUnitPrice(unitPrice);
		this.setQuantity(quantity);
		this.product = prod;
		this.eventTime = eventTime;
		this.user = u;
	}

	public Calendar getEventTime() {
		return eventTime;
	}

	public void setEventTime(Calendar eventTime) {
		this.eventTime = eventTime;
	}

	public Calendar getDelivered() {
		return delivered;
	}

	public void setDelivered(Calendar delivered) {
		this.delivered = delivered;
	}

	public EventUser getUser() {
		return user;
	}

	public void setUser(EventUser usersId) {
		this.user = usersId;
	}

	public List<DiscountInstance> getDiscountInstances() {
		return discountInstances;
	}

	public void setDiscountInstances(List<DiscountInstance> discountInstanceList) {
		this.discountInstances = discountInstanceList;
	}

	public void setFoodWave(FoodWave foodWave) {
		this.foodWave = foodWave;
	}

	public FoodWave getFoodWave() {
		return foodWave;
	}

	public void setProduct(Product product) {
		this.product = product;
	}

	public Product getProduct() {
		return product;
	}

	public void setSeller(EventUser seller) {
		this.seller = seller;
	}

	public EventUser getSeller() {
		return seller;
	}

	public void setBill(Bill bill) {
		this.bill = bill;
	}

	public Bill getBill() {
		return bill;
	}

	public void setUnitPrice(BigDecimal unitPrice) {
		this.unitPrice = unitPrice;
	}

	public BigDecimal getUnitPrice() {
		return unitPrice;
	}

	public void setQuantity(BigDecimal quantity) {
		this.quantity = quantity;
	}

	public BigDecimal getQuantity() {
		return quantity;
	}

	public void setCash(boolean cash) {
		this.cash = cash;
	}

	public boolean isCash() {
		return cash;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public boolean isEventDelivered() {
		return (delivered != null);
	}

}