/// <summary> /// Update blocks for the seniority list of a given piece of equipment /// </summary> /// <param name="context"></param> /// <param name="equipment"></param> /// <param name="configuration"></param> public static void UpdateBlocksFromEquipment(this DbAppContext context, Equipment equipment, IConfiguration configuration) { if (equipment != null && equipment.LocalArea != null && equipment.DistrictEquipmentType != null && equipment.DistrictEquipmentType.EquipmentType != null) { int localAreaId = equipment.LocalArea.Id; int equipmentTypeId = equipment.DistrictEquipmentType.EquipmentType.Id; bool isDumpTruck = equipment.DistrictEquipmentType.EquipmentType.IsDumpTruck; // get processing rules SeniorityScoringRules scoringRules = new SeniorityScoringRules(configuration); // get rules int blockSize = isDumpTruck ? scoringRules.GetBlockSize("DumpTruck") : scoringRules.GetBlockSize(); int totalBlocks = isDumpTruck ? scoringRules.GetTotalBlocks("DumpTruck") : scoringRules.GetTotalBlocks(); // update blocks AssignBlocks(context, localAreaId, equipmentTypeId, blockSize, totalBlocks); } }
/// <summary> /// Hangfire job to do the Annual Rollover tasks /// </summary> /// <param name="context"></param> /// <param name="connectionstring"></param> /// <param name="configuration"></param> public static void AnnualRolloverJob(PerformContext context, string connectionstring, IConfiguration configuration) { try { // open a connection to the database DbContextOptionsBuilder <DbAppContext> options = new DbContextOptionsBuilder <DbAppContext>(); options.UseNpgsql(connectionstring); DbAppContext dbContext = new DbAppContext(null, options.Options); // get processing rules SeniorityScoringRules scoringRules = new SeniorityScoringRules(configuration); // update progress bar IProgressBar progress = context.WriteProgressBar(); context.WriteLine("Starting Annual Rollover Job"); progress.SetValue(0); // get all equipment types List <EquipmentType> equipmentTypes = dbContext.EquipmentTypes.ToList(); // The annual rollover will process all local areas in turn List <LocalArea> localAreas = dbContext.LocalAreas.ToList(); foreach (LocalArea localArea in localAreas.WithProgress(progress)) { if (localArea.Name != null) { context.WriteLine("Local Area: " + localArea.Name); } else { context.WriteLine("Local Area ID: " + localArea.Id); } foreach (EquipmentType equipmentType in equipmentTypes) { // it this a dumptruck? bool isDumpTruck = 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(null, options.Options)) { List <Equipment> data = etContext.Equipments .Include(x => x.LocalArea) .Include(x => x.DistrictEquipmentType.EquipmentType) .Where(x => x.Status == Equipment.StatusApproved && x.LocalArea.Id == localArea.Id && x.DistrictEquipmentType.EquipmentType.Id == equipmentType.Id) .Select(x => x) .ToList(); foreach (Equipment equipment in data) { // rollover the year equipment.ServiceHoursThreeYearsAgo = equipment.ServiceHoursTwoYearsAgo; equipment.ServiceHoursTwoYearsAgo = equipment.ServiceHoursLastYear; equipment.ServiceHoursLastYear = equipment.GetYtdServiceHours(dbContext); equipment.CalculateYearsOfService(DateTime.UtcNow); // blank out the override reason equipment.SeniorityOverrideReason = ""; // update the seniority score equipment.CalculateSeniority(seniorityScoring); etContext.Equipments.Update(equipment); etContext.SaveChanges(); etContext.Entry(equipment).State = EntityState.Detached; } } // now update the rotation list using (DbAppContext abContext = new DbAppContext(null, options.Options)) { int localAreaId = localArea.Id; int equipmentTypeId = equipmentType.Id; AssignBlocks(abContext, localAreaId, equipmentTypeId, blockSize, totalBlocks); } } } } catch (Exception e) { Console.WriteLine(e); throw; } }
/// <summary> /// Calculate the Seniority List /// </summary> /// <param name="context"></param> /// <param name="localAreaId"></param> /// <param name="districtEquipmentTypeId"></param> /// <param name="equipmentTypeId"></param> /// <param name="configuration"></param> public static void CalculateSeniorityList(this DbAppContext context, int localAreaId, int districtEquipmentTypeId, int equipmentTypeId, IConfiguration configuration) { try { // validate data if (context != null && context.LocalAreas.Any(x => x.Id == localAreaId) && context.DistrictEquipmentTypes.Any(x => x.Id == districtEquipmentTypeId)) { // get processing rules SeniorityScoringRules scoringRules = new SeniorityScoringRules(configuration); // get the associated equipment type EquipmentType equipmentTypeRecord = context.EquipmentTypes.FirstOrDefault(x => x.Id == equipmentTypeId); if (equipmentTypeRecord != null) { // get rules int seniorityScoring = equipmentTypeRecord.IsDumpTruck ? scoringRules.GetEquipmentScore("DumpTruck") : scoringRules.GetEquipmentScore(); int blockSize = equipmentTypeRecord.IsDumpTruck ? scoringRules.GetBlockSize("DumpTruck") : scoringRules.GetBlockSize(); int totalBlocks = equipmentTypeRecord.IsDumpTruck ? scoringRules.GetTotalBlocks("DumpTruck") : scoringRules.GetTotalBlocks(); // get all equipment records IQueryable <Equipment> data = context.Equipments .Where(x => x.LocalAreaId == localAreaId && x.DistrictEquipmentTypeId == districtEquipmentTypeId) .Select(x => x); // update the seniority score foreach (Equipment equipment in data) { if (equipment.Status != Equipment.StatusApproved) { equipment.SeniorityEffectiveDate = DateTime.UtcNow; equipment.BlockNumber = null; equipment.Seniority = null; equipment.NumberInBlock = null; } else { equipment.CalculateSeniority(seniorityScoring); equipment.SeniorityEffectiveDate = DateTime.UtcNow; } context.Equipments.Update(equipment); } context.SaveChanges(); // put equipment into the correct blocks AssignBlocks(context, localAreaId, districtEquipmentTypeId, blockSize, totalBlocks); } } } catch (Exception e) { Console.WriteLine("ERROR: CalculateSeniorityList"); Console.WriteLine(e); throw; } }