public static byte MatchOffersMode(TransferReason material)
        {
            //incoming only mode 0
            //outgoing only mode 1
            //balanced mode 2
            //incoming first mode 3
            switch (material)
            {
            case TransferReason.Oil:
            case TransferReason.Ore:
            case TransferReason.Coal:
            case TransferReason.Petrol:
            case TransferReason.Food:
            case TransferReason.Grain:
            case TransferReason.Lumber:
            case TransferReason.Logs:
            case TransferReason.Goods:
            case TransferReason.LuxuryProducts:
            case TransferReason.AnimalProducts:
            case TransferReason.Flours:
            case TransferReason.Petroleum:
            case TransferReason.Plastics:
            case TransferReason.Metals:
            case TransferReason.Glass:
            case TransferReason.PlanedTimber:
            case TransferReason.Paper:
            case TransferReason.Snow:
            case TransferReason.RoadMaintenance:
            case TransferReason.ParkMaintenance:
            case TransferReason.Fish:
                return(2);

            case TransferReason.Garbage:
            case TransferReason.Crime:
            case TransferReason.Fire:
            case TransferReason.Dead:
            case TransferReason.Taxi:
                return(3);

            case TransferReason.GarbageMove:
            case TransferReason.CriminalMove:
            case TransferReason.DeadMove:
            case TransferReason.SnowMove:
                return(1);

            default: return(2);
            }
        }
Example #2
0
        /// <inheritdoc/>
        public string ToDelimitedString()
        {
            CultureInfo culture = CultureInfo.CurrentCulture;

            return(string.Format(
                       culture,
                       StringHelper.StringFormatSequence(0, 38, Configuration.FieldSeparator),
                       Id,
                       PriorPendingLocation?.ToDelimitedString(),
                       AccommodationCode?.ToDelimitedString(),
                       AdmitReason?.ToDelimitedString(),
                       TransferReason?.ToDelimitedString(),
                       PatientValuables != null ? string.Join(Configuration.FieldRepeatSeparator, PatientValuables) : null,
                       PatientValuablesLocation,
                       VisitUserCode,
                       ExpectedAdmitDateTime.HasValue ? ExpectedAdmitDateTime.Value.ToString(Consts.DateTimeFormatPrecisionSecond, culture) : null,
                       ExpectedDischargeDateTime.HasValue ? ExpectedDischargeDateTime.Value.ToString(Consts.DateTimeFormatPrecisionSecond, culture) : null,
                       EstimatedLengthOfInpatientStay.HasValue ? EstimatedLengthOfInpatientStay.Value.ToString(Consts.NumericFormat, culture) : null,
                       ActualLengthOfInpatientStay.HasValue ? ActualLengthOfInpatientStay.Value.ToString(Consts.NumericFormat, culture) : null,
                       VisitDescription,
                       ReferralSourceCode?.ToDelimitedString(),
                       PreviousServiceDate.HasValue ? PreviousServiceDate.Value.ToString(Consts.DateFormatPrecisionDay, culture) : null,
                       EmploymentIllnessRelatedIndicator,
                       PurgeStatusCode,
                       PurgeStatusDate.HasValue ? PurgeStatusDate.Value.ToString(Consts.DateFormatPrecisionDay, culture) : null,
                       SpecialProgramCode,
                       RetentionIndicator,
                       ExpectedNumberOfInsurancePlans.HasValue ? ExpectedNumberOfInsurancePlans.Value.ToString(Consts.NumericFormat, culture) : null,
                       VisitPublicityCode,
                       VisitProtectionIndicator,
                       ClinicOrganizationName != null ? string.Join(Configuration.FieldRepeatSeparator, ClinicOrganizationName.Select(x => x.ToDelimitedString())) : null,
                       PatientStatusCode,
                       VisitPriorityCode,
                       PreviousTreatmentDate.HasValue ? PreviousTreatmentDate.Value.ToString(Consts.DateFormatPrecisionDay, culture) : null,
                       ExpectedDischargeDisposition,
                       SignatureOnFileDate.HasValue ? SignatureOnFileDate.Value.ToString(Consts.DateFormatPrecisionDay, culture) : null,
                       FirstSimilarIllnessDate.HasValue ? FirstSimilarIllnessDate.Value.ToString(Consts.DateFormatPrecisionDay, culture) : null,
                       PatientChargeAdjustmentCode,
                       RecurringServiceCode,
                       BillingMediaCode,
                       ExpectedSurgeryDateAndTime.HasValue ? ExpectedSurgeryDateAndTime.Value.ToString(Consts.DateTimeFormatPrecisionSecond, culture) : null,
                       MilitaryPartnershipCode,
                       MilitaryNonAvailabilityCode,
                       NewbornBabyIndicator,
                       BabyDetainedIndicator
                       ).TrimEnd(Configuration.FieldSeparator.ToCharArray()));
        }
Example #3
0
        /// <summary>
        /// Increases the account balance of the specific ID with IncreaseBy.
        /// </summary>
        /// <param name="id">Steam 64 ID of the account.</param>
        /// <param name="increaseBy">The amount that the account should be changed with (can be negative).</param>
        /// <returns>The new balance of the account.</returns>
        public decimal IncreaseBalance(string id, decimal increaseBy)
        {
            TransferReason reason = null;
            UnturnedPlayer player = UnturnedPlayer.FromCSteamID(new CSteamID(ulong.Parse(id)));

            if (increaseBy >= 0)
            {
                reason = new TransferReason_Unknown_In($"{id} ({(player != null ? player.DisplayName : id)})", "", increaseBy);
            }
            else
            {
                reason = new TransferReason_Unknown_Out("", $"{id} ({(player != null ? player.DisplayName : id)})", increaseBy);
            }
            BankingSystem.Instance.api.increaseBalance(id, increaseBy, reason);
            decimal balance = BankingSystem.Instance.api.getPlayerBalance(id);

            return(balance);
        }
