Пример #1
0
    private RichAccommodationDetails GetDbAccommodation(Contracts.MultilingualAccommodation accommodation, bool isActive,
                                                        DeactivationReasons deactivationReason = DeactivationReasons.None)
    {
        var locationIds = _actualLocationsSearchHelper.GetActualLocationIds(accommodation.Location);
        var utcNow      = DateTimeOffset.UtcNow;

        var dbAccommodation = new RichAccommodationDetails
        {
            CountryCode                = _country.Code,
            FinalAccommodation         = accommodation,
            SupplierAccommodationCodes = new Dictionary <string, string> {
                { _supplier, accommodation.SupplierCode }
            },
            Created            = utcNow,
            Modified           = utcNow,
            IsCorrected        = true,
            KeyData            = _multilingualDataHelper.GetAccommodationKeyData(accommodation),
            CountryId          = _country.Id,
            LocalityId         = locationIds.LocalityId,
            LocalityZoneId     = locationIds.LocalityZoneId,
            IsActive           = isActive,
            DeactivationReason = deactivationReason
        };

        return(dbAccommodation);
    }
Пример #2
0
    public void RemoveSupplierCodeOrDeactivateNotValid(Contracts.MultilingualAccommodation accommodation, DeactivationReasons deactivationReason)
    {
        if (!_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var existingAccommodation) ||
            existingAccommodation.SupplierAccommodationCodes.Count == 1)
        {
            ProcessDeactivation(accommodation.SupplierCode, deactivationReason, accommodation);
            return;
        }

        var dbAccommodation = new RichAccommodationDetails
        {
            Id          = existingAccommodation.HtId,
            Modified    = DateTimeOffset.UtcNow,
            IsCorrected = false
        };

        _accommodationChangeLogCollectorService.CollectSupplierCodeRemoveEvent(existingAccommodation.HtId,
                                                                               AccommodationChangeEventSources.Updater, _supplier, accommodation.SupplierCode, existingAccommodation.SupplierAccommodationCodes,
                                                                               SupplierCodeRemoveReasonConverter.Convert(deactivationReason));

        foreach (var supplierCode in existingAccommodation.SupplierAccommodationCodes)
        {
            dbAccommodation.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value);
        }

        dbAccommodation.SupplierAccommodationCodes.Remove(_supplier);

        _context.Attach(dbAccommodation);
        var entry = _context.Entry(dbAccommodation);

        entry.Property(ac => ac.Modified).IsModified    = true;
        entry.Property(ac => ac.IsCorrected).IsModified = true;
        entry.Property(ac => ac.SupplierAccommodationCodes).IsModified = true;
    }
Пример #3
0
    private void ProcessDeactivation(string supplierAccommodationCode, DeactivationReasons reason,
                                     Contracts.MultilingualAccommodation accommodation)
    {
        if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(supplierAccommodationCode, out var invalidAccommodation))
        {
            if (invalidAccommodation.DeactivationReason == reason)
            {
                return;
            }

            var accommodationToUpdate = new RichAccommodationDetails
            {
                Id = invalidAccommodation.HtId,
                DeactivationReason = reason,
                Modified           = DateTimeOffset.UtcNow,
                FinalAccommodation = accommodation
            };

            _context.Attach(accommodationToUpdate);

            var entry = _context.Entry(accommodationToUpdate);
            entry.Property(ac => ac.DeactivationReason).IsModified = true;
            entry.Property(ac => ac.Modified).IsModified           = true;
            entry.Property(ac => ac.FinalAccommodation).IsModified = true;

            _accommodationChangeLogCollectorService.CollectDeactivationReasonChangeEvent(invalidAccommodation.HtId, AccommodationChangeEventSources.Updater,
                                                                                         invalidAccommodation.DeactivationReason, reason);

            return;
        }

        if (_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(supplierAccommodationCode,
                                                                               out var existingActive))
        {
            var accommodationToUpdate = new RichAccommodationDetails
            {
                Id                 = existingActive.HtId,
                IsActive           = false,
                DeactivationReason = reason,
                Modified           = DateTimeOffset.UtcNow,
                FinalAccommodation = accommodation
            };

            _context.Attach(accommodationToUpdate);

            var entry = _context.Entry(accommodationToUpdate);
            entry.Property(ac => ac.IsActive).IsModified           = true;
            entry.Property(ac => ac.DeactivationReason).IsModified = true;
            entry.Property(ac => ac.Modified).IsModified           = true;

            _accommodationsToRemove.Add(existingActive.HtId);
            _accommodationChangeLogCollectorService.CollectDeactivationEvent(existingActive.HtId, AccommodationChangeEventSources.Updater, reason,
                                                                             string.Empty);
            return;
        }

        var dbAccommodation = GetDbAccommodation(accommodation, isActive: false, reason);

        _accommodationsToAdd.Add(dbAccommodation);
    }
