Commit af646526 by 陶然

优化了划转功能,支持未使用未开票金额优先划出

parent ea0e471a
......@@ -497,10 +497,14 @@ namespace Kivii.Finances
/// </summary>
/// <param name="payment"></param>
/// <param name="amountAssign"></param>
/// <param name="remark"></param>
/// <param name="ownerKvid"></param>
/// <param name="ownerName"></param>
/// <param name="conn"></param>
/// <param name="AmountFirst">标记划转出去的金额没有开票和没有使用优先,默认true,优先划转已经开票和使用的金额</param>
/// <returns></returns>
public static Payment BizAssign(this Payment payment, decimal amountAssign, string remark = null, Guid? ownerKvid = null, string ownerName = null, IDbConnection conn = null)
/// <exception cref="Exception"></exception>
public static Payment BizAssign(this Payment payment, decimal amountAssign, string remark = null, Guid? ownerKvid = null, string ownerName = null, IDbConnection conn = null, bool AmountFirst = true)
{
payment.ThrowIfNull($"传入payment参数为空");
if (payment.Type != PaymentType.Split) throw new Exception("请选择正确类型!");
......@@ -511,44 +515,99 @@ namespace Kivii.Finances
if (payment.OwnerKvid == ownerKvid) throw new Exception("不可划转至同部门!");
decimal amountInvoice = 0;
decimal amountUsed = 0;
if (payment.AmountInvoice > 0 || payment.AmountUsed > 0)//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
#region 计算开票金额和使用金额
if (AmountFirst)
{
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
//查看已经拆分的项目分得的已经开票金额
var existSplits = conn.Select<Payment>(o => o.RootKvid == payment.RootKvid && o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.Assign));
if (payment.AmountInvoice < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
if (payment.AmountInvoice > 0 || payment.AmountUsed > 0)//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (!existSplits.IsNullOrEmpty())
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
//查看已经拆分的项目分得的已经开票金额
var existSplits = conn.Select<Payment>(o => o.RootKvid == payment.RootKvid && o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.Assign));
if (payment.AmountInvoice < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
//剩余的开票金额
var remainAmountInvoice = payment.AmountInvoice - existSplits.Sum(o => o.AmountInvoice);
if (remainAmountInvoice > 0) amountInvoice = remainAmountInvoice > amountAssign ? amountAssign : remainAmountInvoice;
if (!existSplits.IsNullOrEmpty())
{
//剩余的开票金额
var remainAmountInvoice = payment.AmountInvoice - existSplits.Sum(o => o.AmountInvoice);
if (remainAmountInvoice > 0) amountInvoice = remainAmountInvoice > amountAssign ? amountAssign : remainAmountInvoice;
}
else
{
amountInvoice = payment.AmountInvoice > amountAssign ? amountAssign : payment.AmountInvoice;
}
}
else
else amountInvoice = amountAssign;//否则直接记录拆分项完全开票
if (payment.AmountUsed < payment.Amount)
{
amountInvoice = payment.AmountInvoice > amountAssign ? amountAssign : payment.AmountInvoice;
if (!existSplits.IsNullOrEmpty())
{
//剩余的开票金额
var remainAmountUsed = payment.AmountUsed - existSplits.Sum(o => o.AmountUsed);
if (remainAmountUsed > 0) amountUsed = remainAmountUsed > amountAssign ? amountAssign : remainAmountUsed;
}
else
{
amountUsed = payment.AmountUsed > amountAssign ? amountAssign : payment.AmountUsed;
}
}
else amountUsed = amountAssign;
}
else amountInvoice = amountAssign;//否则直接记录拆分项完全开票
if (payment.AmountUsed < payment.Amount)
}
else
{
if (payment.AmountInvoice > 0 || payment.AmountUsed > 0)//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (!existSplits.IsNullOrEmpty())
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
//查看已经拆分的项目分得的已经开票金额
var existAssigns = conn.Select<Payment>(o => o.RootKvid == payment.RootKvid && o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.Assign));
if (payment.AmountInvoice < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
//剩余的开票金额
var remainAmountUsed = payment.AmountUsed - existSplits.Sum(o => o.AmountUsed);
if (remainAmountUsed > 0) amountUsed = remainAmountUsed > amountAssign ? amountAssign : remainAmountUsed;
//剩余的未开票金额
var paymentAmountUnInvoice = payment.Amount - payment.AmountInvoice;
if (!existAssigns.IsNullOrEmpty())
{
//已经划转未开票的金额
var existAssignsAmountUnInvoice = existAssigns.Sum(o => o.Amount) - existAssigns.Sum(o => o.AmountInvoice);
var leftAmountUnInvoice = paymentAmountUnInvoice - existAssignsAmountUnInvoice < 0 ? 0 : paymentAmountUnInvoice - existAssignsAmountUnInvoice;
//要是剩余未开票金额小于要划转金额那么划转开票金额就是差值否则就是0元
amountInvoice = leftAmountUnInvoice < amountAssign ? amountAssign - leftAmountUnInvoice : 0;
}
else
{
amountInvoice = paymentAmountUnInvoice < amountAssign ? amountAssign - paymentAmountUnInvoice : 0;
}
}
else
else amountInvoice = amountAssign;//否则直接记录拆分项完全开票
if (payment.AmountUsed < payment.Amount)
{
amountUsed = payment.AmountUsed > amountAssign ? amountAssign : payment.AmountUsed;
//剩余的未使用金额
var paymentAmountUnUsed = payment.Amount - payment.AmountUsed;
if (!existAssigns.IsNullOrEmpty())
{
//已经划转未使用的金额
var existAssignsAmountUnUsed = existAssigns.Sum(o => o.Amount) - existAssigns.Sum(o => o.AmountUsed);
var leftAmountUnUsed = paymentAmountUnUsed - existAssignsAmountUnUsed < 0 ? 0 : paymentAmountUnUsed - existAssignsAmountUnUsed;
//要是剩余未使用金额小于要划转金额那么划转使用金额就是差值否则就是0元
amountUsed = leftAmountUnUsed < amountAssign ? amountAssign - leftAmountUnUsed : 0;
}
else
{
amountUsed = paymentAmountUnUsed < amountAssign ? amountAssign - paymentAmountUnUsed : 0;
}
}
else amountUsed = amountAssign;
}
else amountUsed = amountAssign;
}
#endregion
#region 新增拆分项目
var assignPayment = new Payment();
assignPayment.PopulateWith(payment);//先从父级中拷贝所有参数
//赋值
//赋值
assignPayment.Kvid = Guid.NewGuid();
assignPayment.ParentKvid = payment.Kvid;
assignPayment.RootKvid = payment.RootKvid;
......
......@@ -33,5 +33,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("5.4.2022.12070")]
[assembly: AssemblyFileVersion("5.4.2022.12070")]
[assembly: AssemblyVersion("5.4.2023.4190")]
[assembly: AssemblyFileVersion("5.4.2023.4190")]
......@@ -519,6 +519,7 @@ namespace Kivii.Finances.Transforms
[ApiMember(Description = "所属类型,默认为Department,Organization,Member")]
public OwnerType OwnerType { get; set; } = OwnerType.Department;
public bool AmountFirst { get; set; } = true;//标记划转出去的金额没有开票和没有使用优先,默认true,优先划转已经开票和使用的金额
public Guid OwnerKvid { get; set; }
public string OwnerName { get; set; }
......@@ -571,7 +572,7 @@ namespace Kivii.Finances.Transforms
ownerName = OwnerName;
}
if (payment.OwnerKvid == ownerKvid) throw new Exception("不可划转至同部门!");
var assign = payment.BizAssign(Amount, Remark, ownerKvid, ownerName, conn);
var assign = payment.BizAssign(Amount, Remark, ownerKvid, ownerName, conn, AmountFirst);
var rtns = new RestfulExecutionResponse<Payment>();
rtns.Results = new List<Payment>();
......@@ -608,6 +609,7 @@ namespace Kivii.Finances.Transforms
public Guid OwnerKvid { get; set; }
public string OwnerName { get; set; }
public bool AmountFirst { get; set; } = true;//标记划转出去的金额没有开票和没有使用优先,默认true,优先划转已经开票和使用的金额
public List<Guid> Kvids { get; set; }
......@@ -662,7 +664,7 @@ namespace Kivii.Finances.Transforms
{
var amount = payment.Amount - payment.AmountSplited;
if (amount <= 0) continue;
var assignPayment = payment.BizAssign(amount, Remark, ownerKvid, ownerName, conn);
var assignPayment = payment.BizAssign(amount, Remark, ownerKvid, ownerName, conn, AmountFirst);
assigns.Add(assignPayment);
spliteds.Add(payment);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment