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

import javax.validation.constraints.Pattern;
import java.util.List;

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

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

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

    /**
     * 申请方身份（必填）
     * 0:销方 1:购方
     */
    @Pattern(regexp = "0|1", message = "申请方身份applyIdentity为必填项，只能传入0（销方）或1（购方）")
    private String applyIdentity;

    /**
     * 销售方纳税人识别号（必填）
     * 长度1-20位
     */
    @Pattern(regexp = "^[\\s\\S]{1,20}$", message = "销售方纳税人识别号sellerTaxNo为必填项，长度不能超过20位")
    private String sellerTaxNo;

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

    /**
     * 购买方纳税人识别号（非必填）
     * 长度1-20位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,20}$", message = "购买方纳税人识别号buyerTaxno只能传入：空 或 长度不超过20位的任意字符")
    private String buyerTaxno;

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

    /**
     * 冲红原因（必填）
     * 01:开票有误 02:销货退回 03:服务中止 04:销售折让
     */
    @Pattern(regexp = "01|02|03|04", message = "冲红原因redReason为必填项，只能传入01/02/03/04")
    private String redReason;

    /**
     * 红字确认单状态（必填）
     * 01-无需确认、02-销方录入待购方确认、03-购方录入待销方确认、04-购销双方已确认
     * 05-作废(销方录入购方否认)、06-作废(购方录入销方否认)、07-作废(超72小时未确认)
     * 08-作废(发起方已撤销)、09-作废(确认后撤销)、10-作废(异常凭证)、15-申请中、16-申请失败
     */
    @Pattern(regexp = "01|02|03|04|05|06|07|08|09|10|15|16",
            message = "红字确认单状态confirmStatus为必填项，只能传入指定枚举值")
    private String confirmStatus;

    /**
     * 红字发票开具状态（必填）
     * 1:未开票 2:开票失败 3:已开票 4:开票中
     */
    @Pattern(regexp = "1|2|3|4", message = "红字发票开具状态makeStatus为必填项，只能传入1/2/3/4")
    private String makeStatus;

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

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

    /**
     * 原蓝票发票类型（必填）
     * 01-数电票(增值税专用发票)、02-数电票(普通发票)、03-数电纸质发票(增值税专用发票)
     * 04-数电纸质发票(普通发票)、83-数电票(机动车销售统一发票)、84-数电票(二手车销售统一发票)
     * 87-数电纸质发票(机动车销售统一发票)、88-数电纸质发票(二手车销售统一发票)
     * 05-增值税电子普通发票、06-增值税普通发票、07-增值税专用发票、08-增值税电子专用发票
     * 09-机动车统一销售发票、15-二手车统一销售发票
     */
    @Pattern(regexp = "01|02|03|04|83|84|87|88|05|06|07|08|09|15",
            message = "原蓝票发票类型originalInvType为必填项，只能传入指定枚举值")
    private String originalInvType;

    /**
     * 原蓝票发票代码（非必填）
     * 12位或10位纯数字
     */
    @Pattern(regexp = "^$|^\\d{10}$|^\\d{12}$", message = "原蓝票发票代码originalInvcode只能传入：空 或 10位/12位纯数字")
    private String originalInvcode;

    /**
     * 原蓝票发票号码（非必填）
     * 20位或8位纯数字
     */
    @Pattern(regexp = "^$|^\\d{8}$|^\\d{20}$", message = "原蓝票发票号码originalInvno只能传入：空 或 8位/20位纯数字")
    private String originalInvno;

    /**
     * 原蓝票开票日期（非必填）
     * 格式：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;

    /**
     * 原蓝票特定要素（非必填）
     * 01-成品油发票、02-稀土发票、03-建筑服务发票、04-货物运输服务发票、05-不动产销售服务发票
     * 06-不动产租赁服务发票、07-代收车船税、08-通行费、09-旅客运输服务发票、10-医疗服务（住院）发票
     * 11-医疗服务（门诊）发票、12-自产农产品销售发票、13-拖拉机和联合收割机发票、14-机动车
     * 15-二手车、16-农产品收购发票、17-光伏收购发票、18-卷烟发票、31-二手车*、32-电子烟
     * 51-二手车正向开具、52-二手车反向开具
     */
    @Pattern(regexp = "^$|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|31|32|51|52",
            message = "原蓝票特定要素oriSpecificFactor只能传入：空 或 指定枚举值")
    private String oriSpecificFactor;

    /**
     * 红字发票订单号（非必填）
     * 当请求方身份为0(销方)且红字确认单已开票时有值；长度1-50位
     */
    @Pattern(regexp = "^$|^[\\s\\S]{1,50}$", message = "红字发票订单号redInvOrderNo只能传入：空 或 长度不超过50位的任意字符")
    private String redInvOrderNo;

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

    /**
     * 红字确认单申请时间（非必填）
     * 格式：yyyy-MM-dd HH:mm:ss
     */
    @Pattern(regexp = "^$|^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            message = "红字确认单申请时间applyTime只能传入：空 或 格式为yyyy-MM-dd HH:mm:ss的日期")
    private String applyTime;

    /**
     * 确认时间（非必填）
     * 格式：yyyy-MM-dd HH:mm:ss
     */
    @Pattern(regexp = "^$|^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            message = "确认时间confirmTime只能传入：空 或 格式为yyyy-MM-dd HH:mm:ss的日期")
    private String confirmTime;

    /**
     * 商品类
     */
    private List<OMSRedInvoiceConfirmApplyItem> applyItems;

    public String getRedNo() {
        return redNo;
    }

    public void setRedNo(String redNo) {
        this.redNo = redNo;
    }

    public String getRedUuid() {
        return redUuid;
    }

    public void setRedUuid(String redUuid) {
        this.redUuid = redUuid;
    }

    public String getApplyIdentity() {
        return applyIdentity;
    }

    public void setApplyIdentity(String applyIdentity) {
        this.applyIdentity = applyIdentity;
    }

    public String getSellerTaxNo() {
        return sellerTaxNo;
    }

    public void setSellerTaxNo(String sellerTaxNo) {
        this.sellerTaxNo = sellerTaxNo;
    }

    public String getSellerName() {
        return sellerName;
    }

    public void setSellerName(String sellerName) {
        this.sellerName = sellerName;
    }

    public String getBuyerTaxno() {
        return buyerTaxno;
    }

    public void setBuyerTaxno(String buyerTaxno) {
        this.buyerTaxno = buyerTaxno;
    }

    public String getBuyerName() {
        return buyerName;
    }

    public void setBuyerName(String buyerName) {
        this.buyerName = buyerName;
    }

    public String getRedReason() {
        return redReason;
    }

    public void setRedReason(String redReason) {
        this.redReason = redReason;
    }

    public String getConfirmStatus() {
        return confirmStatus;
    }

    public void setConfirmStatus(String confirmStatus) {
        this.confirmStatus = confirmStatus;
    }

    public String getMakeStatus() {
        return makeStatus;
    }

    public void setMakeStatus(String makeStatus) {
        this.makeStatus = makeStatus;
    }

    public String getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(String totalAmount) {
        this.totalAmount = totalAmount;
    }

    public String getTotalTax() {
        return totalTax;
    }

    public void setTotalTax(String totalTax) {
        this.totalTax = totalTax;
    }

    public String getOriginalInvType() {
        return originalInvType;
    }

    public void setOriginalInvType(String originalInvType) {
        this.originalInvType = originalInvType;
    }

    public String getOriginalInvcode() {
        return originalInvcode;
    }

    public void setOriginalInvcode(String originalInvcode) {
        this.originalInvcode = originalInvcode;
    }

    public String getOriginalInvno() {
        return originalInvno;
    }

    public void setOriginalInvno(String originalInvno) {
        this.originalInvno = originalInvno;
    }

    public String getOriginalInvDate() {
        return originalInvDate;
    }

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

    public String getOriSpecificFactor() {
        return oriSpecificFactor;
    }

    public void setOriSpecificFactor(String oriSpecificFactor) {
        this.oriSpecificFactor = oriSpecificFactor;
    }

    public String getRedInvOrderNo() {
        return redInvOrderNo;
    }

    public void setRedInvOrderNo(String redInvOrderNo) {
        this.redInvOrderNo = redInvOrderNo;
    }

    public String getFailCause() {
        return failCause;
    }

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

    public String getApplyTime() {
        return applyTime;
    }

    public void setApplyTime(String applyTime) {
        this.applyTime = applyTime;
    }

    public String getConfirmTime() {
        return confirmTime;
    }

    public void setConfirmTime(String confirmTime) {
        this.confirmTime = confirmTime;
    }

    public List<OMSRedInvoiceConfirmApplyItem> getApplyItems() {
        return applyItems;
    }

    public void setApplyItems(List<OMSRedInvoiceConfirmApplyItem> applyItems) {
        this.applyItems = applyItems;
    }
}