Example #4
0
        public static bool Prefix(TransferReason material, TransferOffer offer)
        {
            IndustriesImportExportController controller = IndustriesImportExportController.instance;
            bool res = true;

            if (controller.aiAddingConnections)
            {
                if (controller.config.ImportConfig.ContainsKey(material))
                {
                    res = controller.config.ImportConfig[material];
                }
            }

            if (!res)
            {
                Debug.Log("Blocked Export of " + material.ToString());
            }
            return(res);
        }
        public async Task CloseVacancyReview(long vacancyReference, TransferReason transferReason)
        {
            var review = await _vacancyReviewQuery.GetLatestReviewByReferenceAsync(vacancyReference);

            if (review.IsPending)
            {
                review.ManualOutcome = transferReason == TransferReason.BlockedByQa
                                        ? ManualQaOutcome.Blocked
                                        : ManualQaOutcome.Transferred;
                review.Status     = ReviewStatus.Closed;
                review.ClosedDate = _timeProvider.Now;

                await _vacancyReviewRepository.UpdateAsync(review);
            }
            else if (review.Status == ReviewStatus.UnderReview)
            {
                _logger.LogWarning($"Latest review for vacancy {review.VacancyReference} that has been transferred is currently being reviewed.");
            }
        }
        public static bool CanUseNewMatchOffers(TransferReason material)
        {
            switch (material)
            {
            case TransferReason.Oil:
            case TransferReason.Ore:
            case TransferReason.Coal:
            case TransferReason.Petrol:
            case TransferReason.Food:
            case TransferReason.Grain:
            case TransferReason.Lumber:
            case TransferReason.Logs:
            case TransferReason.Goods:
            case TransferReason.LuxuryProducts:
            case TransferReason.AnimalProducts:
            case TransferReason.Flours:
            case TransferReason.Petroleum:
            case TransferReason.Plastics:
            case TransferReason.Metals:
            case TransferReason.Glass:
            case TransferReason.PlanedTimber:
            case TransferReason.Paper:
            case TransferReason.Fire:
            case TransferReason.Garbage:
            case TransferReason.GarbageMove:
            case TransferReason.Crime:
            case TransferReason.CriminalMove:
            case TransferReason.Dead:
            case TransferReason.DeadMove:
            case TransferReason.Snow:
            case TransferReason.SnowMove:
            case TransferReason.RoadMaintenance:
            case TransferReason.ParkMaintenance:
            case TransferReason.Taxi:
                return(true);

            default: return(false);
            }
        }
        public static void MatchOffers(TransferReason material)
        {
            if (!_init)
            {
                Init();
                _init = true;
            }
            if (material != TransferReason.None)
            {
                float distanceMultiplier = TransferManagerGetDistanceMultiplierDG(material);
                float maxDistance        = (distanceMultiplier == 0f) ? 0f : (0.01f / distanceMultiplier);
                for (int priority = 7; priority >= 0; priority--)
                {
                    int offerIdex     = (int)material * 8 + priority;
                    int incomingCount = m_incomingCount[offerIdex];
                    int outgoingCount = m_outgoingCount[offerIdex];
                    int incomingIdex  = 0;
                    int outgoingIdex  = 0;
                    int oldPriority   = priority;
                    // NON-STOCK CODE START
                    byte matchOffersMode = MatchOffersMode(material);
                    bool isLoopValid     = false;
                    if ((matchOffersMode == 2) || (matchOffersMode == 3))
                    {
                        isLoopValid = (incomingIdex < incomingCount || outgoingIdex < outgoingCount);
                    }
                    else if (matchOffersMode == 1)
                    {
                        isLoopValid = (outgoingIdex < outgoingCount);
                    }
                    else if (matchOffersMode == 0)
                    {
                        isLoopValid = (incomingIdex < incomingCount);
                    }

                    // NON-STOCK CODE END
                    while (isLoopValid)
                    {
                        //use incomingOffer to match outgoingOffer
                        if ((incomingIdex < incomingCount) && (matchOffersMode != 1))
                        {
                            TransferOffer incomingOffer = m_incomingOffers[offerIdex * 256 + incomingIdex];
                            // NON-STOCK CODE START
                            bool canUseNewMatchOffers = CanUseNewMatchOffers(material);
                            // NON-STOCK CODE END
                            Vector3 incomingPosition    = incomingOffer.Position;
                            int     incomingOfferAmount = incomingOffer.Amount;
                            do
                            {
                                int incomingPriority        = Mathf.Max(0, 2 - priority);
                                int incomingPriorityExclude = (!incomingOffer.Exclude) ? incomingPriority : Mathf.Max(0, 3 - priority);
                                // NON-STOCK CODE START
                                float currentShortestDistance = -1f;
                                if (canUseNewMatchOffers && (matchOffersMode != 2))
                                {
                                    //incoming only mode 0
                                    //outgoing only mode 1
                                    //balanced mode 2
                                    //incoming first mode 3
                                    priority                = 7;
                                    incomingPriority        = Mathf.Max(0, 2 - oldPriority);
                                    incomingPriorityExclude = (!incomingOffer.Exclude) ? incomingPriority : Mathf.Max(0, 3 - oldPriority);
                                }
                                else
                                {
                                    priority                = oldPriority;
                                    incomingPriority        = Mathf.Max(0, 2 - priority);
                                    incomingPriorityExclude = (!incomingOffer.Exclude) ? incomingPriority : Mathf.Max(0, 3 - priority);
                                }
                                // NON-STOCK CODE END
                                int   validPriority              = -1;
                                int   validOutgoingIdex          = -1;
                                float distanceOffsetPre          = -1f;
                                int   outgoingIdexInsideIncoming = outgoingIdex;
                                for (int incomingPriorityInside = priority; incomingPriorityInside >= incomingPriority; incomingPriorityInside--)
                                {
                                    int outgoingIdexWithPriority  = (int)material * 8 + incomingPriorityInside;
                                    int outgoingCountWithPriority = m_outgoingCount[outgoingIdexWithPriority];
                                    //To let incomingPriorityInsideFloat!=0
                                    float incomingPriorityInsideFloat = (float)incomingPriorityInside + 0.1f;
                                    //Higher priority will get more chance to match
                                    //UseNewMatchOffers to find the shortest transfer building
                                    if ((distanceOffsetPre >= incomingPriorityInsideFloat) && !canUseNewMatchOffers)
                                    {
                                        break;
                                    }
                                    //Find the nearest offer to match in every priority.
                                    for (int i = outgoingIdexInsideIncoming; i < outgoingCountWithPriority; i++)
                                    {
                                        TransferOffer outgoingOfferPre = m_outgoingOffers[outgoingIdexWithPriority * 256 + i];
                                        if (incomingOffer.m_object != outgoingOfferPre.m_object && (!outgoingOfferPre.Exclude || incomingPriorityInside >= incomingPriorityExclude))
                                        {
                                            float incomingOutgoingDistance = Vector3.SqrMagnitude(outgoingOfferPre.Position - incomingPosition);
                                            // NON-STOCK CODE START
                                            if (canUseNewMatchOffers)
                                            {
                                                //WareHouse first
                                                incomingOutgoingDistance = incomingOutgoingDistance / WareHouseFirst(incomingOffer, outgoingOfferPre, material);
                                                if ((incomingOutgoingDistance < currentShortestDistance) || currentShortestDistance == -1)
                                                {
                                                    if (!IsUnRoutedMatch(incomingOffer, outgoingOfferPre, material) && CanWareHouseTransfer(incomingOffer, outgoingOfferPre, material))
                                                    {
                                                        validPriority           = incomingPriorityInside;
                                                        validOutgoingIdex       = i;
                                                        currentShortestDistance = incomingOutgoingDistance;
                                                    }
                                                }
                                            }
                                            // NON-STOCK CODE END
                                            float distanceOffset = (!(distanceMultiplier < 0f)) ? (incomingPriorityInsideFloat / (1f + incomingOutgoingDistance * distanceMultiplier)) : (incomingPriorityInsideFloat - incomingPriorityInsideFloat / (1f - incomingOutgoingDistance * distanceMultiplier));
                                            if ((distanceOffset > distanceOffsetPre) && !canUseNewMatchOffers)
                                            {
                                                validPriority     = incomingPriorityInside;
                                                validOutgoingIdex = i;
                                                distanceOffsetPre = distanceOffset;
                                                if ((incomingOutgoingDistance < maxDistance))
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    outgoingIdexInsideIncoming = 0;
                                }
                                // NON-STOCK CODE START
                                if (canUseNewMatchOffers)
                                {
                                    priority = oldPriority;
                                }
                                // NON-STOCK CODE END
                                if (validPriority == -1)
                                {
                                    break;
                                }
                                //Find a validPriority, get outgoingOffer
                                int           matchedOutgoingOfferIdex = (int)material * 8 + validPriority;
                                TransferOffer outgoingOffer            = m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex];
                                int           outgoingOfferAmount      = outgoingOffer.Amount;
                                int           matchedOfferAmount       = Mathf.Min(incomingOfferAmount, outgoingOfferAmount);
                                if (matchedOfferAmount != 0)
                                {
                                    TransferManagerStartTransferDG(Singleton <TransferManager> .instance, material, outgoingOffer, incomingOffer, matchedOfferAmount);
                                }
                                incomingOfferAmount -= matchedOfferAmount;
                                outgoingOfferAmount -= matchedOfferAmount;
                                //matched outgoingOffer is empty now
                                if (outgoingOfferAmount == 0)
                                {
                                    int outgoingCountPost = m_outgoingCount[matchedOutgoingOfferIdex] - 1;
                                    m_outgoingCount[matchedOutgoingOfferIdex] = (ushort)outgoingCountPost;
                                    m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex] = m_outgoingOffers[matchedOutgoingOfferIdex * 256 + outgoingCountPost];
                                    if (matchedOutgoingOfferIdex == offerIdex)
                                    {
                                        outgoingCount = outgoingCountPost;
                                    }
                                }
                                else
                                {
                                    outgoingOffer.Amount = outgoingOfferAmount;
                                    m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex] = outgoingOffer;
                                }
                                incomingOffer.Amount = incomingOfferAmount;
                            }while (incomingOfferAmount != 0);
                            //matched incomingOffer is empty now
                            if (incomingOfferAmount == 0)
                            {
                                incomingCount--;
                                m_incomingCount[offerIdex] = (ushort)incomingCount;
                                m_incomingOffers[offerIdex * 256 + incomingIdex] = m_incomingOffers[offerIdex * 256 + incomingCount];
                            }
                            else
                            {
                                incomingOffer.Amount = incomingOfferAmount;
                                m_incomingOffers[offerIdex * 256 + incomingIdex] = incomingOffer;
                                incomingIdex++;
                            }
                        }
                        //For RealConstruction, We only satisify incoming building
                        //use outgoingOffer to match incomingOffer
                        if ((outgoingIdex < outgoingCount) && (matchOffersMode != 0))
                        {
                            TransferOffer outgoingOffer = m_outgoingOffers[offerIdex * 256 + outgoingIdex];
                            // NON-STOCK CODE START
                            bool canUseNewMatchOffers = CanUseNewMatchOffers(material);
                            // NON-STOCK CODE END
                            Vector3 outgoingPosition    = outgoingOffer.Position;
                            int     outgoingOfferAmount = outgoingOffer.Amount;
                            do
                            {
                                int outgoingPriority        = Mathf.Max(0, 2 - priority);
                                int outgoingPriorityExclude = (!outgoingOffer.Exclude) ? outgoingPriority : Mathf.Max(0, 3 - priority);
                                // NON-STOCK CODE START
                                float currentShortestDistance = -1f;
                                //incoming first mode can only match lower priority
                                if (canUseNewMatchOffers && (matchOffersMode == 1))
                                {
                                    //incoming only mode 0
                                    //outgoing only mode 1
                                    //balanced mode 2
                                    //incoming first mode 3
                                    priority                = 7;
                                    outgoingPriority        = Mathf.Max(0, 2 - oldPriority);
                                    outgoingPriorityExclude = (!outgoingOffer.Exclude) ? outgoingPriority : Mathf.Max(0, 3 - oldPriority);
                                }
                                else
                                {
                                    priority                = oldPriority;
                                    outgoingPriority        = Mathf.Max(0, 2 - priority);
                                    outgoingPriorityExclude = (!outgoingOffer.Exclude) ? outgoingPriority : Mathf.Max(0, 3 - priority);
                                }
                                // NON-STOCK CODE END
                                int   validPriority              = -1;
                                int   validIncomingIdex          = -1;
                                float distanceOffsetPre          = -1f;
                                int   incomingIdexInsideOutgoing = incomingIdex;
                                for (int outgoingPriorityInside = priority; outgoingPriorityInside >= outgoingPriority; outgoingPriorityInside--)
                                {
                                    int incomingIdexWithPriority  = (int)material * 8 + outgoingPriorityInside;
                                    int incomingCountWithPriority = m_incomingCount[incomingIdexWithPriority];
                                    //To let outgoingPriorityInsideFloat!=0
                                    float outgoingPriorityInsideFloat = (float)outgoingPriorityInside + 0.1f;
                                    //Higher priority will get more chance to match
                                    if ((distanceOffsetPre >= outgoingPriorityInsideFloat) && !canUseNewMatchOffers)
                                    {
                                        break;
                                    }
                                    for (int j = incomingIdexInsideOutgoing; j < incomingCountWithPriority; j++)
                                    {
                                        TransferOffer incomingOfferPre = m_incomingOffers[incomingIdexWithPriority * 256 + j];
                                        if (outgoingOffer.m_object != incomingOfferPre.m_object && (!incomingOfferPre.Exclude || outgoingPriorityInside >= outgoingPriorityExclude))
                                        {
                                            float incomingOutgoingDistance = Vector3.SqrMagnitude(incomingOfferPre.Position - outgoingPosition);
                                            // NON-STOCK CODE START
                                            if (canUseNewMatchOffers)
                                            {
                                                //WareHouse first
                                                incomingOutgoingDistance = incomingOutgoingDistance / WareHouseFirst(incomingOfferPre, outgoingOffer, material);
                                                if (incomingOfferPre.Building != 0)
                                                {
                                                    if (RejectLowPriority(material))
                                                    {
                                                        if (incomingOfferPre.Priority == 0)
                                                        {
                                                            incomingOutgoingDistance = incomingOutgoingDistance * 10000f;
                                                        }
                                                    }
                                                }
                                                if ((incomingOutgoingDistance < currentShortestDistance) || currentShortestDistance == -1)
                                                {
                                                    if (!IsUnRoutedMatch(incomingOfferPre, outgoingOffer, material) && CanWareHouseTransfer(incomingOfferPre, outgoingOffer, material))
                                                    {
                                                        validPriority           = outgoingPriorityInside;
                                                        validIncomingIdex       = j;
                                                        currentShortestDistance = incomingOutgoingDistance;
                                                    }
                                                }
                                            }
                                            // NON-STOCK CODE END
                                            float distanceOffset = (!(distanceMultiplier < 0f)) ? (outgoingPriorityInsideFloat / (1f + incomingOutgoingDistance * distanceMultiplier)) : (outgoingPriorityInsideFloat - outgoingPriorityInsideFloat / (1f - incomingOutgoingDistance * distanceMultiplier));
                                            if ((distanceOffset > distanceOffsetPre) && !canUseNewMatchOffers)
                                            {
                                                validPriority     = outgoingPriorityInside;
                                                validIncomingIdex = j;
                                                distanceOffsetPre = distanceOffset;
                                                if (incomingOutgoingDistance < maxDistance)
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    incomingIdexInsideOutgoing = 0;
                                }
                                // NON-STOCK CODE START
                                if (canUseNewMatchOffers)
                                {
                                    priority = oldPriority;
                                }
                                // NON-STOCK CODE END
                                if (validPriority == -1)
                                {
                                    break;
                                }
                                //Find a validPriority, get incomingOffer
                                int           matchedIncomingOfferIdex = (int)material * 8 + validPriority;
                                TransferOffer incomingOffers           = m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex];
                                int           incomingOffersAmount     = incomingOffers.Amount;
                                int           matchedOfferAmount       = Mathf.Min(outgoingOfferAmount, incomingOffersAmount);
                                if (matchedOfferAmount != 0)
                                {
                                    TransferManagerStartTransferDG(Singleton <TransferManager> .instance, material, outgoingOffer, incomingOffers, matchedOfferAmount);
                                }
                                outgoingOfferAmount  -= matchedOfferAmount;
                                incomingOffersAmount -= matchedOfferAmount;
                                //matched incomingOffer is empty now
                                if (incomingOffersAmount == 0)
                                {
                                    int incomingCountPost = m_incomingCount[matchedIncomingOfferIdex] - 1;
                                    m_incomingCount[matchedIncomingOfferIdex] = (ushort)incomingCountPost;
                                    m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex] = m_incomingOffers[matchedIncomingOfferIdex * 256 + incomingCountPost];
                                    if (matchedIncomingOfferIdex == offerIdex)
                                    {
                                        incomingCount = incomingCountPost;
                                    }
                                }
                                else
                                {
                                    incomingOffers.Amount = incomingOffersAmount;
                                    m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex] = incomingOffers;
                                }
                                outgoingOffer.Amount = outgoingOfferAmount;
                            }while (outgoingOfferAmount != 0);
                            //matched outgoingOffer is empty now
                            if (outgoingOfferAmount == 0)
                            {
                                outgoingCount--;
                                m_outgoingCount[offerIdex] = (ushort)outgoingCount;
                                m_outgoingOffers[offerIdex * 256 + outgoingIdex] = m_outgoingOffers[offerIdex * 256 + outgoingCount];
                            }
                            else
                            {
                                outgoingOffer.Amount = outgoingOfferAmount;
                                m_outgoingOffers[offerIdex * 256 + outgoingIdex] = outgoingOffer;
                                outgoingIdex++;
                            }
                        }

                        // NON-STOCK CODE START
                        if ((matchOffersMode == 2) || (matchOffersMode == 3))
                        {
                            isLoopValid = (incomingIdex < incomingCount || outgoingIdex < outgoingCount);
                        }
                        else if (matchOffersMode == 1)
                        {
                            isLoopValid = (outgoingIdex < outgoingCount);
                        }
                        else if (matchOffersMode == 0)
                        {
                            isLoopValid = (incomingIdex < incomingCount);
                        }
                        // NON-STOCK CODE END
                    }
                }
                for (int k = 0; k < 8; k++)
                {
                    int num40 = (int)material * 8 + k;
                    m_incomingCount[num40] = 0;
                    m_outgoingCount[num40] = 0;
                }
                m_incomingAmount[(int)material] = 0;
                m_outgoingAmount[(int)material] = 0;
            }
        }
        public static bool IsUnRoutedMatch(TransferOffer offerIn, TransferOffer offerOut, TransferReason material)
        {
            if (!MoreEffectiveTransfer.fixUnRouteTransfer)
            {
                return(false);
            }

            bool            active    = offerIn.Active;
            bool            active2   = offerOut.Active;
            VehicleManager  instance1 = Singleton <VehicleManager> .instance;
            BuildingManager instance  = Singleton <BuildingManager> .instance;

            if (active && offerIn.Vehicle != 0)
            {
                ushort targetBuilding = 0;
                ushort sourceBuilding = instance1.m_vehicles.m_buffer[offerIn.Vehicle].m_sourceBuilding;
                targetBuilding = offerOut.Building;

                if ((targetBuilding != 0) && (sourceBuilding != 0))
                {
                    for (int j = 0; j < MainDataStore.canNotConnectedBuildingIDCount[targetBuilding]; j++)
                    {
                        if (MainDataStore.canNotConnectedBuildingID[targetBuilding, j] == sourceBuilding)
                        {
                            ForgetFailedBuilding(targetBuilding, j);
                            return(true);
                        }
                    }
                }
                return(false);
                //info.m_vehicleAI.StartTransfer(vehicle, ref vehicles.m_buffer[(int)vehicle], material, offerOut);
            }
            else if (active2 && offerOut.Vehicle != 0)
            {
                ushort targetBuilding = 0;
                ushort sourceBuilding = instance1.m_vehicles.m_buffer[offerOut.Vehicle].m_sourceBuilding;
                targetBuilding = offerIn.Building;

                if ((targetBuilding != 0) && (sourceBuilding != 0))
                {
                    for (int j = 0; j < MainDataStore.canNotConnectedBuildingIDCount[targetBuilding]; j++)
                    {
                        if (MainDataStore.canNotConnectedBuildingID[targetBuilding, j] == sourceBuilding)
                        {
                            ForgetFailedBuilding(targetBuilding, j);
                            return(true);
                        }
                    }
                }
                return(false);
                //info2.m_vehicleAI.StartTransfer(vehicle2, ref vehicles2.m_buffer[(int)vehicle2], material, offerIn);
            }
            else if (active && offerIn.Citizen != 0u)
            {
                DebugLog.LogToFileOnly("Error: No such case active && offerIn.Citizen != 0u");
                return(false);
            }
            else if (active2 && offerOut.Citizen != 0u)
            {
                DebugLog.LogToFileOnly("Error: No such case active && offerOut.Citizen != 0u");
                return(false);
            }
            else if (active2 && offerOut.Building != 0)
            {
                ushort targetBuilding = 0;
                ushort sourceBuilding = offerOut.Building;
                targetBuilding = offerIn.Building;

                if ((targetBuilding != 0) && (sourceBuilding != 0))
                {
                    for (int j = 0; j < MainDataStore.canNotConnectedBuildingIDCount[targetBuilding]; j++)
                    {
                        if (MainDataStore.canNotConnectedBuildingID[targetBuilding, j] == sourceBuilding)
                        {
                            ForgetFailedBuilding(targetBuilding, j);
                            return(true);
                        }
                    }
                }
                return(false);
                //info3.m_buildingAI.StartTransfer(building, ref buildings.m_buffer[(int)building], material, offerIn);
            }
            else if (active && offerIn.Building != 0)
            {
                ushort targetBuilding = 0;
                ushort sourceBuilding = offerIn.Building;
                targetBuilding = offerOut.Building;

                if ((targetBuilding != 0) && (sourceBuilding != 0))
                {
                    for (int j = 0; j < MainDataStore.canNotConnectedBuildingIDCount[targetBuilding]; j++)
                    {
                        if (MainDataStore.canNotConnectedBuildingID[targetBuilding, j] == sourceBuilding)
                        {
                            ForgetFailedBuilding(targetBuilding, j);
                            return(true);
                        }
                    }
                }
                return(false);
                //info4.m_buildingAI.StartTransfer(building2, ref buildings2.m_buffer[(int)building2], material, offerOut);
            }
            return(false);
        }
        public static float WareHouseFirst(TransferOffer offerIn, TransferOffer offerOut, TransferReason material)
        {
            if (!MoreEffectiveTransfer.warehouseFirst)
            {
                return(1f);
            }

            switch (material)
            {
            case TransferReason.Oil:
            case TransferReason.Ore:
            case TransferReason.Coal:
            case TransferReason.Petrol:
            case TransferReason.Food:
            case TransferReason.Grain:
            case TransferReason.Lumber:
            case TransferReason.Logs:
            case TransferReason.Goods:
            case TransferReason.LuxuryProducts:
            case TransferReason.AnimalProducts:
            case TransferReason.Flours:
            case TransferReason.Petroleum:
            case TransferReason.Plastics:
            case TransferReason.Metals:
            case TransferReason.Glass:
            case TransferReason.PlanedTimber:
            case TransferReason.Paper:
                break;

            default:
                return(1f);
            }


            BuildingManager bM = Singleton <BuildingManager> .instance;

            if (bM.m_buildings.m_buffer[offerIn.Building].Info.m_buildingAI is WarehouseAI)
            {
                return(1000f);
            }
            else if (bM.m_buildings.m_buffer[offerOut.Building].Info.m_buildingAI is WarehouseAI)
            {
                return(1000f);
            }

            return(1f);
        }
