/// <summary>
        /// 過帳至入金機
        /// </summary>
        private static void PostingDepositBill(ApplicationDbContext dataAccess, ReceiptBillModel receipt)
        {
            DepositBillReceiptDetailModel dt = new DepositBillReceiptDetailModel()
            {
                BillNo = receipt.BillNo, ReceiptBill = receipt, ReceiptBillNo = receipt.BillNo, RowState = RowState.Insert
            };

            dataAccess.Add(dt);
        }
 /// <summary>
 /// 生成電子通路帳簿
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 private static ChannelEAccountBillSet CreateChannelEAccountBill(ReceiptBillModel model)
 {
     return(new ChannelEAccountBillSet()
     {
         ChannelEAccountBill = new ChannelEAccountBillModel()
         {
             ChannelId = model.ChannelId,
             CollectionTypeId = model.CollectionTypeId,
             ExpectRemitDate = model.ExpectRemitDate,
         },
         ChannelEAccountBillDetail = new List <ChannelEAccountBillDetailModel>(),
     });
 }
 /// <summary>
 /// 設置對應的帳單編號
 /// </summary>
 /// <param name="set"></param>
 /// <returns></returns>
 private static void SetBillNo(ApplicationDbContext DataAccess, ReceiptBillModel receiptBill)
 {
     if (BizVirtualAccountCode.CheckBankCodeExist(DataAccess, receiptBill.VirtualAccountCode, out VirtualAccountCodeModel virtualAccount))
     {
         receiptBill.BillProgId = virtualAccount.SrcProgId;
         receiptBill.ToBillNo   = virtualAccount.SrcBillNo;
     }
     else
     {
         receiptBill.BillProgId = string.Empty;
         receiptBill.ToBillNo   = string.Empty;
     }
 }
        /// <summary>
        /// 過帳至帳單
        /// </summary>
        /// <param name="dataAccess"></param>
        /// <param name="receipt"></param>
        private static void PostingBill(ApplicationDbContext dataAccess, ReceiptBillModel receipt)
        {
            BillModel bill            = dataAccess.Find <BillModel>(receipt.ToBillNo);
            BillReceiptDetailModel dt = new BillReceiptDetailModel()
            {
                BillNo = receipt.ToBillNo, ReceiptBill = receipt, ReceiptBillNo = receipt.ToBillNo, RowState = RowState.Insert
            };

            dataAccess.Add(dt);
            bill.HadPayAmount += receipt.PayAmount;
            bill.PayStatus     = BizBill.GetPayStatus(bill.PayAmount, bill.HadPayAmount);
            dataAccess.Update(bill);
        }
        /// <summary>
        /// 檢查,並設置異常訊息
        /// </summary>
        /// <param name="receiptBill"></param>
        private static void SetErrMessage(ReceiptBillModel receiptBill)
        {
            StringBuilder strBuilder = new StringBuilder();
            int           i          = 1;

            if (receiptBill.CustomerCode.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析企業編號。");
            }
            if (receiptBill.CollectionTypeId.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析代收類別代號。");
            }
            if (receiptBill.ChannelId.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析代收通路。");
            }
            if (receiptBill.TradeDate.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析交易日期。");
            }
            if (receiptBill.TransDate.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析傳輸日期。");
            }
            if (receiptBill.ExpectRemitDate.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析預計匯款日。");
            }
            if (receiptBill.PayAmount.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無法解析實繳金額。");
            }
            if (!(receiptBill.BizCustomer.ChannelIds.Split(',').Contains(receiptBill.ChannelId)))
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 未啟用該代收通路。");
            }
            if (!(receiptBill.BizCustomer.CollectionTypeIds.Split(',').Contains(receiptBill.CollectionTypeId)))
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 未啟用該代收類別。");
            }
            if (receiptBill.ToBillNo.IsNullOrEmpty())
            {
                strBuilder.AppendLine($"{i++.ToString().PadLeft(2)}. 無帳單資料。");
            }
            receiptBill.ErrMessage = strBuilder.ToString();
            receiptBill.IsErrData  = !receiptBill.ErrMessage.IsNullOrEmpty();
        }
        /// <summary>
        /// 設置費用
        /// </summary>
        private static void SetFee(ReceiptBillModel receiptBill, BizCustomerSet bizCustomerSet, CollectionTypeSet collectionTypeSet)
        {
            CollectionTypeDetailModel collectionTypeDetailModel = collectionTypeSet.CollectionTypeDetail.FirstOrDefault(p => p.ChannelId.Equals(receiptBill.ChannelId) && (p.SRange <= receiptBill.PayAmount && p.ERange >= receiptBill.PayAmount));
            BizCustomerFeeDetailModel bizCustomerFeeDetailModel = bizCustomerSet.BizCustomerFeeDetail.FirstOrDefault(p => p.ChannelGroupType.Equals(receiptBill.Channel.ChannelGroupType));
            BizCustomerFeeDetailModel hiTrust = bizCustomerSet.BizCustomerFeeDetail.FirstOrDefault(p => p.BankFeeType.Equals(BankFeeType.Hitrust_ClearFee_CurMonth) || p.BankFeeType.Equals(BankFeeType.Hitrust_ClearFee_NextMonth));

            receiptBill.ChargePayType = collectionTypeSet.CollectionType.ChargePayType;
            receiptBill.BankFeeType   = bizCustomerFeeDetailModel.BankFeeType;
            if (receiptBill.BankFeeType.Equals(BankFeeType.TotalFee))
            {
                switch (receiptBill.CollectionType.ChargePayType)
                {
                case ChargePayType.Deduction:
                {
                    receiptBill.ThirdFee = FeeDeduct(bizCustomerFeeDetailModel.Fee, collectionTypeDetailModel.ChannelTotalFee, bizCustomerFeeDetailModel.IntroPercent);
                    receiptBill.BankFee  = bizCustomerFeeDetailModel.Fee - receiptBill.ThirdFee;
                }
                break;

                case ChargePayType.Increase:
                {
                    receiptBill.ThirdFee = FeePlus(bizCustomerFeeDetailModel.Fee, bizCustomerFeeDetailModel.IntroPercent);
                    receiptBill.BankFee  = bizCustomerFeeDetailModel.Fee - receiptBill.ThirdFee;
                }
                break;
                }
            }
            else
            {
                receiptBill.BankFee  = bizCustomerFeeDetailModel.Fee;
                receiptBill.ThirdFee = 0m;
            }
            receiptBill.ThirdFee           = null != hiTrust ? hiTrust.IntroPercent : receiptBill.ThirdFee;
            receiptBill.ChannelFeedBackFee = collectionTypeDetailModel.ChannelFeedBackFee;
            receiptBill.ChannelRebateFee   = collectionTypeDetailModel.ChannelRebateFee;
            receiptBill.ChannelFee         = collectionTypeDetailModel.ChannelFee;
            receiptBill.ChannelTotalFee    = collectionTypeDetailModel.ChannelTotalFee;
            receiptBill.TotalFee           = receiptBill.BankFeeType.Equals(BankFeeType.TotalFee) ? bizCustomerFeeDetailModel.Fee : collectionTypeDetailModel.ChannelTotalFee;
        }
        /// <summary>
        /// 設置預計匯款日
        /// </summary>
        /// <param name="model"></param>
        /// <param name="periodModel"></param>
        /// <returns></returns>
        private static void SetRemitDate(ReceiptBillModel receiptBill, CollectionTypeSet collectionTypeSet, Dictionary <DateTime, bool> workDic)
        {
            DateTime expectRemitDate = receiptBill.ExpectRemitDate;

            if (!receiptBill.Channel.ChannelGroupType.In(ChannelGroupType.Bank, ChannelGroupType.Self))
            {
                CollectionTypeVerifyPeriodModel period = collectionTypeSet.CollectionTypeVerifyPeriod.Where(p => p.ChannelId.Equals(receiptBill.ChannelId)).FirstOrDefault();

                switch (period?.PayPeriodType)
                {
                case PayPeriodType.NDay_A: expectRemitDate = GetNDay_A(workDic, receiptBill.TransDate); break;

                case PayPeriodType.NDay_B: expectRemitDate = GetNDay_B(workDic, receiptBill.TransDate); break;

                case PayPeriodType.NDay_C: expectRemitDate = GetNDay_C(workDic, receiptBill.TransDate); break;

                case PayPeriodType.Week: expectRemitDate = GetWeekTime(workDic, receiptBill.TransDate); break;

                case PayPeriodType.TenDay: expectRemitDate = GetTenDayTime(workDic, receiptBill.TransDate); break;
                }
            }
            receiptBill.ExpectRemitDate = expectRemitDate;
        }
        /// <summary>
        /// 過帳帳單收款明細
        /// </summary>
        /// <param name="receiptBillNo"></param>
        /// <param name="billNo"></param>
        private static void PostingBillReceiptDetail(ApplicationDbContext dataAccess, ReceiptBillModel receipt)
        {
            if (receipt.ToBillNo.IsNullOrEmpty())
            {
                return;
            }
            switch (receipt.BillProgId)
            {
            case SystemCP.ProgId_AutoDebitBill:
                PostingAutoDebitBill(dataAccess, receipt);
                break;

            case SystemCP.ProgId_Bill:
                PostingBill(dataAccess, receipt);
                break;

            case SystemCP.ProgId_DepositBill:
                PostingDepositBill(dataAccess, receipt);
                break;
            }
        }
 /// <summary>
 /// 設置企業編號
 /// </summary>
 /// <param name="receiptBill"></param>
 /// <param name="bizCustomerSet"></param>
 private static void SetBizCustomer(ReceiptBillModel receiptBill, BizCustomerModel bizCustomer)
 {
     receiptBill.BizCustomer  = bizCustomer;
     receiptBill.CustomerCode = bizCustomer?.CustomerCode;
 }