Example #1
0
        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));
            }
        }