|
|
package com.dxhy.common.util;
|
|
|
|
|
|
import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
import com.dxhy.common.enums.FplxEnum;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
/**
|
|
|
* 发票信息校验处理类
|
|
|
*
|
|
|
* @author Administrator 2016-8-18 @version(版本)1.0
|
|
|
*
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
@SuppressWarnings({"AlibabaUndefineMagicConstant", "AlibabaAvoidComplexCondition"})
|
|
|
public class InvoiceUtil {
|
|
|
|
|
|
/**
|
|
|
* 电子发票号段
|
|
|
*/
|
|
|
public static final String HD =
|
|
|
"111001571071,111001571072,131001570151,133011501118,133020691510,133021591000,134021522401,144031539110";
|
|
|
|
|
|
/**
|
|
|
* 是否10位数字
|
|
|
*/
|
|
|
private static final Pattern FPDM10_PATTERN = Pattern.compile("\\d{10}");
|
|
|
|
|
|
/**
|
|
|
* 是否12位数字
|
|
|
*/
|
|
|
private static final Pattern FPDM12_PATTERN = Pattern.compile("\\d{12}");
|
|
|
|
|
|
/**
|
|
|
* 是否8位数字
|
|
|
*/
|
|
|
private static final Pattern FPHM8_PATTERN = Pattern.compile("\\d{8}");
|
|
|
|
|
|
/**
|
|
|
* 是否10位数字
|
|
|
*/
|
|
|
private static final Pattern FPHM10_PATTERN = Pattern.compile("\\d{10}");
|
|
|
|
|
|
/**
|
|
|
* 是否保留2位小数的钱数
|
|
|
*/
|
|
|
private static final Pattern MONEY_PATTERN = Pattern.compile(
|
|
|
"(^(([1-9]+\\d*)|(0{1}))(\\.\\d{1,2})?$)|(^-([1-9]+\\d*(\\.\\d{1,2})?|0\\.(0[1-9]{1}|[1-9]{1}\\d?))$)");
|
|
|
|
|
|
/**
|
|
|
* 发票类型代码
|
|
|
*/
|
|
|
private static String fplxdm;
|
|
|
|
|
|
/**
|
|
|
* 发票类型名称
|
|
|
*/
|
|
|
private static String fplxmc;
|
|
|
|
|
|
/**
|
|
|
* 发票代码
|
|
|
*/
|
|
|
private String fpdm;
|
|
|
|
|
|
/**
|
|
|
* 发票号码
|
|
|
*/
|
|
|
private String fphm;
|
|
|
|
|
|
/**
|
|
|
* 开票日期
|
|
|
*/
|
|
|
private String kprq;
|
|
|
|
|
|
/**
|
|
|
* 金额
|
|
|
*/
|
|
|
private String je;
|
|
|
|
|
|
/**
|
|
|
* 税额
|
|
|
*/
|
|
|
private String se;
|
|
|
|
|
|
/**
|
|
|
* 校验码
|
|
|
*/
|
|
|
private String jym;
|
|
|
|
|
|
public InvoiceUtil() {}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
* 根据发票代码判断发票类型 判断通行费发票时,需要传入特殊票种标识
|
|
|
*
|
|
|
* @param fpdm
|
|
|
* 发票代码
|
|
|
*
|
|
|
*/
|
|
|
public InvoiceUtil(String fpdm) {
|
|
|
if (fpdm != null && fpdm.length() >= 10) {
|
|
|
this.fpdm = fpdm;
|
|
|
this.getFplx(fpdm);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据发票代码获取发票类型
|
|
|
*
|
|
|
* @param fpdm
|
|
|
* 发票代码
|
|
|
*
|
|
|
* 1、 电子发票
|
|
|
* 特殊的发票代码包括:'144031539110', '131001570151', '133011501118', '111001571071',如果发票代码为以上代码之一,则判定为电子发票。
|
|
|
* 代码长度为12位,首位为0,最后两位为11。 2、 通行费发票 代码长度为12位,首位为0,最后两位是12。 3、 增值税普通发票 代码长度为12位,首位为0,最后两位是04或05;
|
|
|
* 代码长度为10位,第8位是3或者6。 4、 卷式发票 代码长度为12位,首位为0,最后两位是06或07; 5、 机动车发票 代码长度为12位,首位不是0,第8位是2 6、 增值税专用发票
|
|
|
* 代码长度为10位,第8位为1或5。 7、 货物运输发票 代码长度为10位,第8位为2或7 8、 二手车发票 代码长度为12位,首位为0,最后两位是17
|
|
|
*/
|
|
|
private void getFplx(String fpdm) {
|
|
|
|
|
|
String invoiceTypeCode;
|
|
|
|
|
|
invoiceTypeCode = fpdm.substring(7, 8);
|
|
|
|
|
|
if (fpdm.length() == 12) {
|
|
|
if (HD.contains(fpdm)) {
|
|
|
fplxdm = FplxEnum.DZP.getFplxDm();
|
|
|
fplxmc = FplxEnum.DZP.getFplxMc(FplxEnum.DZP.getIndex());
|
|
|
} else if ("0".equals(fpdm.substring(0, 1)) && "11".equals(fpdm.substring(10, 12))) {
|
|
|
fplxdm = FplxEnum.DZP.getFplxDm();
|
|
|
fplxmc = FplxEnum.DZP.getFplxMc(FplxEnum.DZP.getIndex());
|
|
|
} else if ("0".equals(fpdm.substring(0, 1)) && "12".equals(fpdm.substring(10, 12))) {
|
|
|
fplxdm = FplxEnum.TXF.getFplxDm();
|
|
|
fplxmc = FplxEnum.TXF.getFplxMc(FplxEnum.TXF.getIndex());
|
|
|
} else if (!"0".equals(fpdm.substring(0, 1)) && "2".equals(invoiceTypeCode)) {
|
|
|
fplxdm = FplxEnum.JDC.getFplxDm();
|
|
|
fplxmc = FplxEnum.JDC.getFplxMc(FplxEnum.JDC.getIndex());
|
|
|
} else if ("0".equals(fpdm.substring(0, 1))
|
|
|
&& ("06".equals(fpdm.substring(10, 12)) || "07".equals(fpdm.substring(10, 12)))) {
|
|
|
fplxdm = FplxEnum.JSP.getFplxDm();
|
|
|
fplxmc = FplxEnum.JSP.getFplxMc(FplxEnum.JSP.getIndex());
|
|
|
} else if ("0".equals(fpdm.substring(0, 1))
|
|
|
&& ("04".equals(fpdm.substring(10, 12)) || "05".equals(fpdm.substring(10, 12)))) {
|
|
|
fplxdm = FplxEnum.PP.getFplxDm();
|
|
|
fplxmc = FplxEnum.PP.getFplxMc(FplxEnum.PP.getIndex());
|
|
|
} else if ("0".equals(fpdm.substring(0, 1)) && "17".equals(fpdm.substring(10, 12))) {
|
|
|
fplxdm = FplxEnum.ESC.getFplxDm();
|
|
|
fplxmc = FplxEnum.ESC.getFplxMc(FplxEnum.ESC.getIndex());
|
|
|
} else if ("0".equals(fpdm.substring(0, 1)) && "13".equals(fpdm.substring(10, 12))) {
|
|
|
fplxdm = FplxEnum.DZZP.getFplxDm();
|
|
|
fplxmc = FplxEnum.DZZP.getFplxMc(FplxEnum.DZZP.getIndex());
|
|
|
} else {
|
|
|
fplxdm = null;
|
|
|
}
|
|
|
} else if (fpdm.length() == 10) {
|
|
|
if ("1".equals(invoiceTypeCode) || "5".equals(invoiceTypeCode)) {
|
|
|
fplxdm = FplxEnum.ZP.getFplxDm();
|
|
|
fplxmc = FplxEnum.ZP.getFplxMc(FplxEnum.ZP.getIndex());
|
|
|
} else if ("6".equals(invoiceTypeCode) || "3".equals(invoiceTypeCode)) {
|
|
|
fplxdm = FplxEnum.PP.getFplxDm();
|
|
|
fplxmc = FplxEnum.PP.getFplxMc(FplxEnum.PP.getIndex());
|
|
|
} else {
|
|
|
fplxdm = null;
|
|
|
}
|
|
|
} else {
|
|
|
fplxdm = null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断发票代码位数是否合法
|
|
|
*
|
|
|
* 合法返回true,否则返回false
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public boolean fpdmValid() {
|
|
|
boolean valid = false;
|
|
|
if (!StringHelper.isBlank(fpdm) && (FPDM10_PATTERN.matcher(fpdm).matches() || FPDM12_PATTERN.matcher(fpdm).matches())) {
|
|
|
valid = true;
|
|
|
}else if(fpdm == null || StringHelper.isBlank(fpdm)){
|
|
|
valid = true;
|
|
|
}
|
|
|
return valid;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断发票号码位数是否合法
|
|
|
*
|
|
|
* 合法返回true,否则返回false
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public boolean fphmValid() {
|
|
|
boolean valid = false;
|
|
|
if (!StringHelper.isBlank(fphm)
|
|
|
&& (FPHM8_PATTERN.matcher(fphm).matches() || FPHM10_PATTERN.matcher(fphm).matches())) {
|
|
|
valid = true;
|
|
|
}
|
|
|
return valid;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断金额是否合法
|
|
|
*
|
|
|
* 合法返回true,否则返回false
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public boolean jeValid() {
|
|
|
boolean valid = false;
|
|
|
if (!StringHelper.isBlank(je) && (MONEY_PATTERN.matcher(je).matches())) {
|
|
|
valid = true;
|
|
|
}
|
|
|
return valid;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断税额是否合法
|
|
|
*
|
|
|
* 合法返回true,否则返回false
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public boolean seValid() {
|
|
|
boolean valid = false;
|
|
|
if (!StringHelper.isBlank(se) && (MONEY_PATTERN.matcher(se).matches())) {
|
|
|
valid = true;
|
|
|
}
|
|
|
return valid;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断税额是否合法
|
|
|
*
|
|
|
* 合法返回true,否则返回false
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public boolean kprqValid(String dataFormat) {
|
|
|
boolean valid = true;
|
|
|
SimpleDateFormat format;
|
|
|
if (dataFormat == null) {
|
|
|
format = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
} else {
|
|
|
format = new SimpleDateFormat(dataFormat);
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
format.parse(kprq);
|
|
|
} catch (ParseException e) {
|
|
|
valid = false;
|
|
|
}
|
|
|
return valid;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 判断税额是否合法
|
|
|
*
|
|
|
* 合法返回true,否则返回false
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public boolean jymValid() {
|
|
|
boolean valid = false;
|
|
|
if (!StringHelper.isBlank(jym) && jym.length() >= 6) {
|
|
|
valid = true;
|
|
|
}
|
|
|
return valid;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取发票类型代码
|
|
|
*
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public String getFplxdm() {
|
|
|
return fplxdm;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取发票类型名称
|
|
|
*
|
|
|
*
|
|
|
*
|
|
|
*/
|
|
|
public String getFplxmc() {
|
|
|
return fplxmc;
|
|
|
}
|
|
|
|
|
|
public String getFpdm() {
|
|
|
return fpdm;
|
|
|
}
|
|
|
|
|
|
public void setFpdm(String fpdm) {
|
|
|
this.fpdm = fpdm;
|
|
|
this.getFplx(fpdm);
|
|
|
}
|
|
|
|
|
|
public String getFphm() {
|
|
|
return fphm;
|
|
|
}
|
|
|
|
|
|
public void setFphm(String fphm) {
|
|
|
this.fphm = fphm;
|
|
|
}
|
|
|
|
|
|
public String getKprq() {
|
|
|
return kprq;
|
|
|
}
|
|
|
|
|
|
public void setKprq(String kprq) {
|
|
|
this.kprq = kprq;
|
|
|
}
|
|
|
|
|
|
public String getJe() {
|
|
|
return je;
|
|
|
}
|
|
|
|
|
|
public void setJe(String je) {
|
|
|
this.je = je;
|
|
|
}
|
|
|
|
|
|
public String getSe() {
|
|
|
return se;
|
|
|
}
|
|
|
|
|
|
public void setSe(String se) {
|
|
|
this.se = se;
|
|
|
}
|
|
|
|
|
|
public String getJym() {
|
|
|
return jym;
|
|
|
}
|
|
|
|
|
|
public void setJym(String jym) {
|
|
|
this.jym = jym;
|
|
|
}
|
|
|
}
|
|
|
|