package com.jeeplus.finance.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 javax.validation.constraints.Size;
import java.math.BigDecimal;

/**
 * 差额凭证信息子实体类
 * 差额征税、差额开票时必传
 */
public class DifferenceVoucher {

    /**
     * 序号
     * 必填，从1开始依次增加，3位字符
     */
    @NotBlank(message = "序号detailIndex不能为空")
    @Pattern(regexp = "^[1-9]\\d{0,2}$",
            message = "序号必须从1开始依次增加，且为1-3位数字")
    private String detailIndex;

    /**
     * 凭证类型
     * 必填，可选值：01(数电发票)、02(增值税专用发票)、03(增值税普通发票)、04(营业税发票)、05(财政票据)、06(法院裁决书)、07(契税完税凭证)、08(其他发票类)、09(其他扣除凭证)
     */
    @NotBlank(message = "凭证类型voucherType不能为空")
    @Pattern(regexp = "^01|02|03|04|05|06|07|08|09$",
            message = "凭证类型不在合法范围内")
    private String voucherType;

    /**
     * 数电票号码
     * 凭证类型为01时必传，最大20字符
     */
    @Size(max = 20, message = "数电票号码长度不能超过20字符")
    private String allEinVno;

    /**
     * 发票代码
     * 凭证类型为02、03、04时必传，最大12字符
     */
    @Size(max = 12, message = "发票代码长度不能超过12字符")
    private String invcode;

    /**
     * 发票号码
     * 凭证类型为02、03、04时必传，最大8字符
     */
    @Size(max = 8, message = "发票号码长度不能超过8字符")
    private String invno;

    /**
     * 凭证号码
     * 最大20字符
     */
    @Size(max = 20, message = "凭证号码长度不能超过20字符")
    private String voucherNumber;

    /**
     * 开具日期
     * 凭证类型为01、02、03、04时必传，格式为yyyy-MM-dd
     */
    @Pattern(regexp = "^$|^\\d{4}-\\d{2}-\\d{2}$",
            message = "开具日期格式错误，必须为yyyy-MM-dd")
    private String invoiceTime;

    /**
     * 凭证金额
     * 必填，最多18位整数，保留2位小数
     */
    @NotNull(message = "凭证金额totalTax不能为空")
    @Digits(integer = 18, fraction = 2, message = "凭证金额格式错误，最多18位整数，保留2位小数")
    private BigDecimal totalTax;

    /**
     * 本次扣除金额
     * 必填，不能大于凭证金额，最多18位整数，保留2位小数
     */
    @NotNull(message = "本次扣除金额deduction不能为空")
    @Digits(integer = 18, fraction = 2, message = "本次扣除金额格式错误，最多18位整数，保留2位小数")
    private BigDecimal deduction;

    /**
     * 备注
     * 凭证类型为08、09时必传，最大100字符
     */
    @Size(max = 100, message = "备注长度不能超过100字符")
    private String remarks;

    /**
     * 凭证来源
     * 必填，可选值：1(手工录入)、2(勾选录入)、3(模板录入)；同一张发票内保持一致
     */
    @NotBlank(message = "凭证来源voucherSource不能为空")
    @Pattern(regexp = "^1|2|3$",
            message = "凭证来源只能传入：1(手工录入)、2(勾选录入)、3(模板录入)")
    private String voucherSource;

    public String getDetailIndex() {
        return detailIndex;
    }

    public void setDetailIndex(String detailIndex) {
        this.detailIndex = detailIndex;
    }

    public String getVoucherType() {
        return voucherType;
    }

    public void setVoucherType(String voucherType) {
        this.voucherType = voucherType;
    }

    public String getAllEinVno() {
        return allEinVno;
    }

    public void setAllEinVno(String allEinVno) {
        this.allEinVno = allEinVno;
    }

    public String getInvcode() {
        return invcode;
    }

    public void setInvcode(String invcode) {
        this.invcode = invcode;
    }

    public String getInvno() {
        return invno;
    }

    public void setInvno(String invno) {
        this.invno = invno;
    }

    public String getVoucherNumber() {
        return voucherNumber;
    }

    public void setVoucherNumber(String voucherNumber) {
        this.voucherNumber = voucherNumber;
    }

    public String getInvoiceTime() {
        return invoiceTime;
    }

    public void setInvoiceTime(String invoiceTime) {
        this.invoiceTime = invoiceTime;
    }

    public BigDecimal getTotalTax() {
        return totalTax;
    }

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

    public BigDecimal getDeduction() {
        return deduction;
    }

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

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    public String getVoucherSource() {
        return voucherSource;
    }

    public void setVoucherSource(String voucherSource) {
        this.voucherSource = voucherSource;
    }
}