Example #10
0
        public async Task GivenApprovedVacancyReviewCommand_AndVacancyHasBeenTransferredSinceReviewWasCreated_ThenDoNotRaiseVacancyApprovedEventAndCloseVacancy(TransferReason transferReason, ClosureReason expectedClosureReason)
        {
            var transferInfo = new TransferInfo
            {
                Reason = transferReason
            };

            var existingVacancy = _autoFixture.Build <Vacancy>()
                                  .With(x => x.TransferInfo, transferInfo)
                                  .Create();

            _mockVacancyRepository.Setup(x => x.GetVacancyAsync(existingVacancy.VacancyReference.Value)).ReturnsAsync(existingVacancy);

            _mockVacancyReviewRepository.Setup(x => x.GetAsync(_existingReviewId)).ReturnsAsync(new VacancyReview
            {
                Id               = _existingReviewId,
                CreatedDate      = _mockTimeProvider.Object.Now.AddHours(-5),
                Status           = ReviewStatus.UnderReview,
                VacancyReference = existingVacancy.VacancyReference.Value,
                VacancySnapshot  = new Vacancy()
            });

            var command = new ApproveVacancyReviewCommand(_existingReviewId, "comment", new List <ManualQaFieldIndicator>(), new List <Guid>());

            await _sut.Handle(command, CancellationToken.None);

            _mockVacancyReviewRepository.Verify(x => x.UpdateAsync(It.Is <VacancyReview>(r => r.Id == _existingReviewId)), Times.Once);
            _mockMessaging.Verify(x => x.PublishEvent(It.IsAny <VacancyReviewApprovedEvent>()), Times.Never);

            existingVacancy.Status.Should().Be(VacancyStatus.Closed);
            existingVacancy.ClosureReason.Should().Be(expectedClosureReason);
            _mockVacancyRepository.Verify(x => x.UpdateAsync(existingVacancy), Times.Once);
            _mockCommunicationQueueService.Verify(c => c.AddMessageAsync(It.Is <CommunicationRequest>(r => r.RequestType == CommunicationConstants.RequestType.ProviderBlockedEmployerNotificationForLiveVacancies)));
        }
        public static bool CheckWareHouseForCity(TransferOffer offerIn, TransferOffer offerOut, TransferReason material)
        {
            BuildingManager bM = Singleton <BuildingManager> .instance;

            if (bM.m_buildings.m_buffer[offerIn.Building].Info.m_buildingAI is WarehouseAI)
            {
                if (bM.m_buildings.m_buffer[offerOut.Building].Info.m_buildingAI is OutsideConnectionAI)
                {
                    if (bM.m_buildings.m_buffer[offerIn.Building].m_flags.IsFlagSet(Building.Flags.Filling) || bM.m_buildings.m_buffer[offerIn.Building].m_flags.IsFlagSet(Building.Flags.Downgrading))
                    {
                        if (MoreEffectiveTransfer.warehouseOutsideControl)
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                }
            }
            else
            {
                if (bM.m_buildings.m_buffer[offerOut.Building].Info.m_buildingAI is OutsideConnectionAI)
                {
                    if (MoreEffectiveTransfer.warehouseTransfer)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }


            if (bM.m_buildings.m_buffer[offerOut.Building].Info.m_buildingAI is WarehouseAI)
            {
                if (bM.m_buildings.m_buffer[offerIn.Building].Info.m_buildingAI is OutsideConnectionAI)
                {
                    if (bM.m_buildings.m_buffer[offerOut.Building].m_flags.IsFlagSet(Building.Flags.Filling) || bM.m_buildings.m_buffer[offerOut.Building].m_flags.IsFlagSet(Building.Flags.Downgrading))
                    {
                        if (MoreEffectiveTransfer.warehouseOutsideControl)
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                }
            }
            else
            {
                if (bM.m_buildings.m_buffer[offerIn.Building].Info.m_buildingAI is OutsideConnectionAI)
                {
                    if (MoreEffectiveTransfer.warehouseTransfer)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }

            return(false);
        }
        public async Task Run(long ukprn, long legalEntityId, Guid userRef, string userEmail, string userName, TransferReason transferReason)
        {
            var vacancies = await _vacanciesQuery.GetProviderOwnedVacanciesForLegalEntityAsync(ukprn, legalEntityId);

            var tasks = vacancies.Select(vac => _queueService.AddMessageAsync(new TransferVacancyToLegalEntityQueueMessage
            {
                VacancyReference = vac.VacancyReference.Value,
                UserRef          = userRef,
                UserEmailAddress = userEmail,
                UserName         = userName,
                TransferReason   = transferReason
            }));

            await Task.WhenAll(tasks);
        }
        public async Task TransferVacancyToLegalEntityAsync(Vacancy vacancy, VacancyUser initiatingUser, TransferReason transferReason)
        {
            var originalStatus = vacancy.Status;

            switch (originalStatus)
            {
            case VacancyStatus.Draft:
            case VacancyStatus.Referred:
            case VacancyStatus.Closed:
                break;

            case VacancyStatus.Submitted:
                var vr = await _vacancyReviewQuery.GetLatestReviewByReferenceAsync(vacancy.VacancyReference.Value);

                if (vr.Status != ReviewStatus.UnderReview)
                {
                    vacancy.Status = VacancyStatus.Draft;
                }
                break;

            case VacancyStatus.Live:
                CloseVacancy(vacancy, initiatingUser);
                break;

            case VacancyStatus.Approved:
                vacancy.ApprovedDate = null;
                CloseVacancy(vacancy, initiatingUser);
                break;

            case VacancyStatus.Rejected:
            case VacancyStatus.Review:
                vacancy.Status = VacancyStatus.Draft;
                break;

            default:
                throw new ArgumentException(string.Format(ExceptionMessages.UnrecognisedStatusToTransferVacancyFrom, originalStatus.ToString(), vacancy.VacancyReference));
            }

            vacancy.TransferInfo = new TransferInfo
            {
                Ukprn             = vacancy.TrainingProvider.Ukprn.GetValueOrDefault(),
                ProviderName      = vacancy.TrainingProvider.Name,
                LegalEntityName   = vacancy.LegalEntityName,
                TransferredByUser = initiatingUser,
                TransferredDate   = _timeProvider.Now,
                Reason            = transferReason
            };

            vacancy.OwnerType       = OwnerType.Employer;
            vacancy.ProviderContact = null;
            vacancy.SubmittedByUser = null;
            vacancy.ReviewByUser    = null;

            await _vacancyRepository.UpdateAsync(vacancy);
        }
 private static bool CanUseNewMatchOffers(ushort buildingID, TransferReason material)
 {
     //For RealConstruction Mod, always use new matchoffers
     return(true);
 }
        public EmployerTransferredVacanciesAlertViewModel GetTransferredVacanciesAlert(IEnumerable <VacancySummary> vacancies, TransferReason reason, DateTime?userLastDismissedDate)
        {
            if (userLastDismissedDate.HasValue == false)
            {
                userLastDismissedDate = DateTime.MinValue;
            }

            var transferredVacancies = vacancies.Where(v =>
                                                       v.TransferInfoReason == reason &&
                                                       v.TransferInfoTransferredDate > userLastDismissedDate)
                                       .ToList();

            if (transferredVacancies.Any() == false)
            {
                return(null);
            }

            var transferredVacanciesProviderNames = transferredVacancies
                                                    .Select(v => v.TransferInfoProviderName)
                                                    .Distinct()
                                                    .OrderBy(p => p)
                                                    .ToList();

            return(new EmployerTransferredVacanciesAlertViewModel
            {
                TransferredVacanciesCount = transferredVacancies.Count,
                TransferredVacanciesProviderNames = transferredVacanciesProviderNames
            });
        }
Example #16
0
 public GpuQuickPaymentProvider(IUser user, string subject, string orderNo, Currency currency, GpuPayType payType, TransferReason bizType, string notifyUrl, string returnUrl = null)
 {
     this._user      = user;
     this._subject   = subject;
     this._orderNo   = orderNo;
     this._notifyUrl = notifyUrl;
     this._returnUrl = returnUrl;
     this._payType   = payType;
     this._currency  = currency;
     this._bizType   = bizType;
 }
        private static void MatchOffers(TransferReason material)
        {
            if (!_init)
            {
                Init();
                _init = true;
            }

            if (material != TransferReason.None)
            {
                float distanceMultiplier = 1E-07f;
                float maxDistance        = (distanceMultiplier == 0f) ? 0f : (0.01f / distanceMultiplier);
                for (int priority = 7; priority >= 0; priority--)
                {
                    int offerIdex     = (int)material * 8 + priority;
                    int incomingCount = m_incomingCount[offerIdex];
                    int outgoingCount = m_outgoingCount[offerIdex];
                    int incomingIdex  = 0;
                    int outgoingIdex  = 0;
                    int oldPriority   = priority;
                    // NON-STOCK CODE START
                    //In Real Gas Station Mod, we use outgoing first mode.
                    byte matchOffersMode = 1;
                    bool isLoopValid     = false;
                    if (matchOffersMode == 2)
                    {
                        isLoopValid = (incomingIdex < incomingCount || outgoingIdex < outgoingCount);
                    }
                    else if (matchOffersMode == 1)
                    {
                        isLoopValid = (outgoingIdex < outgoingCount);
                    }
                    else if (matchOffersMode == 0)
                    {
                        isLoopValid = (incomingIdex < incomingCount);
                    }

                    // NON-STOCK CODE END
                    while (isLoopValid)
                    {
                        //use incomingOffer to match outgoingOffer
                        if (incomingIdex < incomingCount && (matchOffersMode != 1))
                        {
                            TransferOffer incomingOffer = m_incomingOffers[offerIdex * 256 + incomingIdex];
                            // NON-STOCK CODE START
                            Vector3 incomingPositionNew  = Vector3.zero;
                            bool    canUseNewMatchOffers = true;
                            if (canUseNewMatchOffers)
                            {
                                if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[incomingOffer.Building].m_flags.IsFlagSet(Building.Flags.Untouchable))
                                {
                                    incomingPositionNew = Singleton <BuildingManager> .instance.m_buildings.m_buffer[incomingOffer.Building].m_position;
                                }
                                else
                                {
                                    incomingPositionNew = incomingOffer.Position;
                                }
                            }
                            // NON-STOCK CODE END
                            Vector3 incomingPosition    = incomingOffer.Position;
                            int     incomingOfferAmount = incomingOffer.Amount;
                            do
                            {
                                int incomingPriority = Mathf.Max(0, 2 - priority);
                                // NON-STOCK CODE START
                                float currentShortestDistance = -1f;
                                if (canUseNewMatchOffers)
                                {
                                    priority         = 7;
                                    incomingPriority = 0;
                                }
                                else
                                {
                                    priority         = oldPriority;
                                    incomingPriority = Mathf.Max(0, 2 - priority);
                                }
                                // NON-STOCK CODE END
                                int   incomingPriorityExclude    = (!incomingOffer.Exclude) ? incomingPriority : Mathf.Max(0, 3 - priority);
                                int   validPriority              = -1;
                                int   validOutgoingIdex          = -1;
                                float distanceOffsetPre          = -1f;
                                int   outgoingIdexInsideIncoming = outgoingIdex;
                                for (int incomingPriorityInside = priority; incomingPriorityInside >= incomingPriority; incomingPriorityInside--)
                                {
                                    int outgoingIdexWithPriority  = (int)material * 8 + incomingPriorityInside;
                                    int outgoingCountWithPriority = m_outgoingCount[outgoingIdexWithPriority];
                                    //To let incomingPriorityInsideFloat!=0
                                    float incomingPriorityInsideFloat = (float)incomingPriorityInside + 0.1f;
                                    //Higher priority will get more chance to match
                                    //UseNewMatchOffers to find the shortest transfer building
                                    if ((distanceOffsetPre >= incomingPriorityInsideFloat) && !canUseNewMatchOffers)
                                    {
                                        break;
                                    }
                                    //Find the nearest offer to match in every priority.
                                    for (int i = outgoingIdexInsideIncoming; i < outgoingCountWithPriority; i++)
                                    {
                                        TransferOffer outgoingOfferPre = m_outgoingOffers[outgoingIdexWithPriority * 256 + i];
                                        if (incomingOffer.m_object != outgoingOfferPre.m_object && (!outgoingOfferPre.Exclude || incomingPriorityInside >= incomingPriorityExclude))
                                        {
                                            float incomingOutgoingDistance = Vector3.SqrMagnitude(outgoingOfferPre.Position - incomingPosition);
                                            // NON-STOCK CODE START
                                            Vector3 outgoingPositionNew         = Vector3.zero;
                                            float   incomingOutgoingDistanceNew = 0;
                                            if (canUseNewMatchOffers)
                                            {
                                                if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[outgoingOfferPre.Building].m_flags.IsFlagSet(Building.Flags.Untouchable))
                                                {
                                                    outgoingPositionNew = Singleton <BuildingManager> .instance.m_buildings.m_buffer[outgoingOfferPre.Building].m_position;
                                                }
                                                else
                                                {
                                                    outgoingPositionNew = outgoingOfferPre.Position;
                                                }
                                                incomingOutgoingDistanceNew = Vector3.SqrMagnitude(outgoingPositionNew - incomingPositionNew);
                                                if ((incomingOutgoingDistanceNew < currentShortestDistance) || currentShortestDistance == -1)
                                                {
                                                    validPriority           = incomingPriorityInside;
                                                    validOutgoingIdex       = i;
                                                    currentShortestDistance = incomingOutgoingDistanceNew;
                                                }
                                            }
                                            // NON-STOCK CODE END
                                            float distanceOffset = (!(distanceMultiplier < 0f)) ? (incomingPriorityInsideFloat / (1f + incomingOutgoingDistance * distanceMultiplier)) : (incomingPriorityInsideFloat - incomingPriorityInsideFloat / (1f - incomingOutgoingDistance * distanceMultiplier));
                                            if ((distanceOffset > distanceOffsetPre) && !canUseNewMatchOffers)
                                            {
                                                validPriority     = incomingPriorityInside;
                                                validOutgoingIdex = i;
                                                distanceOffsetPre = distanceOffset;
                                                if ((incomingOutgoingDistance < maxDistance))
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    outgoingIdexInsideIncoming = 0;
                                }
                                // NON-STOCK CODE START
                                if (canUseNewMatchOffers)
                                {
                                    priority = oldPriority;
                                }
                                // NON-STOCK CODE END
                                if (validPriority == -1)
                                {
                                    break;
                                }
                                //Find a validPriority, get outgoingOffer
                                int           matchedOutgoingOfferIdex = (int)material * 8 + validPriority;
                                TransferOffer outgoingOffer            = m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex];
                                int           outgoingOfferAmount      = outgoingOffer.Amount;
                                int           matchedOfferAmount       = Mathf.Min(incomingOfferAmount, outgoingOfferAmount);
                                if (matchedOfferAmount != 0)
                                {
                                    StartTransfer(material, outgoingOffer, incomingOffer, matchedOfferAmount);
                                }
                                incomingOfferAmount -= matchedOfferAmount;
                                outgoingOfferAmount -= matchedOfferAmount;
                                //matched outgoingOffer is empty now
                                if (outgoingOfferAmount == 0)
                                {
                                    int outgoingCountPost = m_outgoingCount[matchedOutgoingOfferIdex] - 1;
                                    m_outgoingCount[matchedOutgoingOfferIdex] = (ushort)outgoingCountPost;
                                    m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex] = m_outgoingOffers[matchedOutgoingOfferIdex * 256 + outgoingCountPost];
                                    if (matchedOutgoingOfferIdex == offerIdex)
                                    {
                                        outgoingCount = outgoingCountPost;
                                    }
                                }
                                else
                                {
                                    outgoingOffer.Amount = outgoingOfferAmount;
                                    m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex] = outgoingOffer;
                                }
                                incomingOffer.Amount = incomingOfferAmount;
                            }while (incomingOfferAmount != 0);
                            //matched incomingOffer is empty now
                            if (incomingOfferAmount == 0)
                            {
                                incomingCount--;
                                m_incomingCount[offerIdex] = (ushort)incomingCount;
                                m_incomingOffers[offerIdex * 256 + incomingIdex] = m_incomingOffers[offerIdex * 256 + incomingCount];
                            }
                            else
                            {
                                incomingOffer.Amount = incomingOfferAmount;
                                m_incomingOffers[offerIdex * 256 + incomingIdex] = incomingOffer;
                                incomingIdex++;
                            }
                        }
                        //For RealConstruction, We only satisify incoming building
                        //use outgoingOffer to match incomingOffer
                        if (outgoingIdex < outgoingCount && (matchOffersMode != 0))
                        {
                            TransferOffer outgoingOffer = m_outgoingOffers[offerIdex * 256 + outgoingIdex];
                            // NON-STOCK CODE START
                            bool    canUseNewMatchOffers = true;
                            Vector3 outgoingPositionNew  = Vector3.zero;
                            if (canUseNewMatchOffers)
                            {
                                if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[outgoingOffer.Building].m_flags.IsFlagSet(Building.Flags.Untouchable))
                                {
                                    outgoingPositionNew = Singleton <BuildingManager> .instance.m_buildings.m_buffer[outgoingOffer.Building].m_position;
                                }
                                else
                                {
                                    outgoingPositionNew = outgoingOffer.Position;
                                }
                            }
                            // NON-STOCK CODE END
                            Vector3 outgoingPosition    = outgoingOffer.Position;
                            int     outgoingOfferAmount = outgoingOffer.Amount;
                            do
                            {
                                int outgoingPriority = Mathf.Max(0, 2 - priority);
                                // NON-STOCK CODE START
                                float currentShortestDistance = -1f;
                                if (canUseNewMatchOffers)
                                {
                                    priority         = 7;
                                    outgoingPriority = 0;
                                }
                                else
                                {
                                    priority         = oldPriority;
                                    outgoingPriority = Mathf.Max(0, 2 - priority);
                                }
                                // NON-STOCK CODE END
                                int   outgoingPriorityExclude    = (!outgoingOffer.Exclude) ? outgoingPriority : Mathf.Max(0, 3 - priority);
                                int   validPriority              = -1;
                                int   validIncomingIdex          = -1;
                                float distanceOffsetPre          = -1f;
                                int   incomingIdexInsideOutgoing = incomingIdex;
                                for (int outgoingPriorityInside = priority; outgoingPriorityInside >= outgoingPriority; outgoingPriorityInside--)
                                {
                                    int incomingIdexWithPriority  = (int)material * 8 + outgoingPriorityInside;
                                    int incomingCountWithPriority = m_incomingCount[incomingIdexWithPriority];
                                    //To let outgoingPriorityInsideFloat!=0
                                    float outgoingPriorityInsideFloat = (float)outgoingPriorityInside + 0.1f;
                                    //Higher priority will get more chance to match
                                    if ((distanceOffsetPre >= outgoingPriorityInsideFloat) && !canUseNewMatchOffers)
                                    {
                                        break;
                                    }
                                    for (int j = incomingIdexInsideOutgoing; j < incomingCountWithPriority; j++)
                                    {
                                        TransferOffer incomingOfferPre = m_incomingOffers[incomingIdexWithPriority * 256 + j];
                                        if (outgoingOffer.m_object != incomingOfferPre.m_object && (!incomingOfferPre.Exclude || outgoingPriorityInside >= outgoingPriorityExclude))
                                        {
                                            float incomingOutgoingDistance = Vector3.SqrMagnitude(incomingOfferPre.Position - outgoingPosition);
                                            // NON-STOCK CODE START
                                            Vector3 incomingPositionNew         = Vector3.zero;
                                            float   incomingOutgoingDistanceNew = 0;
                                            if (canUseNewMatchOffers)
                                            {
                                                if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[incomingOfferPre.Building].m_flags.IsFlagSet(Building.Flags.Untouchable))
                                                {
                                                    incomingPositionNew = Singleton <BuildingManager> .instance.m_buildings.m_buffer[incomingOfferPre.Building].m_position;
                                                }
                                                else
                                                {
                                                    incomingPositionNew = incomingOfferPre.Position;
                                                }
                                                incomingOutgoingDistanceNew = Vector3.SqrMagnitude(outgoingPositionNew - incomingPositionNew);
                                                if ((incomingOutgoingDistanceNew < currentShortestDistance) || currentShortestDistance == -1)
                                                {
                                                    validPriority           = outgoingPriorityInside;
                                                    validIncomingIdex       = j;
                                                    currentShortestDistance = incomingOutgoingDistanceNew;
                                                }
                                            }
                                            // NON-STOCK CODE END
                                            float distanceOffset = (!(distanceMultiplier < 0f)) ? (outgoingPriorityInsideFloat / (1f + incomingOutgoingDistance * distanceMultiplier)) : (outgoingPriorityInsideFloat - outgoingPriorityInsideFloat / (1f - incomingOutgoingDistance * distanceMultiplier));
                                            if ((distanceOffset > distanceOffsetPre) && !canUseNewMatchOffers)
                                            {
                                                validPriority     = outgoingPriorityInside;
                                                validIncomingIdex = j;
                                                distanceOffsetPre = distanceOffset;
                                                if (incomingOutgoingDistance < maxDistance)
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    incomingIdexInsideOutgoing = 0;
                                }
                                // NON-STOCK CODE START
                                if (canUseNewMatchOffers)
                                {
                                    priority = oldPriority;
                                }
                                // NON-STOCK CODE END
                                if (validPriority == -1)
                                {
                                    break;
                                }
                                //Find a validPriority, get incomingOffer
                                int           matchedIncomingOfferIdex = (int)material * 8 + validPriority;
                                TransferOffer incomingOffers           = m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex];
                                int           incomingOffersAmount     = incomingOffers.Amount;
                                int           matchedOfferAmount       = Mathf.Min(outgoingOfferAmount, incomingOffersAmount);
                                if (matchedOfferAmount != 0)
                                {
                                    StartTransfer(material, outgoingOffer, incomingOffers, matchedOfferAmount);
                                }
                                outgoingOfferAmount  -= matchedOfferAmount;
                                incomingOffersAmount -= matchedOfferAmount;
                                //matched incomingOffer is empty now
                                if (incomingOffersAmount == 0)
                                {
                                    int incomingCountPost = m_incomingCount[matchedIncomingOfferIdex] - 1;
                                    m_incomingCount[matchedIncomingOfferIdex] = (ushort)incomingCountPost;
                                    m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex] = m_incomingOffers[matchedIncomingOfferIdex * 256 + incomingCountPost];
                                    if (matchedIncomingOfferIdex == offerIdex)
                                    {
                                        incomingCount = incomingCountPost;
                                    }
                                }
                                else
                                {
                                    incomingOffers.Amount = incomingOffersAmount;
                                    m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex] = incomingOffers;
                                }
                                outgoingOffer.Amount = outgoingOfferAmount;
                            }while (outgoingOfferAmount != 0);
                            //matched outgoingOffer is empty now
                            if (outgoingOfferAmount == 0)
                            {
                                outgoingCount--;
                                m_outgoingCount[offerIdex] = (ushort)outgoingCount;
                                m_outgoingOffers[offerIdex * 256 + outgoingIdex] = m_outgoingOffers[offerIdex * 256 + outgoingCount];
                            }
                            else
                            {
                                outgoingOffer.Amount = outgoingOfferAmount;
                                m_outgoingOffers[offerIdex * 256 + outgoingIdex] = outgoingOffer;
                                outgoingIdex++;
                            }
                        }

                        // NON-STOCK CODE START
                        if (matchOffersMode == 2)
                        {
                            isLoopValid = (incomingIdex < incomingCount || outgoingIdex < outgoingCount);
                        }
                        else if (matchOffersMode == 1)
                        {
                            isLoopValid = (outgoingIdex < outgoingCount);
                        }
                        else if (matchOffersMode == 0)
                        {
                            isLoopValid = (incomingIdex < incomingCount);
                        }
                        // NON-STOCK CODE END
                    }
                }
                for (int k = 0; k < 8; k++)
                {
                    int num40 = (int)material * 8 + k;
                    m_incomingCount[num40] = 0;
                    m_outgoingCount[num40] = 0;
                }
                m_incomingAmount[(int)material] = 0;
                m_outgoingAmount[(int)material] = 0;
            }
        }
        public async Task Run(long ukprn, string employerAccountId, string accountLegalEntityPublicHashedId, Guid userRef, string userEmail, string userName, TransferReason transferReason)
        {
            var vacanciesTask = _vacanciesQuery.GetProviderOwnedVacanciesForLegalEntityAsync(ukprn, accountLegalEntityPublicHashedId);
            var vacanciesWithoutLegalEntityIdTask = GetProviderOwnerVacanciesWithoutLegalEntityThatMustBeTransferred(ukprn, employerAccountId, accountLegalEntityPublicHashedId);

            await Task.WhenAll(vacanciesTask, vacanciesWithoutLegalEntityIdTask);

            var vacancies = vacanciesTask.Result.Concat(vacanciesWithoutLegalEntityIdTask.Result);

            var tasks = vacancies.Select(vac => _queueService.AddMessageAsync(new TransferVacancyToLegalEntityQueueMessage
            {
                VacancyReference = vac.VacancyReference.Value,
                UserRef          = userRef,
                UserEmailAddress = userEmail,
                UserName         = userName,
                TransferReason   = transferReason
            }));

            await Task.WhenAll(tasks);
        }
        public static float ApplyPriority(TransferOffer offerIn, TransferOffer offerOut, TransferReason material, bool isOfferIn)
        {
            if (!MoreEffectiveTransfer.applyPrority)
            {
                return(1f);
            }

            bool canApplyPriority = false;

            switch (material)
            {
            case TransferReason.Oil:
            case TransferReason.Ore:
            case TransferReason.Coal:
            case TransferReason.Petrol:
            case TransferReason.Food:
            case TransferReason.Grain:
            case TransferReason.Lumber:
            case TransferReason.Logs:
            case TransferReason.Goods:
            case TransferReason.LuxuryProducts:
            case TransferReason.AnimalProducts:
            case TransferReason.Flours:
            case TransferReason.Petroleum:
            case TransferReason.Plastics:
            case TransferReason.Metals:
            case TransferReason.Glass:
            case TransferReason.PlanedTimber:
            case TransferReason.Paper:
            case TransferReason.Garbage:
            case TransferReason.Snow:
            case TransferReason.RoadMaintenance:
            case TransferReason.ParkMaintenance:
            case TransferReason.Crime:
            case TransferReason.Fire:
            case TransferReason.GarbageMove:
            case TransferReason.CriminalMove:
            case TransferReason.DeadMove:
            case TransferReason.Dead:
            case TransferReason.SnowMove:
            case TransferReason.Taxi:
                canApplyPriority = true; break;

            default: canApplyPriority = false; break;
            }

            float priority = 1f;

            if (canApplyPriority)
            {
                if (isOfferIn)
                {
                    priority = offerIn.Priority + 1f;
                }
                else
                {
                    priority = offerOut.Priority + 1f;
                }
            }
            return(priority);
        }
