Пример #1
0
        public async System.Threading.Tasks.Task <ActionResult> List()
        {
            var isAdmin = User.IsInRole(UserRoleName.Admin);
            var jobs    = await _jobsRepository.GetAsync();

            if (!isAdmin)
            {
                jobs = jobs.Where(x => x.JobStatusId == JobStatus.Enabled).ToList();
            }
            var myJobs = await _jobsRepository.GetAsync(await sessionAdapter.EmployeeIdAsync());

            var availableClients = await clientRepository.GetAllClients();

            var availableSites = await siteRepository.GetAll();

            var allEmployees = await _employeeRepository.GetAllEmployees();

            var models = jobs.OrderBy(x => x.JobCode).Select(job =>
            {
                var details = new JobModelDetail
                {
                    Client         = _mapper.Map <ClientModel>(availableClients.SingleOrDefault(z => z.ClientId == job.ClientId)),
                    Site           = _mapper.Map <SiteModel>(availableSites.SingleOrDefault(z => z.SiteID == job.SiteId)),
                    ProjectManager = _mapper.Map <ProjectManagerModel>(allEmployees.SingleOrDefault(z => z.EmployeeId == job.ProjectManagerEmployeeId))
                };
                return(job, details);
            }).ToList();
            var vm = new JobListViewModel()
            {
                AllJobsWithAssociationStatus = models.OrderBy(x => x.job.JobCode)
                                               .ToDictionary(x => x, x => myJobs.Any(z => z.JobId == x.job.JobId)),
            };

            return(View("ListJobs", vm));
        }
        /*
         * below to BE removed!
         * private async Task<ExcelReport<JobSummaryReportCriteria>> GetJobSummaryReportCriteria(bool isCurrentUserAdmin)
         * {
         *  var vm = new JobSummaryReportCriteria();
         *  vm.PeriodSettings = GetDefaultPeriodSettings();
         *  vm.AvailableJobs = (await jobService.GetAsync()).OrderBy(x => x.FullJobCodeWithName).ToList();
         *  var rpt = new ExcelReport<JobSummaryReportCriteria>(JobSummaryReportCriteria.PROJECT_STATUS_REPORT_NAME, vm, isCurrentUserAdmin);
         *  return rpt;
         * }
         */
        private async Task <ExcelReport <QuickJobTimeReportCriteria> > GetJobDetailreportAsync()
        {
            var vm = new QuickJobTimeReportCriteria();

            vm.PeriodSettings = GetDefaultPeriodSettings();
            vm.AvailableJobs  = (await jobService.GetAsync()).OrderBy(x => x.FullJobCodeWithName).ToList();
            var rpt = new ExcelReport <QuickJobTimeReportCriteria>(QuickJobTimeReportCriteria.QUICK_JOB_TIME_REPORT_NAME, vm, true);

            return(rpt);
        }
Пример #3
0
        public async Task <ActionResult> Index(int weekid, string originUrl)
        {
            var jobs = await _jobsService.GetAsync(await _sessionAdapter.EmployeeIdAsync());

            var vm = new AddExpenseViewModel()
            {
                AvailableJobs = jobs.ToList(),
                ExpenseToSave = new ExpenseModel(),
                Week          = WeekDTO.CreateForWeekId(weekid),
                CancelUrl     = originUrl,
                WeekId        = weekid,
            };

            return(View("New", vm));
        }
Пример #4
0
        public async Task <IActionResult> Upsert(int?id)
        {
            IEnumerable <JobSearch> jsList = await _jsRepo.GetAllAsync(SD.JobSearchAPIPath);

            JobVM objVM = new JobVM()
            {
                JobSearchList = jsList.Select(i => new Microsoft.AspNetCore.Mvc.Rendering.SelectListItem {
                    Text  = i.Name,
                    Value = i.Id.ToString()
                })
            };

            if (id == null)
            {
                //true for insert or create
                return(View(objVM));
            }
            objVM.Job = await _jobsRepo.GetAsync(SD.JobsAPIPath, id.GetValueOrDefault());

            if (objVM.Job == null)
            {
                //update
                return(NotFound());
            }
            return(View(objVM));
        }
Пример #5
0
        public async Task <ActionResult> Edit(string employee)
        {
            var allJobs = jobService.GetAsync();
            var roles   = await employeeService.GetAllRoles();

            var emp = await employeeService.GetSingleEmployeeAsync(employee);

            var vm = new EditEmployeeViewModel()
            {
                SelectedRole   = emp.Role,
                AvailableRoles = roles,
                Email          = emp.UserName,
                FirstName      = emp.First,
                LastName       = emp.Last,
                IsExempt       = emp.IsExempt
            };


            return(View("Edit", vm));
        }
