2312数电纸质发票不校验购买方地址电话银行账户_适配枚举编码
This commit is contained in:
parent
ae51ee48cb
commit
3ed9c679f6
|
@ -0,0 +1,454 @@
|
||||||
|
package nc.bs.sscivm.ivsale.rule;
|
||||||
|
|
||||||
|
import nc.bs.framework.common.NCLocator;
|
||||||
|
import nc.bs.sscivm.ivsale.ivaconst.IVAWebConst;
|
||||||
|
import nc.bs.sscivm.ivsale.util.IVApplicationTspzUtil;
|
||||||
|
import nc.bs.sscivm.logger.SSCIVMLogger;
|
||||||
|
import nc.impl.pubapp.pattern.rule.IRule;
|
||||||
|
import nc.itf.sscivm.service.IVMInvoiceQueryService;
|
||||||
|
import nc.vo.pub.BusinessException;
|
||||||
|
import nc.vo.pub.VOStatus;
|
||||||
|
import nc.vo.pub.lang.UFBoolean;
|
||||||
|
import nc.vo.pub.lang.UFDouble;
|
||||||
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
|
import nc.vo.sscivm.invoice.IVMInvoiceAggVO;
|
||||||
|
import nc.vo.sscivm.ivmpub.IVAplocationFPXZ;
|
||||||
|
import nc.vo.sscivm.ivmpub.IVAplocationZSFS;
|
||||||
|
import nc.vo.sscivm.ivmpub.InvoiceTypeEnum;
|
||||||
|
import nc.vo.sscivm.ivsale.IVApplicationAggVO;
|
||||||
|
import nc.vo.sscivm.ivsale.IVApplicationBodyVO;
|
||||||
|
import nc.vo.sscivm.ivsale.IVApplicationHeadVO;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public class IVApplicationCheckRule implements IRule<IVApplicationAggVO>{
|
||||||
|
@Override
|
||||||
|
public void process(IVApplicationAggVO[] vos) {
|
||||||
|
// 校验单据的购买方信息
|
||||||
|
if(vos != null && vos.length > 0){
|
||||||
|
for (IVApplicationAggVO aggVO : vos) {
|
||||||
|
// 增值税专用发票校验客户名称、客户纳税人识别号、地址电话、开户行及账号
|
||||||
|
Integer fplx = aggVO.getParentVO().getFplx();
|
||||||
|
UFBoolean sgbz = aggVO.getParentVO().getSgbz();
|
||||||
|
if (InvoiceTypeEnum.getSpecialInvoice().contains(fplx) && (sgbz == null || !sgbz.booleanValue())) {
|
||||||
|
checkHeadNull(aggVO);
|
||||||
|
} else if (sgbz != null && sgbz.booleanValue()){//收购类申请表头判空
|
||||||
|
checkSGHeadNull(aggVO);
|
||||||
|
} else {
|
||||||
|
// 其它类型发票客户名称不能为空
|
||||||
|
if (isEmpty(aggVO.getParentVO().getGmf_mc())) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0044")/*@res "该类型的发票购买方名称不能为空"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//红冲原因校验
|
||||||
|
checkCommonInvoice(aggVO);
|
||||||
|
|
||||||
|
// 校验表体的必输项:项目名称、数量
|
||||||
|
checkBodyNull(aggVO);
|
||||||
|
// 校验折扣行行号和被折扣行行号合法性
|
||||||
|
checkBodyValid(aggVO);
|
||||||
|
//校验表头表体金额是否一致
|
||||||
|
checkAmount(aggVO);
|
||||||
|
|
||||||
|
if (fplx == InvoiceTypeEnum.INVOICETYPE_ZYFP_JDC.toIntValue()){
|
||||||
|
//机动车专用发票单位校验
|
||||||
|
checkDw(aggVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
//矿产类发票校验
|
||||||
|
if (InvoiceTypeEnum.getKCLInvoice().contains(fplx)){
|
||||||
|
checkKCL(aggVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
//特殊票种校验
|
||||||
|
checkTspz(aggVO);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkBodyNull(IVApplicationAggVO aggVO) throws RuntimeException {
|
||||||
|
IVApplicationBodyVO[] applicationBodyVOs = (IVApplicationBodyVO[])aggVO.getChildrenVO();
|
||||||
|
List<IVApplicationBodyVO> applicationBodyVOList = new ArrayList<>();
|
||||||
|
|
||||||
|
if(applicationBodyVOs != null && applicationBodyVOs.length > 0){
|
||||||
|
for(IVApplicationBodyVO bodyvo : applicationBodyVOs){
|
||||||
|
if(bodyvo.getStatus() != VOStatus.DELETED){
|
||||||
|
applicationBodyVOList.add(bodyvo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
applicationBodyVOs = applicationBodyVOList.toArray(new IVApplicationBodyVO[0]);
|
||||||
|
IVApplicationHeadVO hvo = aggVO.getParentVO();
|
||||||
|
Integer fplx = hvo.getFplx();
|
||||||
|
|
||||||
|
if (applicationBodyVOs != null && applicationBodyVOs.length > 0) {
|
||||||
|
for (IVApplicationBodyVO applicationBodyVO : applicationBodyVOs) {
|
||||||
|
if (applicationBodyVO.getXmmc() == null) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0047")/*@res "开票申请单表体行的物料名称不能为空!"*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hvo.getSgbz() == null || !hvo.getSgbz().booleanValue() && (hvo.getHzfp() == null || !hvo.getHzfp().booleanValue()) && (hvo.getZffp() == null || !hvo.getZffp().booleanValue()) && (hvo.getCkfp() == null || !hvo.getCkfp().booleanValue())){
|
||||||
|
if (applicationBodyVO.getPk_materiel() != null && applicationBodyVO.getTaxcode() == null) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0159")/*@res "开票申请单表体行的税码不能为空!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 成品油普通发票、成品油专用发票、成品油普通发票(卷式)、增值税电子普通发票(成品油)表体数量是必输
|
||||||
|
if (fplx == InvoiceTypeEnum.INVOICETYPE_CPYPTFP.toIntValue()
|
||||||
|
|| fplx == InvoiceTypeEnum.INVOICETYPE_CPYZXFP.toIntValue()
|
||||||
|
|| fplx == InvoiceTypeEnum.INVOICETYPE_CPYPTFP_JS.toIntValue()
|
||||||
|
|| fplx == InvoiceTypeEnum.INVOICETYPE_DZPTFP_CPY.toIntValue()) {
|
||||||
|
if (applicationBodyVO.getXmsl() == null || applicationBodyVO.getXmsl().doubleValue() == 0.0) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0059")/*@res "该类型的发票表体行的数量不能为空!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0099")/*@res "表体数据不能为空"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkBodyValid(IVApplicationAggVO aggVO) {
|
||||||
|
IVApplicationBodyVO[] applicationBodyVOs = (IVApplicationBodyVO[])aggVO.getChildrenVO();
|
||||||
|
List<IVApplicationBodyVO> applicationBodyVOList = new ArrayList<>();
|
||||||
|
|
||||||
|
if(applicationBodyVOs != null && applicationBodyVOs.length > 0){
|
||||||
|
for(IVApplicationBodyVO bodyvo : applicationBodyVOs){
|
||||||
|
if(bodyvo.getStatus() != VOStatus.DELETED){
|
||||||
|
applicationBodyVOList.add(bodyvo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
applicationBodyVOs = applicationBodyVOList.toArray(new IVApplicationBodyVO[0]);
|
||||||
|
if((null == aggVO.getParentVO().getHzfp() || UFBoolean.FALSE.equals(aggVO.getParentVO().getHzfp()))
|
||||||
|
&& (null == aggVO.getParentVO().getZffp() || UFBoolean.FALSE.equals(aggVO.getParentVO().getZffp()))){
|
||||||
|
Map<String, IVApplicationBodyVO> rowNumAndBodyMap = new HashMap<>();
|
||||||
|
Map<String, String> rowNumAndXmmc = new HashMap<>();
|
||||||
|
Map<String,String> hhMap = new HashMap<String,String>();
|
||||||
|
for (IVApplicationBodyVO applicationBodyVO : applicationBodyVOs) {
|
||||||
|
if (applicationBodyVO.getHh() != null){
|
||||||
|
if (hhMap.get("hh"+applicationBodyVO.getHh()) != null){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0109")/*"行号不允许重复"*/);
|
||||||
|
} else {
|
||||||
|
hhMap.put("hh"+applicationBodyVO.getHh(), "hh"+applicationBodyVO.getHh());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!StringUtils.isEmpty(applicationBodyVO.getZkhhh())){
|
||||||
|
if (applicationBodyVO.getFphxz() == null || IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() != applicationBodyVO.getFphxz()){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0156")/*"当前行不是被折扣行,折扣行行号不能有值!"*/);
|
||||||
|
}
|
||||||
|
if (hhMap.get("zkhhh"+applicationBodyVO.getZkhhh()) != null){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0110")/*"折扣行行号不允许重复"*/);
|
||||||
|
} else {
|
||||||
|
hhMap.put("zkhhh"+applicationBodyVO.getZkhhh(), "zkhhh"+applicationBodyVO.getZkhhh());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 校验折扣行和被折扣行上的行号必输
|
||||||
|
if (applicationBodyVO.getFphxz() !=null && IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() == applicationBodyVO.getFphxz() && StringUtils.isEmpty(applicationBodyVO.getZkhhh())) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0097")/*@res "被折扣行的折扣行行号不能为空"*/);
|
||||||
|
} else if (applicationBodyVO.getFphxz() !=null && IVAplocationFPXZ.FPXZ_ZKH.toIntValue() == applicationBodyVO.getFphxz() && StringUtils.isEmpty(applicationBodyVO.getHh())) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0098")/*@res "折扣行的行号不能为空"*/);
|
||||||
|
}
|
||||||
|
// 折扣行与被折扣行金额正负校验
|
||||||
|
if ( (applicationBodyVO.getFphxz() != null && IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() == applicationBodyVO.getFphxz())
|
||||||
|
&& applicationBodyVO.getXmjshj().compareTo(UFDouble.ZERO_DBL) < 0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0108")/*@res "蓝字开票申请被折扣行金额不能为负数"*/);
|
||||||
|
}
|
||||||
|
if ( (applicationBodyVO.getFphxz() == null || IVAplocationFPXZ.FPXZ_ZKH.toIntValue() == applicationBodyVO.getFphxz())
|
||||||
|
&& applicationBodyVO.getXmjshj().compareTo(UFDouble.ZERO_DBL) > 0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0137")/*@res "蓝字开票申请单折扣行金额不能大于零,请修改数量为负数!"*/);
|
||||||
|
}
|
||||||
|
if (applicationBodyVO.getFphxz() !=null && IVAplocationFPXZ.FPXZ_ZKH.toIntValue() == applicationBodyVO.getFphxz()){
|
||||||
|
rowNumAndBodyMap.put(applicationBodyVO.getHh(), applicationBodyVO);
|
||||||
|
rowNumAndXmmc.put(applicationBodyVO.getHh(), applicationBodyVO.getXmmc());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (IVApplicationBodyVO applicationBodyVO : applicationBodyVOs) {
|
||||||
|
if (applicationBodyVO.getFphxz() !=null && IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() == applicationBodyVO.getFphxz() && !rowNumAndBodyMap.containsKey(applicationBodyVO.getZkhhh())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0099")/*@res "折扣行与被折扣行数据校验不通过"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 校验折扣行数与被折扣行数是否一致 add by ligru 20201203
|
||||||
|
int zkhNum = 0, bzkhNum = 0;
|
||||||
|
Map<String,IVApplicationBodyVO> zkhMap = new HashMap<String,IVApplicationBodyVO>();
|
||||||
|
for (IVApplicationBodyVO applicationBodyVO : applicationBodyVOs) {
|
||||||
|
if (applicationBodyVO.getFphxz() !=null && IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() == applicationBodyVO.getFphxz()){
|
||||||
|
bzkhNum++;
|
||||||
|
} else if(applicationBodyVO.getFphxz() !=null && IVAplocationFPXZ.FPXZ_ZKH.toIntValue() == applicationBodyVO.getFphxz()){
|
||||||
|
zkhMap.put(applicationBodyVO.getHh(), applicationBodyVO);
|
||||||
|
zkhNum++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(zkhNum != bzkhNum){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0099")/*@res "折扣行与被折扣行数据校验不通过"*/);
|
||||||
|
}
|
||||||
|
// 校验折扣行与被折扣行项目名称是否相同
|
||||||
|
for (IVApplicationBodyVO applicationBodyVO : applicationBodyVOs) {
|
||||||
|
if (applicationBodyVO.getFphxz() != null
|
||||||
|
&& IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() == applicationBodyVO.getFphxz()
|
||||||
|
&& !java.util.Objects.equals(rowNumAndXmmc.get(applicationBodyVO.getZkhhh()), applicationBodyVO.getXmmc()))
|
||||||
|
{
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID(
|
||||||
|
"1058sal_0",
|
||||||
|
"01058sal-0116",
|
||||||
|
null,
|
||||||
|
new String[] { rowNumAndXmmc.get(applicationBodyVO.getZkhhh()), applicationBodyVO.getXmmc() }/*@res 折扣行项目名称[{0}]与被折扣行项目名称[{1}]不一致*/));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(applicationBodyVO.getFphxz() != null
|
||||||
|
&& IVAplocationFPXZ.PFPXZ_BZKH.toIntValue() == applicationBodyVO.getFphxz()
|
||||||
|
&& applicationBodyVO.getXmjshj().add(zkhMap.get(applicationBodyVO.getZkhhh()).getXmjshj()).doubleValue() <0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0", "01058sal-0120")/*"被折扣行的金额应大于折扣行金额!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkSGHeadNull(IVApplicationAggVO aggVO) throws RuntimeException{
|
||||||
|
if(isEmpty(aggVO.getParentVO().getXsf_mc())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0193")/*@res "收购发票销售方名称不能为空"*/);
|
||||||
|
}
|
||||||
|
if(isEmpty(aggVO.getParentVO().getXsf_nsrsbh())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0194")/*@res "收购发票销售方纳税人识别号不能为空"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkHeadNull(IVApplicationAggVO aggVO) throws RuntimeException {
|
||||||
|
if(isEmpty(aggVO.getParentVO().getGmf_mc())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0040")/*@res "增值税专用发票购买方名称不能为空"*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isEmpty(aggVO.getParentVO().getGmf_nsrsbh())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0041")/*@res "增值税专用发票购买方纳税人识别号不能为空"*/);
|
||||||
|
}
|
||||||
|
//全电专票无需校验地址电话银行账号
|
||||||
|
if(aggVO.getHeadVO().getFplx() == InvoiceTypeEnum.DZFP_ZZSZYFP.toIntValue() || aggVO.getHeadVO().getFplx() == InvoiceTypeEnum.ZZFP_ZZSZYFP.toIntValue()
|
||||||
|
|| aggVO.getHeadVO().getFplx() == InvoiceTypeEnum.ZZFP_SDFP.toIntValue()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(isEmpty(aggVO.getParentVO().getGmf_dzdh())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0042")/*@res "增值税专用发票购买方地址电话不能为空"*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isEmpty(aggVO.getParentVO().getGmf_yhzh())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0043")/*@res "增值税专用发票购买方银行账号不能为空"*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkCommonInvoice(IVApplicationAggVO aggVO) throws RuntimeException {
|
||||||
|
|
||||||
|
//普票红字申请红冲原因不能为空,专票红字信息申请表不能为空@税率说明红冲原因@
|
||||||
|
if (aggVO.getHeadVO().getHzfp() != null && aggVO.getHeadVO().getHzfp().booleanValue()){
|
||||||
|
if ((InvoiceTypeEnum.getCommonInvoice().contains(aggVO.getHeadVO().getFplx()) || InvoiceTypeEnum.DZFP_ZZSZYFP.toIntValue()==aggVO.getHeadVO().getFplx())){
|
||||||
|
if (isEmpty(aggVO.getParentVO().getHcyy())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0185")/*"红冲原因不能为空"*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
IVApplicationBodyVO[] applicationBodyVOs = (IVApplicationBodyVO[])aggVO.getChildrenVO();
|
||||||
|
for (IVApplicationBodyVO applicationBodyVO : applicationBodyVOs){
|
||||||
|
//不校验删除行
|
||||||
|
if (applicationBodyVO.getStatus() == VOStatus.DELETED){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (applicationBodyVO.getSpbm() != null){
|
||||||
|
//税收编码为以1、2开头的冲红原因不允许选择“服务中止”;
|
||||||
|
if ((applicationBodyVO.getSpbm().startsWith("1") ||applicationBodyVO.getSpbm().startsWith("2")) && aggVO.getParentVO().getHcyy().equals("3")){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0186")/*"当前税收编码的红冲原因不允许选择:服务中止"*/);
|
||||||
|
}
|
||||||
|
//税收编码为以3开头的冲红原因不允许选择“销售退回”
|
||||||
|
if (applicationBodyVO.getSpbm().startsWith("3") && aggVO.getParentVO().getHcyy().equals("1")){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0187")/*"当前税收编码的红冲原因不允许选择:销货退回"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//红冲金额与蓝字发票金额一致时,红冲原因不允许选择“销售折让”
|
||||||
|
String condition = "fpdm='"+aggVO.getHeadVO().getFpdm()+"' and fphm='"+aggVO.getHeadVO().getFphm()+"' and dr = 0 and (billtypecode = 'SSIV-Cxx-sale' or (billtypecode = 'SSIV-Cxx-rec' and invoice_type in (109,309) )) ";
|
||||||
|
if (aggVO.getHeadVO().getFpdm() == null){
|
||||||
|
condition = " fphm='"+aggVO.getHeadVO().getFphm()+"' and dr = 0 and (billtypecode = 'SSIV-Cxx-sale' or (billtypecode = 'SSIV-Cxx-rec' and invoice_type in (109,309) )) ";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
IVMInvoiceAggVO[] vos = NCLocator.getInstance().lookup(IVMInvoiceQueryService.class).queryAggVOsByCondition(condition);
|
||||||
|
if (vos != null){
|
||||||
|
if ((vos[0].getHeadVO().getJshj().add(aggVO.getHeadVO().getJshj())).compareTo(UFDouble.ZERO_DBL) == 0 && aggVO.getParentVO().getHcyy().equals("4")){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0188")/*"全部红冲的原因不允许选择:销售折让"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
SSCIVMLogger.error(e.getMessage(), e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InvoiceTypeEnum.getSpecialInvoice().contains(aggVO.getHeadVO().getFplx()) && aggVO.getHeadVO().getFplx() != InvoiceTypeEnum.DZFP_ZZSZYFP.toIntValue() && isEmpty(aggVO.getParentVO().getHzxxsqb())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0189")/*"红字信息申请表不能为空"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验表头表体金额是否一致
|
||||||
|
* @param aggVO
|
||||||
|
*/
|
||||||
|
private void checkAmount(IVApplicationAggVO aggVO) {
|
||||||
|
UFDouble jshj = UFDouble.ZERO_DBL;
|
||||||
|
UFDouble hjje = UFDouble.ZERO_DBL;
|
||||||
|
UFDouble hjse = UFDouble.ZERO_DBL;
|
||||||
|
|
||||||
|
//表体金额合计
|
||||||
|
for (IVApplicationBodyVO bodyvo : aggVO.getBodyVOs()){
|
||||||
|
if (bodyvo.getStatus() == VOStatus.DELETED){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
jshj = jshj.add(bodyvo.getXmjshj() == null ? UFDouble.ZERO_DBL : bodyvo.getXmjshj());
|
||||||
|
hjje = hjje.add(bodyvo.getXmje() == null ? UFDouble.ZERO_DBL : bodyvo.getXmje());
|
||||||
|
hjse = hjse.add(bodyvo.getSe() == null ? UFDouble.ZERO_DBL : bodyvo.getSe());
|
||||||
|
}
|
||||||
|
|
||||||
|
IVApplicationHeadVO headvo = aggVO.getHeadVO();
|
||||||
|
//价税合计判断
|
||||||
|
if (headvo.getJshj().compareTo(jshj) != 0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0160")/*"表头表体价税合计不一致!"*/);
|
||||||
|
}
|
||||||
|
//无税金额判断
|
||||||
|
if (headvo.getHjje().compareTo(hjje) != 0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0161")/*"表头表体无税金额不一致!"*/);
|
||||||
|
}
|
||||||
|
//无税金额判断
|
||||||
|
if (headvo.getHjse().compareTo(hjse) != 0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0162")/*"表头表体税额不一致!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验机动车专用发票单位
|
||||||
|
* @param aggVO
|
||||||
|
*/
|
||||||
|
private void checkDw(IVApplicationAggVO aggVO){
|
||||||
|
for (IVApplicationBodyVO body : aggVO.getBodyVOs()){
|
||||||
|
if (body == null || !nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0225")/*@res "辆"*/.equals(body.getDw())){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0155", null, new String[] {nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0225")/*@res "辆"*/})/*"增值税专用发票(机动车)单位必须为辆,请修改!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 矿产类发票校验
|
||||||
|
* @param aggVO 开票申请VO
|
||||||
|
*/
|
||||||
|
private void checkKCL(IVApplicationAggVO aggVO){
|
||||||
|
for (IVApplicationBodyVO body : aggVO.getBodyVOs()){
|
||||||
|
//不校验删除行
|
||||||
|
if (body.getStatus() == VOStatus.DELETED){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//计量单位校验
|
||||||
|
if(body.getDw() == null || (!nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0226")/*@res "立方米"*/.equals(body.getDw()) && !nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0227")/*@res "吨"*/.equals(body.getDw()) && !nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0228")/*@res "千克"*/.equals(body.getDw()) && !nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0229")/*@res "克"*/.equals(body.getDw())&& !nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0230")/*@res "克拉"*/.equals(body.getDw()))){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0190", null, new String[]{nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0","01058sal-0231")/*@res "立方米、吨、千克、克、克拉"*/})/*"矿产类发票计量单位必须为:立方米、吨、千克、克、克拉!"*/);
|
||||||
|
}
|
||||||
|
//数量单价校验
|
||||||
|
if (body.getXmsl() == null || body.getXmsl().compareTo(UFDouble.ZERO_DBL) == 0 || body.getXmdj() == null || body.getXmdj().compareTo(UFDouble.ZERO_DBL) == 0){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0191")/*"矿产类发票单价数量不能为空!"*/);
|
||||||
|
}
|
||||||
|
//税收分类编码不为空时,需校验:税编为102矿产品开头且非102040303稀土矿产品开头的商品。
|
||||||
|
//税收分类编码为空且物料为空,“商品编码”字段含义为税收分类编码,此时需校验:税编为102矿产品开头且非102040303稀土矿产品开头的商品
|
||||||
|
if ((!StringUtils.isEmpty(body.getSsflbm()) && (!body.getSsflbm().startsWith("102") || body.getSsflbm().startsWith("102040303")))
|
||||||
|
||(StringUtils.isEmpty(body.getSsflbm()) && StringUtils.isEmpty(body.getPk_materiel()) &&(StringUtils.isEmpty(body.getSpbm()) || !body.getSpbm().startsWith("102") || body.getSpbm().startsWith("102040303")))){
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0192", null, new String[]{"102", "102040303"})/*"矿产类发票税收分类编码必须为102矿产品开头且非102040303稀土矿产品开头的商品!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void checkTspz(IVApplicationAggVO aggVO) {
|
||||||
|
|
||||||
|
String tspz = aggVO.getParentVO().getTspz() == null ? null : IVApplicationTspzUtil.getTspzCode( aggVO.getParentVO().getTspz());
|
||||||
|
//数电特殊票种为E06不动产租赁、E05不动产销售、E03建筑服务时,或为差额开票时,发票明细表体行只允许一正常明细行,或一组折扣与被折扣行
|
||||||
|
String zsfs = aggVO.getParentVO().getZsfs();
|
||||||
|
if(IVAWebConst.TSPZ_JZFW.equals(tspz)||
|
||||||
|
IVAWebConst.TSPZ_BDCXS.equals(tspz) ||
|
||||||
|
IVAWebConst.TSPZ_BDCZN.equals(tspz) ||
|
||||||
|
String.valueOf(IVAplocationZSFS.HCYY_CEZS.toIntValue()).equals(zsfs)
|
||||||
|
) {
|
||||||
|
//判断表体是否满足条件
|
||||||
|
boolean bodyflag = false;
|
||||||
|
IVApplicationBodyVO[] bodys = aggVO.getBodyVOs();
|
||||||
|
//过滤已删除的表体
|
||||||
|
List<IVApplicationBodyVO> unDelBodys = new ArrayList<>();
|
||||||
|
for (IVApplicationBodyVO body : bodys){
|
||||||
|
if (body.getStatus() != VOStatus.DELETED){
|
||||||
|
unDelBodys.add(body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bodys = unDelBodys.toArray(new IVApplicationBodyVO[0]);
|
||||||
|
if(bodys!=null && bodys.length>2) {
|
||||||
|
bodyflag =true;
|
||||||
|
}else if(bodys!=null && bodys.length==2){
|
||||||
|
for(IVApplicationBodyVO body:bodys) {
|
||||||
|
int fphxz = body.getFphxz();
|
||||||
|
//判断是否折扣及被折扣
|
||||||
|
if(IVAplocationFPXZ.FPXZ_ZKH.toIntValue()!= fphxz && IVAplocationFPXZ.PFPXZ_BZKH.toIntValue()!=fphxz) {
|
||||||
|
bodyflag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(bodyflag) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0263")/*@res "该票种属于特定业务或差额开票,开具时不可多行开具!"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( IVAWebConst.TSPZ_BDCXS.equals(tspz) || IVAWebConst.TSPZ_BDCZN.equals(tspz)) {
|
||||||
|
String bdcdz = aggVO.getParentVO().getBdcdz();
|
||||||
|
if (bdcdz == null ||(!bdcdz.contains("街") && !bdcdz.contains("路") && !bdcdz.contains("村") && !bdcdz.contains("乡") && !bdcdz.contains("镇")&& !bdcdz.contains("道") && !bdcdz.contains("巷") && !bdcdz.contains("号"))) {
|
||||||
|
ExceptionUtils.wrappBusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1058sal_0",
|
||||||
|
"01058sal-0265")/*@res "不动产地址必须包含街、路、村、乡、 镇、道、巷、号等任意一个关键词"*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public boolean isEmpty(String str) {
|
||||||
|
return StringUtils.isBlank(str) || "null".equals(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue