/// <summary> /// 修正退款的应收/退金额 /// </summary> private void reviseRefundAnticipation(NormalPayDetailBill payBill, NormalRefundDetailBill refundBill, IEnumerable <NormalRefundDetailBill> refundedBills) { var refundedAmount = refundedBills.Sum(item => item.Anticipation); if (Math.Abs(payBill.Anticipation) < Math.Abs(refundBill.Anticipation + refundedAmount)) { refundBill.Anticipation = (payBill.Anticipation + refundedAmount) * -1; } }
/// <summary> /// 修正退还的加价金额 /// </summary> private void reviseRefundIncreasing(NormalPayDetailBill payBill, NormalRefundDetailBill refundBill, IEnumerable <NormalRefundDetailBill> refundedBills) { var refundedIncreasing = refundedBills.Sum(item => item.Increasing); if (Math.Abs(payBill.Increasing) < Math.Abs(refundBill.Increasing + refundedIncreasing)) { refundBill.Increasing = (payBill.Increasing + refundedIncreasing) * -1; } }
/// <summary> /// 修改应该退还的服务费 /// </summary> private void reviseRefundServiceCharge(NormalPayDetailBill payBill, NormalRefundDetailBill refundBill, IEnumerable <NormalRefundDetailBill> refundedBills) { var refundedServiceCharge = refundedBills.Sum(item => item.ServiceCharge); if (Math.Abs(payBill.ServiceCharge) < Math.Abs(refundBill.ServiceCharge + refundedServiceCharge)) { refundBill.ServiceCharge = (payBill.ServiceCharge + refundedServiceCharge) * -1; } }
/// <summary> /// 修改应该退还的佣金 /// </summary> private void reviseRefundCommission(NormalPayDetailBill payBill, NormalRefundDetailBill refundBill, IEnumerable <NormalRefundDetailBill> refundedBills) { var refundedCommission = refundedBills.Sum(item => item.Commission); if (Math.Abs(payBill.Commission) < Math.Abs(refundBill.Commission + refundedCommission)) { refundBill.Commission = (payBill.Commission + refundedCommission) * -1; } }
/// <summary> /// 生成差错退款账单明细 /// </summary> private NormalRefundDetailBill makeRefundDetailBill(NormalPayDetailBill payBill, ErrorRefundFlight refundFlight, IEnumerable <NormalRefundDetailBill> refundedBills) { var result = new NormalRefundDetailBill(payBill.Passenger, payBill.Flight); result.Anticipation = GetErrorRefundAnticipation(refundFlight); reviseRefundAnticipation(payBill, result, refundedBills); result.TradeFee = CalcTradeFee(result.Anticipation); reviseRefundTradeFee(payBill, result, refundedBills); return(result); }
/// <summary> /// 生成支付账单明细 /// </summary> private NormalPayDetailBill makePayDetailBill(bool isThirdRelation, Guid passenger, Flight flight, Deduction deduction) { var bill = new NormalPayDetailBill(passenger, flight) { Commission = deduction == null ? 0 : CalcCommission(flight, deduction.Rebate), Increasing = deduction == null ? 0 : GetIncreasing(deduction), ServiceCharge = GetServiceCharge(isThirdRelation, flight) }; bill.Anticipation = GetAnticipation(flight, bill.ServiceCharge, bill.Commission, bill.Increasing); bill.TradeFee = CalcTradeFee(bill.Anticipation); return(bill); }
/// <summary> /// 修改退款时的交易手续费 /// </summary> private void reviseRefundTradeFee(NormalPayDetailBill payBill, NormalRefundDetailBill refundBill, IEnumerable <NormalRefundDetailBill> refundedBills) { var refundedTradeFee = refundedBills.Sum(item => item.TradeFee); var refundedAnticipation = refundedBills.Sum(b => b.Anticipation); var refundAnticipation = refundedAnticipation + refundBill.Anticipation; // 退款金额与收款金额相同时,直接全退手续费 // 退还的手续费不能超过收取的手续费 if (Math.Abs(payBill.Anticipation) == Math.Abs(refundAnticipation) || Math.Abs(payBill.TradeFee) < Math.Abs(refundBill.TradeFee + refundedTradeFee)) { refundBill.TradeFee = (payBill.TradeFee + refundedTradeFee) * -1; } }
/// <summary> /// 生成退款账单明细 /// </summary> private NormalRefundDetailBill makeRefundDetailBill(NormalPayDetailBill payBill, RefundInfo refundInfo, IEnumerable <NormalRefundDetailBill> refundedBills) { var refundFlight = refundInfo == null ? null : refundInfo.GetFlight(payBill.Flight.Id); var result = new NormalRefundDetailBill(payBill.Passenger, payBill.Flight) { RefundRate = refundFlight == null ? 0 : refundFlight.Rate, RefundFee = refundFlight == null ? 0 : GetRefundFee(payBill.Flight, payBill.Passenger, refundFlight) }; result.Commission = GetRefundCommission(payBill); reviseRefundCommission(payBill, result, refundedBills); result.Increasing = refundFlight == null ? payBill.Increasing * -1 : GetRefundIncreasing(payBill, refundFlight.RefundServiceCharge.HasValue); reviseRefundIncreasing(payBill, result, refundedBills); result.ServiceCharge = refundFlight == null ? payBill.ServiceCharge * -1 : GetRefundServiceCharge(refundInfo.HasSupplier, refundFlight); reviseRefundServiceCharge(payBill, result, refundedBills); result.Anticipation = refundFlight == null ? payBill.Anticipation * -1 : GetRefundAnticipation(payBill, result.Commission, result.Increasing, result.ServiceCharge, result.RefundRate, result.RefundFee); reviseRefundAnticipation(payBill, result, refundedBills); result.TradeFee = CalcTradeFee(result.Anticipation); reviseRefundTradeFee(payBill, result, refundedBills); return(result); }
/// <summary> /// 生成支付账单明细 /// </summary> private NormalPayDetailBill makePayDetailBill(bool isThirdRelation, Guid passenger, Flight flight, decimal rebate, decimal increasing, decimal maxCommission, decimal maxTradeFee, bool isLastFlight) { var bill = new NormalPayDetailBill(passenger, flight) { Commission = CalcCommission(flight, rebate), Increasing = increasing, ServiceCharge = GetServiceCharge(isThirdRelation, flight) }; if (isLastFlight || Math.Abs(bill.Commission) > Math.Abs(maxCommission)) { bill.Commission = maxCommission; } bill.Anticipation = GetAnticipation(flight, bill.ServiceCharge, bill.Commission, increasing); bill.TradeFee = CalcTradeFee(bill.Anticipation); if (isLastFlight || Math.Abs(bill.TradeFee) > Math.Abs(maxTradeFee)) { bill.TradeFee = maxTradeFee; } return(bill); }
/// <summary> /// 获取应退/收金额 /// </summary> protected abstract decimal GetRefundAnticipation(NormalPayDetailBill payBill, decimal refundCommission, decimal refundIncreasing, decimal refundServiceCharge, decimal refundRate, decimal refundFee);
/// <summary> /// 获取应该退还的加价金额 /// </summary> protected virtual decimal GetRefundIncreasing(NormalPayDetailBill payBill, bool providerRefundServiceCharge) { return(payBill.Increasing * -1); }
/// <summary> /// 获取应该退还的佣金 /// </summary> protected virtual decimal GetRefundCommission(NormalPayDetailBill payBill) { return(payBill.Commission * -1); }