Пример #6
0
 public JobsController(IMapper mapper, IJobsRepository jobRepo)
 {
     _repo = new InMemRepo <Job>(() => ((Job z) => z.Id, jobRepo.GetAsync()
                                        .GetAwaiter()
                                        .GetResult()
                                        .Select(x => new Job()
     {
         Name = x.JobName,
         JobCode = x.JobCode,
         Id = x.FullJobCodeWithName.ToGuid(),
         ClientId = x.ClientId.ToString().ToGuid(),
         SiteId = x.SiteId.ToString().ToGuid(),
         LastModified = DateTimeOffset.Now,
     }).ToArray()));
 }
Пример #7
0
        public async Task <FullTimeEntryViewModel> GetFullTimeEntryViewModelAsync(WeekOfTimeEntriesRequest request)
        {
            var employeeForWeek = await employeeService.GetSingleEmployeeAsync(request.EmployeeId);

            if (!request.RequestingUserIsAdmin && employeeForWeek.UserName != request.RequestingUserName)
            {
                throw new UnauthorizedAccessException($"You are not allowed to view others time sheets");
            }

            var currentWeek = WeekDTO.CreateForWeekId(request.WeekId);

            var weekOfTimeEntries = await timeService.GetWeekAsync(request.EmployeeId, request.WeekId);

            //var timeEntries = await timeService.GetAsync(request.WeekId, request.EmployeeId);
            var allJobList = (await jobService.GetAsync()).ToList();
            var taskList   = (await taskService.GetTasks()).ToList().OrderBy(x => x.Name).ThenBy(x => x.Description);
            var entries    = new List <TimeEntryViewModel>();
            var status     = await timeApprovalService.GetAsync(request.WeekId, request.EmployeeId);

            var existingJobWithTasks = weekOfTimeEntries.AsEnumerable().GroupBy(x => new JobWithTaskDTO()
            {
                JobId = x.JobId, TaskId = x.JobTaskId
            });

            foreach (var entry in existingJobWithTasks)
            {
                var tasky = taskList.FirstOrDefault(x => x.TaskId == entry.Key.TaskId);
                var SelectedEntryTaskName = $"{tasky?.LegacyCode} - {tasky?.Name}";

                var SelectedEntryJob = allJobList.FirstOrDefault(x => x.JobId == entry.Key.JobId);
                var jobCode          = "";
                if (SelectedEntryJob != null)
                {
                    jobCode = SelectedEntryJob.JobCode;
                }
                var item = new TimeEntryViewModel()
                {
                    SelectedJobId         = entry.Key.JobId,
                    SelectedTaskId        = entry.Key.TaskId,
                    SelectedEntryTaskName = SelectedEntryTaskName,
                    SelectedEntryJobName  = SelectedEntryJob?.JobName,
                    SelectedJobCode       = jobCode,
                    SelectedTaskCategory  = tasky?.Category?.Name,
                    Monday    = MapToViewModel(currentWeek, DayOfWeek.Monday, entry),
                    Tuesday   = MapToViewModel(currentWeek, DayOfWeek.Tuesday, entry),
                    Wednesday = MapToViewModel(currentWeek, DayOfWeek.Wednesday, entry),
                    Thursday  = MapToViewModel(currentWeek, DayOfWeek.Thursday, entry),
                    Friday    = MapToViewModel(currentWeek, DayOfWeek.Friday, entry),
                    Saturday  = MapToViewModel(currentWeek, DayOfWeek.Saturday, entry),
                    Sunday    = MapToViewModel(currentWeek, DayOfWeek.Sunday, entry),
                };
                entries.Add(item);
            }

            entries = entries.OrderBy(x => x.SelectedJobCode).ThenBy(x => x.SelectedTaskId).ToList();
            var nextWeek = currentWeek.Next();
            var prevWeek = currentWeek.Previous();

            return(new FullTimeEntryViewModel()
            {
                TimeEntryRow = entries,
                EmployeeId = employeeForWeek.EmployeeId,
                EmployeeDisplayName = $"{employeeForWeek.First} {employeeForWeek.Last}",
                NewEntry = await GenerateEmptyJobTaskAsync(request.WeekId, request.EmployeeId),
                Week = new WeekIdentifier()
                {
                    WeekEnd = currentWeek.WeekEnd,
                    WeekStart = currentWeek.WeekStart,
                    WeekId = currentWeek.WeekId.Value,
                    Year = currentWeek.Year
                },
                ApprovalStatus = status.TimeApprovalStatus,

                Expenses = await _expenseService.GetExpensesForEmployee(request.EmployeeId, request.WeekId)
            });
        }
