Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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;
            }
        }
Ejemplo n.º 3
0
        /// <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;
            }
        }