Example #1
0
        /// <summary>
        /// Получение сгруппированного по наименованиям списка остатков
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public List <BatchGroup> GetBatches(BatchFilter filter)
        {
            List <BatchGroup> batchGroups = new List <BatchGroup>();
            Guid itemId = filter.ItemId;

            // Получаем все ids всех наименований
            var itemList = _siriusContext.Items.Select(i => new { i.Id, i.Name });

            // Если в фильтре указан itemId, то производим отбор
            var items = itemId != Guid.Empty ? itemList.Where(i => i.Id == filter.ItemId).ToList() : itemList.ToList();

            // Получаем остатки по каждому наименованию
            items.ForEach(i =>
            {
                filter.ItemId = itemId != Guid.Empty ? filter.ItemId : i.Id;

                /** Получаем остатки в зависимости от значения параметра фильтра IsDynamic
                 * Если значение false, то ищем в накопительном регистре StorageRegiter
                 * При значении true высчитываем остатки по всем существующим регистрам проведённых накладных (возможно будет медленно)    */
                BatchGroup batchGroup = new BatchGroup()
                {
                    Name    = i.Name,
                    Batches = filter.IsDynamic == true ? GetDynamicBatchesByFilter(filter).Result : GetStaticBatchesByFilter(filter)
                };
                batchGroups.Add(batchGroup);
            });

            return(batchGroups);
        }
        public List <RecurringBatchDataViewModel> GetBatchViewListForExport(BatchFilter batchFilter)
        {
            try
            {
                var batchData = new List <RecurringBatchDataViewModel>();
                var batchList = batchRepository.GetBatchList(batchFilter);
                foreach (var batch in batchList)
                {
                    var batchDataViewModel = new RecurringBatchDataViewModel
                    {
                        BatchStatus        = batch.BatchStatus,
                        BatchId            = batch.Id,
                        BatchDate          = batch.CreateDateTime,
                        BatchNumber        = batch.MerchantAssignedBatchNumber,
                        MerchantDbaName    = batch.DbaName,
                        MerchantNationalId = batch.AuxiliaryField02,
                        MerchantNumber     = batch.MerchantAgreementNumber
                    };

                    if (batch.BatchStatus == BatchStatus.Processed)
                    {
                        batchDataViewModel.TotalAmount = batch.BatchReport.BatchTotalAmount;
                    }

                    batchData.Add(batchDataViewModel);
                }
                return(batchData);
            }
            catch (Exception exception)
            {
                //logger.LogError("Unexpected error occurred when filtering and mapping RecurringBatch", exception);
                return(null);
            }
        }
Example #3
0
        /// <summary>
        /// Копирование регистров в целевую накладную
        /// </summary>
        /// <param name="sourceInvoiceId"></param>
        /// <param name="destinationInvoiceId"></param>
        /// <returns></returns>
        public IEnumerable <Register> CopyRegisters(Guid sourceInvoiceId, Guid destinationInvoiceId)
        {
            //ПОЯСНЕНИЕ:
            //Item - позиция
            //Batch - остаток
            //Invoice - накладная
            //Register - регистр
            //Получаем регисты их исходной накладной (шаблона)
            var registers = _unitOfWork.RegisterRepository.GetByInvoiceId(sourceInvoiceId);

            registers.ToList().ForEach(reg =>
            {
                // Получаем остатки по позиции и остатку текущего регистра
                var filter = new BatchFilter()
                {
                    ItemId = reg.ItemId
                };
                var batches = _unitOfWork.RegisterRepository.GetDynamicBatchesByFilter(filter).GetAwaiter().GetResult();
                // Вызываем метод копирования
                AddCopiedRegister(new Register()
                {
                    InvoiceId = destinationInvoiceId, ItemId = reg.ItemId, Amount = reg.Amount
                }, batches);
            });

            _unitOfWork.Save();

            var result = GetRegistersByInvoiceId(destinationInvoiceId)
                         .Select(r => new Register()
            {
                Id = r.Id, InvoiceId = r.InvoiceId, ItemId = r.ItemId, Amount = r.Amount, Cost = r.Cost
            });

            return(result);
        }