Пример #4
0
        public List <SlimAccommodationData> GetNearest(Contracts.MultilingualAccommodation accommodation,
                                                       STRtree <SlimAccommodationData> tree)
        {
            var accommodationEnvelope = new Envelope(accommodation.Location.Coordinates.Longitude - 0.01,
                                                     accommodation.Location.Coordinates.Longitude + 0.01,
                                                     accommodation.Location.Coordinates.Latitude - 0.01, accommodation.Location.Coordinates.Latitude + 0.01);

            return(tree.Query(accommodationEnvelope).ToList());
        }
Пример #5
0
    public void AddUncertain(Contracts.MultilingualAccommodation accommodation, int existingHtId, float score)
    {
        int matchedHtId = 0;

        if (_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var existing))
        {
            matchedHtId = existing.HtId;
            if (IsExistUncertainMatch(matchedHtId, existingHtId))
            {
                return;
            }
        }
        else if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(accommodation.SupplierCode, out var existingNotValid))
        {
            matchedHtId = existingNotValid.HtId;
            ActivateOrAddActive(accommodation);

            if (IsExistUncertainMatch(matchedHtId, existingHtId))
            {
                return;
            }
        }

        var utcNow = DateTimeOffset.UtcNow;

        _uncertainAccommodationsToAdd.Add(new AccommodationUncertainMatches
        {
            Score                = score,
            SourceHtId           = existingHtId,
            HtIdToMerge          = matchedHtId != 0 ? matchedHtId : 0,
            Created              = utcNow,
            Modified             = utcNow,
            AccommodationToMatch = matchedHtId == 0 ? GetDbAccommodation(accommodation, isActive: true) : null,
            IsActive             = true
        });


        bool IsExistUncertainMatch(int firstId, int secondId)
        => _accommodationDataStorage.ActiveUncertainMatches.Any(eum
                                                                => eum.Value.Equals(new(firstId, secondId)) ||
                                                                eum.Value.Equals(new(secondId, firstId)));
    }
Пример #6
0
    public void ActivateOrAddActive(Contracts.MultilingualAccommodation accommodation)
    {
        if (_accommodationDataStorage.SupplierActiveAccommodations.ContainsKey(accommodation.SupplierCode))
        {
            return;
        }

        if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(accommodation.SupplierCode, out var existingNotValid))
        {
            // Get accommodation data here, because invalid accommodations are dependant from one supplier no need recalculation
            var accommodationToUpdate = GetDbAccommodation(accommodation, true, DeactivationReasons.None);
            accommodationToUpdate.Id = existingNotValid.HtId;

            _context.Attach(accommodationToUpdate);

            var entry = _context.Entry(accommodationToUpdate);

            // After activation invalids only these fields can be changed
            entry.Property(ac => ac.IsActive).IsModified           = true;
            entry.Property(ac => ac.Modified).IsModified           = true;
            entry.Property(ac => ac.DeactivationReason).IsModified = true;
            entry.Property(ac => ac.KeyData).IsModified            = true;
            entry.Property(ac => ac.FinalAccommodation).IsModified = true;
            entry.Property(ac => ac.LocalityId).IsModified         = true;
            entry.Property(ac => ac.LocalityZoneId).IsModified     = true;
            entry.Property(ac => ac.IsCorrected).IsModified        = true;

            _accommodationsToActivate.Add((new AccommodationData(existingNotValid.HtId, accommodationToUpdate.KeyData.DefaultName,
                                                                 accommodationToUpdate.KeyData.DefaultLocalityName, accommodationToUpdate.KeyData.DefaultCountryName, _country.Code,
                                                                 accommodationToUpdate.KeyData.Coordinates),
                                           accommodationToUpdate.LocalityId ?? default));

            _accommodationChangeLogCollectorService.CollectActivationEvent(existingNotValid.HtId, AccommodationChangeEventSources.Updater,
                                                                           existingNotValid.DeactivationReason, existingNotValid.KeyData, accommodationToUpdate.KeyData);

            return;
        }

        var dbAccommodation = GetDbAccommodation(accommodation, isActive: true);

        _accommodationsToAdd.Add(dbAccommodation);
    }
