package com.jeeplus.finance.invoice.domain.OMS.fastRed;
import com.google.common.collect.Lists;

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

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

    /**
     * 组织代码（必填）
     * 所属组织唯一标识，长度1-20位
     */
    @Pattern(regexp = "^[\\s\\S]{1,20}$", message = "组织代码deptCode为必填项，长度不能超过20位")
    private String deptCode;

    /**
     * 申请单号（必填）
     * 唯一标识，长度1-32位
     */
    @Pattern(regexp = "^[\\s\\S]{1,32}$", message = "申请单号applyNo为必填项，长度不能超过32位")
    private String applyNo;

    /**
     * 申请方身份（必填）
     * 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;

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

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

    /**
     * 原蓝票发票类型（必填）
     * 可选值：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;

    /**
     * 原蓝票金额（必填）
     * 正数，保留两位小数
     */
    @Pattern(regexp = "^\\d+(\\.\\d{1,2})?$", message = "原蓝票金额originalInvAmount为必填项，只能传入正数且保留两位小数")
    private String originalInvAmount;

    /**
     * 原蓝票税额（必填）
     * 正数，保留两位小数
     */
    @Pattern(regexp = "^\\d+(\\.\\d{1,2})?$", message = "原蓝票税额originalInvTax为必填项，只能传入正数且保留两位小数")
    private String originalInvTax;

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

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

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

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

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

    /**
     * 原蓝票特定要素类型（非必填）
     * 可选值：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;

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

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

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

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

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

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

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

    /**
     * 是否自动开票（非必填）
     * N:否 Y:是，默认N
     */
    @Pattern(regexp = "^$|N|Y", message = "是否自动开票autoMakeInv只能传入：空 或 N 或 Y")
    private String autoMakeInv;

    /**
     * 红字发票类型（非必填）
     * 原蓝票为增值税纸质发票时选填，可选值：01-数电票(增值税专用发票)、02-数电票(普通发票)、
     * 03-数电纸质发票(增值税专用发票)、04-数电纸质发票(普通发票)、83-数电票(机动车销售统一发票)、
     * 84-数电票(二手车销售统一发票)、87-数电纸质发票(机动车销售统一发票)、88-数电纸质发票(二手车销售统一发票)
     */
    @Pattern(regexp = "^$|01|02|03|04|83|84|87|88",
            message = "红字发票类型redInvType只能传入：空 或 指定枚举值")
    private String redInvType;

    /**
     * 红字发票详情信息
     */
    List<OMSApplyItem> applyItems = Lists.newArrayList();

    public String getDeptCode() {
        return deptCode;
    }

    public void setDeptCode(String deptCode) {
        this.deptCode = deptCode;
    }

    public String getApplyNo() {
        return applyNo;
    }

    public void setApplyNo(String applyNo) {
        this.applyNo = applyNo;
    }

    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 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 getOriginalInvType() {
        return originalInvType;
    }

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

    public String getOriginalInvAmount() {
        return originalInvAmount;
    }

    public void setOriginalInvAmount(String originalInvAmount) {
        this.originalInvAmount = originalInvAmount;
    }

    public String getOriginalInvTax() {
        return originalInvTax;
    }

    public void setOriginalInvTax(String originalInvTax) {
        this.originalInvTax = originalInvTax;
    }

    public String getOriginalInvDate() {
        return originalInvDate;
    }

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

    public String getRedReason() {
        return redReason;
    }

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

    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 getTotalTaxamount() {
        return totalTaxamount;
    }

    public void setTotalTaxamount(String totalTaxamount) {
        this.totalTaxamount = totalTaxamount;
    }

    public String getOriSpecificFactor() {
        return oriSpecificFactor;
    }

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

    public String getSpare1() {
        return spare1;
    }

    public void setSpare1(String spare1) {
        this.spare1 = spare1;
    }

    public String getSpare2() {
        return spare2;
    }

    public void setSpare2(String spare2) {
        this.spare2 = spare2;
    }

    public String getSpare3() {
        return spare3;
    }

    public void setSpare3(String spare3) {
        this.spare3 = spare3;
    }

    public String getSpare4() {
        return spare4;
    }

    public void setSpare4(String spare4) {
        this.spare4 = spare4;
    }

    public String getSpare5() {
        return spare5;
    }

    public void setSpare5(String spare5) {
        this.spare5 = spare5;
    }

    public String getDrawer() {
        return drawer;
    }

    public void setDrawer(String drawer) {
        this.drawer = drawer;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public String getAutoMakeInv() {
        return autoMakeInv;
    }

    public void setAutoMakeInv(String autoMakeInv) {
        this.autoMakeInv = autoMakeInv;
    }

    public String getRedInvType() {
        return redInvType;
    }

    public void setRedInvType(String redInvType) {
        this.redInvType = redInvType;
    }

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

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