public async Task <IActionResult> CreateCustomerCredits([FromBody] ReportFilterViewModel model) { try { if (!ModelState.IsValid) { throw new Exception("Form is not valid!"); } var userId = new Guid(User.FindFirstValue(ClaimTypes.NameIdentifier)); var company = await _companyBusinessManager.GetCompany(model.CompanyId); if (company == null || company.Settings == null || !company.Settings.SaveCreditValues) //возможно ли сохранение лимитов { throw new Exception("Please, check company settings!"); } var date = model.Date.LastDayOfMonth(); var previousDate = model.Date.AddMonths(-1).LastDayOfMonth(); var savedReports = await _reportBusinessManager.GetSavedFactReport(userId, model.CompanyId); if (savedReports != null && savedReports.Count > 0) { var prevReport = savedReports.Where(x => x.Date == previousDate).FirstOrDefault(); if (prevReport == null || !prevReport.IsPublished) { throw new Exception($"You must save and publish a report for the previous period: {previousDate.ToShortDateString()}"); } } var report = await _reportBusinessManager.GetAgingReport(model.CompanyId, date, 30, model.NumberOfPeriods, false); #region CREDIT UTILIZED SETTINGS var creditUtilizedSettings = await _businessManager.GetCustomerCreditUtilizedSettings(model.CompanyId, model.Date); if (creditUtilizedSettings == null) { creditUtilizedSettings = await _businessManager.CreateCustomerCreditUtilizedSettings(new CustomerCreditUtilizedSettingsDto() { CompanyId = model.CompanyId, Date = model.Date, RoundType = model.RoundType }); } else { if (creditUtilizedSettings.RoundType != model.RoundType) { creditUtilizedSettings.RoundType = model.RoundType; creditUtilizedSettings = await _businessManager.UpdateCustomerCreditUtilizedSettings(creditUtilizedSettings.Id, creditUtilizedSettings); } } #endregion var createCreditUtilized = 0; var updateCreditUtilized = 0; var ignoreCreditUtilized = 0; foreach (var data in report.Rows) { var customer = data.Customer; var value = data.Data["Total"]; //new height credit if (creditUtilizedSettings.RoundType == Core.Data.Enum.RoundType.RoundUp) { value = Math.Ceiling(value); } else if (creditUtilizedSettings.RoundType == Core.Data.Enum.RoundType.RoundDown) { value = Math.Floor(value); } var creditUtilizeds = await _businessManager.GetCustomerCreditUtilizeds(customer.Id); var creditUtilized = creditUtilizeds .OrderByDescending(x => x.CreatedDate) .Where(x => x.CreatedDate <= date).FirstOrDefault(); // если в БД нет записей // ИЛИ // запись есть и даты не совпадают, а также значение меньше значения текущего отчета // создать запись if (creditUtilized == null) { await _businessManager.CreateCustomerCreditUtilized(new CustomerCreditUtilizedDto() { CreatedDate = date, Value = value, CustomerId = customer.Id }); createCreditUtilized++; } else if (creditUtilized.Value < value) // если новое значение больше предыдущей записи { if (creditUtilized.CreatedDate < date) // если даты не равны { if (!creditUtilized.IsIgnored || model.CreditUtilizeds == null || !model.CreditUtilizeds.Contains(creditUtilized.Id)) // если знаение со статусом Ignore и оно не выбрано, тогда проигнорировать { await _businessManager.CreateCustomerCreditUtilized(new CustomerCreditUtilizedDto() //создать новую запись { CreatedDate = date, Value = value, CustomerId = customer.Id }); createCreditUtilized++; } else { ignoreCreditUtilized++; } } else if (creditUtilized.CreatedDate == date) // если даты равны { if (creditUtilized.IsIgnored) { ignoreCreditUtilized++; } else { creditUtilized.Value = value; creditUtilized = await _businessManager.UpdateCustomerCreditUtilized(creditUtilized.Id, creditUtilized); // изменить значение записи updateCreditUtilized++; } } } } return(Ok(new { Updated = updateCreditUtilized, Created = createCreditUtilized, Ignored = ignoreCreditUtilized })); } catch (Exception er) { return(BadRequest(er.Message ?? er.StackTrace)); } }