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

/**
 * OMS红字确认单返回接口的商品明细子类
 * 对应业务场景：红字确认单返回数据中的商品明细信息
 * 所有字段均采用 @Pattern 正则校验，规则：^$ 表示允许为空，| 分隔所有合法有效值
 */
public class OMSRedInvoiceConfirmApplyItem {

    /**
     * 商品名称（必填）
     * 长度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;

    /**
     * 计量单位（非必填）
     * 长度1-20位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,20}$", message = "计量单位unit只能传入：空 或 长度不超过20位的任意字符")
    private String unit;

    /**
     * 数量（非必填）
     * 整数最多20位，小数最多10位；冲红场景下可为负数
     */
    @Pattern(regexp = "^$|^-?\\d+(\\.\\d{1,10})?$", message = "数量qty只能传入：空 或 整数最多20位、小数最多10位的数字（可正可负）")
    private String qty;

    /**
     * 单价（非必填）
     * 整数最多20位，小数最多10位
     */
    @Pattern(regexp = "^$|^\\d+(\\.\\d{1,10})?$", message = "单价price只能传入：空 或 整数最多20位、小数最多10位的数字")
    private String price;

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

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

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

    /**
     * 优惠政策标识（非必填）
     * 可选值：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;

    /**
     * 税收分类编码简称（非必填）
     * 长度1-100位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,100}$", message = "税收分类编码简称codeAbb只能传入：空 或 长度不超过100位的任意字符")
    private String codeAbb;

    /**
     * 项目名称（非必填）
     * 不定长，最多1000位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,1000}$", message = "项目名称detailGoodsName只能传入：空 或 长度不超过1000位的任意字符")
    private String detailGoodsName;

    /**
     * 行号（非必填）
     * 长度1-8位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,8}$", message = "行号lineCode只能传入：空 或 长度不超过8位的任意字符")
    private String lineCode;

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

    /**
     * 原蓝票开票日期（非必填）
     * 格式：yyyy-mm-dd hh:mm:ss
     */
    @Pattern(regexp = "^$|^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            message = "原蓝票开票日期originalInvDate只能传入：空 或 格式为yyyy-mm-dd hh:mm:ss的日期")
    private String originalInvDate;

    /**
     * 开票失败原因（非必填）
     * 不定长，最多1000位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,1000}$", message = "开票失败原因failCause只能传入：空 或 长度不超过1000位的任意字符")
    private String failCause;

    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 String getQty() {
        return qty;
    }

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

    public String getPrice() {
        return price;
    }

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

    public String getAmount() {
        return amount;
    }

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

    public String getTaxrate() {
        return taxrate;
    }

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

    public String getTax() {
        return tax;
    }

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

    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 getCodeAbb() {
        return codeAbb;
    }

    public void setCodeAbb(String codeAbb) {
        this.codeAbb = codeAbb;
    }

    public String getDetailGoodsName() {
        return detailGoodsName;
    }

    public void setDetailGoodsName(String detailGoodsName) {
        this.detailGoodsName = detailGoodsName;
    }

    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 getOriginalInvDate() {
        return originalInvDate;
    }

    public void setOriginalInvDate(String originalInvDate) {
        this.originalInvDate = originalInvDate;
    }

    public String getFailCause() {
        return failCause;
    }

    public void setFailCause(String failCause) {
        this.failCause = failCause;
    }
}
