package com.jeeplus.finance.invoice.domain.OMS.fastRed;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;

/**
 * OMS发票冲红申请明细实体类
 * 对应业务场景：发票冲红申请的商品明细参数封装
 * 所有字段均采用 @Pattern 正则校验，规则：^$ 表示允许为空，| 分隔所有合法有效值
 */
public class OMSApplyItem {

    /**
     * 行号（必填）
     * 明细行号，仅作为唯一标识使用；最终确认单中的明细顺序以请求报文中的明细顺序为准
     * 长度8位，支持数字或字符
     */
    @Pattern(regexp = "^[\\s\\S]{1,8}$", message = "行号lineCode为必填项，长度不能超过8位")
    private String lineCode;

    /**
     * 商品名称（必填）
     * 长度1-90位
     */
    @Pattern(regexp = "^[\\s\\S]{1,90}$", message = "商品名称goodsName为必填项，长度不能超过90位")
    private String goodsName;

    /**
     * 规格型号（非必填）
     * 原蓝票类型为机动车销售统一发票或特定要素为14、15、31时必传车架号；长度1-40位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,40}$", message = "规格型号model只能传入：空 或 长度不超过40位的任意字符（特定场景下需传车架号）")
    private String model;

    /**
     * 计量单位（非必填）
     * 特定要素为14、15、31时，填写“辆”；长度1-20位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,20}$", message = "计量单位unit只能传入：空 或 长度不超过20位的任意字符（特定场景下需填“辆”）")
    private String unit;

    /**
     * 数量（非必填）
     * 负数，最大12位整数（小数最多4位）或整数最多3位（小数最多13位）；特定要素为14、15、31时填写-1
     */
    @Pattern(regexp = "^$|-\\d+(\\.\\d{1,13})?$", message = "数量qty只能传入：空 或 负数（格式如-123.45，整数最多12位/小数最多13位，特定场景下填-1）")
    private BigDecimal qty;

    /**
     * 单价（非必填）
     * 数字，最大12位整数（小数最多4位）或整数最多3位（小数最多13位）
     */
    @Pattern(regexp = "^$|\\d+(\\.\\d{1,13})?$", message = "单价price只能传入：空 或 数字（格式如123.45，整数最多12位/小数最多13位）")
    private BigDecimal price;

    /**
     * 含税单价（非必填）
     * 数字，最大12位整数（小数最多4位）或整数最多3位（小数最多13位）
     */
    @Pattern(regexp = "^$|\\d+(\\.\\d{1,13})?$", message = "含税单价taxprice只能传入：空 或 数字（格式如123.45，整数最多12位/小数最多13位）")
    private BigDecimal taxprice;

    /**
     * 金额（不含税）（必填）
     * 负数，保留两位小数
     */
    @Pattern(regexp = "^-\\d+(\\.\\d{2})$", message = "金额（不含税）amount为必填项，只能传入负数且保留两位小数（如-123.45）")
    private BigDecimal amount;

    /**
     * 税率（必填）
     * 最多3位小数，格式如0.13、13.00
     */
    @Pattern(regexp = "^\\d+(\\.\\d{1,3})$", message = "税率taxrate为必填项，最多保留3位小数（如0.13、13.00）")
    private BigDecimal taxrate;

    /**
     * 税额（必填）
     * 负数，保留两位小数
     */
    @Pattern(regexp = "^-\\d+(\\.\\d{2})$", message = "税额tax为必填项，只能传入负数且保留两位小数（如-12.34）")
    private BigDecimal tax;

    /**
     * 含税金额（必填）
     * 负数，保留两位小数
     */
    @Pattern(regexp = "^-\\d+(\\.\\d{2})$", message = "含税金额taxamount为必填项，只能传入负数且保留两位小数（如-135.79）")
    private BigDecimal taxamount;

    /**
     * 优惠政策标识（非必填）
     * 可选值：01-简易征收;02-稀土产品;03-免税;04-不征税;05-先征后退;06-100%先征后退;07-50%先征后退;08-按3%简易征收;09-按5%简易征收;10-按5%简易征收减按1.5%计征;11-即征即退30%;12-即征即退50%;13-即征即退70%;14-即征即退100%;15-超税负3%即征即退;16-超税负8%即征即退;17-超税负12%即征即退;18-超税负6%即征即退
     */
    @Pattern(regexp = "^$|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18",
            message = "优惠政策标识taxpre只能传入：空 或 指定枚举值（如01-简易征收）")
    private String taxpre;

    /**
     * 税收分类编码（必填）
     * 长度1-19位，纯数字
     */
    @Pattern(regexp = "^\\d{1,19}$", message = "税收分类编码goodstaxno为必填项，只能传入1-19位纯数字")
    private String goodstaxno;

    /**
     * 对应蓝票明细行序号（必填）
     * 长度8位，纯数字
     */
    @Pattern(regexp = "^\\d{8}$", message = "对应蓝票明细行序号oriLineCode为必填项，只能传入8位纯数字")
    private String oriLineCode;

    /**
     * 明细备用1（非必填）
     * 预留字段，长度1-100位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,100}$", message = "明细备用1itemspare1只能传入：空 或 长度不超过100位的任意字符")
    private String itemspare1;

    /**
     * 明细备用2（非必填）
     * 预留字段，长度1-100位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,100}$", message = "明细备用2itemspare2只能传入：空 或 长度不超过100位的任意字符")
    private String itemspare2;

    /**
     * 明细备用3（非必填）
     * 预留字段，长度1-100位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,100}$", message = "明细备用3itemspare3只能传入：空 或 长度不超过100位的任意字符")
    private String itemspare3;

    /**
     * 明细备用4（非必填）
     * 预留字段，长度1-100位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,100}$", message = "明细备用4itemspare4只能传入：空 或 长度不超过100位的任意字符")
    private String itemspare4;

    /**
     * 明细备用5（非必填）
     * 预留字段，长度1-100位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,100}$", message = "明细备用5itemspare5只能传入：空 或 长度不超过100位的任意字符")
    private String itemspare5;

    public String getLineCode() {
        return lineCode;
    }

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

    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 BigDecimal getTaxprice() {
        return taxprice;
    }

    public void setTaxprice(BigDecimal taxprice) {
        this.taxprice = taxprice;
    }

    public BigDecimal getAmount() {
        return amount;
    }

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

    public BigDecimal getTaxrate() {
        return taxrate;
    }

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

    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 String getOriLineCode() {
        return oriLineCode;
    }

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

    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;
    }
}
