package com.salesmanager.core.model.order.orderaccount;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import com.salesmanager.core.constants.SchemaConstant;
import com.salesmanager.core.model.order.orderproduct.OrderProduct;
import com.salesmanager.core.utils.CloneUtils;

@Entity
@Table (name="ORDER_ACCOUNT_PRODUCT", schema=SchemaConstant.SALESMANAGER_SCHEMA )
public class OrderAccountProduct implements Serializable {
	private static final long serialVersionUID = -7437197293537758668L;

	@Id
	@Column (name="ORDER_ACCOUNT_PRODUCT_ID")
	@TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
		pkColumnValue = "ORDERACCOUNTPRODUCT_SEQ_NEXT_VAL")
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
	private Long orderAccountProductId;

	@ManyToOne
	@JoinColumn(name = "ORDER_ACCOUNT_ID" , nullable=false)
	private OrderAccount orderAccount;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ORDER_PRODUCT_ID" , nullable=false)
	private OrderProduct orderProduct;

	@Temporal(TemporalType.DATE)
	@Column (name="ORDER_ACCOUNT_PRODUCT_ST_DT" , length=0 , nullable=false)
	private Date orderAccountProductStartDate;

	@Temporal(TemporalType.DATE)
	@Column (name="ORDER_ACCOUNT_PRODUCT_END_DT", length=0)
	private Date orderAccountProductEndDate;

	@Temporal(TemporalType.TIMESTAMP)
	@Column (name="ORDER_ACCOUNT_PRODUCT_EOT"  , length=0 )
	private Date orderAccountProductEot;

	@Temporal(TemporalType.DATE)
	@Column (name="ORDER_ACCOUNT_PRODUCT_ACCNT_DT"  , length=0 )
	private Date orderAccountProductAccountedDate;

	@Temporal(TemporalType.TIMESTAMP)
	@Column (name="ORDER_ACCOUNT_PRODUCT_L_ST_DT"  , length=0 )
	private Date orderAccountProductLastStatusDate;

	@Column (name="ORDER_ACCOUNT_PRODUCT_L_TRX_ST" , nullable=false )
	private Integer orderAccountProductLastTransactionStatus;

	@Column (name="ORDER_ACCOUNT_PRODUCT_PM_FR_TY" , nullable=false )
	private Integer orderAccountProductPaymentFrequencyType;

	@Column (name="ORDER_ACCOUNT_PRODUCT_STATUS" , nullable=false )
	private Integer orderAccountProductStatus;

	public OrderAccountProduct() {
	}

	public Long getOrderAccountProductId() {
		return orderAccountProductId;
	}

	public void setOrderAccountProductId(Long orderAccountProductId) {
		this.orderAccountProductId = orderAccountProductId;
	}

	public OrderAccount getOrderAccount() {
		return orderAccount;
	}

	public void setOrderAccount(OrderAccount orderAccount) {
		this.orderAccount = orderAccount;
	}

	public OrderProduct getOrderProduct() {
		return orderProduct;
	}

	public void setOrderProduct(OrderProduct orderProduct) {
		this.orderProduct = orderProduct;
	}

	public Date getOrderAccountProductStartDate() {
		return CloneUtils.clone(orderAccountProductStartDate);
	}

	public void setOrderAccountProductStartDate(Date orderAccountProductStartDate) {
		this.orderAccountProductStartDate = CloneUtils.clone(orderAccountProductStartDate);
	}

	public Date getOrderAccountProductEndDate() {
		return CloneUtils.clone(orderAccountProductEndDate);
	}

	public void setOrderAccountProductEndDate(Date orderAccountProductEndDate) {
		this.orderAccountProductEndDate = CloneUtils.clone(orderAccountProductEndDate);
	}

	public Date getOrderAccountProductEot() {
		return CloneUtils.clone(orderAccountProductEot);
	}

	public void setOrderAccountProductEot(Date orderAccountProductEot) {
		this.orderAccountProductEot = CloneUtils.clone(orderAccountProductEot);
	}

	public Date getOrderAccountProductAccountedDate() {
		return CloneUtils.clone(orderAccountProductAccountedDate);
	}

	public void setOrderAccountProductAccountedDate(
			Date orderAccountProductAccountedDate) {
		this.orderAccountProductAccountedDate = CloneUtils.clone(orderAccountProductAccountedDate);
	}

	public Date getOrderAccountProductLastStatusDate() {
		return CloneUtils.clone(orderAccountProductLastStatusDate);
	}

	public void setOrderAccountProductLastStatusDate(
			Date orderAccountProductLastStatusDate) {
		this.orderAccountProductLastStatusDate = CloneUtils.clone(orderAccountProductLastStatusDate);
	}

	public Integer getOrderAccountProductLastTransactionStatus() {
		return orderAccountProductLastTransactionStatus;
	}

	public void setOrderAccountProductLastTransactionStatus(
			Integer orderAccountProductLastTransactionStatus) {
		this.orderAccountProductLastTransactionStatus = orderAccountProductLastTransactionStatus;
	}

	public Integer getOrderAccountProductPaymentFrequencyType() {
		return orderAccountProductPaymentFrequencyType;
	}

	public void setOrderAccountProductPaymentFrequencyType(
			Integer orderAccountProductPaymentFrequencyType) {
		this.orderAccountProductPaymentFrequencyType = orderAccountProductPaymentFrequencyType;
	}

	public Integer getOrderAccountProductStatus() {
		return orderAccountProductStatus;
	}

	public void setOrderAccountProductStatus(Integer orderAccountProductStatus) {
		this.orderAccountProductStatus = orderAccountProductStatus;
	}
}
