package com.jeeplus.assess.invoice.domain.OMS;


import org.hibernate.validator.constraints.NotBlank;

import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;

/**
 * 订单明细表信息
 */
public class OrderItem {

    /**
     * 行号
     * 明细行行号；仅作为唯一标识使用；最终发票中的明细顺序以请求报文中的明细顺序为准
     * 非空必填，字符串类型
     */
    @NotBlank(message = "明细行号lineCode不能为空")
    private String lineCode;

    /**
     * 对应蓝字发票明细行号
     * 红票必传 蓝字票非必填
     */
    private String oriLineCode;

    /**
     * 发票行性质
     * 00:正常行 01:折扣行 02:被折扣行
     * 必填 + 只能传指定的3个值
     */
    @NotBlank(message = "发票行性质lineType不能为空")
    @Pattern(regexp = "^00|01|02$", message = "发票行性质lineType只能传入：00(正常行)、01(折扣行)、02(被折扣行)")
    private String lineType;

    /**
     * 商品代码
     * 商品唯一标识为商品代码时必传
     */
    private String goodsCode;

    /**
     * 商品名称
     * 商品唯一标识包含商品名称时必传 | 业务核心字段 非空必填
     */
    @NotBlank(message = "商品名称goodsName不能为空")
    private String goodsName;

    /**
     * 规格型号
     * 商品唯一标识包含规格型号时必传；特定要素为14、15、31时，此字段必填，填写车辆识别代号/车架号码
     */
    private String model;

    /**
     * 计量单位
     * 特定要素为14、15、31时，填写“辆”
     */
    private String unit;

    /**
     * 数量
     * 数字，最大12位整数，小数最多4位；红字发票时为负数；特定要素为14、15、31时，填写1
     * 必填 + 数值精度严格校验
     */
    @NotNull(message = "商品数量qty不能为空")
    @Digits(integer = 12, fraction = 4, message = "数量qty格式错误，最大12位整数，最多保留4位小数")
    private BigDecimal qty;

    /**
     * 单价
     * 数字，最大12位整数，小数最多4位
     * 必填 + 数值精度严格校验
     */
    @NotNull(message = "商品单价price不能为空")
    @Digits(integer = 12, fraction = 4, message = "单价price格式错误，最大12位整数，最多保留4位小数")
    private BigDecimal price;

    /**
     * 单价含税标识
     * 0:不含税 1:含税；传0时price字段代表不含税单价，传1时price字段代表含税单价；默认为0 不含税
     * 必填 + 只能传0/1
     */
    @NotBlank(message = "单价含税标识priceTaxFlag不能为空")
    @Pattern(regexp = "^0|1$", message = "单价含税标识priceTaxFlag只能传入：0(不含税)、1(含税)")
    private String priceTaxFlag;

    /**
     * 税率
     * 必填 + 小数点后三位有效数字
     */
    @NotNull(message = "税率taxrate不能为空")
    @Digits(integer = 3, fraction = 3, message = "税率taxrate格式错误，最多3位整数，保留3位小数")
    private BigDecimal taxrate;

    /**
     * 金额
     * 不可为空 + 小数点后两位有效数字
     */
    @NotNull(message = "金额amount不能为空")
    @Digits(integer = 12, fraction = 2, message = "金额amount格式错误，最多12位整数，保留2位小数")
    private BigDecimal amount;

    /**
     * 税额
     * 不可为空 + 小数点后两位有效数字
     */
    @NotNull(message = "税额tax不能为空")
    @Digits(integer = 12, fraction = 2, message = "税额tax格式错误，最多12位整数，保留2位小数")
    private BigDecimal tax;

    /**
     * 含税金额
     * 小数点后两位有效数字
     */
    @Digits(integer = 12, fraction = 2, message = "含税金额taxamount格式错误，最多12位整数，保留2位小数")
    private BigDecimal taxamount;

    /**
     * 优惠政策标识
     * 01:简易征收;02:稀土产品;03:免税 等指定值，非必填但传值则校验合法性
     */
    @Pattern(regexp = "^$|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18",
            message = "优惠政策标识taxpre传入值不在合法范围内")
    private String taxpre;

    /**
     * 税收分类编码
     * 商品唯一标识包含税收分类编码时必传
     */
    private String goodstaxno;

    /**
     * 扣除额
     * 保留两位小数
     */
    @Digits(integer = 12, fraction = 2, message = "扣除额deduction格式错误，最多12位整数，保留2位小数")
    private BigDecimal deduction;

