|
@@ -1,6 +1,5 @@
|
|
|
package nc.bs.ic.base;
|
|
|
|
|
|
-import java.math.BigDecimal;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
@@ -9,18 +8,30 @@ import nc.bs.businessevent.IBusinessListener;
|
|
|
import nc.bs.framework.common.NCLocator;
|
|
|
import nc.bs.pu.event.PUBusinessEvent;
|
|
|
import nc.itf.uap.IUAPQueryBS;
|
|
|
+import nc.jdbc.framework.processor.ColumnProcessor;
|
|
|
import nc.jdbc.framework.processor.MapListProcessor;
|
|
|
+import nc.md.persist.framework.IMDPersistenceQueryService;
|
|
|
+import nc.vo.bd.defdoc.DefdocVO;
|
|
|
import nc.vo.pu.m25.entity.InvoiceItemVO;
|
|
|
import nc.vo.pu.m25.entity.InvoiceVO;
|
|
|
import nc.vo.pub.BusinessException;
|
|
|
-import nc.vo.pub.lang.UFDateTime;
|
|
|
+import nc.vo.pub.lang.UFDate;
|
|
|
import nc.vo.pub.lang.UFDouble;
|
|
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * 采购发票保存后校验
|
|
|
+ * @author yaoy
|
|
|
+ * 2023-05-25
|
|
|
+ *
|
|
|
+ */
|
|
|
public class InvoiceAfterCheckEvent implements IBusinessListener{
|
|
|
|
|
|
|
|
|
- IUAPQueryBS bs = NCLocator.getInstance().lookup(IUAPQueryBS.class);
|
|
|
+ private IUAPQueryBS bs = NCLocator.getInstance().lookup(IUAPQueryBS.class);
|
|
|
+ private IMDPersistenceQueryService service = NCLocator.getInstance().lookup(IMDPersistenceQueryService.class);
|
|
|
+
|
|
|
|
|
|
|
|
|
@Override
|
|
@@ -33,55 +44,99 @@ public class InvoiceAfterCheckEvent implements IBusinessListener{
|
|
|
}
|
|
|
if (obj instanceof InvoiceVO[]) {
|
|
|
InvoiceVO InvoiceVO = (InvoiceVO) obj[0];
|
|
|
- InvoiceItemVO[] invoiceItemListVO = (InvoiceItemVO[]) InvoiceVO.getChildren(InvoiceItemVO.class);
|
|
|
- UFDateTime date = new UFDateTime(System.currentTimeMillis());
|
|
|
- UFDateTime date2 = new UFDateTime("2023-01-01 00:00:01");
|
|
|
- //当年只能报销当年的控制
|
|
|
- if(date.getYear() != date2.getYear()) {
|
|
|
- ExceptionUtils.wrappBusinessException("不能跨年报销发票!");
|
|
|
- }
|
|
|
+ InvoiceItemVO[] arrInvoiceItemVO = (InvoiceItemVO[]) InvoiceVO.getChildren(InvoiceItemVO.class);
|
|
|
//参照上游单据的信息和发票信息一致性校验(抬头、税率)
|
|
|
//发票金额不可超过采购合同/订单金额
|
|
|
//购买方发票抬头、税号准确性
|
|
|
//来源单据类型
|
|
|
- String csourcetypecode = invoiceItemListVO[0].getCsourcetypecode();
|
|
|
+ String csourcetypecode = arrInvoiceItemVO[0].getCsourcetypecode();
|
|
|
//来源单据主键
|
|
|
- String csourceid = invoiceItemListVO[0].getCsourceid();
|
|
|
+ String csourceid = arrInvoiceItemVO[0].getCsourceid();
|
|
|
+
|
|
|
+ List<Map<Object, Object>> listMap = null;
|
|
|
//来源单据是采购订单
|
|
|
+
|
|
|
if("21".equals(csourcetypecode)) {
|
|
|
- String sql = "select po_order_b.pk_order_b,po_order_b.norigtaxmny,po_order_b.ntaxrate from po_order po_order" +
|
|
|
- " left join po_order_b po_order_b on po_order_b.pk_order = po_order.pk_order" +
|
|
|
- " where po_order.pk_order='"+csourceid+"'";
|
|
|
- List<Map<Object, Object>> listMap = (List<Map<Object, Object>>) bs.executeQuery(sql, new MapListProcessor());
|
|
|
- for (InvoiceItemVO invoiceItemVO : invoiceItemListVO) {
|
|
|
- for (Map<Object, Object> map : listMap) {
|
|
|
- if (invoiceItemVO.getCsourcebid().equals(map.get("pk_order_b"))) {
|
|
|
- UFDouble norigtaxmny1 = invoiceItemVO.getNorigtaxmny();
|
|
|
- UFDouble norigtaxmny2 = new UFDouble(map.get("norigtaxmny").toString());
|
|
|
- //比较价税合计
|
|
|
- if(norigtaxmny1.compareTo(norigtaxmny2) == 1) {
|
|
|
- ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"不可超过采购订单价税合计金额!");
|
|
|
- }
|
|
|
- //比较税率
|
|
|
- UFDouble ntaxrate1 = invoiceItemVO.getNtaxrate();
|
|
|
- UFDouble ntaxrate2 = new UFDouble(map.get("ntaxrate").toString());
|
|
|
- if(ntaxrate1.compareTo(ntaxrate2) != 0) {
|
|
|
- ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"与采购订单税率不同!");
|
|
|
- }
|
|
|
- //比较抬头
|
|
|
-
|
|
|
- //比较纳税人识别号
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ StringBuffer sql = new StringBuffer();
|
|
|
+ sql.append("SELECT");
|
|
|
+ sql.append(" po_order_b.pk_order_b,");
|
|
|
+ sql.append(" po_order_b.norigtaxmny,");
|
|
|
+ sql.append(" po_order_b.ntaxrate ");
|
|
|
+ sql.append(" FROM");
|
|
|
+ sql.append(" po_order po_order");
|
|
|
+ sql.append(" LEFT JOIN po_order_b po_order_b ON po_order.pk_order = po_order_b.pk_order");
|
|
|
+ sql.append(" WHERE");
|
|
|
+ sql.append(" po_order.pk_order = '"+csourceid+"'");
|
|
|
+ listMap = (List<Map<Object, Object>>) bs.executeQuery(sql.toString(), new MapListProcessor());
|
|
|
}
|
|
|
|
|
|
//来源单据是入库单
|
|
|
-
|
|
|
- String str = null;
|
|
|
- System.out.println(str.toString());
|
|
|
-
|
|
|
+ if("45".equals(csourcetypecode)) {
|
|
|
+ StringBuffer sql = new StringBuffer();
|
|
|
+ sql.append("SELECT");
|
|
|
+ sql.append(" ic_purchasein_b.cgeneralbid,");
|
|
|
+ sql.append(" po_order_b.pk_order_b,");
|
|
|
+ sql.append(" po_order_b.norigtaxmny,");
|
|
|
+ sql.append(" po_order_b.ntaxrate");
|
|
|
+ sql.append(" FROM");
|
|
|
+ sql.append(" ic_purchasein_h ic_purchasein_h");
|
|
|
+ sql.append(" LEFT JOIN ic_purchasein_b ic_purchasein_b ON ic_purchasein_h.cgeneralhid = ic_purchasein_b.cgeneralhid");
|
|
|
+ sql.append(" LEFT JOIN po_order_b po_order_b ON ic_purchasein_b.csourcebillbid = po_order_b.pk_order_b");
|
|
|
+ sql.append(" WHERE");
|
|
|
+ sql.append(" ic_purchasein_h.cgeneralhid = '"+csourceid+"'");
|
|
|
+ listMap = (List<Map<Object, Object>>) bs.executeQuery(sql.toString(), new MapListProcessor());
|
|
|
+ }
|
|
|
+ for (InvoiceItemVO invoiceItemVO : arrInvoiceItemVO) {
|
|
|
+ invoiceItemVO.setVbdef20("1001ZZ1000000097E319,1001ZZ10000000979E29");
|
|
|
+ String[] arrVbdef20 = invoiceItemVO.getVbdef20().split(",");
|
|
|
+ for(String Vbdef20 : arrVbdef20) {
|
|
|
+ DefdocVO defdocVO = (DefdocVO) service.queryBillOfNCObjectByPKWithDR(DefdocVO.class, Vbdef20, true).getContainmentObject();
|
|
|
+ UFDate date = new UFDate(System.currentTimeMillis());
|
|
|
+ UFDate date2 = new UFDate(defdocVO.getShortname4());
|
|
|
+ //当年只能报销当年的控制
|
|
|
+ if(date.getYear() != date2.getYear()) {
|
|
|
+ ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"不能跨年报销发票!");
|
|
|
+ }
|
|
|
+ //比较抬头
|
|
|
+ String sql1 = "select name from org_financeorg_v where pk_vid ='"+InvoiceVO.getParent().getAttributeValue("pk_org_v")+"'";
|
|
|
+ String orgname = (String) bs.executeQuery(sql1, new ColumnProcessor());
|
|
|
+ if(!orgname.equals(defdocVO.getName2())) {
|
|
|
+ ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"发票抬头不正确!");
|
|
|
+ }
|
|
|
+ //比较纳税人识别号
|
|
|
+ StringBuffer sql2 = new StringBuffer();
|
|
|
+ sql2.append("SELECT");
|
|
|
+ sql2.append(" name");
|
|
|
+ sql2.append(" FROM");
|
|
|
+ sql2.append(" bd_defdoc ");
|
|
|
+ sql2.append(" WHERE");
|
|
|
+ sql2.append(" pk_defdoclist = ( SELECT pk_defdoclist FROM bd_defdoclist WHERE code = 'CORPYS04' ) ");
|
|
|
+ sql2.append(" AND memo = '"+orgname+"' ");
|
|
|
+ sql2.append(" AND enablestate = 2");
|
|
|
+ String tcode = (String) bs.executeQuery(sql2.toString(), new ColumnProcessor());
|
|
|
+ if(!tcode.equals(defdocVO.getMnecode())) {
|
|
|
+ ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"纳税人识别号不正确!");
|
|
|
+ }
|
|
|
+ for (Map<Object, Object> map : listMap) {
|
|
|
+ //来源可能是采购订单,采购入库单
|
|
|
+ if (invoiceItemVO.getCsourcebid().equals(map.get("pk_order_b")) || invoiceItemVO.getCsourcebid().equals(map.get("cgeneralbid"))) {
|
|
|
+ UFDouble norigtaxmny1 = invoiceItemVO.getNorigtaxmny();
|
|
|
+ UFDouble norigtaxmny2 = new UFDouble(map.get("norigtaxmny").toString());
|
|
|
+ //比较价税合计
|
|
|
+ if(norigtaxmny1.compareTo(norigtaxmny2) == 1) {
|
|
|
+ ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"不可超过采购订单价税合计金额!");
|
|
|
+ }
|
|
|
+ //比较税率
|
|
|
+ UFDouble ntaxrate1 = invoiceItemVO.getNtaxrate();
|
|
|
+ UFDouble ntaxrate2 = new UFDouble(map.get("ntaxrate").toString());
|
|
|
+ if(ntaxrate1.compareTo(ntaxrate2) != 0) {
|
|
|
+ ExceptionUtils.wrappBusinessException("行:"+invoiceItemVO.getCrowno()+"与采购订单税率不同!");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|