Example #1
0
        /// <summary>
        /// Создает DataTable по отчету.
        /// </summary>
        /// <returns></returns>
        private DataTable GetTable(MotionReport report)
        {
            var table = new DataTable();

            table.Columns.Add("№", typeof(int));
            table.Columns.Add("Модель", typeof(string));
            table.Columns.Add("Списано", typeof(int));
            table.Columns.Add("Поступило", typeof(int));
            table.Columns.Add($"Остаток на {DateTime.Today:dd.MM.yyyy}", typeof(int));
            foreach (var cartridge in report.Cartridges)
            {
                table.Rows.Add(cartridge.Number, cartridge.Model, cartridge.ExpenseCount, cartridge.ReceiptCount, cartridge.BalanceCount);
                CurrentProgress++;
            }
            return(table);
        }
        /// <summary>
        /// Создает отчет ОСП по движению картриджей.
        /// </summary>
        /// <returns>Отчет ОСП</returns>
        public Report Create()
        {
            // Коллекция картриджей для отчета.
            List <MotionCartridgeDTO> cartridges = new List <MotionCartridgeDTO>();

            // Список Id актуальных картриджей в списаниях.
            int[] expenseActualCartId = DataService.Expenses
                                        .Find(x => x.Osp.Id == Osp.Id && x.Date >= DateTime.Today.AddDays(-ActualCartDays))
                                        .Select(u => u.Cartridge.Id)
                                        .ToArray();
            // Список Id актуальных картриджей в поступлениях.
            int[] recActualCartId = DataService.Receipts
                                    .Find(x => x.Osp.Id == Osp.Id && x.Date >= DateTime.Today.AddDays(-ActualCartDays))
                                    .SelectMany(u => u.Cartridges)
                                    .Select(c => c.Cartridge.Id)
                                    .Distinct()
                                    .ToArray();
            // Объединение id актуальных картриджей
            int[] actualCartsId = expenseActualCartId.Union(recActualCartId).ToArray();
            // Счетчик номера.
            int number = 1;

            // Перебрать Id актуальных картриджей.
            foreach (var cartId in actualCartsId)
            {
                // Сумма списаний картриджа.
                int expenseCount = DataService.Expenses
                                   .Find(x => x.Osp.Id == Osp.Id && x.Date >= StartPeriod && x.Date <= EndPeriod && x.Cartridge.Id == cartId)
                                   .Select(c => c.Count)
                                   .ToArray()
                                   .Sum();
                // Сумма поступлений картриджа.
                int receiptsCount = DataService.Receipts
                                    .Find(x => x.Osp.Id == Osp.Id && x.Date >= StartPeriod && x.Date <= EndPeriod)
                                    .SelectMany(u => u.Cartridges)
                                    .Where(c => c.Cartridge.Id == cartId)
                                    .Select(t => t.Count)
                                    .ToArray()
                                    .Sum();
                // Текущий остаток.
                int balanceCount = DataService.Balance.Find(x => x.Osp.Id == Osp.Id && x.Cartridge.Id == cartId).FirstOrDefault().Count;
                // Модель картриджа.
                string model = DataService.Cartridges.Get(cartId).Model;
                // Создать картридж отчета.
                MotionCartridgeDTO cartridge = new MotionCartridgeDTO(number, model, expenseCount, receiptsCount, balanceCount);
                // Добавить в список.
                cartridges.Add(cartridge);
                // Увеличить счетчик.
                number++;
            }
            if (cartridges.Any())
            {
                // Создать отчет.
                MotionReport report = new MotionReport(DateTime.Today, Osp.Name, cartridges);
                return(report);
            }
            else
            {
                throw new ValidationException($"По ОСП {Osp.Name} отсутствуют движения картриджей.", "");
            }
        }