Пример #8
0
        public async Task <ActionResult <IEnumerable <CoreJobDto> > > SaveBulkJobs([FromBody] IEnumerable <JobUploadModel> jobs)
        {
            var res = new JobUploadResults()
            {
                NewClients = new Dictionary <string, int>(),
                NewSites   = new Dictionary <string, int>(),
            };

            try
            {
                var allSites = await _sitesRepository.GetAll();

                var sitesBySiteName = await BulkSaveSites(allSites, jobs, newSite => res.NewSites.TryAdd(newSite.SiteName, newSite.SiteID));

                var allClients = await _clientsRepository.GetAllClients();

                var clientsByClientName = await BulkSaveClients(allClients, jobs, newClient => res.NewClients.TryAdd(newClient.ClientName, newClient.ClientId));

                var allJobs = await _jobsRepository.GetAsync();

                var newJobs      = new List <CoreJobDto>();
                var updatedJobs  = new List <CoreJobDto>();
                var skippedEntry = new List <CoreJobDto>();
                foreach (var rec in jobs)
                {
                    var isBrandNewJob = false;
                    var temp          = rec;
                    var matchedJob    = await SaveForMatchingField(allJobs,
                                                                   matchCriteria : (existingJob, newJob) => {
                        var wtf = existingJob.JobCode.Replace("-", "").Equals(newJob.JobCode.Replace("-", ""), StringComparison.InvariantCultureIgnoreCase);
                        return(wtf);
                    },
                                                                   factory : async(newJob) =>
                    {
                        var created = await _jobsRepository.Create(new BLL.Jobs.CreateJobDto()
                        {
                            ClientId    = clientsByClientName[newJob.ClientName.Trim()],
                            JobCode     = newJob.JobCode,
                            JobName     = newJob.JobName,
                            JobStatusId = JobStatus.Enabled,
                            SiteId      = sitesBySiteName[newJob.SiteName.Trim()],
                            ProjectManagerEmployeeId = newJob.ProjectManager ?? 1
                        });
                        isBrandNewJob = true;

                        return(created);
                    },
                                                                   field : temp);

                    var nameChanged   = matchedJob.JobName != rec.JobName;
                    var clientChanged = matchedJob.ClientId != clientsByClientName[rec.ClientName.Trim()];
                    var siteChanged   = matchedJob.SiteId != sitesBySiteName[rec.SiteName.Trim()];
                    if (isBrandNewJob)
                    {
                        newJobs.Add(matchedJob);
                    }
                    else if (nameChanged || clientChanged || siteChanged)
                    {
                        matchedJob.JobName  = rec.JobName;
                        matchedJob.ClientId = clientsByClientName[rec.ClientName.Trim()];
                        matchedJob.SiteId   = sitesBySiteName[rec.SiteName.Trim()];
                        await _jobsRepository.Update(matchedJob);

                        updatedJobs.Add(matchedJob);
                    }
                    else
                    {
                        skippedEntry.Add(matchedJob);
                    }
                }

                res.UpdatedJobs = updatedJobs;
                res.CreatedJobs = newJobs;
                res.SkippedEntriesBecuaseNoChange = skippedEntry;
            }
            catch (Exception e)
            {
                return(new ObjectResult(new
                {
                    Error = new ProblemDetails()
                    {
                        Title = e.Message,
                        Detail = e.ToString(),
                        Instance = this.HttpContext.Request.GetDisplayUrl(),
                        Status = StatusCodes.Status500InternalServerError,
                        Type = "Unhandled Error"
                    },
                    Processed = res
                }));
            }


            return(Ok(res));
        }
