public ResponseModel Rate(LateChargeReqModel req)
        {
            var res = new ResponseModel();

            try
            {
                var result = _rateChargeService.CalculationRate(req);
                if (result.Success)
                {
                    res.Datas   = result.Datas;
                    res.Success = result.Success;
                }
                else
                {
                    res.Message = result.Message;
                }
                return(res);
            }
            catch
            {
                return(new ResponseModel
                {
                    StatusCode = StatusCodes.Status500InternalServerError
                });
            }
        }
        public ResponseModel TestRate()
        {
            var req = new LateChargeReqModel
            {
                Header = new HeaderModel
                {
                    SystemId = "000000000",
                    UserID   = "TEST"
                },
                LateCharges = new List <LateChargeModel> {
                    new LateChargeModel
                    {
                        ApplicationNo = "SB-2513-xx1",
                        From          = 1,
                        To            = 10,
                        RateCode      = 666,
                        Sign          = "-",
                        RateAmount    = 2,
                        Type          = "A1"
                    },
                    new LateChargeModel
                    {
                        ApplicationNo = "SB-2513-xx1",
                        From          = 12,
                        To            = 36,
                        RateCode      = 665,
                        Sign          = "+",
                        RateAmount    = 2.5M,
                        Type          = "A1"
                    },

                    new LateChargeModel
                    {
                        ApplicationNo = "SB-2513-xx1",
                        From          = 37,
                        To            = 44,
                        RateCode      = null,
                        Sign          = null,
                        RateAmount    = 36,
                        Type          = "A1"
                    }
                }
            };

            var result = Rate(req);

            return(result);
        }
