BasketInvoiceItemEntity.java

package sk.iway.iwcm.components.basket.jpa;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
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 javax.persistence.Transient;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.Min;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.components.basket.BasketDB;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.doc.DocDetails;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnNested;

@Entity
@Table(name="basket_item")
@Getter
@Setter
public class BasketInvoiceItemEntity {

	@Transient
    private DocDetails doc = null;

	@Id
	@Column(name="basket_item_id")
	@GeneratedValue(generator="WJGen_basket_item")
    @TableGenerator(name="WJGen_basket_item", pkColumnValue="basket_item")
	@DataTableColumn(inputType = DataTableColumnType.ID, title="ID")
	Long id;

	@ManyToOne
	@JsonProperty(access = JsonProperty.Access.READ_ONLY)
	@JsonBackReference(value="itemsBasketInvoice")
	@JoinColumn(name="basket_invoice_id", insertable = false, updatable = false)
	BasketInvoiceEntity itemsBasketInvoice;

	@Column(name="basket_invoice_id")
    @DataTableColumn(inputType = DataTableColumnType.HIDDEN)
    Integer invoiceId;

	@Column(name="item_title")
	@DataTableColumn(
		inputType = DataTableColumnType.OPEN_EDITOR,
		title = "components.basket.item_name",
				editor = {
            @DataTableColumnEditor(
                attr = { @DataTableColumnEditorAttr(key = "disabled", value = "disabled") }
            )
        }
	)
	private String itemTitle;

	@Column(name="item_price")
	@DataTableColumn(
		inputType = DataTableColumnType.NUMBER,
		renderFormat = "dt-format-number--decimal",
		title = "components.basket.price_without_DPH",
		editor = {
            @DataTableColumnEditor(
                attr = { @DataTableColumnEditorAttr(key = "disabled", value = "disabled") }
            )
        }
	)
	private BigDecimal itemPrice;

	@Column(name="item_qty")
	@DataTableColumn(
		inputType = DataTableColumnType.NUMBER,
		title = "components.basket.count"
	)
	@Min(1)
	private Integer itemQty;

	@Column(name="item_vat")
	private Integer itemVat;

	@Column(name="browser_id")
	private Long browserId;

	@Column(name="logged_user_id")
	private int loggedUserId;

	@Column(name="item_id")
	private int itemId;

	@Column(name="item_part_no")
	private String itemPartNo;

	@Column(name="item_note")
	private String itemNote;

	@Column(name="date_insert")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dateInsert;

	@Column(name="domain_id")
	private int domainId;

	@Transient
	@DataTableColumnNested
	private BasketInvoiceItemEditorFields editorFields = null;

	public BigDecimal getItemPriceQty() {
		return BigDecimal.valueOf(getItemQty()).multiply(itemPrice);
	}

    /**
	 * Vrati cenu jednej polozky vratane DPH
	 * @return
	 */
	public BigDecimal getItemPriceVat() {
		//vypocet DPH (aka VAT)
		BigDecimal vat = BigDecimal.valueOf( getItemVat() );
		vat = ( vat.divide(BigDecimal.valueOf(100)) ).add(BigDecimal.valueOf(1));
		return getItemPrice().multiply(vat);
	}

	public boolean itemAlreadyPurchased() {
		return getId() > 0;
	}

	/**
	 * Vrati cenu vratane DPH * pocet poloziek
	 * @return
	 */
	public BigDecimal getItemPriceVatQty() {
		return getItemPriceVat().multiply( BigDecimal.valueOf(getItemQty()) );
	}

	public String getTitle() {
		if (itemAlreadyPurchased())
			return getItemTitle();
		return(getDoc().getTitle());
	}

	public synchronized DocDetails getDoc() {
		if (doc == null) {
			DocDB docDB = DocDB.getInstance();
			doc = docDB.getDoc(getItemId());
		}
		return doc;
	}

	//------------------------PREPOCITAVANIE NA LOKALNE CENY POUZIVATELA-----------------------
	/**
	 * Metody na prepocitavanie cien do inych mien. Metody sa vyskytuju v roznych obmenach:
	 * getLocalPrice - vypocita cenu bez DPH
	 * getItemLocalPriceQty - vypocita cenu bez DPH krat pocet poloziek v kosiku
	 * getLocalPriceVat - vypocita cenu aj s DPH
	 * getItemLocalPriceVatQty - vypocita cenu s DPH krat pocet poloziek v kosiku
	 *
	 * Tieto metody sa vyskytuju v dvoch obmenach - s a bez zadanej meny. Ak sa mena nezada,
	 * vezme sa vychodzia mena pouzivatela.
	 */

	public BigDecimal getLocalPrice(HttpServletRequest request, String currency) {
		if (itemAlreadyPurchased())
			return getItemPrice();
		return getDoc().getLocalPrice(request, currency);
	}

	public BigDecimal getLocalPrice(HttpServletRequest request) {
		if (itemAlreadyPurchased())
			return getItemPrice();
		return getDoc().getLocalPrice(request);
	}

	public BigDecimal getItemLocalPriceQty(HttpServletRequest request, String currency) {
		return BigDecimal.valueOf(getItemQty()).multiply( getLocalPrice(request, currency) );
	}

	public BigDecimal getItemLocalPriceQty(HttpServletRequest request) {
		return BigDecimal.valueOf(getItemQty()).multiply( getLocalPrice(request) );
	}

	public BigDecimal getItemLocalPriceVatQty(HttpServletRequest request, String currency) {
		BigDecimal vat = BigDecimal.valueOf(getItemVat());
		vat = (vat.divide(BigDecimal.valueOf(100))).add(BigDecimal.valueOf(1));
		return vat.multiply(BigDecimal.valueOf(getItemQty())).multiply(getLocalPrice(request, currency));
	}

	public BigDecimal getLocalPriceVat(HttpServletRequest request, String currency) {
		BigDecimal vat = BigDecimal.valueOf(getItemVat());
		vat = (vat.divide(BigDecimal.valueOf(100))).add(BigDecimal.valueOf(1));
		return vat.multiply( getLocalPrice(request, currency) );
	}

	public BigDecimal getLocalPriceVat(HttpServletRequest request) {
		BigDecimal vat = BigDecimal.valueOf(getItemVat());
		vat = (vat.divide(BigDecimal.valueOf(100))).add(BigDecimal.valueOf(1));
		return vat.multiply( getLocalPrice(request) );
	}

	public BigDecimal getItemLocalPriceVatQty(HttpServletRequest request) {
		return getItemLocalPriceVatQty(request, BasketDB.getDisplayCurrency(request));
	}

	public Date getDateInsert() {
		return dateInsert == null ? null : (Date) dateInsert.clone();
	}

	public void setDateInsert(Date dateInsert) {
		this.dateInsert = dateInsert == null ? null : (Date) dateInsert.clone();
	}

	@Override
	public String toString() {
		return String.format("%dx%s", getItemQty(), getItemTitle());
	}
}