Beispiel #1
0
        private async Task <IEnumerable <AccrualViewModel> > GetAccrualViewModels(string userId)
        {
            var tenants = await _tenantRepository.GetAllAsync();

            var contracts = await _contractRepository.GetAllAsync();

            var accruals = (await _accrualRepository.GetAllAsync())
                           .Where(a => userId != null ? tenants.First(t => t.Id == contracts.First(c => c.Id == a.ContractId).TenantId).UserId == userId : true)
                           .Select(AccrualViewModel.FromAccrual)
                           .ToList();
            var getTasks = new List <Task>();

            foreach (var accrual in accruals)
            {
                var contract = contracts.First(c => c.Id == accrual.ContractId);

                getTasks.Add(_tenantRepository
                             .GetByIdAsync(contract.TenantId)
                             .ContinueWith(t => { accrual.Tenant = t.Result.Name; }));
                getTasks.Add(_roomRepository
                             .GetByIdAsync(contract.RoomId)
                             .ContinueWith(r => { accrual.Room = r.Result.Address; }));
                getTasks.Add(_accrualTypeRepository
                             .GetByIdAsync(contract.AccrualTypeId)
                             .ContinueWith(t => { accrual.AccrualType = t.Result.Name; }));
            }

            await Task.WhenAll(getTasks);

            return(accruals);
        }
Beispiel #2
0
        public async Task <ActionResult> Create(string contractId)
        {
            var contract = await _contractRepository.GetByIdAsync(contractId);

            var accrualType = await _accrualTypeRepository.GetByIdAsync(contract.AccrualTypeId);

            var room = await _roomRepository.GetByIdAsync(contract.RoomId);

            var sum  = 0m;
            var rate = 0.0;

            switch (accrualType.Name)
            {
            case "Аренда":
                rate = (await _calcCoefficientRepository
                        .GetByIdAsync("73163d80-28fa-45bf-8636-54dd4c33e5f1"))
                       .Coefficient;
                sum = (decimal)room.Square * (decimal)rate *
                      room.ComfortCoef * room.IncreasingCoefToBaseRate *
                      room.PlacementCoef * room.SocialOrientationCoef *
                      room.Price;
                break;

            case "Техобслуживание":
                rate = (await _calcCoefficientRepository
                        .GetByIdAsync("e557209d-ce5e-4924-952f-3b1751e346dc"))
                       .Coefficient;
                sum = (decimal)(room.Square * rate);
                break;

            case "Капремонт":
                rate = (await _calcCoefficientRepository
                        .GetByIdAsync("7cbbe0f0-b840-409f-aa38-4259f4e1ee82"))
                       .Coefficient;
                sum = (decimal)(room.Square * rate);
                break;
            }

            var accrual = new AccrualViewModel
            {
                ContractId    = contractId,
                Tenant        = (await _tenantRepository.GetByIdAsync(contract.TenantId)).Name,
                Room          = room.Address,
                InvoiceNumber = 0,
                AccrualType   = (await _accrualTypeRepository.GetByIdAsync(contract.AccrualTypeId)).Name,
                AccrualDate   = DateTime.Now.Date,
                Summ          = sum
            };

            return(View(accrual));
        }
        public async Task <ActionResult> Create(string contractId)
        {
            var contract = await _contractRepository.GetByIdAsync(contractId);

            var payment = new PaymentViewModel
            {
                ContractId         = contractId,
                Tenant             = (await _tenantRepository.GetByIdAsync(contract.TenantId)).Name,
                Room               = (await _roomRepository.GetByIdAsync(contract.RoomId)).Address,
                AccrualType        = (await _accrualTypeRepository.GetByIdAsync(contract.AccrualTypeId)).Name,
                PaymentOrderNumber = 0,
                PaymentDate        = DateTime.Now.Date
            };

            return(View(payment));
        }
        public async Task <ActionResult> Edit(string id)
        {
            var contract = await _contractRepository.GetByIdAsync(id);

            var tenant = await _tenantRepository.GetByIdAsync(contract.TenantId);

            var room = await _roomRepository.GetByIdAsync(contract.RoomId);

            var accrualType = await _accrualTypeRepository.GetByIdAsync(contract.AccrualTypeId);

            var vm = ContractViewModel.FromContract(contract);

            vm.Tenant      = tenant.Name;
            vm.Room        = room.Address;
            vm.AccrualType = accrualType.Name;

            return(View(vm));
        }
Beispiel #5
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));
        }