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); }
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); } }