Пример #7
0
    private bool TryProcessDuplicates(SlimAccommodationData matchedAccommodation, Contracts.MultilingualAccommodation accommodation)
    {
        if (_context.ChangeTracker.Entries <RichAccommodationDetails>()
            .Any(ac => ac.Entity.Id == matchedAccommodation.HtId))
        {
            var entry = _context.ChangeTracker.Entries <RichAccommodationDetails>()
                        .Single(ac => ac.Entity.Id == matchedAccommodation.HtId);

            _logger.LogSameAccommodationInOneSupplierError(_supplier.ToString(), entry.Entity.SupplierAccommodationCodes[_supplier],
                                                           accommodation.SupplierCode);

            if (!_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var duplicate))
            {
                ProcessDeactivation(accommodation.SupplierCode, DeactivationReasons.DuplicateInOneSupplier, accommodation);
                return(true);
            }

            _accommodationChangeLogCollectorService.CollectDuplicateAccommodationSupplierCodesMergeEvent(matchedAccommodation.HtId,
                                                                                                         AccommodationChangeEventSources.Updater, duplicate.HtId, matchedAccommodation.SupplierAccommodationCodes,
                                                                                                         duplicate.SupplierAccommodationCodes);

            var duplicateCodes = new Dictionary <string, string>();
            foreach (var supplierCode in duplicate.SupplierAccommodationCodes)
            {
                if (!entry.Entity.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value))
                {
                    duplicateCodes.Add(supplierCode.Key, supplierCode.Value);
                }
            }

            entry.Entity.IsCorrected = false;
            entry.Property(p => p.SupplierAccommodationCodes).IsModified = true;
            entry.Property(p => p.IsCorrected).IsModified = true;

            DeactivateDuplicate(duplicate, duplicateCodes);
            return(true);
        }

        if (matchedAccommodation.SupplierAccommodationCodes.ContainsKey(_supplier))
        {
            _logger.LogSameAccommodationInOneSupplierError(_supplier, accommodation.SupplierCode,
                                                           matchedAccommodation.SupplierAccommodationCodes[_supplier]);
            if (!_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var duplicate))
            {
                ProcessDeactivation(accommodation.SupplierCode, DeactivationReasons.DuplicateInOneSupplier, accommodation);
                return(true);
            }

            _accommodationChangeLogCollectorService.CollectDuplicateAccommodationSupplierCodesMergeEvent(matchedAccommodation.HtId,
                                                                                                         AccommodationChangeEventSources.Updater, duplicate.HtId, matchedAccommodation.SupplierAccommodationCodes,
                                                                                                         duplicate.SupplierAccommodationCodes);

            var accommodationToUpdate = new RichAccommodationDetails
            {
                Id          = matchedAccommodation.HtId,
                Modified    = DateTimeOffset.UtcNow,
                IsCorrected = false,
                SupplierAccommodationCodes = matchedAccommodation.SupplierAccommodationCodes
            };

            var duplicateCodes = new Dictionary <string, string>();

            foreach (var supplierCode in duplicate.SupplierAccommodationCodes)
            {
                if (!accommodationToUpdate.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value))
                {
                    duplicateCodes.Add(supplierCode.Key, supplierCode.Value);
                }
            }

            _context.Attach(accommodationToUpdate);
            var firstEntry = _context.Entry(accommodationToUpdate);
            firstEntry.Property(e => e.Modified).IsModified    = true;
            firstEntry.Property(e => e.IsCorrected).IsModified = true;
            firstEntry.Property(e => e.SupplierAccommodationCodes).IsModified = true;

            DeactivateDuplicate(duplicate, duplicateCodes);

            return(true);
        }

        return(false);


        void DeactivateDuplicate(SlimAccommodationData duplicate, Dictionary <string, string> duplicateCodes)
        {
            var dbDuplicate = new RichAccommodationDetails
            {
                Id       = duplicate.HtId,
                Modified = DateTimeOffset.UtcNow,
                SupplierAccommodationCodes = duplicateCodes,
                DeactivationReason         = DeactivationReasons.DuplicateInOneSupplier,
                IsActive = false
            };

            _context.Attach(dbDuplicate);
            var secondEntry = _context.Entry(dbDuplicate);

            secondEntry.Property(e => e.Modified).IsModified = true;
            secondEntry.Property(e => e.SupplierAccommodationCodes).IsModified = true;
            secondEntry.Property(e => e.IsActive).IsModified           = true;
            secondEntry.Property(e => e.DeactivationReason).IsModified = true;

            _accommodationsToRemove.Add(duplicate.HtId);

            _accommodationChangeLogCollectorService.CollectDuplicateAccommodationCommonSuppliersCodesRemoveEvent(duplicate.HtId,
                                                                                                                 AccommodationChangeEventSources.Updater, matchedAccommodation.HtId, duplicate.SupplierAccommodationCodes,
                                                                                                                 matchedAccommodation.SupplierAccommodationCodes);

            AddOrUpdateHtAccommodationMappings(duplicate.HtId, matchedAccommodation.HtId);
        }
    }
