fix: 收票单推送金蝶补送分录税率编码
This commit is contained in:
+27
-1
@@ -266,7 +266,8 @@ public class KingdeeReceivedInvoiceSyncSupport {
|
|||||||
* 分录组装:逐行取发票明细行(镜像 items_json 反序列化为 {@link BfiInvoicePoolItemVO}),一条明细行一条分录:
|
* 分录组装:逐行取发票明细行(镜像 items_json 反序列化为 {@link BfiInvoicePoolItemVO}),一条明细行一条分录:
|
||||||
* 价税合计=明细金额+税额(合计为 0 拦截);数量取 num(≤0/空/不可解析兜底 1);单价取 unitPrice(空按价税合计/数量反算);
|
* 价税合计=明细金额+税额(合计为 0 拦截);数量取 num(≤0/空/不可解析兜底 1);单价取 unitPrice(空按价税合计/数量反算);
|
||||||
* 物料编码取行商品编码 goodsCode(缺失拦截,去尾部 0);不含税金额取明细金额(空不送);
|
* 物料编码取行商品编码 goodsCode(缺失拦截,去尾部 0);不含税金额取明细金额(空不送);
|
||||||
* 税收分类编码/税率表编码/税额不送;分录标识=发票号码_seq(重推幂等候选键)
|
* 税率编码=发票行税率(小数)×100 按第三方税率映射取编码(行税率空/非法不送,映射未维护拦截);
|
||||||
|
* 税收分类编码行商品编码已送/税率表编码/税额不送;分录标识=发票号码_seq(重推幂等候选键)
|
||||||
*
|
*
|
||||||
* @param receipt 收票登记(发票号码,分录标识前缀)
|
* @param receipt 收票登记(发票号码,分录标识前缀)
|
||||||
* @param mirror 票池镜像(明细行 items_json)
|
* @param mirror 票池镜像(明细行 items_json)
|
||||||
@@ -308,6 +309,9 @@ public class KingdeeReceivedInvoiceSyncSupport {
|
|||||||
// entry.setMaterialNumber(goodsCode);
|
// entry.setMaterialNumber(goodsCode);
|
||||||
// 税收分类编码.编码:数电票行商品编码即税收分类编码
|
// 税收分类编码.编码:数电票行商品编码即税收分类编码
|
||||||
entry.setETaxclassNumber(goodsCode);
|
entry.setETaxclassNumber(goodsCode);
|
||||||
|
// 税率.编码:发票行税率(小数如0.09)×100 转百分数后按 thirdparty.bfi.taxrate 映射(与应付/应收单同口径),行税率空/非法不送
|
||||||
|
entry.setTaxrateidNumber(kingdeeApBillSyncSupport.taxrateCode(
|
||||||
|
this.invoiceTaxRatePercent(receipt.getInvoiceNo(), seq, item.getTaxRate())));
|
||||||
|
|
||||||
// 金额(不含税):明细金额(空不送);税收分类编码/税率表编码/税额不送,税额仅参与价税合计
|
// 金额(不含税):明细金额(空不送);税收分类编码/税率表编码/税额不送,税额仅参与价税合计
|
||||||
if (detailAmount != null) {
|
if (detailAmount != null) {
|
||||||
@@ -326,6 +330,28 @@ public class KingdeeReceivedInvoiceSyncSupport {
|
|||||||
return stripped.isEmpty() ? code : stripped;
|
return stripped.isEmpty() ? code : stripped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发票行税率转百分数:票池税率文本为小数(如 "0.09" 表示 9%),×100 转百分数(9)后供税率编码映射查表;
|
||||||
|
* 行税率为空/非法返回 null(税率编码不送,与应付单无税率组口径一致)
|
||||||
|
*
|
||||||
|
* @param invoiceNo 发票号码(日志定位)
|
||||||
|
* @param seq 分录序号(日志定位)
|
||||||
|
* @param taxRateText 票池明细行税率文本(小数)
|
||||||
|
* @return 百分数税率(如 9),空/非法返回 null
|
||||||
|
*/
|
||||||
|
private BigDecimal invoiceTaxRatePercent(String invoiceNo, String seq, String taxRateText) {
|
||||||
|
if (Func.isBlank(taxRateText)) {
|
||||||
|
log.warn("收票登记发票[{}]分录[{}]行税率为空, 税率编码不送", invoiceNo, seq);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new BigDecimal(taxRateText.trim()).multiply(new BigDecimal("100"));
|
||||||
|
} catch (NumberFormatException exception) {
|
||||||
|
log.warn("收票登记发票[{}]分录[{}]行税率[{}]非法, 税率编码不送", invoiceNo, seq, taxRateText);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** 镜像明细行反序列化:items_json 解析异常按脏数据拦截(A801-1 原样落库,理论上可解析) */
|
/** 镜像明细行反序列化:items_json 解析异常按脏数据拦截(A801-1 原样落库,理论上可解析) */
|
||||||
private List<BfiInvoicePoolItemVO> parseMirrorItems(String invoiceNo, String itemsJson) {
|
private List<BfiInvoicePoolItemVO> parseMirrorItems(String invoiceNo, String itemsJson) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user