Example #4
0
        /// <summary>
        /// Получить запись регистра по Id наименования
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Task <IEnumerable <Batch> > GetBatchesByItemId(Guid id)
        {
            var filter = new BatchFilter()
            {
                ItemId = id
            };

            return(_unitOfWork.RegisterRepository.GetDynamicBatchesByFilter(filter));
        }
Example #5
0
        public IActionResult GetBatch(BatchFilter filter)
        {
            var batches = _siriusService.GetBatch(filter);

            if (batches != null)
            {
                return(Ok(batches));
            }
            return(NotFound());
        }
        public RecurringBatchViewModel GetBatchViewWithPaging(BatchFilter batchFilter)
        {
            try
            {
                var batchData       = new List <RecurringBatchDataViewModel>();
                var batchPagination = batchRepository.GetPagedBatchList(batchFilter);
                foreach (var batch in batchPagination.Batches)
                {
                    var batchDataViewModel = new RecurringBatchDataViewModel
                    {
                        BatchStatus        = batch.BatchStatus,
                        BatchId            = batch.Id,
                        BatchDate          = batch.CreateDateTime,
                        BatchNumber        = batch.MerchantAssignedBatchNumber,
                        MerchantDbaName    = batch.DbaName,
                        MerchantNationalId = batch.AuxiliaryField02,
                        MerchantNumber     = batch.MerchantAgreementNumber
                    };

                    if (batch.BatchStatus == BatchStatus.Processed)
                    {
                        batchDataViewModel.TotalAmount = batch.BatchReport.BatchTotalAmount;
                    }

                    batchData.Add(batchDataViewModel);
                }
                return(new RecurringBatchViewModel
                {
                    Batches = batchData,
                    Filter = batchFilter,
                    Pagination =
                        new PaginationViewModel
                    {
                        CurrentPage = batchPagination.CurrentPage,
                        IsNextPage = batchPagination.IsNextPage,
                        IsPreviousPage = batchPagination.IsPreviousPage,
                        TotalCount = batchPagination.TotalCount,
                        TotalPages = batchPagination.TotalPages,
                        PaginationFunctionUrl = "RecurringBatch/GetPage"
                    }
                });
            }
            catch (Exception exception)
            {
                //logger.LogError("Unexpected error occurred when filtering and mapping RecurringBatch", exception);
                return(null);
            }
        }
Example #7
0
        public IActionResult Index(Guid?viewBatch)
        {
            defaultBatchFilter = new BatchFilter
            {
                TextSearch = string.Empty,
                From       = clock.Now.AddDays(-30),
                To         = clock.Now,
                PageNumber = 1,
                PageSize   = paginationConfiguration.Value.NumberOfRecordsPerPage,
                OpenBatch  = viewBatch
            };

            SetSessionFilter(defaultBatchFilter);

            var model = recurringBatchesManager.GetBatchViewWithPaging(defaultBatchFilter);

            return(View(model));
        }
Example #8
0
        public IEnumerable <Batch> GetStaticBatchesByFilter(BatchFilter filter)
        {
            var result = _siriusContext.StorageRegisters
                         .Include(r => r.Item)
                         .Where(r =>
                                (r.ItemId == filter.ItemId) &&
                                (filter.CategoryId != Guid.Empty ? r.Item.CategoryId == filter.CategoryId : true) &&
                                // Если в фильтре указана выборка по критическим остаткам
                                (filter.isMinimumLimit ? r.Amount <= _siriusContext.Items.FirstOrDefault(x => x.Id == r.ItemId).MinimumLimit : true))
                         .OrderBy(r => r.Item.CategoryId)
                         .Select(sr => new Batch {
                Amount = sr.Amount, Cost = sr.Cost
            })
                         .ToList();

            return(result.Select(b => new Batch {
                Amount = Math.Round(b.Amount, 2), Cost = b.Cost
            }));
        }
