修改销售订单累计开票金额取值逻辑,

修改销售发票提交校验逻辑
This commit is contained in:
2025-08-07 15:47:30 +08:00
parent a33073e02d
commit 6255c510c6
3 changed files with 144 additions and 48 deletions

View File

@@ -19,8 +19,8 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber");
e.FieldKeys.Add("FAFTERTOTALTAX");
e.FieldKeys.Add("F_contractno");
e.FieldKeys.Add("FALLAMOUNTFOR");
e.FieldKeys.Add("FSALEORGID");
}
@@ -28,49 +28,74 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{
base.BeforeExecuteOperationTransaction(e);
//throw new Exception("asdfas");
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
foreach (var bill in e.SelectedRows)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
var FAFTERTOTALTAX = Convert.ToDecimal(bill["AFTERTOTALTAX"]); // 发票单头价税合计本币
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
var entryList = bill["SALESICENTRY"] as DynamicObjectCollection;
// 根据合同号分组
var grouped = entryList.GroupBy(n => n["F_contractno"].ToString());
foreach (var group in grouped)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 销售订单价税合计
var saleOrderAmount = Convert.ToDecimal(saleOrder["FBILLALLAMOUNT_LC"]);
// 销售订单累计开票金额
var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]);
// 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计
if (saleOrderAmount < saleOrderINVOICEAMOUNT + FAFTERTOTALTAX)
{
//有错误信息
e.Cancel = true;
IOperationResult operationResult = new OperationResult();
operationResult.OperateResult.Add(new OperateResult()
// 纸质合同号
var contractNo = group.Key;
// 发票单体价税合计原币
var SumALLAMOUNTFOR = group.Sum(n => Convert.ToDecimal(n["FALLAMOUNTFOR"]));
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
PKValue = "1",
Name = "检查开票金额是否超额",
MessageType = MessageType.FatalError,
Message = string.Format($"纸质合同号:'{contractNo}' ,销售订单价税合计本币:{saleOrderAmount.ToString("0.00")} ,累计开票金额:{saleOrderINVOICEAMOUNT.ToString("0.00")},本次开票金额:{FAFTERTOTALTAX.ToString("0.00")},已超额,不允许提交"),
SuccessStatus = false
});
this.OperationResult.MergeResult(operationResult);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 销售订单Id
var saleOrderId = saleOrder["FID"].ToString();
var saleOrderNo = saleOrder["FBILLNO"].ToString();
// 销售订单价税合计(原币)
var saleOrderAmount = saleOrderService.GetSaleOrderAmount(saleOrderId);
// 销售订单累计开票金额(原币)
var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]);
// 销售订单退货金额(原币)
var rate = saleOrder["FEXCHANGERATE"].ToString();
var saleOrderReturnAmountK3Cloud = saleOrderService.GetSaleOrderRetrunAmount(saleOrderNo);
var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(contractNo, rate);
var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud;
// 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计
if (saleOrderAmount < saleOrderINVOICEAMOUNT + SumALLAMOUNTFOR - saleOrderReturnAmount)
{
//有错误信息
e.Cancel = true;
IOperationResult operationResult = new OperationResult();
operationResult.OperateResult.Add(new OperateResult()
{
PKValue = "1",
Name = "检查开票金额是否超额",
MessageType = MessageType.FatalError,
Message = string.Format($@"
销售订单:'{saleOrderNo}' , 纸质合同号:'{contractNo}', 开票超额,
不满足条件:销售订单价税合计 >= 累计开票金额 + 本次开票金额 - 退货金额。
销售订单价税合计:{saleOrderAmount.ToString("0.00")}
{saleOrderINVOICEAMOUNT.ToString("0.00")}
{SumALLAMOUNTFOR.ToString("0.00")},
退{saleOrderReturnAmountK3Cloud.ToString("0.00")},
K3退货金额{saleOrderReturnAmountK3.ToString("0.00")}
"),
SuccessStatus = false
});
this.OperationResult.MergeResult(operationResult);
}
}
}
}
}