package cn.palmte.work.model;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;

@MappedSuperclass
public class ProjectBudgetCostDetailBase {
    public static final int TYPE_DEVICE = 1;
    public static final int TYPE_BUILD = 2;
    public static final int TYPE_SERVICE = 3;
    public static final int TYPE_OHTER = 4;

    /**
     * id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @GenericGenerator(name = "persistenceGenerator", strategy = "increment")
    private Integer id;

    @Column(name = "project_id")
    private int projectId;

    private int type;
    private int category;

    private String name;

    private String unit;
    private BigDecimal amount;
    private BigDecimal price;

    @Column(name = "tax_rate")
    private BigDecimal taxRate;

    @Column(name = "contract_party")
    private String contractParty;

    @Column(name = "is_underwritten")
    private int isUnderwritten;

    @Column(name = "underwritten_amount")
    private BigDecimal underwrittenAmount;

    @Column(name = "pay_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date payTime;

    @Column(name = "pay_amount")
    private BigDecimal payAmount;

    @Column(name = "pay_way")
    private String payWay;

    @Column(name = "remark")
    private String remark;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getProjectId() {
        return projectId;
    }

    public void setProjectId(int projectId) {
        this.projectId = projectId;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int getCategory() {
        return category;
    }

    public void setCategory(int category) {
        this.category = category;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUnit() {
        return unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public BigDecimal getTaxRate() {
        return taxRate;
    }

    public void setTaxRate(BigDecimal taxRate) {
        this.taxRate = taxRate;
    }

    public String getContractParty() {
        return contractParty;
    }

    public void setContractParty(String contractParty) {
        this.contractParty = contractParty;
    }

    public int getIsUnderwritten() {
        return isUnderwritten;
    }

    public void setIsUnderwritten(int isUnderwritten) {
        this.isUnderwritten = isUnderwritten;
    }

    public BigDecimal getUnderwrittenAmount() {
        return underwrittenAmount;
    }

    public void setUnderwrittenAmount(BigDecimal underwrittenAmount) {
        this.underwrittenAmount = underwrittenAmount;
    }

    public Date getPayTime() {
        return payTime;
    }

    public void setPayTime(Date payTime) {
        this.payTime = payTime;
    }

    public BigDecimal getPayAmount() {
        return payAmount;
    }

    public void setPayAmount(BigDecimal payAmount) {
        this.payAmount = payAmount;
    }

    public String getPayWay() {
        return payWay;
    }

    public void setPayWay(String payWay) {
        this.payWay = payWay;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public BigDecimal getTotalTaxInclude(){
        if(null == price){
            return BigDecimal.ZERO;
        }
        return price.multiply(amount);
    }
    public BigDecimal getTotalTaxExclude(){
        BigDecimal totalTaxInclude = getTotalTaxInclude();
        if(null == totalTaxInclude) {
            return BigDecimal.ZERO;
        } else if (taxRate == null){
            return totalTaxInclude;
        }

        //不含税总金额=含税总金额/（1+税率）
        return totalTaxInclude.divide(taxRate.divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(1)), 2, BigDecimal.ROUND_HALF_UP);
    }

    public BigDecimal getTotalTax(){
        BigDecimal totalTaxInclude = getTotalTaxInclude();
        if(null == totalTaxInclude || taxRate == null){
            return BigDecimal.ZERO;
        }

        //不含税总金额=含税总金额/（1+税率）
        return totalTaxInclude.multiply(taxRate.divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP)).divide(taxRate.divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(1)), 2, BigDecimal.ROUND_HALF_UP);
    }
}