Example #9
0
        public ActionResult BatchFilter(BatchFilter batchFilter)
        {
            if (!ModelState.IsValid)
            {
                var errorList = (from item in ModelState
                                 where item.Value.Errors.Any()
                                 select item.Value.Errors[0].ErrorMessage).ToList();
                var returnString = errorList.Aggregate(string.Empty, (current, error) => current + $"<div class='error'>{error}</div>");

                return(Content(returnString));
            }

            batchFilter.PageSize = paginationConfiguration.Value.NumberOfRecordsPerPage;
            SetSessionFilter(batchFilter);

            var model = recurringBatchesManager.GetBatchViewWithPaging(batchFilter);

            return(PartialView("_BatchData", model));
        }
Example #10
0
        /// <summary>
        /// Получить остатки согласно критериям фильтрации
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public IEnumerable <object> GetBatches(BatchFilter filter)
        {
            var batches = _unitOfWork.RegisterRepository.GetBatches(filter);

            string fileDownloadName = Path.Combine(Directory.GetCurrentDirectory(), "report.xlsx");

            using (var package = CreateExcelPackage(batches))
            {
                try
                {
                    package.SaveAs(new FileInfo(fileDownloadName));
                }
                catch (AppException ex)
                {
                    return(batches);
                }
            }
            return(batches);
        }
Example #11
0
        /// <summary>
        /// Получение остатков по критериям фильтрации
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public async Task <IEnumerable <Batch> > GetDynamicBatchesByFilter(BatchFilter filter)
        {
            List <Batch> result = new List <Batch>();

            var t1 = Guid.Empty;
            var t2 = DateTime.MinValue;

            // Получаем регистры прихода
            var registers = await _siriusContext.Registers
                            .Include(r => r.Item)
                            .Include(r => r.Invoice)
                            .Where(r =>
                                   (r.ItemId == filter.ItemId) &&
                                   (r.Invoice.IsFixed == true) &&
                                   (r.Invoice.Factor > 0) &&
                                   (filter.CategoryId != Guid.Empty ? r.Item.CategoryId == filter.CategoryId : true) &&
                                   (filter.VendorId != Guid.Empty ? r.Invoice.VendorId == filter.VendorId : true))
                            .OrderBy(r => r.Invoice.Date)
                            .ToListAsync();

            List <Batch> batches = new List <Batch>();

            registers.ForEach(reg1 =>
            {
                decimal cost  = reg1.Cost;
                double amount = reg1.Amount;
                registers.ForEach(reg2 =>
                {
                    if (reg1.Id != reg2.Id && reg1.Cost == reg2.Cost)
                    {
                        amount += reg2.Amount;
                    }
                });
                batches.Add(new Batch()
                {
                    Amount = Math.Round(amount, 2),
                    Cost   = cost
                });
            });

            IEnumerable <Batch> arrivalBatch = batches.Distinct();

            // Получаем регистры расхода

            batches = new List <Batch>();

            registers = await _siriusContext.Registers
                        .Include(r => r.Item)
                        .Include(r => r.Invoice)
                        .Where(r =>
                               (r.ItemId == filter.ItemId) &&
                               (r.Invoice.IsFixed == true) &&
                               (r.Invoice.Factor < 0) &&
                               (r.Item.IsCountless == false) &&
                               (filter.CategoryId != Guid.Empty ? r.Item.CategoryId == filter.CategoryId : true) &&
                               (filter.VendorId != Guid.Empty ? r.Invoice.VendorId == filter.VendorId : true))
                        .OrderBy(r => r.Invoice.Date)
                        .ToListAsync();

            registers.ForEach(reg1 =>
            {
                decimal cost  = reg1.Cost;
                double amount = reg1.Amount;
                registers.ForEach(reg2 =>
                {
                    if (reg1.Id != reg2.Id && reg1.Cost == reg2.Cost)
                    {
                        amount += reg2.Amount;
                    }
                });
                batches.Add(new Batch()
                {
                    Amount = Math.Round(amount, 2),
                    Cost   = cost
                });
            });

            IEnumerable <Batch> writeOffBatch = batches.Distinct();

            // Вычисляем остатки путём вычитания расходных значений из приходных
            arrivalBatch.ToList().ForEach(ab =>
            {
                writeOffBatch.ToList().ForEach(wb =>
                {
                    if (ab.Cost == wb.Cost)
                    {
                        ab.Amount = ab.Amount - wb.Amount;
                    }
                });
                if (ab.Amount != 0)
                {
                    result.Add(ab);
                }
            });
            // Убираем совпадения, фильтруем по цене
            result = result.Distinct().Where(b => (filter.Cost != 0 ? b.Cost == filter.Cost : true)).ToList();
            return(result);
        }
