public async Task <ActionResult> Create()
        {
            var tenants      = (await _tenantRepository.GetAllAsync()).OrderBy(t => t.Name);
            var rooms        = (await _roomRepository.GetAllAsync()).OrderBy(r => r.Address);
            var accrualTypes = (await _accrualTypeRepository.GetAllAsync()).OrderBy(t => t.Name);

            var tenantsSelectList      = new SelectList(tenants, "Id", "Name", tenants.First());
            var roomsSelectList        = new SelectList(rooms, "Id", "Address", rooms.First());
            var accrualTypesSelectList = new SelectList(accrualTypes, "Id", "Name", accrualTypes.First());

            var vm = new ContractViewModel
            {
                Tenants      = tenantsSelectList,
                Rooms        = roomsSelectList,
                AccrualTypes = accrualTypesSelectList
            };

            return(View(vm));
        }
        public async Task <IActionResult> Index()
        {
            var tenants      = (await _tenantRepository.GetAllAsync()).OrderBy(t => t.Name);
            var accrualTypes = (await _accrualTypeRepository.GetAllAsync()).OrderBy(a => a.Name).ToList();

            accrualTypes.Add(new Domain.Entities.AccrualType()
            {
                Id = null, Name = "Сводный отчёт"
            });
            var tenantSelectList       = new SelectList(tenants, "Id", "Name", tenants.First());
            var accrualTypesSelectList = new SelectList(accrualTypes, "Id", "Name", accrualTypes.First(a => String.IsNullOrEmpty(a.Id)));

            var vm = new HomeViewModel
            {
                Tenants      = tenantSelectList,
                AccrualTypes = accrualTypesSelectList
            };

            return(View(vm));
        }
예제 #3
0
        public async Task <IActionResult> Index(string id, string accrualTypeId, DateTime start, DateTime end)
        {
            string          userId    = User.IsInRole("User") ? _userManager.GetUserId(User) : null;
            List <Contract> contracts = new List <Contract>();

            var accrualType = accrualTypeId != null ? await _accrualTypeRepository.GetByIdAsync(accrualTypeId) : null;

            if (userId != null || id != null)
            {
                var tenant = userId != null ? await _tenantRepository.GetByUserIdAsync(userId) : await _tenantRepository.GetByIdAsync(id);

                if (accrualType != null)
                {
                    contracts = (await _contractRepository.GetAllByTenantIdAndAccrualTypeIdAsync(tenant.Id, accrualType.Id))
                                .ToList();
                }
                else
                {
                    var entries      = new List <CalculationMonitorEntryViewModel>();
                    var accrualTypes = await _accrualTypeRepository.GetAllAsync();

                    foreach (var type in accrualTypes)
                    {
                        var contractsByAccrualType = (await _contractRepository.GetAllByTenantIdAndAccrualTypeIdAsync(tenant.Id, type.Id))
                                                     .ToList();

                        var accrualsByAccrualType = (await _accrualRepository.GetAllAsync())
                                                    .Where(a => contractsByAccrualType.Exists(c => c.Id == a.ContractId));
                        var paymentsByAccrualType = (await _paymentRepository.GetAllAsync())
                                                    .Where(p => contractsByAccrualType.Exists(c => c.Id == p.ContractId));

                        var openingBalanceByAccrualType = accrualsByAccrualType.Where(a => a.AccrualDate < start).Sum(a => a.Summ)
                                                          - paymentsByAccrualType.Where(a => a.PaymentDate < start).Sum(p => p.Summ);
                        var accrualsSum = accrualsByAccrualType
                                          .Where(a => a.AccrualDate >= start && a.AccrualDate <= end)
                                          .Sum(a => a.Summ);
                        var paymentsSum = paymentsByAccrualType
                                          .Where(p => p.PaymentDate >= start && p.PaymentDate <= end)
                                          .Sum(p => p.Summ);

                        entries.Add(new CalculationMonitorEntryViewModel
                        {
                            TenantId        = tenant.Id,
                            AccrualTypeId   = type.Id,
                            AccrualTypeName = type.Name,
                            OpeningBalance  = openingBalanceByAccrualType,
                            AccrualsSum     = accrualsSum,
                            PaymentsSum     = paymentsSum,
                            ClosingBalance  = openingBalanceByAccrualType + accrualsSum - paymentsSum
                        });
                    }

                    ViewBag.StartDate = start;
                    ViewBag.EndDate   = end;

                    return(View("EntireMonitor", entries.OrderBy(e => e.AccrualTypeName)));
                }
            }

            var accruals = (await _accrualRepository.GetAllAsync()).Where(a => contracts.Exists(c => c.Id == a.ContractId));
            var payments = (await _paymentRepository.GetAllAsync()).Where(p => contracts.Exists(c => c.Id == p.ContractId));

            var openingBalance = accruals.Where(a => a.AccrualDate < start).Sum(a => a.Summ)
                                 - payments.Where(a => a.PaymentDate < start).Sum(p => p.Summ);

            var accrualsInPeriod = accruals
                                   .Where(a => a.AccrualDate >= start && a.AccrualDate <= end)
                                   .OrderBy(a => a.AccrualDate);
            var paymentsInPeriod = payments
                                   .Where(p => p.PaymentDate >= start && p.PaymentDate <= end)
                                   .OrderBy(p => p.PaymentDate);

            var closingBalance = openingBalance + accrualsInPeriod.Sum(a => a.Summ) - paymentsInPeriod.Sum(p => p.Summ);

            var viewModel = new CalculationMonitorViewModel
            {
                TenantId        = id,
                AccrualTypeName = accrualType?.Name ?? "Сводный",
                OpeningBalance  = openingBalance,
                Accruals        = accrualsInPeriod.Select(AccrualViewModel.FromAccrual),
                Payments        = paymentsInPeriod.Select(PaymentViewModel.FromPayment),
                ClosingBalance  = closingBalance,
                Start           = start,
                End             = end
            };

            return(View(viewModel));
        }
 public async Task <ActionResult> Index() =>
 View((await _repository.GetAllAsync()).OrderBy(t => t.Name).Select(AccrualTypeViewModel.FromAccrualType));