Commit 65f88acb by 陶然

优化

parent 53d42be3
......@@ -21,7 +21,7 @@ namespace Kivii.Finances
/// <param name="accountDetail">生成的账户明细清单</param>
/// <param name="amount">指定的费用,若不指定金额则默认全部</param>
/// <returns>生成用于收款登记的到账子项</returns>
public static Payment Paying(this List<Settlement> settlements, Payment payment, Account accountPayee, out List<Pay> pays, out AccountDetail accountDetail, decimal amount = 0)
public static Payment Paying(this List<Settlement> settlements, Payment payment, Account accountPayee, out List<Pay> pays, out AccountDetail accountDetail, decimal amount = 0, string remark = null)
{
settlements.ThrowIfNullOrEmpty("未传入结算信息!");
payment.ThrowIfNull("未传入到账信息!");
......@@ -29,6 +29,7 @@ namespace Kivii.Finances
(settlements.Exists(o => o.Currency != payment.Currency || o.Currency != accountPayee.Currency)).ThrowIfTrue("存在不相符的货币单位!");
if (payment.Type != PaymentType.Split && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!");
var amountSettlement = settlements.Sum(o => o.Amount - o.AmountPayment);
if (amountSettlement <= 0) throw new Exception("当前结算已无需付款登记!");
if (amount <= 0 || amount > amountSettlement) amount = amountSettlement;
(payment.Amount - payment.AmountUsed < amount).ThrowIfTrue($"付款编号[{payment.SerialNumber}]余额不足!可用余额:{ payment.Amount - payment.AmountUsed}");
......@@ -78,6 +79,7 @@ namespace Kivii.Finances
accountDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber;
accountDetail.AmountPayment = amount;
accountDetail.Summary = "收款登记";
accountDetail.Remark = remark;
#endregion
pays = new List<Pay>();
......@@ -85,7 +87,7 @@ namespace Kivii.Finances
{
if (settlement.AmountPayment >= settlement.Amount) continue;
if (amount <= 0) continue;
var currentAmount = amount <= (settlement.Amount - settlement.AmountPayment) ? amount : (settlement.Amount - settlement.AmountPayment);
var currentAmount = (amount <= (settlement.Amount - settlement.AmountPayment) ? amount : (settlement.Amount - settlement.AmountPayment));
var pay = new Pay();
pay.BizId = settlement.SerialNumber;
......@@ -110,6 +112,7 @@ namespace Kivii.Finances
pay.OperateTime = DateTime.Now;
pay.OperatorName = KiviiContext.CurrentMember.FullName;
pay.OperatorKvid = KiviiContext.CurrentMember.Kvid;
pay.Remark = remark;
pays.Add(pay);
settlement.AmountPayment += currentAmount;
......@@ -130,7 +133,7 @@ namespace Kivii.Finances
/// <param name="pays">生成的pay清单,Biz记录结算信息</param>
/// <param name="amount">指定的费用,若不指定金额则默认全部</param>
/// <returns>生成的账户明细清单</returns>
public static List<AccountDetail> Paying(this List<Settlement> settlements, Account accountPayer, Account accountPayee, out List<Pay> pays, decimal amount = 0)
public static List<AccountDetail> Paying(this List<Settlement> settlements, Account accountPayer, Account accountPayee, out List<Pay> pays, decimal amount = 0, string remark = null)
{
settlements.ThrowIfNullOrEmpty("未传入结算信息!");
accountPayer.ThrowIfNull("未传入指定付款账户!");
......@@ -138,6 +141,7 @@ namespace Kivii.Finances
(settlements.Exists(o => o.Currency != accountPayer.Currency || o.Currency != accountPayee.Currency)).ThrowIfTrue("存在不相符的货币单位!");
(accountPayer.Type != AccountType.Deposit && accountPayer.Type != AccountType.Discount).ThrowIfTrue("请选择正确的付款账户!");
var amountSettlement = settlements.Sum(o => o.Amount - o.AmountPayment);
if (amountSettlement <= 0) throw new Exception("当前结算已无需付款登记!");
if (amount <= 0 || amount > amountSettlement) amount = amountSettlement;
(accountPayer.Amount + accountPayer.CreditLine < amount).ThrowIfTrue($"账户[{accountPayer.Name}]余额不足!可用余额:{accountPayer.Amount + accountPayer.CreditLine}");
......@@ -160,6 +164,7 @@ namespace Kivii.Finances
payeeDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber;
payeeDetail.AmountPayment = amount;
payeeDetail.Summary = "收款登记";
payeeDetail.Remark = remark;
rtns.Add(payeeDetail);
var payerDetail = new AccountDetail();
......@@ -179,6 +184,7 @@ namespace Kivii.Finances
payerDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber;
payerDetail.AmountPayment = amount;
payerDetail.Summary = "收款登记";
payerDetail.Remark = remark;
rtns.Add(payerDetail);
#endregion
......@@ -220,6 +226,7 @@ namespace Kivii.Finances
pay.OperateTime = DateTime.Now;
pay.OperatorName = KiviiContext.CurrentMember.FullName;
pay.OperatorKvid = KiviiContext.CurrentMember.Kvid;
pay.Remark = remark;
pays.Add(pay);
settlement.AmountPayment += currentAmount;
......
......@@ -33,14 +33,15 @@ namespace Kivii.Finances.Transforms
settlements.ThrowIfNullOrEmpty("未找到结算单!");
if (settlements.Count != SettlementKvids.Count) throw new Exception("所选结算项与实际结算项不符合!");
if (settlements.Exists(o => o.OffsetKvid != Guid.Empty)) throw new Exception("所选结算项存在已作废项!");
if (settlements.Exists(o => o.AmountPayment == o.Amount)) throw new Exception("所选结算项存在已付款登记!");
if (settlements.Exists(o => o.AmountPayment >= o.Amount)) throw new Exception("所选结算项存在已付款登记!");
(settlements.ConvertAll(o => o.Currency).Distinct().ToList().Count != 1).ThrowIfTrue("存在不相符的货币单位!");
var currency = settlements.ConvertAll(o => o.Currency).Distinct().ToList()[0];
(currency == CurrencyUnit.Unsupported).ThrowIfTrue("不支持的货币单位!");
var amountSettlement = settlements.Sum(o => o.Amount);
var amountSettlementPlan = settlements.Sum(o => o.AmountPlan);
(amountMethod != amountSettlement).ThrowIfTrue("所选结算总金额与付款总金额不等!");
var amountPayed = settlements.Sum(o => o.AmountPayment);
(amountMethod > amountSettlement - amountPayed).ThrowIfTrue("所选结算总金额大于所需金额!");
var rtns = new RestfulExecutionResponse<Pay>();
rtns.Results = new List<Pay>();
......@@ -57,9 +58,13 @@ namespace Kivii.Finances.Transforms
payment.ThrowIfNull("所选付款数据不存在!");
(payment.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
if (payment.Type != PaymentType.Split && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!");
if (payment.Amount - payment.AmountUsed < amountSettlement) throw new Exception($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}");
var amount = amountSettlement - amountPayed;
if (payment.Amount - payment.AmountUsed < amount) amount = payment.Amount - payment.AmountUsed;
(payingMethod.Amount > 0 && payingMethod.Amount > payment.Amount - payment.AmountUsed).ThrowIfTrue($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}");
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
//if (payment.Amount - payment.AmountUsed < amountSettlement) throw new Exception($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}");
//(payment.AmountInvoice != payment.Amount).ThrowIfTrue("所选到账尚未开票,请先开票后再分摊!");
var dynamicPayPayment = settlements.Paying(payment, accountBiz, out var pays, out var accountDetail);
var dynamicPayPayment = settlements.Paying(payment, accountBiz, out var pays, out var accountDetail, amount);
var trans = conn.OpenTransaction();
List<IDbTransaction> subTrans = new List<IDbTransaction>();
......@@ -112,8 +117,12 @@ namespace Kivii.Finances.Transforms
account.ThrowIfNull("未找到所选账户!");
(account.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
(account.Type != AccountType.Deposit).ThrowIfTrue("请选择正确的客户存款账户!");
(account.Amount + account.CreditLine < amountSettlement).ThrowIfTrue($"所选付款方式余额不足,可用余额:{account.Amount + account.CreditLine}");
var accountDetails = settlements.Paying(account, accountBiz, out var pays);
var amount = amountSettlement - amountPayed;
if (account.Amount + account.CreditLine < amount) amount = account.Amount + account.CreditLine;
(payingMethod.Amount > 0 && payingMethod.Amount > account.Amount + account.CreditLine).ThrowIfTrue($"所选付款方式余额不足,可用余额:{account.Amount + account.CreditLine}");
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
//(account.Amount + account.CreditLine < amountSettlement).ThrowIfTrue($"所选付款方式余额不足,可用余额:{account.Amount + account.CreditLine}");
var accountDetails = settlements.Paying(account, accountBiz, out var pays, amount);
var trans = conn.OpenTransaction();
List<IDbTransaction> subTrans = new List<IDbTransaction>();
......@@ -164,7 +173,9 @@ namespace Kivii.Finances.Transforms
(discountAccount.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
(discountAccount.Type != AccountType.Discount).ThrowIfTrue("请选择正确的折扣账户!");
(discountAccount.OwnerKvid != KiviiContext.CurrentMember.DepartmentKvid).ThrowIfTrue("存在非本部门的折扣账户!");
var accountDetails = settlements.Paying(discountAccount, accountBiz, out var pays);
var amount = amountSettlement - amountPayed;
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
var accountDetails = settlements.Paying(discountAccount, accountBiz, out var pays, amount, payingMethod.Remark);
var trans = conn.OpenTransaction();
List<IDbTransaction> subTrans = new List<IDbTransaction>();
......@@ -258,6 +269,8 @@ namespace Kivii.Finances.Transforms
{
var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid);
if (payingMethod == null) continue;
(payingMethod.Amount <= 0).ThrowIfTrue("组合付款缺少当前方式指定金额!");
(payingMethod.Amount > item.Amount - item.AmountUsed).ThrowIfTrue($"所选付款方式余额不足,可用余额:{item.Amount - item.AmountUsed}");
var dynamicPayPayment = settlements.Paying(item, accountBiz, out var pays, out var accountDetail, payingMethod.Amount);
allPays.AddRange(pays);
dynamicSplitPayments.Add(dynamicPayPayment);
......@@ -270,6 +283,8 @@ namespace Kivii.Finances.Transforms
{
var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid);
if (payingMethod == null) continue;
(payingMethod.Amount <= 0).ThrowIfTrue("组合付款缺少当前方式指定金额!");
(payingMethod.Amount > item.Amount + item.CreditLine).ThrowIfTrue($"所选付款方式余额不足,可用余额:{item.Amount + item.CreditLine}");
var accountDetails = settlements.Paying(item, accountBiz, out var pays, payingMethod.Amount);
allPays.AddRange(pays);
allAccountDetails.AddRange(accountDetails);
......@@ -281,6 +296,7 @@ namespace Kivii.Finances.Transforms
{
var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid);
if (payingMethod == null) continue;
(payingMethod.Amount <= 0).ThrowIfTrue("组合付款缺少当前方式指定金额!");
var accountDetails = settlements.Paying(item, accountBiz, out var pays, payingMethod.Amount);
allPays.AddRange(pays);
allAccountDetails.AddRange(accountDetails);
......
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