Example #12
0
 /// <summary>
 /// Получить 1 остаток согласно критериям фильтрации
 /// </summary>
 /// <param name="filter"></param>
 /// <returns></returns>
 public object GetBatch(BatchFilter filter)
 {
     return(_unitOfWork.RegisterRepository.GetDynamicBatchesByFilter(filter).Result.FirstOrDefault());
 }
        public RecurringBatchPaginationList GetPagedBatchList(BatchFilter filter)
        {
            // TODO : implement access to database or data service
            var rand      = new Random();
            var batchList = new List <Batch>();

            for (var i = 0; i < 1500; i++)
            {
                var batch = new Batch
                {
                    Id                          = i == 0 ? Guid.Parse("37d16b94-3345-4149-bed7-35135df18379") : Guid.NewGuid(),
                    BatchStatus                 = i % 2 == 0 ? BatchStatus.Processed : BatchStatus.Open,
                    BatchClosingDateTime        = DateTime.Now,
                    CreateDateTime              = DateTime.Now.AddDays(-1 * i),
                    DbaName                     = $"Sjonna búð {i}",
                    MerchantAgreementNumber     = i.ToString().PadLeft(6, '0'),
                    MerchantCity                = "Reykjavík",
                    MerchantAssignedBatchNumber = "123456789",
                    MerchantCountry             = "352",
                    MerchantName                = $"Sjonni {i} HF",
                    MerchantPostCode            = "112",
                    MerchantTypeMccCode         = "2388",
                    ProcessingEndTime           = DateTime.Now,
                    ProcessingStartTime         = DateTime.Now,
                    TerminalId                  = rand.Next(1000, 10000).ToString(),
                    AuxiliaryField01            = Guid.NewGuid().ToString(),
                    AuxiliaryField02            = "1912822999"
                };
                if (i % 2 == 0)
                {
                    batch.BatchReport = new BatchReport
                    {
                        BatchStatus                    = batch.BatchStatus,
                        BatchId                        = batch.Id,
                        AuthorizedBatchAmount          = 1000,
                        AuxiliaryField01               = batch.AuxiliaryField01,
                        AuxiliaryField02               = batch.AuxiliaryField02,
                        BatchTotalAmount               = 1200,
                        DbaName                        = batch.DbaName,
                        MerchantAgreementNumber        = batch.MerchantAgreementNumber,
                        MerchantAssignedBatchNumber    = batch.MerchantAssignedBatchNumber,
                        MerchantName                   = batch.MerchantName,
                        NumberOfAuthorizedTransactions = 10,
                        ProcessingStartTime            = batch.CreateDateTime.AddSeconds(10),
                        ProcessingEndTime              = batch.CreateDateTime.AddSeconds(20),
                        TotalNumberOfTransactions      = 12
                    };
                }
                batchList.Add(batch);
            }

            var filteredByDate = batchList.Where(x => x.CreateDateTime > filter.From && x.CreateDateTime < filter.To).ToList();

            if (!string.IsNullOrEmpty(filter.TextSearch))
            {
                batchList =
                    filteredByDate.Where(
                        x => x.DbaName.ToLower().Contains(filter.TextSearch.ToLower()) ||
                        x.MerchantAgreementNumber.ToLower().Contains(filter.TextSearch.ToLower()) ||
                        x.MerchantName.ToLower().Contains(filter.TextSearch.ToLower()) ||
                        x.TerminalId.ToLower().Contains(filter.TextSearch.ToLower())).ToList();
            }

            var recurringBatchPaginationList = new RecurringBatchPaginationList
            {
                TotalCount  = batchList.Count,
                CurrentPage = filter.PageNumber,
            };

            recurringBatchPaginationList.TotalPages = (int)Math.Ceiling(recurringBatchPaginationList.TotalCount / (double)filter.PageSize);

            recurringBatchPaginationList.Batches = batchList.Skip((recurringBatchPaginationList.CurrentPage - 1) * filter.PageSize).Take(filter.PageSize).ToList();

            recurringBatchPaginationList.IsPreviousPage = filter.PageNumber > 1;

            recurringBatchPaginationList.IsNextPage = filter.PageNumber < recurringBatchPaginationList.TotalPages;

            return(recurringBatchPaginationList);
        }
        public List <Batch> GetBatchList(BatchFilter filter)
        {
            // TODO : implement access to database or data service
            var rand      = new Random();
            var batchList = new List <Batch>();

            for (var i = 0; i < 40; i++)
            {
                var batch = new Batch
                {
                    Id                          = Guid.NewGuid(),
                    BatchStatus                 = i % 2 == 0 ? BatchStatus.Processed : BatchStatus.Open,
                    BatchClosingDateTime        = DateTime.Now,
                    CreateDateTime              = DateTime.Now.AddDays(-1 * i),
                    DbaName                     = $"Sjonna búð {i}",
                    MerchantAgreementNumber     = i.ToString().PadLeft(6, '0'),
                    MerchantCity                = "Reykjavík",
                    MerchantAssignedBatchNumber = "123456789",
                    MerchantCountry             = "352",
                    MerchantName                = $"Sjonni {i} HF",
                    MerchantPostCode            = "112",
                    MerchantTypeMccCode         = "2388",
                    ProcessingEndTime           = DateTime.Now,
                    ProcessingStartTime         = DateTime.Now,
                    TerminalId                  = rand.Next(1000, 10000).ToString(),
                    AuxiliaryField01            = Guid.NewGuid().ToString(),
                    AuxiliaryField02            = "1912822999"
                };
                if (i % 2 == 0)
                {
                    batch.BatchReport = new BatchReport
                    {
                        BatchStatus                    = batch.BatchStatus,
                        BatchId                        = batch.Id,
                        AuthorizedBatchAmount          = 1000,
                        AuxiliaryField01               = batch.AuxiliaryField01,
                        AuxiliaryField02               = batch.AuxiliaryField02,
                        BatchTotalAmount               = 1200,
                        DbaName                        = batch.DbaName,
                        MerchantAgreementNumber        = batch.MerchantAgreementNumber,
                        MerchantAssignedBatchNumber    = batch.MerchantAssignedBatchNumber,
                        MerchantName                   = batch.MerchantName,
                        NumberOfAuthorizedTransactions = 10,
                        ProcessingStartTime            = batch.CreateDateTime.AddSeconds(10),
                        ProcessingEndTime              = batch.CreateDateTime.AddSeconds(20),
                        TotalNumberOfTransactions      = 12
                    };
                }
                batchList.Add(batch);
            }

            var filteredByDate = batchList.Where(x => x.CreateDateTime > filter.From && x.CreateDateTime < filter.To).ToList();

            if (!string.IsNullOrEmpty(filter.TextSearch))
            {
                batchList =
                    filteredByDate.Where(
                        x => x.DbaName.ToLower().Contains(filter.TextSearch.ToLower()) ||
                        x.MerchantAgreementNumber.ToLower().Contains(filter.TextSearch.ToLower()) ||
                        x.MerchantName.ToLower().Contains(filter.TextSearch.ToLower()) ||
                        x.TerminalId.ToLower().Contains(filter.TextSearch.ToLower())).ToList();
            }

            return(batchList);
        }