Exemple #3
0
        public ResponseModel <LateCharge> CalculationRate(LateChargeReqModel req)
        {
            var methodName  = MethodBase.GetCurrentMethod().Name;
            var LateCharges = req.LateCharges;
            var header      = req.Header;
            var rateMax     = new LateChargeModel();

            try
            {
                _logger.LogInformation($"Start Function => {methodName}, Parameters => {JsonSerializer.ToJsonString(req)}");

                #region Step 1 check parameter

                var parameter = _context.Parameter.FirstOrDefault(r => r.Name == "FirstLateCharge");
                if (parameter == null)
                {
                    return(new ResponseModel <LateCharge>
                    {
                        Message = $"ไม่พบ FirstLateCharge ในฐานข้อมูล"
                    });
                }

                #endregion

                #region Step 2 หาค่า ratemax จากค่าทั้งหมด

                if (LateCharges.Count(r => !r.RateCode.HasValue && string.IsNullOrEmpty(r.Sign)) == LateCharges.Count)
                {//Rate Fix
                    var late = LateCharges.OrderByDescending(r => r.RateAmount).FirstOrDefault();
                    late.RateCal = late.RateAmount;
                    rateMax      = late;
                }
                else
                {
                    //AlternateRate
                    var rateCodes = LateCharges.Select(r => r.RateCode).ToList();
                    var sSRATEs   = _context.SSRATE.Where(r => rateCodes.Contains(r.JRRATN)).ToList();
                    if (!sSRATEs.Any())
                    {
                        return(new ResponseModel <LateCharge>
                        {
                            Message = $"ไม่พบ RateCode: {string.Join(",", rateCodes)} ในฐานข้อมูล"
                        });
                    }

                    LateCharges.ForEach(LateCharge =>
                    {
                        var rateByInterfaceDate = (decimal?)null;
                        if (LateCharge.InterfaceDate.HasValue)
                        {
                            var rateByDate = sSRATEs.FirstOrDefault(sRate
                                                                    => (sRate.JRDATE_FUTURE.HasValue && sRate.JRCRAT_FUTURE.HasValue) &&
                                                                    (sRate.JRRATN == LateCharge.RateCode) &&
                                                                    (LateCharge.InterfaceDate.Value.Date >= sRate.JRDATE_FUTURE.Value.Date));

                            if (rateByDate != null)
                            {
                                rateByInterfaceDate = rateByDate.JRCRAT_FUTURE.Value;
                                //LateCharge.Late = rateByInterfaceDate;
                                LateCharge.MrrEffectiveRateDate = rateByDate.JRDATE_FUTURE;
                            }
                        }

                        //Initial rate
                        var late           = rateByInterfaceDate ?? (sSRATEs.FirstOrDefault(sRate => sRate.JRRATN == LateCharge.RateCode)?.JRCRAT ?? 0);
                        LateCharge.MrrRate = late;

                        LateCharge.RateCal = LateCharge.Sign switch
                        {
                            "+" => (late + LateCharge.RateAmount),
                            "-" => (late - LateCharge.RateAmount),
                            _ => LateCharge.RateAmount,
                        };
                    });

                    rateMax = LateCharges.OrderByDescending(r => r.RateCal).FirstOrDefault();
                }


                #endregion

                #region Step 3 validate product type and business logic

                //Validate ProductType
                var productType = _context.LNPAR2.FirstOrDefault(r => r.PTYPE == rateMax.Type);

                //Variable response
                var result = new LateCharge
                {
                    ApplicationNo        = rateMax.ApplicationNo,
                    MrrRate              = rateMax.MrrRate,
                    MrrEffectiveRateDate = rateMax.MrrEffectiveRateDate
                };

                if (productType != null)
                {
                    var calRateMax = 0M;
                    if (productType.LATCHGCOD.HasValue)
                    {
                        _          = decimal.TryParse(parameter.Value, out var firstLate);
                        calRateMax = (rateMax.RateCal + firstLate);
                    }
                    else
                    {
                        calRateMax = rateMax.RateCal;
                    }

                    var type    = rateMax.Type;
                    var cELRATE = _context.CELRATE.FirstOrDefault(r => r.PTYPE == type);
                    if (cELRATE == null)
                    {
                        return(new ResponseModel <LateCharge>
                        {
                            Message = $"ไม่พบ Celrate Type: {type} ในฐานข้อมูล"
                        });
                    }

                    var prrcelRATE = cELRATE.PRRCELRATE;
                    result.FirstLateCharge = (calRateMax > prrcelRATE ? prrcelRATE : calRateMax);
                }
                else
                {
                    //result.FirstLateCharge = 0;
                }

                #endregion

                #region Step 4 commit transation to db and  data response

                var obj = _context.LateCharge.FirstOrDefault(r => r.ApplicationNo == result.ApplicationNo);
                if (obj == null)
                {
                    var _dateNow = DateTime.Now;
                    result.CreateBy   = header.UserID;
                    result.CreateDate = _dateNow;
                    result.UpdateBy   = header.UserID;
                    result.UpdateDate = _dateNow;
                    _context.LateCharge.Add(result);
                    _context.SaveChanges();
                    _logger.LogInformation($"Finish (New Insert) Function => {methodName}, Result => {JsonSerializer.ToJsonString(result)}");
                    return(new ResponseModel <LateCharge>
                    {
                        Success = true,
                        Datas = result
                    });
                }
                else
                {
                    obj.FirstLateCharge      = result.FirstLateCharge;
                    obj.MrrRate              = result.MrrRate;
                    obj.MrrEffectiveRateDate = result.MrrEffectiveRateDate;
                    obj.UpdateBy             = header.UserID;
                    obj.UpdateDate           = DateTime.Now;
                    _context.SaveChanges();
                    _logger.LogInformation($"Finish (Update) Function => {methodName}, Result => {JsonSerializer.ToJsonString(result)}");

                    return(new ResponseModel <LateCharge>
                    {
                        Success = true,
                        Datas = obj
                    });
                }

                #endregion
            }
            catch (Exception ex)
            {
                var messageError = $"Error Function => {methodName}";
                _logger.LogError(ex, messageError);
                throw new ArgumentException(messageError, ex);
            }
        }