Пример #9
0
        public async Task <ReportDTO <QuickJobTimeReportDTO> > RunAsync(QuickJobTimeReportCriteria criteria)
        {
            DateTime start = criteria.PeriodSettings.Start;
            DateTime end   = criteria.PeriodSettings.End;
            int      jobId = int.Parse(criteria.SelectedJobId);

            int?limitToEmployeeId = await _sessionAdapter.EmployeeIdAsync();

            if (criteria.ShowAllEmployeesForJob)
            {
                limitToEmployeeId = null;
            }

            using (var conn = new SqlConnection(configuration.GetConnectionString("SiteConnection")))
                using (var cmd = conn.CreateCommand())
                {
                    conn.Open();


                    cmd.CommandText = @"

Select " +

                                      $"	min(Convert(varchar(10),Isnull(te.Date,@WeekStart), 101)) as  {nameof(QuickJobTimeReportDTO.PeriodStart)}, "
                                      + $"	max(Convert(varchar(10),isnull( te.Date,@WeekEnd),101)) as {nameof(QuickJobTimeReportDTO.PeriodEnd)},    "
                                      + $"	COALESCE(e.Last,'') + ', ' + COALESCE(e.First,'')  as  {nameof(QuickJobEmployees.EmployeeName)}, "
                                      + $"	j.JobCode  as  {nameof(QuickJobTimeReportDTO.JobCode)}, "
                                      + $"	j.JobName as  {nameof(QuickJobTimeReportDTO.JobName)},"
                                      + $"	c.ClientName as  {nameof(QuickJobTimeReportDTO.ClientName)}, "
                                      + $"    s.SiteName as  {nameof(QuickJobTimeReportDTO.SiteName)}, "
                                      + $"	jt.LegacyCode + ' - ' + jt.[Name] as {nameof(QuickJobEmployees.TaskName)}, "
                                      + $"	tc.Name as {nameof(QuickJobEmployees.TaskCategory)}, "
                                      + $"	isnull(sum(te.hours),0) as {nameof(QuickJobEmployees.Regular)}, "
                                      + $"    isnull(sum(te.overtimehours),0) as {nameof(QuickJobEmployees.Overtime)}, "
                                      + $"	isnull(sum(te.hours),0) + isnull(sum(te.overtimehours),0) as  {nameof(QuickJobEmployees.Combined)}"
                                      +

                                      @"
from 
    dbo.Jobs j
    inner join dbo.Clients c
        on c.ClientId = j.ClientId
	left outer join [dbo].TimeEntries te
		on j.JobId = te.JobId
    left outer join [dbo].Employees e
		on e.EmployeeId = te.EmployeeId
    inner join dbo.[Sites] s
	    on j.SiteId = s.SiteID
	left outer join dbo.JobTasks jt
		on jt.JobTaskId = te.TaskId
    inner join dbo.TaskCategories tc
	    on tc.TaskCategoryId = jt.TaskCategoryId
where 
	(@JobId is null Or te.JobId = @JobId) and
	te.Date >= @WeekStart and te.Date <= @WeekEnd and
    ISNULL(e.[UserName],'') != '*****@*****.**' "
                                      + (limitToEmployeeId.HasValue ? $" and te.EmployeeId = { limitToEmployeeId.Value}" : string.Empty)
                                      + @"  group by tc.Name,s.SiteName, 
j.JobCode, 
COALESCE(e.Last,'') + ', ' + COALESCE(e.First,'') , 
j.JobName, c.ClientName , 
jt.LegacyCode + ' - ' + jt.[Name], 
j.JobId




Select 
    'Time And Expense Expenditures' as [name]
    ,SUM(ISNULL(e.Amount,0)) as amount
    from dbo.Jobs j
inner join dbo.TimeAndExpenceExpenditures e
on e.JobId = j.JobId
where WeekId BETWEEN @WeekIdStartInclusive AND @WeekIdEndInclusive
AND (@LimitToEmployeeId is null OR @LimitToEmployeeId = e.EmployeeId)
AND (@JobId is null Or j.JobId = @JobId)    
HAVING SUM(ISNULL(e.Amount,0)) > 0

UNION ALL

select 
    'Company Vehicle Expense' as [name]
    ,SUM(ISNULL((ve.TotalNumberOfDaysUsed * 125)
        + CASE WHEN ve.TotalMiles > 250 
            THEN (ve.TotalMiles * .50) - (250 * .50)
            ELSE 0
            END,0)) as amount
from dbo.Jobs j       
inner join dbo.CompanyVehicleExpenditures ve
on ve.JobId = j.JobId
where WeekId BETWEEN @WeekIdStartInclusive AND @WeekIdEndInclusive
AND (@LimitToEmployeeId is null OR @LimitToEmployeeId = ve.EmployeeId)
AND (@JobId is null Or j.JobId = @JobId)    
HAVING SUM(ISNULL((ve.TotalNumberOfDaysUsed * 125)
        + CASE WHEN ve.TotalMiles > 250 
            THEN (ve.TotalMiles * .50) - (250 * .50)
            ELSE 0
            END,0)) > 0

UNION ALL 

select 
    'Contractor/PO Expense' as [name]
    ,SUM(ISNULL(ce.TotalPOContractAmount,0)) as amount
from dbo.Jobs j       
inner join dbo.ContractorExpenditures ce
on j.JobId = ce.JobId
where WeekId BETWEEN @WeekIdStartInclusive AND @WeekIdEndInclusive
AND (@LimitToEmployeeId is null OR @LimitToEmployeeId = ce.EmployeeId)
AND (@JobId is null Or j.JobId = @JobId)   
HAVING SUM(ISNULL(ce.TotalPOContractAmount,0)) > 0

UNION ALL    

select 
    'Arc Flash Labels Expense' as [name]
    ,SUM(ISNULL(e.TotalLabelsCost,0) + ISNULL(e.TotalPostageCost,0)) as amount
FROM dbo.Jobs j
inner join  dbo.ArcFlashlabelExpenditures e
on j.jobId = e.jobId
where WeekId BETWEEN @WeekIdStartInclusive AND @WeekIdEndInclusive
AND (@LimitToEmployeeId is null OR @LimitToEmployeeId = e.EmployeeId)
AND (@JobId is null Or j.JobId = @JobId)   
HAVING SUM(ISNULL(e.TotalLabelsCost,0) + ISNULL(e.TotalPostageCost,0)) > 0

UNION ALL

select 
    'Miscellaneous Expense' as [name]
    ,SUM(ISNULL(e.Amount,0)) as amount
from dbo.Jobs j
inner join dbo.MiscExpenditures e
on j.JobId = e.JobId
where WeekId BETWEEN @WeekIdStartInclusive AND @WeekIdEndInclusive
AND (@LimitToEmployeeId is null OR @LimitToEmployeeId = e.EmployeeId)
AND (@JobId is null Or j.JobId = @JobId)   
HAVING SUM(ISNULL(e.Amount,0)) > 0 ";



                    cmd.Parameters.Add(new SqlParameter("JobId", jobId));
                    cmd.Parameters.Add(new SqlParameter("LimitToEmployeeId", limitToEmployeeId.HasValue ? limitToEmployeeId : DBNull.Value));
                    cmd.Parameters.Add(new SqlParameter("WeekIdStartInclusive", WeekDTO.CreateWithWeekContaining(start).WeekId.Value));
                    cmd.Parameters.Add(new SqlParameter("WeekIdEndInclusive", WeekDTO.CreateWithWeekContaining(end).WeekId.Value));
                    cmd.Parameters.Add(new SqlParameter("WeekStart", start));
                    cmd.Parameters.Add(new SqlParameter("WeekEnd", end));

                    var rdr = cmd.ExecuteReader();

                    var map = GetColumnMap(rdr.GetColumnSchema());
                    var rpt = new QuickJobTimeReportDTO()
                    {
                        PeriodEnd   = end,
                        PeriodStart = start,
                        Expenses    = new Dictionary <string, decimal>()
                    };

                    var employeeRows = new List <QuickJobEmployees>();

                    var job = (await _jobsRepository.GetAsync()).SingleOrDefault(x => x.JobId == jobId);
                    rpt.JobCode    = job.JobCode;
                    rpt.JobName    = job.JobName;
                    rpt.SiteName   = (await _sitesRepository.GetAll()).SingleOrDefault(x => x.SiteID == job.SiteId)?.SiteName;
                    rpt.ClientName = (await _clientsRepository.GetClient(job.ClientId))?.ClientName;

                    while (await rdr.ReadAsync())
                    {
                        if (rdr.HasRows)
                        {
                            employeeRows.Add(new QuickJobEmployees()
                            {
                                Combined     = rdr.GetDecimal(map[nameof(QuickJobEmployees.Combined)]),
                                Regular      = rdr.GetDecimal(map[nameof(QuickJobEmployees.Regular)]),
                                Overtime     = rdr.GetDecimal(map[nameof(QuickJobEmployees.Overtime)]),
                                EmployeeName = rdr.GetSqlString(map[nameof(QuickJobEmployees.EmployeeName)]).Value,
                                TaskCategory = rdr.GetSqlString(map[nameof(QuickJobEmployees.TaskCategory)]).Value,
                                TaskName     = rdr.GetSqlString(map[nameof(QuickJobEmployees.TaskName)]).Value,
                            });
                        }
                    }
                    rpt.Employees = employeeRows;

                    await rdr.NextResultAsync();

                    while (await rdr.ReadAsync())
                    {
                        rpt.Expenses.Add(rdr.GetString(0), rdr.GetDecimal(1));
                    }

                    return(new ReportDTO <QuickJobTimeReportDTO>()
                    {
                        Data = rpt,
                        ReportName = QuickJobTimeReport.QuickJobTimeReportCriteria.QUICK_JOB_TIME_REPORT_NAME,
                        RunSettings =
                            new Dictionary <string, string>()
                        {
                            { "Generated", $"{DateTimeWithZone.EasternStandardTime.ToShortDateString()} at {DateTimeWithZone.EasternStandardTime.ToShortTimeString()}" },
                            { "Company", $"Orion Engineering Co., Inc." },
                            { "Showing Time From", criteria.ShowAllEmployeesForJob ? "All Employees" : "Self" },
                        }
                    });
                }
        }
