Example #1
0
        private static HetEquipment LastAskedByBlock(int block, int?districtEquipmentTypeId,
                                                     int?localAreaId, DateTime fiscalStart, DbAppContext context)
        {
            if (districtEquipmentTypeId == null || localAreaId == null)
            {
                return(null);
            }

            block++;

            // if this is not block 1 - check that we have "asked" anyone in the previous list
            HetRentalRequestRotationList rotationList = context.HetRentalRequestRotationList.AsNoTracking()
                                                        .Include(x => x.RentalRequest)
                                                        .Include(x => x.Equipment)
                                                        .Where(x => x.RentalRequest.DistrictEquipmentTypeId == districtEquipmentTypeId &&
                                                               x.RentalRequest.LocalAreaId == localAreaId &&
                                                               x.RentalRequest.AppCreateTimestamp >= fiscalStart &&
                                                               x.Equipment.BlockNumber == block &&
                                                               x.WasAsked == true &&
                                                               x.IsForceHire != true)
                                                        .OrderByDescending(x => x.RentalRequestId)
                                                        .ThenByDescending(x => x.RotationListSortOrder)
                                                        .FirstOrDefault();

            // return the equipment record that was last asked for this block
            return(rotationList?.Equipment);
        }
Example #2
0
        /// <summary>
        /// Create Last Called
        /// </summary>
        /// <param name="performContext"></param>
        /// <param name="dbContext"></param>
        /// <param name="systemId"></param>
        public static void ProcessLastCalled(PerformContext performContext, DbAppContext dbContext, string systemId)
        {
            try
            {
                performContext.WriteLine("*** Recreating Last Called ***");
                Debug.WriteLine("Recreating Last Called");

                int    ii = 0;
                string _oldTableProgress = "LastCalled_Progress";
                string _newTable         = "LastCalled";

                // check if the last called has already been completed
                int startPoint = ImportUtility.CheckInterMapForStartPoint(dbContext, _oldTableProgress, BcBidImport.SigId, _newTable);

                if (startPoint == BcBidImport.SigId)    // this means the assignment job is complete
                {
                    performContext.WriteLine("*** Recreating Last Called is complete from the former process ***");
                    return;
                }

                // ************************************************************
                // get all last called records
                // ************************************************************
                List <HetLocalAreaRotationList> rotationList = dbContext.HetLocalAreaRotationList.AsNoTracking()
                                                               .Distinct()
                                                               .ToList();

                // ************************************************************************
                // iterate the data and create rotation requests
                // ************************************************************************
                Debug.WriteLine("Recreating Last Called - Rotation List Record Count: " + rotationList.Count);

                // get status
                int?statusIdComplete = StatusHelper.GetStatusId(HetRentalRequest.StatusComplete, "rentalRequestStatus", dbContext);

                if (statusIdComplete == null)
                {
                    throw new DataException("Status Id cannot be null");
                }

                foreach (HetLocalAreaRotationList listItem in rotationList)
                {
                    HetRentalRequest request = new HetRentalRequest
                    {
                        LocalAreaId               = listItem.LocalAreaId,
                        DistrictEquipmentTypeId   = listItem.DistrictEquipmentTypeId,
                        RentalRequestStatusTypeId = (int)statusIdComplete,
                        ExpectedStartDate         = DateTime.Now,
                        ExpectedEndDate           = DateTime.Now,
                        EquipmentCount            = 1,
                        ExpectedHours             = 0,
                        AppCreateUserid           = systemId,
                        AppCreateTimestamp        = DateTime.UtcNow,
                        AppLastUpdateUserid       = systemId,
                        AppLastUpdateTimestamp    = DateTime.UtcNow
                    };

                    dbContext.HetRentalRequest.Add(request);

                    // save change to database
                    if (ii++ % 100 == 0)
                    {
                        Debug.WriteLine("Recreating Last Called - Index: " + ii);
                        ImportUtility.AddImportMapForProgress(dbContext, _oldTableProgress, ii.ToString(), BcBidImport.SigId, _newTable);
                        dbContext.SaveChangesForImport();
                    }
                }

                // save remaining requests
                dbContext.SaveChangesForImport();

                // ************************************************************************
                // iterate the data and create "last called" records
                // ************************************************************************
                foreach (HetLocalAreaRotationList listItem in rotationList)
                {
                    // get request
                    HetRentalRequest request = dbContext.HetRentalRequest.AsNoTracking()
                                               .FirstOrDefault(x => x.LocalAreaId == listItem.LocalAreaId &&
                                                               x.DistrictEquipmentTypeId == listItem.DistrictEquipmentTypeId);

                    if (request == null)
                    {
                        throw new DataException("Rental request cannot be null");
                    }

                    // block 1
                    if (listItem.AskNextBlock1Id != null)
                    {
                        // create last call record
                        HetRentalRequestRotationList rotation = new HetRentalRequestRotationList
                        {
                            RentalRequestId       = request.RentalRequestId,
                            EquipmentId           = listItem.AskNextBlock1Id,
                            BlockNumber           = 1,
                            RotationListSortOrder = 1,
                            AskedDateTime         = DateTime.Now,
                            WasAsked              = true,
                            OfferResponse         = "Yes",
                            OfferResponseDatetime = DateTime.Now,
                            IsForceHire           = false,
                            Note                   = "CONVERSION",
                            AppCreateUserid        = systemId,
                            AppCreateTimestamp     = DateTime.UtcNow,
                            AppLastUpdateUserid    = systemId,
                            AppLastUpdateTimestamp = DateTime.UtcNow
                        };

                        dbContext.HetRentalRequestRotationList.Add(rotation);
                    }

                    // block 2
                    if (listItem.AskNextBlock2Id != null)
                    {
                        // create last call record
                        HetRentalRequestRotationList rotation = new HetRentalRequestRotationList
                        {
                            RentalRequestId       = request.RentalRequestId,
                            EquipmentId           = listItem.AskNextBlock2Id,
                            BlockNumber           = 2,
                            RotationListSortOrder = 2,
                            AskedDateTime         = DateTime.Now,
                            WasAsked              = true,
                            OfferResponse         = "Yes",
                            OfferResponseDatetime = DateTime.Now,
                            IsForceHire           = false,
                            Note                   = "CONVERSION",
                            AppCreateUserid        = systemId,
                            AppCreateTimestamp     = DateTime.UtcNow,
                            AppLastUpdateUserid    = systemId,
                            AppLastUpdateTimestamp = DateTime.UtcNow
                        };

                        dbContext.HetRentalRequestRotationList.Add(rotation);
                    }

                    // open block
                    if (listItem.AskNextBlockOpenId != null)
                    {
                        // get equipment record
                        HetEquipment equipment = dbContext.HetEquipment.AsNoTracking()
                                                 .FirstOrDefault(x => x.EquipmentId == listItem.AskNextBlockOpenId);

                        if (equipment == null)
                        {
                            throw new DataException("Equipment cannot be null");
                        }

                        // create last call record
                        HetRentalRequestRotationList rotation = new HetRentalRequestRotationList
                        {
                            RentalRequestId       = request.RentalRequestId,
                            EquipmentId           = listItem.AskNextBlockOpenId,
                            BlockNumber           = equipment.BlockNumber,
                            RotationListSortOrder = 3,
                            AskedDateTime         = DateTime.Now,
                            WasAsked              = true,
                            OfferResponse         = "Yes",
                            OfferResponseDatetime = DateTime.Now,
                            IsForceHire           = false,
                            Note                   = "CONVERSION",
                            AppCreateUserid        = systemId,
                            AppCreateTimestamp     = DateTime.UtcNow,
                            AppLastUpdateUserid    = systemId,
                            AppLastUpdateTimestamp = DateTime.UtcNow
                        };

                        dbContext.HetRentalRequestRotationList.Add(rotation);
                    }

                    // save change to database
                    if (ii++ % 100 == 0)
                    {
                        Debug.WriteLine("Recreating Last Called - Index: " + ii);
                        ImportUtility.AddImportMapForProgress(dbContext, _oldTableProgress, ii.ToString(), BcBidImport.SigId, _newTable);
                        dbContext.SaveChangesForImport();
                    }
                }

                // save remaining requests
                dbContext.SaveChangesForImport();

                // ************************************************************
                // save final set of updates
                // ************************************************************
                try
                {
                    performContext.WriteLine("*** Recreating Last Called is Done ***");
                    Debug.WriteLine("Recreating Last Called is Done");
                    ImportUtility.AddImportMapForProgress(dbContext, _oldTableProgress, BcBidImport.SigId.ToString(), BcBidImport.SigId, _newTable);
                    dbContext.SaveChangesForImport();
                }
                catch (Exception e)
                {
                    string temp = string.Format("Error saving data (Record: {0}): {1}", ii, e.Message);
                    performContext.WriteLine(temp);
                    throw new DataException(temp);
                }
            }
            catch (Exception e)
            {
                performContext.WriteLine("*** ERROR ***");
                performContext.WriteLine(e.ToString());
                throw;
            }
        }
        /// <summary>
        /// Seniority List view model
        /// </summary>
        /// <param name="model"></param>
        /// <param name="scoringRules"></param>
        /// <param name="rotationList"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public static SeniorityViewModel ToSeniorityViewModel(HetEquipment model, SeniorityScoringRules scoringRules,
                                                              HetRentalRequestRotationList rotationList, DbAppContext context)
        {
            SeniorityViewModel seniorityViewModel = new SeniorityViewModel();

            if (model == null)
            {
                return(seniorityViewModel);
            }

            int numberOfBlocks = 0;

            // get number of blocks for this equipment type
            if (model.DistrictEquipmentType != null)
            {
                numberOfBlocks = model.DistrictEquipmentType.EquipmentType.IsDumpTruck
                    ? scoringRules.GetTotalBlocks("DumpTruck") + 1
                    : scoringRules.GetTotalBlocks() + 1;
            }

            // get equipment block number
            int blockNumber = 0;

            if (model.BlockNumber != null)
            {
                blockNumber = (int)model.BlockNumber;
            }

            // get equipment block number
            int numberInBlock = 0;

            if (model.NumberInBlock != null)
            {
                numberInBlock = (int)model.NumberInBlock;
            }

            // *************************************************************
            // check if this record/owner was called last
            // *************************************************************
            bool callLast = rotationList != null && rotationList.EquipmentId == model.EquipmentId;

            seniorityViewModel.LastCalled = callLast ? "Y" : " ";

            // *************************************************************
            // map data to view model
            // *************************************************************
            seniorityViewModel.Id = model.EquipmentId;

            if (model.DistrictEquipmentType != null)
            {
                seniorityViewModel.EquipmentType = model.DistrictEquipmentType.DistrictEquipmentName;
            }

            if (model.Owner != null)
            {
                seniorityViewModel.OwnerName = model.Owner.OrganizationName;
                seniorityViewModel.OwnerId   = model.OwnerId;
            }

            // replacing Open with 3 (HETS-968 Rotation list -Wrong Block number for Open block)
            seniorityViewModel.Block = blockNumber == numberOfBlocks ? "3" : blockNumber.ToString();

            // format the seniority value
            seniorityViewModel.Seniority = $"{model.Seniority:0.###}";

            // format year / make / model / size
            seniorityViewModel.YearMakeModelSize = $"{model.Year}/{model.Make}/{model.Model}/{model.Size}";

            seniorityViewModel.EquipmentCode = model.EquipmentCode;

            seniorityViewModel.YearsRegistered = model.YearsOfService.ToString();

            // Determine if this equipment is currently hired
            seniorityViewModel.IsHired = EquipmentHelper.IsHired(model.EquipmentId, context) ? "Y" : "N";

            // calculate and format the ytd hours
            float tempHours = EquipmentHelper.GetYtdServiceHours(model.EquipmentId, context);

            seniorityViewModel.YtdHours = string.Format("{0:0.###}", tempHours);

            // format the hours
            seniorityViewModel.HoursYearMinus1 = string.Format("{0:0.###}", model.ServiceHoursLastYear);
            seniorityViewModel.HoursYearMinus2 = string.Format("{0:0.###}", model.ServiceHoursTwoYearsAgo);
            seniorityViewModel.HoursYearMinus3 = string.Format("{0:0.###}", model.ServiceHoursThreeYearsAgo);

            // add the correct sorting order (numeric)
            seniorityViewModel.SenioritySortOrder = EquipmentHelper.CalculateSenioritySortOrder(blockNumber, numberInBlock);

            return(seniorityViewModel);
        }
