Beispiel #1
0
 public async Task <CustomerPaymentContract> SaveAsync(CustomerPaymentContract contract, CancellationToken token = default(CancellationToken))
 => await addCustomerPaymentContractQueryProcessor.SaveAsync(contract, token);
 public async Task <CustomerPaymentContract> Save(CustomerPaymentContract contract, CancellationToken token)
 => await customerPaymentContractProcessor.SaveAsync(contract, token);
Beispiel #3
0
 public async Task <CustomerPaymentContractResult> SavePaymentContractAsync(string SessionKey, CustomerPaymentContract CustomerPaymentContract)
 {
     return(await authorizationProcessor.DoAuthorizeAsync(SessionKey, async token =>
     {
         var result = await customerPaymentContractProcessor.SaveAsync(CustomerPaymentContract, token);
         return new CustomerPaymentContractResult
         {
             ProcessResult = new ProcessResult {
                 Result = true
             },
             Payment = result,
         };
     }, logger));
 }
        public Task <CustomerPaymentContract> SaveAsync(CustomerPaymentContract contract, CancellationToken token = default(CancellationToken))
        {
            if (contract.GreaterThanCollectCategoryId2 == 0)
            {
                contract.GreaterThanCollectCategoryId2 = null;
            }
            if (contract.GreaterThanCollectCategoryId3 == 0)
            {
                contract.GreaterThanCollectCategoryId3 = null;
            }
            #region merge query
            var query = @"
MERGE INTO CustomerPaymentContract AS target
      USING (
          SELECT
              @CustomerId AS CustomerId 

      ) AS source 
      ON ( 
          target.CustomerId = source.CustomerId 
      ) 
      WHEN MATCHED THEN 
          UPDATE SET 
            CustomerId                      = @CustomerId
          , ThresholdValue                  = @ThresholdValue
          , LessThanCollectCategoryId       = @LessThanCollectCategoryId
          , GreaterThanCollectCategoryId1   = @GreaterThanCollectCategoryId1
          , GreaterThanRate1                = @GreaterThanRate1
          , GreaterThanRoundingMode1        = @GreaterThanRoundingMode1
          , GreaterThanSightOfBill1         = @GreaterThanSightOfBill1
          , GreaterThanCollectCategoryId2   = @GreaterThanCollectCategoryId2
          , GreaterThanRate2                = @GreaterThanRate2
          , GreaterThanRoundingMode2        = @GreaterThanRoundingMode2
          , GreaterThanSightOfBill2         = @GreaterThanSightOfBill2
          , GreaterThanCollectCategoryId3   = @GreaterThanCollectCategoryId3
          , GreaterThanRate3                = @GreaterThanRate3
          , GreaterThanRoundingMode3        = @GreaterThanRoundingMode3
          , GreaterThanSightOfBill3         = @GreaterThanSightOfBill3
          , UpdateBy                        = @UpdateBy
          , UpdateAt                        = GETDATE()
WHEN NOT MATCHED THEN
   INSERT (CustomerId
  ,ThresholdValue
  ,LessThanCollectCategoryId
  ,GreaterThanCollectCategoryId1
  ,GreaterThanRate1
  ,GreaterThanRoundingMode1
  ,GreaterThanSightOfBill1
  ,GreaterThanCollectCategoryId2
  ,GreaterThanRate2
  ,GreaterThanRoundingMode2
  ,GreaterThanSightOfBill2
  ,GreaterThanCollectCategoryId3
  ,GreaterThanRate3
  ,GreaterThanRoundingMode3
  ,GreaterThanSightOfBill3
  ,CreateBy
  ,CreateAt
  ,UpdateBy
  ,UpdateAt)
 
  VALUES (
  @CustomerId
  ,@ThresholdValue
  ,@LessThanCollectCategoryId
  ,@GreaterThanCollectCategoryId1
  ,@GreaterThanRate1
  ,@GreaterThanRoundingMode1
  ,@GreaterThanSightOfBill1
  ,@GreaterThanCollectCategoryId2
  ,@GreaterThanRate2
  ,@GreaterThanRoundingMode2
  ,@GreaterThanSightOfBill2
  ,@GreaterThanCollectCategoryId3
  ,@GreaterThanRate3
  ,@GreaterThanRoundingMode3
  ,@GreaterThanSightOfBill3
  ,@CreateBy
  ,GETDATE()
  ,@UpdateBy
  ,GETDATE())
OUTPUT inserted.*;";
            #endregion
            return(dbHelper.ExecuteAsync <CustomerPaymentContract>(query, contract, token));
        }
        /// <summary>
        /// 明細一行を約定条件によって分割する処理
        /// </summary>
        /// <param name="detail">分割対象の 約定の行</param>
        /// <param name="contract">約定条件</param>
        /// <returns>
        /// 列ごとの約定金額判定を実施するため、dic に 横縦変換して保持する
        /// </returns>
        private List <CollectionSchedule> Divide(CollectionSchedule detail,
                                                 CustomerPaymentContract contract)
        {
            var list = new List <CollectionSchedule>();
            var dic  = Pivot(detail);

            if (dic.Values.Any(x => x != 0M && x < contract.ThresholdValue))
            {
                list.Add(GetNewItem(contract.LessThanCode, contract.LessThanName, detail));
            }
            if (dic.Values.Any(x => x >= contract.ThresholdValue))
            {
                if (!list.Any(x => x.CollectCategoryCode == contract.GreaterThanCode1))
                {
                    list.Add(GetNewItem(contract.GreaterThanCode1, contract.GreaterThanName1, detail));
                }
                if ((contract.GreaterThanCollectCategoryId2 ?? 0) != 0 &&
                    !list.Any(x => x.CollectCategoryCode == contract.GreaterThanCode2))
                {
                    list.Add(GetNewItem(contract.GreaterThanCode2, contract.GreaterThanName2, detail));
                }
                if ((contract.GreaterThanCollectCategoryId3 ?? 0) != 0 &&
                    !list.Any(x => x.CollectCategoryCode == contract.GreaterThanCode3))
                {
                    list.Add(GetNewItem(contract.GreaterThanCode3, contract.GreaterThanName3, detail));
                }
            }

            foreach (var key in dic.Keys)
            {
                if (dic[key] == 0M)
                {
                    continue;
                }
                if (dic[key] < contract.ThresholdValue)
                {
                    var index = list.FindIndex(x => x.CollectCategoryCode == contract.LessThanCode);
                    SetValue(list[index], key, dic[key]);
                    continue;
                }

                var remainingIndex = -1;
                var remaining      = dic[key];

                {
                    var index = list.FindIndex(x => x.CollectCategoryCode == contract.GreaterThanCode1);
                    var mode  = contract.GreaterThanRoundingMode1.Value;
                    if (mode == 0)
                    {
                        remainingIndex = index;
                    }
                    var scale = GetScale(mode);
                    var value = decimal.Truncate(dic[key] * contract.GreaterThanRate1.Value / 100M / scale) * scale;
                    SetValue(list[index], key, value);
                    remaining -= value;
                }

                if ((contract.GreaterThanCollectCategoryId2 ?? 0) != 0)
                {
                    var index = list.FindIndex(x => x.CollectCategoryCode == contract.GreaterThanCode2);
                    var mode  = contract.GreaterThanRoundingMode2.Value;
                    if (mode == 0)
                    {
                        remainingIndex = index;
                    }
                    var scale = GetScale(mode);
                    var value = decimal.Truncate(dic[key] * contract.GreaterThanRate2.Value / 100M / scale) * scale;
                    SetValue(list[index], key, value);
                    remaining -= value;
                }

                if ((contract.GreaterThanCollectCategoryId3 ?? 0) != 0)
                {
                    var index = list.FindIndex(x => x.CollectCategoryCode == contract.GreaterThanCode3);
                    var mode  = contract.GreaterThanRoundingMode3.Value;
                    if (mode == 0)
                    {
                        remainingIndex = index;
                    }
                    var scale = GetScale(mode);
                    var value = decimal.Truncate(dic[key] * contract.GreaterThanRate3.Value / 100M / scale) * scale;
                    SetValue(list[index], key, value);
                    remaining -= value;
                }
                if (remaining != 0M && remainingIndex != -1)
                {
                    SetValue(list[remainingIndex], key, remaining);
                }
            }
            return(list);
        }
        /// <summary>
        /// 得意先情報 および 得意先マスター設定の 回収区分情報取得
        /// </summary>
        /// <param name="detail"></param>
        /// <param name="category"></param>
        /// <param name="contract"></param>
        /// <returns></returns>
        private List <string> GetCustomerInfo(CollectionSchedule detail,
                                              Category category,
                                              CustomerPaymentContract contract)
        {
            var list = new List <string>();

            list.Add($"{detail.CustomerCode} {detail.CustomerName}");
            if (category != null)
            {
                list.Add(detail.CustomerSightOfBill.HasValue ?
                         $" {category.Name} {detail.CustomerSightOfBill}日" :
                         $" {category.Name}");
                return(list);
            }
            if (contract == null)
            {
                return(list);
            }
            list.Add($" {contract.ThresholdValue:#,##0}円未満 {contract.LessThanName}");

            {
                var item = new List <string>();
                item.Add(" 以上");
                item.Add($"{contract.GreaterThanRate1}%");
                item.Add(contract.GreaterThanName1);
                if (contract.GreaterThanSightOfBill1 != 0)
                {
                    item.Add($"{contract.GreaterThanSightOfBill1}日");
                }
                if (contract.GreaterThanRoundingMode1 == 0)
                {
                    item.Add("端数");
                }
                list.Add(string.Join(" ", item.ToArray()));
            }

            if (contract.GreaterThanCollectCategoryId2.HasValue)
            {
                var item = new List <string>();
                item.Add(" 以上");
                item.Add($"{contract.GreaterThanRate2}%");
                item.Add(contract.GreaterThanName2);
                if ((contract.GreaterThanSightOfBill2 ?? 0) != 0)
                {
                    item.Add($"{contract.GreaterThanSightOfBill2}日");
                }
                if (contract.GreaterThanRoundingMode2 == 0)
                {
                    item.Add("端数");
                }
                list.Add(string.Join(" ", item.ToArray()));
            }
            if (contract.GreaterThanCollectCategoryId3.HasValue)
            {
                var item = new List <string>();
                item.Add(" 以上");
                item.Add($"{contract.GreaterThanRate3}%");
                item.Add(contract.GreaterThanName3);
                if ((contract.GreaterThanSightOfBill3 ?? 0) != 0)
                {
                    item.Add($"{contract.GreaterThanSightOfBill3}日");
                }
                if (contract.GreaterThanRoundingMode3 == 0)
                {
                    item.Add("端数");
                }
                list.Add(string.Join(" ", item.ToArray()));
            }
            return(list);
        }