Пример #1
0
        protected override async Task <IProcessResult <AllExpendituresModel> > Handle(GetAllExpendituresRequest msg)
        {
            var employeeDetails = (await empRepo.GetAllEmployees())
                                  .Where(x => x.EmployeeId != 1) //exclude Admin here
                                  .ToDictionary(x => x.EmployeeId);
            var jobs   = (await jobsRepository.GetAsync()).ToDictionary(x => x.JobId);
            var result = new AllExpendituresModel();


            if (msg.IncludeArcFlashlabels)
            {
                await LoadSection(await arcFlashLabelsRepo.SearchForEntity(x => msg.LimitToSingleExpense.HasValue ?
                                                                           x.ExternalId == msg.LimitToSingleExpense.Value :
                                                                           true),
                                  (ArcFlashLabelExpenditure x) => new Expense <ArcFlashLabelExpenditure>()
                {
                    Detail              = x,
                    Amount              = x.TotalLabelsCost,
                    EmployeeName        = $"{employeeDetails[x.EmployeeId].Last}, {employeeDetails[x.EmployeeId].First}",
                    FullJobNameWithCode = jobs[x.JobId].FullJobCodeWithName,
                    Id = x.Id,
                    ShortExpenseName    = $"Arc Flash Label Expense ({DateTimeWithZone.ConvertToEST(x.DateOfInvoice.UtcDateTime).ToShortDateString()})",
                    JobId               = x.JobId,
                    LastModifiedDateEst = DateTimeWithZone.ConvertToEST(x.LastModified.UtcDateTime)
                },
                                  mapped => result.ArcFlashLabelExpenditures = mapped);
            }
            if (msg.IncludeCompanyVehicles)
            {
                await LoadSection(await companyVehicleRepo.SearchForEntity(x => msg.LimitToSingleExpense.HasValue ?
                                                                           x.ExternalId == msg.LimitToSingleExpense.Value :
                                                                           true),
                                  (CompanyVehicleExpenditure x) => new Expense <CompanyVehicleExpenditure>()
                {
                    Detail              = x,
                    Amount              = x.GetTotalCost(),
                    EmployeeName        = $"{employeeDetails[x.EmployeeId].Last}, {employeeDetails[x.EmployeeId].First}",
                    FullJobNameWithCode = jobs[x.JobId].FullJobCodeWithName,
                    Id = x.ExternalId,
                    ShortExpenseName    = $"Company Vehicle: {x.Vehicle} ({x.TotalMiles:N} miles)",
                    JobId               = x.JobId,
                    LastModifiedDateEst = DateTimeWithZone.ConvertToEST(x.LastModified.UtcDateTime)
                },
                                  mapped => result.CompanyVehicleExpenditures = mapped);
            }

            if (msg.IncludeContractorExpenditures)
            {
                await LoadSection(await contractorExpRepo.SearchForEntity(x => msg.LimitToSingleExpense.HasValue ?
                                                                          x.ExternalId == msg.LimitToSingleExpense.Value :
                                                                          true),
                                  (ContractorExpenditure x) => new Expense <ContractorExpenditure>()
                {
                    Detail              = x,
                    Amount              = x.TotalPOContractAmount,
                    EmployeeName        = $"{employeeDetails[x.EmployeeId].Last}, {employeeDetails[x.EmployeeId].First}",
                    FullJobNameWithCode = jobs[x.JobId].FullJobCodeWithName,
                    Id = x.ExternalId,
                    ShortExpenseName    = $"Contrator Expense (PO: {x.OrionPONumber})",
                    JobId               = x.JobId,
                    LastModifiedDateEst = DateTimeWithZone.ConvertToEST(x.LastModified.UtcDateTime)
                },
                                  mapped => result.ContractorExpenditures = mapped);
            }
            if (msg.IncludeMiscExpenditure)
            {
                await LoadSection(await miscRepo.SearchForEntity(x => msg.LimitToSingleExpense.HasValue ?
                                                                 x.ExternalId == msg.LimitToSingleExpense.Value :
                                                                 true),
                                  (MiscExpenditure x) => new Expense <MiscExpenditure>()
                {
                    Detail              = x,
                    Amount              = x.Amount,
                    EmployeeName        = $"{employeeDetails[x.EmployeeId].Last}, {employeeDetails[x.EmployeeId].First}",
                    FullJobNameWithCode = jobs[x.JobId].FullJobCodeWithName,
                    Id = x.Id,
                    ShortExpenseName    = $"Misc - {x.Description}",
                    JobId               = x.JobId,
                    LastModifiedDateEst = DateTimeWithZone.ConvertToEST(x.LastModified.UtcDateTime)
                },
                                  mapped => result.MiscExpenditures = mapped);
            }

            if (msg.IncludeTimeAndExpenseExpenditures)
            {
                await LoadSection(await timeAndExpenseExpRepo.SearchForEntity(x => msg.LimitToSingleExpense.HasValue ?
                                                                              x.ExternalId == msg.LimitToSingleExpense.Value :
                                                                              true),
                                  (TimeAndExpenceExpenditure x) => new Expense <TimeAndExpenceExpenditure>()
                {
                    Detail              = x,
                    Amount              = x.Amount,
                    EmployeeName        = $"{employeeDetails[x.EmployeeId].Last}, {employeeDetails[x.EmployeeId].First}",
                    FullJobNameWithCode = jobs[x.JobId].FullJobCodeWithName,
                    Id = x.Id,
                    ShortExpenseName    = $"T&E - ({DateTimeWithZone.ConvertToEST(x.ExpenseOnDate.UtcDateTime).ToShortDateString()})",
                    JobId               = x.JobId,
                    LastModifiedDateEst = DateTimeWithZone.ConvertToEST(x.LastModified.UtcDateTime)
                },
                                  mapped => result.TimeAndExpenceExpenditures = mapped);
            }

            result.AvailableEmployees = employeeDetails.Select(e => new CoreEmployeeDto()
            {
                EmployeeId = e.Key,
                First      = e.Value.First,
                Last       = e.Value.Last
            }).ToList();

            var inUseJobs = result.AsFullList().Select(x => x.JobId).ToHashSet();

            result.AvailableJobs = jobs.Values.Where(x => x.JobStatusId == JobStatus.Enabled || inUseJobs.Contains(x.JobId)).ToList();

            return(Success(result));
        }