Example #4
0
        /// <summary>
        /// Create Rental Request Rotation List
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <param name="configuration"></param>
        public static HetRentalRequest CreateRotationList(HetRentalRequest request, DbAppContext context, IConfiguration configuration)
        {
            request.HetRentalRequestRotationList = new List <HetRentalRequestRotationList>();

            // validate input parameters
            if (request.LocalAreaId == null || request.DistrictEquipmentTypeId == null)
            {
                return(request);
            }

            int currentSortOrder = 1;

            // get the number of blocks for this piece of equipment
            int numberOfBlocks = GetNumberOfBlocks(request, context, configuration);

            numberOfBlocks = numberOfBlocks + 1;

            int?statusId = StatusHelper.GetStatusId(HetEquipment.StatusApproved, "equipmentStatus", context);

            if (statusId == null)
            {
                throw new ArgumentException("Status Id cannot be null");
            }

            // get the equipment based on the current seniority list for the area
            // (and sort the results based on block then
            //      numberInBlock -> ensures consistency with the UI)
            for (int currentBlock = 1; currentBlock <= numberOfBlocks; currentBlock++)
            {
                // start by getting the current set of equipment for the given equipment type
                List <HetEquipment> blockEquipment = context.HetEquipment.AsNoTracking()
                                                     .Where(x => x.DistrictEquipmentTypeId == request.DistrictEquipmentTypeId &&
                                                            x.BlockNumber == currentBlock &&
                                                            x.LocalAreaId == request.LocalAreaId &&
                                                            x.EquipmentStatusTypeId == statusId)
                                                     .OrderBy(x => x.NumberInBlock)
                                                     .ToList();

                int listSize = blockEquipment.Count;

                // sets the rotation list sort order
                int currentPosition = 0;

                for (int i = 0; i < listSize; i++)
                {
                    HetRentalRequestRotationList rentalRequestRotationList = new HetRentalRequestRotationList
                    {
                        Equipment             = blockEquipment[i],
                        EquipmentId           = blockEquipment[i].EquipmentId,
                        SeniorityFloat        = blockEquipment[i].Seniority,
                        BlockNumber           = blockEquipment[i].BlockNumber,
                        AppCreateTimestamp    = DateTime.UtcNow,
                        RotationListSortOrder = currentSortOrder
                    };

                    request.HetRentalRequestRotationList.Add(rentalRequestRotationList);

                    currentPosition++;
                    currentSortOrder++;

                    if (currentPosition >= listSize)
                    {
                        currentPosition = 0;
                    }
                }
            }

            // update the local area rotation list - find record #1
            request = SetupNewRotationList(request, numberOfBlocks, context);

            // remove equipment records
            foreach (HetRentalRequestRotationList rotationList in request.HetRentalRequestRotationList)
            {
                rotationList.Equipment = null;
            }

            // Done!
            return(request);
        }
