private static void UpdateStatusComplete(DbAppContext dbContext, HetDistrictStatus status, int localAreaCompleteCount, int equipmentCompleteCount) { try { // determine the current fiscal year DateTime fiscalStart; if (DateTime.UtcNow.Month == 1 || DateTime.UtcNow.Month == 2 || DateTime.UtcNow.Month == 3) { fiscalStart = new DateTime(DateTime.UtcNow.AddYears(-1).Year, 4, 1); } else { fiscalStart = new DateTime(DateTime.UtcNow.Year, 4, 1); } status.LocalAreaCompleteCount = localAreaCompleteCount; status.DistrictEquipmentTypeCompleteCount = equipmentCompleteCount; status.ProgressPercentage = 100; status.RolloverEndDate = DateTime.UtcNow; status.CurrentFiscalYear = fiscalStart.Year; status.NextFiscalYear = fiscalStart.Year + 1; status.DisplayRolloverMessage = true; dbContext.HetDistrictStatus.Update(status); dbContext.SaveChanges(); } catch (Exception e) { Console.WriteLine(e); throw; } }
public virtual IActionResult DistrictFiscalYearsGet([FromRoute] int id) { bool exists = _context.HetDistrict.Any(a => a.DistrictId == id); // not found if (!exists) { return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration)))); } HetDistrictStatus status = _context.HetDistrictStatus .AsNoTracking() .FirstOrDefault(x => x.DistrictId == id); if (status == null) { return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration)))); } List <string> fiscalYears = new List <string>(); string current = $"{status.CurrentFiscalYear.ToString()}/{(status.CurrentFiscalYear + 1).ToString()}"; string next = $"{status.NextFiscalYear.ToString()}/{(status.NextFiscalYear + 1).ToString()}"; fiscalYears.Add(current); fiscalYears.Add(next); return(new ObjectResult(new HetsResponse(fiscalYears))); }
public virtual IActionResult DismissRolloverMessagePost([FromRoute] int id) { bool exists = _context.HetDistrictStatus.Any(a => a.DistrictId == id); // not found - return new status record if (!exists) { return(new ObjectResult(new HetsResponse(AnnualRolloverHelper.GetRecord(id, _context)))); } // get record and update HetDistrictStatus status = _context.HetDistrictStatus .First(a => a.DistrictId == id); // ensure the process is complete if (status.DisplayRolloverMessage != null && status.DisplayRolloverMessage == true && status.ProgressPercentage != null && status.ProgressPercentage == 100) { status.ProgressPercentage = null; status.DisplayRolloverMessage = false; _context.SaveChanges(); } // get status of current district return(new ObjectResult(new HetsResponse(AnnualRolloverHelper.GetRecord(id, _context)))); }
/// <summary> /// Get an Equipment record /// </summary> /// <param name="id"></param> /// <param name="context"></param> /// <param name="configuration"></param> /// <returns></returns> public static HetEquipment GetRecord(int id, DbAppContext context, IConfiguration configuration) { // retrieve updated equipment record to return to ui HetEquipment equipment = context.HetEquipment.AsNoTracking() .Include(x => x.EquipmentStatusType) .Include(x => x.LocalArea) .ThenInclude(y => y.ServiceArea) .ThenInclude(z => z.District) .ThenInclude(a => a.Region) .Include(x => x.DistrictEquipmentType) .ThenInclude(d => d.EquipmentType) .Include(x => x.Owner) .ThenInclude(x => x.OwnerStatusType) .Include(x => x.HetEquipmentAttachment) .Include(x => x.HetNote) .Include(x => x.HetDigitalFile) .Include(x => x.HetHistory) .FirstOrDefault(a => a.EquipmentId == id); if (equipment != null) { equipment.IsHired = IsHired(id, context); equipment.NumberOfBlocks = GetNumberOfBlocks(equipment, configuration); equipment.HoursYtd = GetYtdServiceHours(id, context); equipment.Status = equipment.EquipmentStatusType.EquipmentStatusTypeCode; if (equipment.Seniority != null && equipment.BlockNumber != null) { equipment.SeniorityString = FormatSeniorityString((float)equipment.Seniority, (int)equipment.BlockNumber, equipment.NumberOfBlocks); } if (equipment.Owner != null) { // populate the "Status" description equipment.Owner.Status = equipment.Owner.OwnerStatusType.OwnerStatusTypeCode; } // set fiscal year headers if (equipment.LocalArea?.ServiceArea?.District != null) { int districtId = equipment.LocalArea.ServiceArea.District.DistrictId; HetDistrictStatus district = context.HetDistrictStatus.AsNoTracking() .FirstOrDefault(x => x.DistrictId == districtId); if (district?.NextFiscalYear != null) { int fiscalYear = (int)district.NextFiscalYear; // status table uses the start of the tear equipment.YearMinus1 = string.Format("{0}/{1}", fiscalYear - 2, fiscalYear - 1); equipment.YearMinus2 = string.Format("{0}/{1}", fiscalYear - 3, fiscalYear - 2); equipment.YearMinus3 = string.Format("{0}/{1}", fiscalYear - 4, fiscalYear - 3); } } } return(equipment); }
/// <summary> /// Get rental agreement /// </summary> /// <param name="equipment"></param> /// <param name="context"></param> /// <returns></returns> public static string GetRentalAgreementNumber(HetEquipment equipment, DbAppContext context) { string result = ""; // validate item. if (equipment?.LocalArea != null) { int localAreaId = equipment.LocalArea.LocalAreaId; // get the district HetLocalArea localArea = context.HetLocalArea.AsNoTracking() .Include(x => x.ServiceArea) .ThenInclude(y => y.District) .First(x => x.LocalAreaId == localAreaId); int?districtId = localArea.ServiceArea.DistrictId; int ministryDistrictId = localArea.ServiceArea.District.MinistryDistrictId; if (districtId == null) { return(result); } // get fiscal year HetDistrictStatus status = context.HetDistrictStatus.AsNoTracking() .First(x => x.DistrictId == districtId); int?fiscalYear = status.CurrentFiscalYear; if (fiscalYear == null) { return(result); } // fiscal year in the status table stores the "start" of the year DateTime fiscalYearStart = new DateTime((int)fiscalYear, 4, 1); fiscalYear = fiscalYear + 1; // count the number of rental agreements in the system in this district int currentCount = context.HetRentalAgreement .Count(x => x.DistrictId == districtId && x.AppCreateTimestamp >= fiscalYearStart); currentCount++; // format of the Rental Agreement number is: // * FY-DD-#### // FY = last 2 digits of the year // DD - District(2 digits - 1 to 11) result = fiscalYear.ToString().Substring(2, 2) + "-" + ministryDistrictId + "-" + currentCount.ToString("D4"); } return(result); }
private static void UpdateStatus(DbAppContext dbContext, HetDistrictStatus status, int localAreaCompleteCount, int equipmentCompleteCount) { try { int localAreaCount = status.LocalAreaCount ?? 0; int equipmentCount = status.DistrictEquipmentTypeCount ?? 0; int percentComplete; if (localAreaCount == 0 && equipmentCount == 0) { percentComplete = 100; } else { // (current / maximum) * 100 -> just using the local area decimal temp = Convert.ToDecimal(localAreaCompleteCount) / Convert.ToDecimal(localAreaCount); temp = temp * 100; percentComplete = Convert.ToInt32(temp); if (percentComplete < 1) { percentComplete = 1; } if (percentComplete > 99) { percentComplete = 100; } } status.LocalAreaCompleteCount = localAreaCompleteCount; status.DistrictEquipmentTypeCompleteCount = equipmentCompleteCount; status.ProgressPercentage = percentComplete; status.DisplayRolloverMessage = true; dbContext.HetDistrictStatus.Update(status); dbContext.SaveChanges(); } catch (Exception e) { Console.WriteLine(e); throw; } }
/// <summary> /// Get a District Status record /// </summary> /// <param name="id"></param> /// <param name="context"></param> /// <returns></returns> public static HetDistrictStatus GetRecord(int id, DbAppContext context) { HetDistrictStatus status = context.HetDistrictStatus.AsNoTracking() .Include(a => a.District) .FirstOrDefault(a => a.DistrictId == id); // if there isn't a status - we'll add one now if (status == null) { // ******************************************************************************* // determine current fiscal year - check for existing rotation lists this year // ******************************************************************************* DateTime fiscalStart; if (DateTime.UtcNow.Month == 1 || DateTime.UtcNow.Month == 2 || DateTime.UtcNow.Month == 3) { fiscalStart = new DateTime(DateTime.UtcNow.AddYears(-1).Year, 4, 1); } else { fiscalStart = new DateTime(DateTime.UtcNow.Year, 4, 1); } status = new HetDistrictStatus { DistrictId = id, CurrentFiscalYear = fiscalStart.Year, NextFiscalYear = fiscalStart.Year + 1, DisplayRolloverMessage = false }; context.HetDistrictStatus.Add(status); context.SaveChanges(); // get updated record status = context.HetDistrictStatus.AsNoTracking() .Include(a => a.District) .First(a => a.DistrictId == id); } return(status); }
private static void UpdateStatusKickoff(DbAppContext dbContext, HetDistrictStatus status, int localAreaCompleteCount, int equipmentCompleteCount) { try { status.LocalAreaCompleteCount = localAreaCompleteCount; status.DistrictEquipmentTypeCompleteCount = equipmentCompleteCount; status.ProgressPercentage = 1; status.RolloverStartDate = DateTime.UtcNow; status.DisplayRolloverMessage = true; dbContext.HetDistrictStatus.Update(status); dbContext.SaveChanges(); } catch (Exception e) { Console.WriteLine(e); throw; } }
/// <summary> /// Get the YTD service hours for a piece of equipment /// </summary> /// <param name="id"></param> /// <param name="context"></param> /// <param name="rolloverDate"></param> public static float GetYtdServiceHours(int id, DbAppContext context, DateTime?rolloverDate = null) { float result = 0.0F; // ******************************************************************************* // determine current fiscal year - check for existing rotation lists this year // * the rollover uses the dates from the status table (rolloverDate) // ******************************************************************************* HetEquipment equipment = context.HetEquipment.AsNoTracking() .Include(x => x.LocalArea.ServiceArea.District) .First(x => x.EquipmentId == id); HetDistrictStatus district = context.HetDistrictStatus.AsNoTracking() .First(x => x.DistrictId == equipment.LocalArea.ServiceArea.DistrictId); if (district?.NextFiscalYear == null) { throw new ArgumentException("Error retrieving district status record"); } int fiscalYear = (int)district.NextFiscalYear; // status table uses the start of the year DateTime fiscalEnd = new DateTime(fiscalYear, 3, 31); DateTime fiscalStart = new DateTime(fiscalYear - 1, 4, 1); // ******************************************************************************* // get all the time data for the current fiscal year // ******************************************************************************* float?summation = context.HetTimeRecord.AsNoTracking() .Include(x => x.RentalAgreement.Equipment) .Where(x => x.RentalAgreement.EquipmentId == id && x.WorkedDate >= fiscalStart && x.WorkedDate <= fiscalEnd) .Sum(x => x.Hours); if (summation != null) { result = (float)summation; } return(result); }
public static TimeRecordLite GetTimeRecords(int id, int?districtId, DbAppContext context, IConfiguration configuration) { // get fiscal year HetDistrictStatus status = context.HetDistrictStatus.AsNoTracking() .First(x => x.DistrictId == districtId); int?fiscalYear = status.CurrentFiscalYear; // get agreement and time records HetRentalAgreement agreement = context.HetRentalAgreement.AsNoTracking() .Include(x => x.Equipment) .ThenInclude(y => y.DistrictEquipmentType) .ThenInclude(z => z.EquipmentType) .Include(x => x.Project) .Include(x => x.HetTimeRecord) .First(x => x.RentalAgreementId == id); // get the max hours for this equipment type float? hoursYtd = 0.0F; int maxHours = 0; string equipmentCode = ""; if (agreement.Equipment?.EquipmentId != null && agreement.Equipment.DistrictEquipmentType?.EquipmentType != null) { maxHours = Convert.ToInt32(agreement.Equipment.DistrictEquipmentType.EquipmentType.IsDumpTruck ? configuration.GetSection("MaximumHours:DumpTruck").Value : configuration.GetSection("MaximumHours:Default").Value); int equipmentId = agreement.Equipment.EquipmentId; hoursYtd = EquipmentHelper.GetYtdServiceHours(equipmentId, context); equipmentCode = agreement.Equipment.EquipmentCode; } // get the project info string projectName = ""; string projectNumber = ""; if (agreement.Project != null) { projectName = agreement.Project.Name; projectNumber = agreement.Project.ProvincialProjectNumber; } // fiscal year in the status table stores the "start" of the year TimeRecordLite timeRecord = new TimeRecordLite(); if (fiscalYear != null) { DateTime fiscalYearStart = new DateTime((int)fiscalYear, 4, 1); timeRecord.TimeRecords = new List <HetTimeRecord>(); timeRecord.TimeRecords.AddRange(agreement.HetTimeRecord.Where(x => x.WorkedDate >= fiscalYearStart)); } timeRecord.EquipmentCode = equipmentCode; timeRecord.ProjectName = projectName; timeRecord.ProvincialProjectNumber = projectNumber; timeRecord.HoursYtd = hoursYtd; timeRecord.MaximumHours = maxHours; return(timeRecord); }
public virtual IActionResult AnnualRolloverGet([FromRoute] int id) { bool exists = _context.HetDistrict.Any(a => a.DistrictId == id); // not found if (!exists) { return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration)))); } // determine the current fiscal year DateTime fiscalStart; if (DateTime.UtcNow.Month == 1 || DateTime.UtcNow.Month == 2 || DateTime.UtcNow.Month == 3) { fiscalStart = new DateTime(DateTime.UtcNow.AddYears(-1).Year, 4, 1); } else { fiscalStart = new DateTime(DateTime.UtcNow.Year, 4, 1); } // get record and ensure it isn't already processing HetDistrictStatus status = AnnualRolloverHelper.GetRecord(id, _context); if (status == null) { return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration)))); } if (status.CurrentFiscalYear == fiscalStart.Year) { // return - cannot rollover again return(new ObjectResult(status)); } if (status.DisplayRolloverMessage == true || (status.ProgressPercentage != null && status.ProgressPercentage > 0)) { // return already active return(new ObjectResult(status)); } // serialize scoring rules from config into json string IConfigurationSection scoringRules = _configuration.GetSection("SeniorityScoringRules"); string seniorityScoringRules = GetConfigJson(scoringRules); // get connection string string connectionString = GetConnectionString(); // queue the job BackgroundJob.Enqueue(() => AnnualRolloverHelper.AnnualRolloverJob(null, id, seniorityScoringRules, connectionString)); // get counts for this district int localAreaCount = _context.HetLocalArea .Count(a => a.ServiceArea.DistrictId == id); int equipmentCount = _context.HetDistrictEquipmentType .Count(a => a.DistrictId == id); // update status - job is kicked off status.LocalAreaCount = localAreaCount; status.DistrictEquipmentTypeCount = equipmentCount; status.ProgressPercentage = 1; status.DisplayRolloverMessage = true; _context.HetDistrictStatus.Update(status); _context.SaveChanges(); return(new ObjectResult(status)); }
/// <summary> /// Create the district status records /// </summary> /// <param name="performContext"></param> /// <param name="dbContext"></param> /// <param name="systemId"></param> public static void ResetDistrictStatus(PerformContext performContext, DbAppContext dbContext, string systemId) { try { performContext.WriteLine("*** Creating HET_DISTRICT_STATUS records after import ***"); Debug.WriteLine("Creating HET_DISTRICT_STATUS records after import"); // determine the current fiscal year DateTime fiscalStart; if (DateTime.UtcNow.Month == 1 || DateTime.UtcNow.Month == 2 || DateTime.UtcNow.Month == 3) { fiscalStart = new DateTime(DateTime.UtcNow.AddYears(-1).Year, 4, 1); } else { fiscalStart = new DateTime(DateTime.UtcNow.Year, 4, 1); } if (dbContext.HetDistrict.Any()) { List <HetDistrict> districts = dbContext.HetDistrict.AsNoTracking().ToList(); foreach (HetDistrict district in districts) { int id = district.DistrictId; // check if the record already exists bool exists = dbContext.HetDistrictStatus.Any(x => x.DistrictId == id); if (exists) { continue; } // add new status record HetDistrictStatus status = new HetDistrictStatus { DistrictId = id, CurrentFiscalYear = fiscalStart.Year, NextFiscalYear = fiscalStart.Year + 1, DisplayRolloverMessage = false, AppCreateUserid = systemId, AppCreateTimestamp = DateTime.UtcNow, AppLastUpdateUserid = systemId, AppLastUpdateTimestamp = DateTime.UtcNow }; dbContext.HetDistrictStatus.Add(status); dbContext.SaveChanges(); } } performContext.WriteLine("*** Done creating HET_DISTRICT_STATUS records after import ***"); Debug.WriteLine("Creating HET_DISTRICT_STATUS records after import - Done!"); } catch (Exception e) { performContext.WriteLine("*** ERROR ***"); performContext.WriteLine(e.ToString()); throw; } }
/// <summary> /// Get a Project record /// </summary> /// <param name="id"></param> /// <param name="context"></param> /// <param name="districtId"></param> /// <returns></returns> public static HetProject GetRecord(int id, DbAppContext context, int?districtId = 0) { HetProject project = context.HetProject.AsNoTracking() .Include(x => x.ProjectStatusType) .Include(x => x.District) .ThenInclude(x => x.Region) .Include(x => x.HetContact) .Include(x => x.PrimaryContact) .Include(x => x.HetRentalRequest) .ThenInclude(y => y.DistrictEquipmentType) .Include(x => x.HetRentalRequest) .ThenInclude(y => y.RentalRequestStatusType) .Include(x => x.HetRentalRequest) .ThenInclude(y => y.HetRentalRequestRotationList) .Include(x => x.HetRentalRequest) .ThenInclude(y => y.LocalArea) .Include(x => x.HetRentalAgreement) .ThenInclude(y => y.Equipment) .ThenInclude(z => z.DistrictEquipmentType) .Include(x => x.HetRentalAgreement) .ThenInclude(y => y.RentalAgreementStatusType) .Include(x => x.HetRentalAgreement) .ThenInclude(y => y.Equipment) .ThenInclude(z => z.LocalArea) .FirstOrDefault(a => a.ProjectId == id); if (project != null) { project.Status = project.ProjectStatusType.ProjectStatusTypeCode; // calculate the number of hired (yes or forced hire) equipment // count active requests (In Progress) int countActiveRequests = 0; foreach (HetRentalRequest rentalRequest in project.HetRentalRequest) { rentalRequest.Status = rentalRequest.RentalRequestStatusType.RentalRequestStatusTypeCode; int temp = 0; foreach (HetRentalRequestRotationList equipment in rentalRequest.HetRentalRequestRotationList) { if (equipment.OfferResponse != null && equipment.OfferResponse.ToLower().Equals("yes")) { temp++; } if (equipment.IsForceHire != null && equipment.IsForceHire == true) { temp++; } } rentalRequest.YesCount = temp; rentalRequest.HetRentalRequestRotationList = null; if (rentalRequest.RentalRequestStatusType.RentalRequestStatusTypeCode == null || rentalRequest.RentalRequestStatusType.RentalRequestStatusTypeCode .Equals(HetRentalRequest.StatusInProgress)) { countActiveRequests++; } } // count active agreements (Active) int countActiveAgreements = 0; foreach (HetRentalAgreement rentalAgreement in project.HetRentalAgreement) { rentalAgreement.Status = rentalAgreement.RentalAgreementStatusType.RentalAgreementStatusTypeCode; if (rentalAgreement.RentalAgreementStatusType.RentalAgreementStatusTypeCode == null || rentalAgreement.RentalAgreementStatusType.RentalAgreementStatusTypeCode .Equals(HetRentalAgreement.StatusActive)) { countActiveAgreements++; } // workaround for converted records from Bc Bid if (rentalAgreement.Number.StartsWith("BCBid")) { rentalAgreement.RentalRequestId = -1; rentalAgreement.RentalRequestRotationListId = -1; } if (rentalAgreement.Equipment.LocalArea != null) { rentalAgreement.LocalAreaName = rentalAgreement.Equipment.LocalArea.Name; } } foreach (HetRentalRequest rentalRequest in project.HetRentalRequest) { if (rentalRequest.LocalArea != null) { rentalRequest.LocalAreaName = rentalRequest.LocalArea.Name; } } //To make rental agreement lightweight foreach (HetRentalAgreement rentalAgreement in project.HetRentalAgreement) { rentalAgreement.Equipment.LocalArea = null; } //To make rental request lightweight foreach (HetRentalRequest rentalRequest in project.HetRentalRequest) { rentalRequest.LocalArea = null; } // Only allow editing the "Status" field under the following conditions: // * If Project.status is currently "Active" AND // (All child RentalRequests.Status != "In Progress" AND All child RentalAgreement.status != "Active")) // * If Project.status is currently != "Active" if (project.ProjectStatusType.ProjectStatusTypeCode.Equals(HetProject.StatusActive) && (countActiveRequests > 0 || countActiveAgreements > 0)) { project.CanEditStatus = false; } else { project.CanEditStatus = true; } } // get fiscal year if (districtId > 0) { HetDistrictStatus status = context.HetDistrictStatus.AsNoTracking() .First(x => x.DistrictId == districtId); int?fiscalYear = status.CurrentFiscalYear; // fiscal year in the status table stores the "start" of the year if (fiscalYear != null && project != null) { DateTime fiscalYearStart = new DateTime((int)fiscalYear, 4, 1); project.FiscalYearStartDate = fiscalYearStart; } } return(project); }
public virtual IActionResult TimeRecordSearchGet([FromQuery] string localAreas, [FromQuery] string projects, [FromQuery] string owners, [FromQuery] string equipment) { int?[] localAreasArray = ArrayHelper.ParseIntArray(localAreas); int?[] projectArray = ArrayHelper.ParseIntArray(projects); int?[] ownerArray = ArrayHelper.ParseIntArray(owners); int?[] equipmentArray = ArrayHelper.ParseIntArray(equipment); // get initial results - must be limited to user's district int?districtId = UserAccountHelper.GetUsersDistrictId(_context, _httpContext); // get fiscal year HetDistrictStatus district = _context.HetDistrictStatus.AsNoTracking() .FirstOrDefault(x => x.DistrictId == districtId); if (district?.CurrentFiscalYear == null) { return(new BadRequestObjectResult(new HetsResponse("HETS-30", ErrorViewModel.GetDescription("HETS-30", _configuration)))); } int fiscalYear = (int)district.CurrentFiscalYear; // status table uses the start of the year DateTime fiscalStart = new DateTime(fiscalYear, 3, 31); // look for all records AFTER the 31st // only return active equipment / projects and agreements IQueryable <HetTimeRecord> data = _context.HetTimeRecord.AsNoTracking() .Include(x => x.RentalAgreement) .ThenInclude(x => x.Project) .Include(x => x.RentalAgreement) .ThenInclude(x => x.Equipment) .ThenInclude(y => y.EquipmentStatusType) .Include(x => x.RentalAgreement) .ThenInclude(x => x.Equipment) .ThenInclude(z => z.LocalArea) .ThenInclude(a => a.ServiceArea) .Include(x => x.RentalAgreement) .ThenInclude(x => x.Equipment) .ThenInclude(z => z.Owner) .Where(x => x.RentalAgreement.Equipment.LocalArea.ServiceArea.DistrictId.Equals(districtId) && x.WorkedDate > fiscalStart); if (localAreasArray != null && localAreasArray.Length > 0) { data = data.Where(x => localAreasArray.Contains(x.RentalAgreement.Equipment.LocalArea.LocalAreaId)); } if (projectArray != null && projectArray.Length > 0) { data = data.Where(x => projectArray.Contains(x.RentalAgreement.ProjectId)); } if (ownerArray != null && ownerArray.Length > 0) { data = data.Where(x => ownerArray.Contains(x.RentalAgreement.Equipment.OwnerId)); } if (equipmentArray != null && equipmentArray.Length > 0) { data = data.Where(x => equipmentArray.Contains(x.RentalAgreement.EquipmentId)); } // convert Time Model to the "TimeLite" Model List <TimeRecordSearchLite> result = new List <TimeRecordSearchLite>(); foreach (HetTimeRecord item in data) { result.Add(TimeRecordHelper.ToLiteModel(item)); } // return to the client return(new ObjectResult(new HetsResponse(result))); }
public virtual IActionResult RentalRequestsHiresGet([FromQuery] string localAreas, [FromQuery] string projects, [FromQuery] string owners, [FromQuery] string equipment) { int?[] localAreasArray = ArrayHelper.ParseIntArray(localAreas); int?[] projectArray = ArrayHelper.ParseIntArray(projects); int?[] ownerArray = ArrayHelper.ParseIntArray(owners); int?[] equipmentArray = ArrayHelper.ParseIntArray(equipment); // get initial results - must be limited to user's district int?districtId = UserAccountHelper.GetUsersDistrictId(_context, _httpContext); // get fiscal year HetDistrictStatus district = _context.HetDistrictStatus.AsNoTracking() .FirstOrDefault(x => x.DistrictId == districtId); if (district?.CurrentFiscalYear == null) { return(new BadRequestObjectResult(new HetsResponse("HETS-30", ErrorViewModel.GetDescription("HETS-30", _configuration)))); } int fiscalYear = (int)district.CurrentFiscalYear; // status table uses the start of the year DateTime fiscalStart = new DateTime(fiscalYear, 3, 31); // look for all records AFTER the 31st IQueryable <HetRentalRequestRotationList> data = _context.HetRentalRequestRotationList.AsNoTracking() .Include(x => x.RentalRequest) .ThenInclude(y => y.LocalArea) .ThenInclude(z => z.ServiceArea) .Include(x => x.RentalRequest) .ThenInclude(y => y.Project) .Include(x => x.Equipment) .ThenInclude(y => y.Owner) .Where(x => x.RentalRequest.LocalArea.ServiceArea.DistrictId.Equals(districtId) && x.AskedDateTime > fiscalStart && (x.IsForceHire == true || x.OfferResponse.ToLower() == "no")); if (localAreasArray != null && localAreasArray.Length > 0) { data = data.Where(x => localAreasArray.Contains(x.RentalRequest.LocalAreaId)); } if (projectArray != null && projectArray.Length > 0) { data = data.Where(x => projectArray.Contains(x.RentalRequest.ProjectId)); } if (ownerArray != null && ownerArray.Length > 0) { data = data.Where(x => ownerArray.Contains(x.Equipment.OwnerId)); } if (equipmentArray != null && equipmentArray.Length > 0) { data = data.Where(x => equipmentArray.Contains(x.EquipmentId)); } // convert Rental Request Model to the "RentalRequestHires" Model List <RentalRequestHires> result = new List <RentalRequestHires>(); foreach (HetRentalRequestRotationList item in data) { HetUser user = _context.HetUser.AsNoTracking() .FirstOrDefault(x => x.SmUserId == item.AppCreateUserid); result.Add(RentalRequestHelper.ToHiresModel(item, user)); } // return to the client return(new ObjectResult(new HetsResponse(result))); }
/// <summary> /// Annual Rollover /// </summary> /// <param name="context"></param> /// <param name="districtId"></param> /// <param name="seniorityScoringRules"></param> /// <param name="connectionString"></param> public static void AnnualRolloverJob(PerformContext context, int districtId, string seniorityScoringRules, string connectionString) { try { // open a connection to the database DbAppContext dbContext = new DbAppContext(connectionString); // get processing rules SeniorityScoringRules scoringRules = new SeniorityScoringRules(seniorityScoringRules); // update progress bar IProgressBar progress = context.WriteProgressBar(); context.WriteLine("Starting Annual Rollover Job - District #" + districtId); progress.SetValue(0); // validate district id HetDistrict district = dbContext.HetDistrict.AsNoTracking() .FirstOrDefault(x => x.DistrictId == districtId); if (district == null) { context.WriteLine("District not found"); progress.SetValue(100); return; } // get status record - and ensure we're active HetDistrictStatus status = GetRecord(districtId, dbContext); if (status == null) { context.WriteLine("District Status not found"); progress.SetValue(100); return; } // get equipment status int?statusId = StatusHelper.GetStatusId(HetEquipment.StatusApproved, "equipmentStatus", dbContext); if (statusId == null) { context.WriteLine("Equipment Status not found"); progress.SetValue(100); return; } // determine the "Rollover Date" (required for testing) DateTime rolloverDate; if (DateTime.UtcNow.Month == 1 || DateTime.UtcNow.Month == 2 || DateTime.UtcNow.Month == 3) { if (status.NextFiscalYear == null) { status.NextFiscalYear = DateTime.UtcNow.Year; } rolloverDate = new DateTime((int)status.NextFiscalYear, DateTime.UtcNow.Month, DateTime.UtcNow.Day); } else { if (status.CurrentFiscalYear == null) { status.CurrentFiscalYear = DateTime.UtcNow.Year; } rolloverDate = new DateTime((int)status.CurrentFiscalYear, DateTime.UtcNow.Month, DateTime.UtcNow.Day); } // get all district equipment types List <HetDistrictEquipmentType> equipmentTypes = dbContext.HetDistrictEquipmentType.AsNoTracking() .Include(x => x.EquipmentType) .Where(x => x.DistrictId == districtId).ToList(); // get all local areas List <HetLocalArea> localAreas = dbContext.HetLocalArea.AsNoTracking() .Where(a => a.ServiceArea.DistrictId == districtId).ToList(); // update status - job is kicked off int localAreaCompleteCount = 0; int equipmentCompleteCount = 0; UpdateStatusKickoff(dbContext, status, localAreaCompleteCount, equipmentCompleteCount); // process all local areas and equipment types foreach (HetLocalArea localArea in localAreas.WithProgress(progress)) { // re-open the connection dbContext = new DbAppContext(connectionString); if (localArea.Name != null) { context.WriteLine("Local Area: " + localArea.Name); } else { context.WriteLine("Local Area ID: " + localArea.LocalAreaId); } // reset equipment counter equipmentCompleteCount = 0; foreach (HetDistrictEquipmentType equipmentType in equipmentTypes) { // it this a dump truck? bool isDumpTruck = equipmentType.EquipmentType.IsDumpTruck; // get rules for scoring and seniority block int seniorityScoring = isDumpTruck ? scoringRules.GetEquipmentScore("DumpTruck") : scoringRules.GetEquipmentScore(); int blockSize = isDumpTruck ? scoringRules.GetBlockSize("DumpTruck") : scoringRules.GetBlockSize(); int totalBlocks = isDumpTruck ? scoringRules.GetTotalBlocks("DumpTruck") : scoringRules.GetTotalBlocks(); using (DbAppContext etContext = new DbAppContext(connectionString)) { List <HetEquipment> data = etContext.HetEquipment .Include(x => x.LocalArea) .Include(x => x.DistrictEquipmentType.EquipmentType) .Where(x => x.EquipmentStatusTypeId == statusId && x.LocalAreaId == localArea.LocalAreaId && x.DistrictEquipmentTypeId == equipmentType.DistrictEquipmentTypeId) .ToList(); foreach (HetEquipment equipment in data) { // rollover the year equipment.ServiceHoursThreeYearsAgo = equipment.ServiceHoursTwoYearsAgo; equipment.ServiceHoursTwoYearsAgo = equipment.ServiceHoursLastYear; equipment.ServiceHoursLastYear = EquipmentHelper.GetYtdServiceHours(equipment.EquipmentId, dbContext, rolloverDate); equipment.CalculateYearsOfService(DateTime.UtcNow); // blank out the override reason equipment.SeniorityOverrideReason = ""; // update the seniority score equipment.CalculateSeniority(seniorityScoring); etContext.HetEquipment.Update(equipment); etContext.SaveChanges(); } } // now update the rotation list using (DbAppContext abContext = new DbAppContext(connectionString)) { int localAreaId = localArea.LocalAreaId; int equipmentTypeId = equipmentType.DistrictEquipmentTypeId; SeniorityListHelper.AssignBlocks(localAreaId, equipmentTypeId, blockSize, totalBlocks, abContext); } // increment counters and update status equipmentCompleteCount++; UpdateStatus(dbContext, status, localAreaCompleteCount, equipmentCompleteCount); } // increment counters and update status localAreaCompleteCount++; UpdateStatus(dbContext, status, localAreaCompleteCount, equipmentCompleteCount); if (status.ProgressPercentage != null) { progress.SetValue((int)status.ProgressPercentage); } } // done! UpdateStatusComplete(dbContext, status, localAreaCompleteCount, equipmentCompleteCount); progress.SetValue(100); // ********************************************************** // regenerate Owner Secret Keys for this district // ********************************************************** dbContext = new DbAppContext(connectionString); context.WriteLine(""); context.WriteLine("Generate New Secret Keys - District #" + districtId); progress = context.WriteProgressBar(); progress.SetValue(0); // get records List <HetOwner> owners = dbContext.HetOwner.AsNoTracking() .Where(x => x.BusinessId == null && x.LocalArea.ServiceArea.DistrictId == districtId) .ToList(); int i = 0; int ownerCount = owners.Count; foreach (HetOwner owner in owners) { i++; string key = SecretKeyHelper.RandomString(8, owner.OwnerId); string temp = owner.OwnerCode; if (string.IsNullOrEmpty(temp)) { temp = SecretKeyHelper.RandomString(4, owner.OwnerId); } key = temp + "-" + (rolloverDate.Year + 1) + "-" + key; // get owner and update HetOwner ownerRecord = dbContext.HetOwner.First(x => x.OwnerId == owner.OwnerId); ownerRecord.SharedKey = key; dbContext.HetOwner.Update(ownerRecord); decimal tempProgress = Convert.ToDecimal(i) / Convert.ToDecimal(ownerCount); tempProgress = tempProgress * 100; int percentComplete = Convert.ToInt32(tempProgress); if (percentComplete < 1) { percentComplete = 1; } if (percentComplete > 99) { percentComplete = 100; } progress.SetValue(percentComplete); } // save remaining updates - done! dbContext.SaveChangesForImport(); progress.SetValue(100); context.WriteLine("Generate New Secret Keys - Done"); } catch (Exception e) { Console.WriteLine(e); throw; } }