    /**
     * 煤炭种类
     * 煤炭商品必填; 0100:政府保供煤 0201:长协煤等，非必填但传值则校验合法性
     */
    @Pattern(regexp = "^$|0100|0201|0202|0203|0204|0300", message = "煤炭种类coalType传入值不在合法范围内")
    private String coalType;

    /**
     * 明细备用1-10 预留字段
     */
    private String itemspare1;
    private String itemspare2;
    private String itemspare3;
    private String itemspare4;
    private String itemspare5;
    private String itemspare6;
    private String itemspare7;
    private String itemspare8;
    private String itemspare9;
    private String itemspare10;



    public String getLineCode() {
        return lineCode;
    }

    public void setLineCode(String lineCode) {
        this.lineCode = lineCode;
    }

    public String getOriLineCode() {
        return oriLineCode;
    }

    public void setOriLineCode(String oriLineCode) {
        this.oriLineCode = oriLineCode;
    }

    public String getLineType() {
        return lineType;
    }

    public void setLineType(String lineType) {
        this.lineType = lineType;
    }

    public String getGoodsCode() {
        return goodsCode;
    }

    public void setGoodsCode(String goodsCode) {
        this.goodsCode = goodsCode;
    }

    public String getGoodsName() {
        return goodsName;
    }

    public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getUnit() {
        return unit;
    }

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

    public BigDecimal getQty() {
        return qty;
    }

    public void setQty(BigDecimal qty) {
        this.qty = qty;
    }

    public BigDecimal getPrice() {
        return price;
    }

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

    public String getPriceTaxFlag() {
        return priceTaxFlag;
    }

    public void setPriceTaxFlag(String priceTaxFlag) {
        this.priceTaxFlag = priceTaxFlag;
    }

    public BigDecimal getTaxrate() {
        return taxrate;
    }

    public void setTaxrate(BigDecimal taxrate) {
        this.taxrate = taxrate;
    }

    public BigDecimal getAmount() {
        return amount;
    }

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

    public BigDecimal getTax() {
        return tax;
    }

    public void setTax(BigDecimal tax) {
        this.tax = tax;
    }

    public BigDecimal getTaxamount() {
        return taxamount;
    }

    public void setTaxamount(BigDecimal taxamount) {
        this.taxamount = taxamount;
    }

    public String getTaxpre() {
        return taxpre;
    }

    public void setTaxpre(String taxpre) {
        this.taxpre = taxpre;
    }

    public String getGoodstaxno() {
        return goodstaxno;
    }

    public void setGoodstaxno(String goodstaxno) {
        this.goodstaxno = goodstaxno;
    }

    public BigDecimal getDeduction() {
        return deduction;
    }

    public void setDeduction(BigDecimal deduction) {
        this.deduction = deduction;
    }

    public String getCoalType() {
        return coalType;
    }

    public void setCoalType(String coalType) {
        this.coalType = coalType;
    }

    public String getItemspare1() {
        return itemspare1;
    }

    public void setItemspare1(String itemspare1) {
        this.itemspare1 = itemspare1;
    }

    public String getItemspare2() {
        return itemspare2;
    }

    public void setItemspare2(String itemspare2) {
        this.itemspare2 = itemspare2;
    }

    public String getItemspare3() {
        return itemspare3;
    }

    public void setItemspare3(String itemspare3) {
        this.itemspare3 = itemspare3;
    }

    public String getItemspare4() {
        return itemspare4;
    }

    public void setItemspare4(String itemspare4) {
        this.itemspare4 = itemspare4;
    }

    public String getItemspare5() {
        return itemspare5;
    }

    public void setItemspare5(String itemspare5) {
        this.itemspare5 = itemspare5;
    }

    public String getItemspare6() {
        return itemspare6;
    }

    public void setItemspare6(String itemspare6) {
        this.itemspare6 = itemspare6;
    }

    public String getItemspare7() {
        return itemspare7;
    }

    public void setItemspare7(String itemspare7) {
        this.itemspare7 = itemspare7;
    }

    public String getItemspare8() {
        return itemspare8;
    }

    public void setItemspare8(String itemspare8) {
        this.itemspare8 = itemspare8;
    }

    public String getItemspare9() {
        return itemspare9;
    }

    public void setItemspare9(String itemspare9) {
        this.itemspare9 = itemspare9;
    }

    public String getItemspare10() {
        return itemspare10;
    }

    public void setItemspare10(String itemspare10) {
        this.itemspare10 = itemspare10;
    }
}