Example #20
0
 public static void Postfix(ushort buildingID, ref Building data, int productionRate, int cargoCapacity, int residentCapacity, int touristFactor0, int touristFactor1, int touristFactor2, TransferReason dummyTrafficReason, int dummyTrafficFactor)
 {
     IndustriesImportExportController.instance.aiAddingConnections = false;
 }
        public static void MatchOffers(TransferReason material)
        {
            if (!_init)
            {
                Init();
                _init = true;
            }

            if (material != TransferReason.None)
            {
                float distanceMultiplier = TransferManagerGetDistanceMultiplierDG(material);
                float maxDistance        = (distanceMultiplier == 0f) ? 0f : (0.01f / distanceMultiplier);
                for (int priority = 7; priority >= 0; priority--)
                {
                    int offerIdex     = (int)material * 8 + priority;
                    int incomingCount = m_incomingCount[offerIdex];
                    int outgoingCount = m_outgoingCount[offerIdex];
                    int incomingIdex  = 0;
                    int outgoingIdex  = 0;
                    while (incomingIdex < incomingCount || outgoingIdex < outgoingCount)
                    {
                        //use incomingOffer to match outgoingOffer
                        if (incomingIdex < incomingCount)
                        {
                            TransferOffer incomingOffer       = m_incomingOffers[offerIdex * 256 + incomingIdex];
                            Vector3       incomingPosition    = incomingOffer.Position;
                            int           incomingOfferAmount = incomingOffer.Amount;
                            // NON-STOCK CODE START
                            TransferReason material2 = material;
                            do
                            {
                                // NON-STOCK CODE END
                                do
                                {
                                    int   incomingPriority           = Mathf.Max(0, 2 - priority);
                                    int   incomingPriorityExclude    = (!incomingOffer.Exclude) ? incomingPriority : Mathf.Max(0, 3 - priority);
                                    int   validPriority              = -1;
                                    int   validOutgoingIdex          = -1;
                                    float distanceOffsetPre          = -1f;
                                    int   outgoingIdexInsideIncoming = outgoingIdex;
                                    for (int incomingPriorityInside = priority; incomingPriorityInside >= incomingPriority; incomingPriorityInside--)
                                    {
                                        int outgoingIdexWithPriority  = (int)material2 * 8 + incomingPriorityInside;
                                        int outgoingCountWithPriority = m_outgoingCount[outgoingIdexWithPriority];
                                        //To let incomingPriorityInsideFloat!=0
                                        float incomingPriorityInsideFloat = (float)incomingPriorityInside + 0.1f;
                                        //Higher priority will get more chance to match
                                        if (distanceOffsetPre >= incomingPriorityInsideFloat)
                                        {
                                            break;
                                        }
                                        //Find the nearest offer to match in every priority.
                                        for (int i = outgoingIdexInsideIncoming; i < outgoingCountWithPriority; i++)
                                        {
                                            TransferOffer outgoingOfferPre = m_outgoingOffers[outgoingIdexWithPriority * 256 + i];
                                            if (incomingOffer.m_object != outgoingOfferPre.m_object && (!outgoingOfferPre.Exclude || incomingPriorityInside >= incomingPriorityExclude))
                                            {
                                                float incomingOutgoingDistance = Vector3.SqrMagnitude(outgoingOfferPre.Position - incomingPosition);
                                                float distanceOffset           = (!(distanceMultiplier < 0f)) ? (incomingPriorityInsideFloat / (1f + incomingOutgoingDistance * distanceMultiplier)) : (incomingPriorityInsideFloat - incomingPriorityInsideFloat / (1f - incomingOutgoingDistance * distanceMultiplier));
                                                if (distanceOffset > distanceOffsetPre)
                                                {
                                                    validPriority     = incomingPriorityInside;
                                                    validOutgoingIdex = i;
                                                    distanceOffsetPre = distanceOffset;
                                                    if (incomingOutgoingDistance < maxDistance)
                                                    {
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                        outgoingIdexInsideIncoming = 0;
                                    }
                                    if (validPriority == -1)
                                    {
                                        break;
                                    }
                                    //Find a validPriority, get outgoingOffer
                                    int           matchedOutgoingOfferIdex = (int)material2 * 8 + validPriority;
                                    TransferOffer outgoingOffer            = m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex];
                                    int           outgoingOfferAmount      = outgoingOffer.Amount;
                                    int           matchedOfferAmount       = Mathf.Min(incomingOfferAmount, outgoingOfferAmount);
                                    if (matchedOfferAmount != 0)
                                    {
                                        TransferManagerStartTransferDG(instance, material2, outgoingOffer, incomingOffer, matchedOfferAmount);
                                    }
                                    incomingOfferAmount -= matchedOfferAmount;
                                    outgoingOfferAmount -= matchedOfferAmount;
                                    //matched outgoingOffer is empty now
                                    if (outgoingOfferAmount == 0)
                                    {
                                        int outgoingCountPost = m_outgoingCount[matchedOutgoingOfferIdex] - 1;
                                        m_outgoingCount[matchedOutgoingOfferIdex] = (ushort)outgoingCountPost;
                                        m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex] = m_outgoingOffers[matchedOutgoingOfferIdex * 256 + outgoingCountPost];
                                        if (matchedOutgoingOfferIdex == offerIdex)
                                        {
                                            outgoingCount = outgoingCountPost;
                                        }
                                    }
                                    else
                                    {
                                        outgoingOffer.Amount = outgoingOfferAmount;
                                        m_outgoingOffers[matchedOutgoingOfferIdex * 256 + validOutgoingIdex] = outgoingOffer;
                                    }
                                    incomingOffer.Amount = incomingOfferAmount;
                                }while (incomingOfferAmount != 0);
                                // NON-STOCK CODE START
                                if (incomingOfferAmount == 0 || material2 < TransferManager.TransferReason.Worker0 || TransferManager.TransferReason.Worker3 <= material2)
                                {
                                    break;
                                }
                                material2++;
                            } while (true);
                            // NON-STOCK CODE END
                            //matched incomingOffer is empty now
                            if (incomingOfferAmount == 0)
                            {
                                incomingCount--;
                                m_incomingCount[offerIdex] = (ushort)incomingCount;
                                m_incomingOffers[offerIdex * 256 + incomingIdex] = m_incomingOffers[offerIdex * 256 + incomingCount];
                            }
                            else
                            {
                                incomingOffer.Amount = incomingOfferAmount;
                                m_incomingOffers[offerIdex * 256 + incomingIdex] = incomingOffer;
                                incomingIdex++;
                            }
                        }
                        //use outgoingOffer to match incomingOffer
                        if (outgoingIdex < outgoingCount)
                        {
                            TransferOffer outgoingOffer         = m_outgoingOffers[offerIdex * 256 + outgoingIdex];
                            Vector3       outgoingOfferPosition = outgoingOffer.Position;
                            int           outgoingOfferAmount   = outgoingOffer.Amount;
                            // NON-STOCK CODE START
                            TransferReason material2 = material;
                            do
                            {
                                // NON-STOCK CODE END
                                do
                                {
                                    int   outgoingPriority           = Mathf.Max(0, 2 - priority);
                                    int   outgoingPriorityExclude    = (!outgoingOffer.Exclude) ? outgoingPriority : Mathf.Max(0, 3 - priority);
                                    int   validPriority              = -1;
                                    int   validIncomingIdex          = -1;
                                    float distanceOffsetPre          = -1f;
                                    int   incomingIdexInsideOutgoing = incomingIdex;
                                    for (int outgoingPriorityInside = priority; outgoingPriorityInside >= outgoingPriority; outgoingPriorityInside--)
                                    {
                                        int incomingIdexWithPriority  = (int)material2 * 8 + outgoingPriorityInside;
                                        int incomingCountWithPriority = m_incomingCount[incomingIdexWithPriority];
                                        //To let outgoingPriorityInsideFloat!=0
                                        float outgoingPriorityInsideFloat = (float)outgoingPriorityInside + 0.1f;
                                        //Higher priority will get more chance to match
                                        if (distanceOffsetPre >= outgoingPriorityInsideFloat)
                                        {
                                            break;
                                        }
                                        for (int j = incomingIdexInsideOutgoing; j < incomingCountWithPriority; j++)
                                        {
                                            TransferOffer incomingOfferPre = m_incomingOffers[incomingIdexWithPriority * 256 + j];
                                            if (outgoingOffer.m_object != incomingOfferPre.m_object && (!incomingOfferPre.Exclude || outgoingPriorityInside >= outgoingPriorityExclude))
                                            {
                                                float incomingOutgoingDistance = Vector3.SqrMagnitude(incomingOfferPre.Position - outgoingOfferPosition);
                                                float distanceOffset           = (!(distanceMultiplier < 0f)) ? (outgoingPriorityInsideFloat / (1f + incomingOutgoingDistance * distanceMultiplier)) : (outgoingPriorityInsideFloat - outgoingPriorityInsideFloat / (1f - incomingOutgoingDistance * distanceMultiplier));
                                                if (distanceOffset > distanceOffsetPre)
                                                {
                                                    validPriority     = outgoingPriorityInside;
                                                    validIncomingIdex = j;
                                                    distanceOffsetPre = distanceOffset;
                                                    if (incomingOutgoingDistance < maxDistance)
                                                    {
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                        incomingIdexInsideOutgoing = 0;
                                    }
                                    if (validPriority == -1)
                                    {
                                        break;
                                    }
                                    //Find a validPriority, get incomingOffer
                                    int           matchedIncomingOfferIdex = (int)material2 * 8 + validPriority;
                                    TransferOffer incomingOffer            = m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex];
                                    int           incomingOfferAmount      = incomingOffer.Amount;
                                    int           matchedOfferAmount       = Mathf.Min(outgoingOfferAmount, incomingOfferAmount);
                                    if (matchedOfferAmount != 0)
                                    {
                                        TransferManagerStartTransferDG(instance, material2, outgoingOffer, incomingOffer, matchedOfferAmount);
                                    }
                                    outgoingOfferAmount -= matchedOfferAmount;
                                    incomingOfferAmount -= matchedOfferAmount;
                                    //matched incomingOffer is empty now
                                    if (incomingOfferAmount == 0)
                                    {
                                        int incomingCountPost = m_incomingCount[matchedIncomingOfferIdex] - 1;
                                        m_incomingCount[matchedIncomingOfferIdex] = (ushort)incomingCountPost;
                                        m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex] = m_incomingOffers[matchedIncomingOfferIdex * 256 + incomingCountPost];
                                        if (matchedIncomingOfferIdex == offerIdex)
                                        {
                                            incomingCount = incomingCountPost;
                                        }
                                    }
                                    else
                                    {
                                        incomingOffer.Amount = incomingOfferAmount;
                                        m_incomingOffers[matchedIncomingOfferIdex * 256 + validIncomingIdex] = incomingOffer;
                                    }
                                    outgoingOffer.Amount = outgoingOfferAmount;
                                }while (outgoingOfferAmount != 0);
                                // NON-STOCK CODE START
                                if (outgoingOfferAmount == 0 || material2 <= TransferManager.TransferReason.Worker0 || TransferManager.TransferReason.Worker3 < material2)
                                {
                                    break;
                                }
                                material2--;
                            } while (true);
                            // NON-STOCK CODE END
                            //matched outgoingOffer is empty now
                            if (outgoingOfferAmount == 0)
                            {
                                outgoingCount--;
                                m_outgoingCount[offerIdex] = (ushort)outgoingCount;
                                m_outgoingOffers[offerIdex * 256 + outgoingIdex] = m_outgoingOffers[offerIdex * 256 + outgoingCount];
                            }
                            else
                            {
                                outgoingOffer.Amount = outgoingOfferAmount;
                                m_outgoingOffers[offerIdex * 256 + outgoingIdex] = outgoingOffer;
                                outgoingIdex++;
                            }
                        }
                    }
                }
                for (int k = 0; k < 8; k++)
                {
                    int num40 = (int)material * 8 + k;
                    m_incomingCount[num40] = 0;
                    m_outgoingCount[num40] = 0;
                }
                m_incomingAmount[(int)material] = 0;
                m_outgoingAmount[(int)material] = 0;
            }
        }
        public async Task Run(long vacancyReference, Guid userRef, string userEmailAddress, string userName, TransferReason transferReason)
        {
            var vacancyToTransfer = await _vacancyRepository.GetVacancyAsync(vacancyReference);

            if (vacancyToTransfer != null)
            {
                await _messaging.SendCommandAsync(new TransferVacancyToLegalEntityCommand(vacancyToTransfer.VacancyReference.GetValueOrDefault(), userRef, userEmailAddress, userName, transferReason));
            }
        }
 public TransferVacancyToLegalEntityCommand(long vacancyReference, Guid userRef, string userEmailAddress, string userName, TransferReason transferReason)
 {
     VacancyReference = vacancyReference;
     UserRef          = userRef;
     UserEmailAddress = userEmailAddress;
     UserName         = userName;
     TransferReason   = transferReason;
 }
        public static bool CanWareHouseTransfer(TransferOffer offerIn, TransferOffer offerOut, TransferReason material)
        {
            BuildingManager bM = Singleton <BuildingManager> .instance;

            if (offerIn.Building == 0 || offerIn.Building > Singleton <BuildingManager> .instance.m_buildings.m_size)
            {
                return(true);
            }

            if (offerOut.Building == 0 || offerOut.Building > Singleton <BuildingManager> .instance.m_buildings.m_size)
            {
                return(true);
            }

            if (bM.m_buildings.m_buffer[offerOut.Building].Info.m_buildingAI is WarehouseAI)
            {
                if (bM.m_buildings.m_buffer[offerIn.Building].Info.m_buildingAI is OutsideConnectionAI)
                {
                    if (MoreEffectiveTransfer.warehouseAdvancedBalance)
                    {
                        var AI = bM.m_buildings.m_buffer[offerOut.Building].Info.m_buildingAI as WarehouseAI;
                        TransferManager.TransferReason actualTransferReason = AI.GetActualTransferReason(offerOut.Building, ref bM.m_buildings.m_buffer[offerOut.Building]);
                        if (actualTransferReason != TransferManager.TransferReason.None)
                        {
                            int budget = Singleton <EconomyManager> .instance.GetBudget(AI.m_info.m_class);

                            int productionRate = PlayerBuildingAI.GetProductionRate(100, budget);
                            int num            = (productionRate * AI.m_truckCount + 99) / 100;
                            int num2           = 0;
                            int num3           = 0;
                            int num4           = 0;
                            int num5           = 0;
                            CustomCommonBuildingAI.InitDelegate();
                            CustomCommonBuildingAI.CalculateOwnVehicles(AI, offerOut.Building, ref bM.m_buildings.m_buffer[offerOut.Building], actualTransferReason, ref num2, ref num3, ref num4, ref num5);
                            if (num2 * 1.25f > (num - 1))
                            {
                                return(false);
                            }
                            else
                            {
                                return(true);
                            }
                        }
                    }
                    else
                    {
                        return(true);
                    }
                }
            }

            return(true);
        }
Example #25
0
 private void onBankingSystemBalanceIncreased(string accountId, decimal amount, TransferReason reason)
 {
     foreach (var playerId in BankingSystem.Instance.api.getActivePlayersFromAccount(accountId))
     {
         Uconomy.Instance.BalanceUpdated(playerId, amount);
     }
 }
Example #26
0
        public async Task GivenExistingLiveProviderOwnedVacancy_ThenProcessTransferAndVerifyVacancyClosedEventRaised(TransferReason transferReason)
        {
            var existingVacancy = GetTestProviderOwnedVacancy();

            existingVacancy.Status = VacancyStatus.Live;
            _mockVacancyRepository.Setup(x => x.GetVacancyAsync(existingVacancy.VacancyReference.GetValueOrDefault()))
            .ReturnsAsync(existingVacancy);

            var command = new TransferVacancyToLegalEntityCommand(existingVacancy.VacancyReference.GetValueOrDefault(), _existingUserGuid, UserEmailAddress, UserName, transferReason);

            await _sut.Handle(command, CancellationToken.None);

            _mockVacancyRepository.Verify(x => x.GetVacancyAsync(It.IsAny <long>()), Times.Once);
            _mockVacancyReviewTransferService.Verify(x => x.CloseVacancyReview(existingVacancy.VacancyReference.Value, transferReason), Times.Never);
            _mockMessaging.Verify(x => x.PublishEvent(It.IsAny <VacancyClosedEvent>()), Times.Once);
            _mockMessaging.Verify(x => x.PublishEvent(It.IsAny <VacancyTransferredEvent>()), Times.Once);
        }
Example #27
0
        private async Task ProcessTransferringVacancy(Vacancy vacancy, VacancyUser user, TransferReason transferReason)
        {
            _logger.LogInformation($"Starting transfer of vacancy {vacancy.VacancyReference.Value} to Legal Entity. Transfer reason: {transferReason.ToString()}");
            var originalStatus = vacancy.Status;

            await _vacancyTransferService.TransferVacancyToLegalEntityAsync(vacancy, user, transferReason);

            switch (originalStatus)
            {
            case VacancyStatus.Submitted:
                await _vacancyReviewTransferService.CloseVacancyReview(vacancy.VacancyReference.GetValueOrDefault(), transferReason);

                break;

            case VacancyStatus.Approved:
            case VacancyStatus.Live:
                await _messaging.PublishEvent(new VacancyClosedEvent
                {
                    VacancyReference = vacancy.VacancyReference.Value,
                    VacancyId        = vacancy.Id
                });

                break;

            default:
                break;
            }

            await _messaging.PublishEvent(new VacancyTransferredEvent
            {
                VacancyId        = vacancy.Id,
                VacancyReference = vacancy.VacancyReference.GetValueOrDefault()
            });

            _logger.LogInformation($"Finished transfer of vacancy {vacancy.VacancyReference.Value} to Legal Entity. Transfer reason: {transferReason.ToString()}");
        }
Example #28
0
 public TransferProviderVacancyCommand(Guid vacancyId, VacancyUser user, DateTime transferredDate, TransferReason reason)
 {
     VacancyId         = vacancyId;
     TransferredByUser = user;
     TransferredDate   = transferredDate;
     Reason            = reason;
 }