Пример #1
0
        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;
            }
        }
Пример #2
0
        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)));
        }
Пример #3
0
        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))));
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        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;
            }
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        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;
            }
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        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));
        }
Пример #12
0
        /// <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;
            }
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        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)));
        }
Пример #15
0
        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)));
        }
Пример #16
0
        /// <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;
            }
        }