Пример #10
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));
        }
Пример #11
0
        protected override async Task <IProcessResult <ExpenseViewModel> > Handle(GetCreateExpenseModelMessage msg)
        {
            var emps = (await empRepo.GetAllEmployees()).Where(x => x.EmployeeId != 1).ToList();
            var jobs = await jobsRepository.GetAsync();

            var mdl = msg.TargetExpenseType switch
            {
                ExpenditureTypeEnum.ArcFlashLabelExpenditure => new ExpenseViewModel()
                {
                    AvailableEmployees            = emps,
                    AvailableJobs                 = jobs,
                    ExpenseType                   = msg.TargetExpenseType,
                    IsBrandNewExpenditureCreation = true,
                    ArcFlashLabelExpenditure      = new Expense <api.expenditures.Models.ArcFlashLabelExpenditure>()
                    {
                        Detail = new api.expenditures.Models.ArcFlashLabelExpenditure()
                        {
                            DateOfInvoice = DateTimeOffset.Now,
                        }
                    }
                },
                ExpenditureTypeEnum.MiscExpenditure => new ExpenseViewModel()
                {
                    AvailableEmployees            = emps,
                    AvailableJobs                 = jobs,
                    ExpenseType                   = msg.TargetExpenseType,
                    IsBrandNewExpenditureCreation = true,
                    MiscExpenditure               = new Expense <api.expenditures.Models.MiscExpenditure>()
                    {
                        Detail = new api.expenditures.Models.MiscExpenditure()
                        {
                            ExpensedOn = DateTimeOffset.Now,
                        }
                    }
                },
                ExpenditureTypeEnum.ContractorExpenditure => new ExpenseViewModel()
                {
                    AvailableEmployees            = emps,
                    AvailableJobs                 = jobs,
                    ExpenseType                   = msg.TargetExpenseType,
                    IsBrandNewExpenditureCreation = true,
                    ContractorExpenditure         = new Expense <api.expenditures.Models.ContractorExpenditure>()
                    {
                        Detail = new api.expenditures.Models.ContractorExpenditure()
                        {
                            ExpensedOn = DateTimeOffset.Now
                        }
                    }
                },
                ExpenditureTypeEnum.TimeAndExpenceExpenditure => new ExpenseViewModel()
                {
                    AvailableEmployees            = emps,
                    AvailableJobs                 = jobs,
                    ExpenseType                   = msg.TargetExpenseType,
                    IsBrandNewExpenditureCreation = true,
                    TimeAndExpenceExpenditure     = new Expense <api.expenditures.Models.TimeAndExpenceExpenditure>()
                    {
                        Detail = new api.expenditures.Models.TimeAndExpenceExpenditure()
                        {
                            ExpenseOnDate = DateTimeOffset.Now
                        }
                    }
                },
                ExpenditureTypeEnum.CompanyVehicleExpenditure => new ExpenseViewModel()
                {
                    AvailableEmployees            = emps,
                    AvailableJobs                 = jobs,
                    ExpenseType                   = msg.TargetExpenseType,
                    IsBrandNewExpenditureCreation = true,
                    CompanyVehicleExpenditure     = new Expense <api.expenditures.Models.CompanyVehicleExpenditure>()
                    {
                        Detail = new api.expenditures.Models.CompanyVehicleExpenditure()
                        {
                            DateVehicleFirstUsed = DateTimeOffset.Now
                        }
                    }
                },
                _ => throw new NotImplementedException()
            };

            return(Success(mdl));
        }
    }