Example #5
0
        public virtual IActionResult RentalRequestIdRotationListIdPut([FromRoute] int id, [FromBody] HetRentalRequestRotationList item)
        {
            // not found
            if (item == null)
            {
                return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration))));
            }

            bool exists = _context.HetRentalRequest.Any(a => a.RentalRequestId == id);

            // not found
            if (!exists)
            {
                return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration))));
            }

            int?statusId = StatusHelper.GetStatusId(HetRentalRequest.StatusInProgress, "rentalRequestStatus", _context);

            if (statusId == null)
            {
                return(new NotFoundObjectResult(new HetsResponse("HETS-23", ErrorViewModel.GetDescription("HETS-23", _configuration))));
            }

            // check if we have the rental request that is In Progress
            exists = _context.HetRentalRequest
                     .Any(a => a.RentalRequestId == id &&
                          a.RentalRequestStatusTypeId == statusId);

            // rental request must be "in progress"
            if (!exists)
            {
                return(new BadRequestObjectResult(new HetsResponse("HETS-06", ErrorViewModel.GetDescription("HETS-06", _configuration))));
            }

            // get rental request record
            HetRentalRequest request = _context.HetRentalRequest
                                       .Include(x => x.Project)
                                       .ThenInclude(x => x.District)
                                       .Include(x => x.LocalArea)
                                       .Include(x => x.HetRentalRequestRotationList)
                                       .ThenInclude(x => x.Equipment)
                                       .First(a => a.RentalRequestId == id);

            // get rotation list record
            HetRentalRequestRotationList requestRotationList = _context.HetRentalRequestRotationList
                                                               .FirstOrDefault(a => a.RentalRequestRotationListId == item.RentalRequestRotationListId);

            // not found
            if (requestRotationList == null)
            {
                return(new NotFoundObjectResult(new HetsResponse("HETS-01", ErrorViewModel.GetDescription("HETS-01", _configuration))));
            }

            // update rotation list record
            int tempEquipmentId = item.Equipment.EquipmentId;

            requestRotationList.ConcurrencyControlNumber = item.ConcurrencyControlNumber;
            requestRotationList.EquipmentId           = tempEquipmentId;
            requestRotationList.IsForceHire           = item.IsForceHire;
            requestRotationList.AskedDateTime         = DateTime.UtcNow;
            requestRotationList.Note                  = item.Note;
            requestRotationList.OfferRefusalReason    = item.OfferRefusalReason;
            requestRotationList.OfferResponse         = item.OfferResponse;
            requestRotationList.OfferResponseDatetime = item.OfferResponseDatetime;
            requestRotationList.WasAsked              = item.WasAsked;
            requestRotationList.OfferResponseNote     = item.OfferResponseNote;

            // do we need to create or modify a Rental Agreement?
            if (item.IsForceHire == true ||
                item.OfferResponse.Equals("Yes", StringComparison.InvariantCultureIgnoreCase))
            {
                // get rental agreement record
                HetRentalAgreement rentalAgreement = _context.HetRentalAgreement
                                                     .FirstOrDefault(a => a.RentalAgreementId == item.RentalAgreementId);

                // create rental agreement if it doesn't exist
                if (rentalAgreement == null)
                {
                    // generate the rental agreement number
                    string agreementNumber = RentalAgreementHelper.GetRentalAgreementNumber(item.Equipment, _context);

                    // get user info - agreement city
                    User   user          = UserAccountHelper.GetUser(_context, _httpContext);
                    string agreementCity = user.AgreementCity;

                    int?rateTypeId = StatusHelper.GetRatePeriodId(HetRatePeriodType.PeriodHourly, _context);
                    if (rateTypeId == null)
                    {
                        return(new NotFoundObjectResult(new HetsResponse("HETS-24", ErrorViewModel.GetDescription("HETS-24", _configuration))));
                    }

                    rentalAgreement = new HetRentalAgreement
                    {
                        ProjectId        = request.ProjectId,
                        DistrictId       = request.Project.District.DistrictId,
                        EquipmentId      = tempEquipmentId,
                        Number           = agreementNumber,
                        RatePeriodTypeId = (int)rateTypeId,
                        AgreementCity    = agreementCity
                    };

                    // add overtime rates
                    List <HetProvincialRateType> overtime = _context.HetProvincialRateType.AsNoTracking()
                                                            .Where(x => x.Overtime)
                                                            .ToList();

                    // agreement overtime records (default overtime flag)
                    foreach (HetProvincialRateType rate in overtime)
                    {
                        // add the rate
                        HetRentalAgreementRate newAgreementRate = new HetRentalAgreementRate
                        {
                            Comment           = rate.Description,
                            ComponentName     = rate.RateType,
                            Overtime          = true,
                            Active            = rate.Active,
                            IsIncludedInTotal = rate.IsIncludedInTotal,
                            Rate = rate.Rate
                        };

                        if (rentalAgreement.HetRentalAgreementRate == null)
                        {
                            rentalAgreement.HetRentalAgreementRate = new List <HetRentalAgreementRate>();
                        }

                        rentalAgreement.HetRentalAgreementRate.Add(newAgreementRate);
                    }

                    _context.HetRentalAgreement.Add(rentalAgreement);
                }

                int?statusIdAgreement = StatusHelper.GetStatusId(HetRentalAgreement.StatusActive, "rentalAgreementStatus", _context);
                if (statusIdAgreement == null)
                {
                    return(new NotFoundObjectResult(new HetsResponse("HETS-23", ErrorViewModel.GetDescription("HETS-23", _configuration))));
                }

                // update rental agreement
                rentalAgreement.RentalAgreementStatusTypeId = (int)statusIdAgreement;
                rentalAgreement.DatedOn                     = DateTime.UtcNow;
                rentalAgreement.EstimateHours               = request.ExpectedHours;
                rentalAgreement.EstimateStartWork           = request.ExpectedStartDate;
                rentalAgreement.RentalRequestId             = request.RentalRequestId;
                rentalAgreement.RentalRequestRotationListId = requestRotationList.RentalRequestRotationListId;

                // have to save the agreement
                _context.SaveChanges();

                // relate the new rental agreement to the original rotation list record
                int tempRentalAgreementId = rentalAgreement.RentalAgreementId;
                requestRotationList.RentalAgreementId = tempRentalAgreementId;
                requestRotationList.RentalAgreement   = rentalAgreement;
            }

            // can we "Complete" this rental request (if the Yes or Forced Hires = Request.EquipmentCount)
            int countOfYeses          = 0;
            int equipmentRequestCount = request.EquipmentCount;

            foreach (HetRentalRequestRotationList rotationList in request.HetRentalRequestRotationList)
            {
                if (rotationList.OfferResponse != null &&
                    rotationList.OfferResponse.Equals("Yes", StringComparison.InvariantCultureIgnoreCase))
                {
                    countOfYeses = countOfYeses + 1;
                }
                else if (rotationList.IsForceHire != null &&
                         rotationList.IsForceHire == true)
                {
                    countOfYeses = countOfYeses + 1;
                }
            }

            if (countOfYeses >= equipmentRequestCount)
            {
                int?statusIdComplete = StatusHelper.GetStatusId(HetRentalRequest.StatusComplete, "rentalRequestStatus", _context);
                if (statusIdComplete == null)
                {
                    return(new NotFoundObjectResult(new HetsResponse("HETS-23", ErrorViewModel.GetDescription("HETS-23", _configuration))));
                }

                request.RentalRequestStatusTypeId = (int)statusIdComplete;
                request.Status = "Complete";
                request.FirstOnRotationList = null;
            }

            // 1. get the number of blocks for this equipment type
            // 2. set which rotation list record is currently "active"
            int numberOfBlocks = EquipmentHelper.GetNumberOfBlocks(item.Equipment, _configuration);

            RentalRequestHelper.UpdateRotationList(request, numberOfBlocks, _context);

            // save the changes
            _context.SaveChanges();

            // get the scoring rules
            SeniorityScoringRules scoringRules = new SeniorityScoringRules(_configuration);

            return(new ObjectResult(new HetsResponse(RentalRequestHelper.GetRecordWithRotationList(id, scoringRules, _context))));
        }