Пример #8
0
    public void Update(Contracts.MultilingualAccommodation accommodation, SlimAccommodationData matchedAccommodation)
    {
        // This is temporary solution
        if (TryProcessDuplicates(matchedAccommodation, accommodation))
        {
            return;
        }

        var accommodationToUpdate = new RichAccommodationDetails
        {
            Id          = matchedAccommodation.HtId,
            Modified    = DateTimeOffset.UtcNow,
            IsCorrected = false,
            SupplierAccommodationCodes = matchedAccommodation.SupplierAccommodationCodes
        };

        _context.Accommodations.Attach(accommodationToUpdate);
        _context.Entry(accommodationToUpdate).Property(p => p.IsCorrected).IsModified = true;
        _context.Entry(accommodationToUpdate).Property(p => p.Modified).IsModified    = true;

        if (_accommodationDataStorage.SupplierActiveAccommodations.TryGetValue(accommodation.SupplierCode, out var existingAccommodation))
        {
            Merge(existingAccommodation);
        }

        else if (_accommodationDataStorage.SupplierInvalidAccommodations.TryGetValue(accommodation.SupplierCode, out var existingInvalidAccommodation))
        {
            Merge(existingInvalidAccommodation);
        }
        else
        {
            _accommodationChangeLogCollectorService.CollectNewSupplierAdditionEvent(accommodationToUpdate.Id, AccommodationChangeEventSources.Updater,
                                                                                    matchedAccommodation.SupplierAccommodationCodes, _supplier, accommodation.SupplierCode);

            accommodationToUpdate.SupplierAccommodationCodes.Add(_supplier, accommodation.SupplierCode);
        }

        _context.Entry(accommodationToUpdate).Property(p => p.SupplierAccommodationCodes).IsModified = true;


        void FindAndDeactivateUncertainMatch(int firstHtId, int secondHtId)
        {
            var existingUncertainMatch = _accommodationDataStorage.ActiveUncertainMatches
                                         .FirstOrDefault(eum => eum.Value.Equals(new(firstHtId, secondHtId)) ||
                                                         eum.Value.Equals(new(secondHtId, firstHtId)));

            if (existingUncertainMatch.Key != default)
            {
                var uncertainMatchToDeactivate = new AccommodationUncertainMatches
                {
                    Id       = existingUncertainMatch.Key,
                    IsActive = false,
                    Modified = DateTimeOffset.UtcNow
                };
                _context.Attach(uncertainMatchToDeactivate);
                var entry = _context.Entry(uncertainMatchToDeactivate);
                entry.Property(um => um.IsActive).IsModified = true;
                entry.Property(um => um.Modified).IsModified = true;
            }
        }

        void Merge(SlimAccommodationData existing)
        {
            ProcessDeactivation(accommodation.SupplierCode, DeactivationReasons.MatchingWithOther, accommodation);

            _accommodationChangeLogCollectorService.CollectMergeEvent(accommodationToUpdate.Id, AccommodationChangeEventSources.Updater,
                                                                      existing.HtId, matchedAccommodation.SupplierAccommodationCodes, existing.SupplierAccommodationCodes);

            foreach (var supplierCode in existing.SupplierAccommodationCodes)
            {
                accommodationToUpdate.SupplierAccommodationCodes.TryAdd(supplierCode.Key, supplierCode.Value);
            }

            AddOrUpdateHtAccommodationMappings(existing.HtId, matchedAccommodation.HtId);
            FindAndDeactivateUncertainMatch(matchedAccommodation.HtId, existing.HtId);
        }
    }