protected List <dynamic> CreateCommandsInOrder(
            ImportMode importMode,
            int id,
            DateTime from,
            DateTime until)
        {
            var importSubaddressCommands = new List <ImportSubaddressFromCrab>();
            List <ImportSubaddressFromCrab>         importSubaddressHistCommands;
            List <ImportSubaddressStatusFromCrab>   importSubaddressStatusCommands;
            List <ImportSubaddressStatusFromCrab>   importSubaddressStatusHistCommands;
            List <ImportSubaddressPositionFromCrab> importSubaddressPositionCommands;
            List <ImportSubaddressPositionFromCrab> importSubaddressPositionHistCommands;
            var importHouseNumberSubaddressCommands = new List <ImportHouseNumberSubaddressFromCrab>();
            List <ImportHouseNumberSubaddressFromCrab> importHouseNumberSubaddressCommandsHist;
            var importSubaddressMailCantonCommands = new List <ImportSubaddressMailCantonFromCrab>();
            List <ImportSubaddressMailCantonFromCrab> importSubaddressMailCantonCommandsHist;

            using (var context = _crabEntitiesFactory())
            {
                var importSubaddressFromCrab = AdresSubadresQueries.GetTblSubadresBySubadresId(id, context);
                if (importSubaddressFromCrab != null)
                {
                    importSubaddressCommands = new List <ImportSubaddressFromCrab> {
                        CrabSubaddressMapper.Map(importSubaddressFromCrab)
                    }
                }
                ;

                importSubaddressHistCommands = CrabSubaddressMapper.Map(AdresSubadresQueries.GetTblSubadresHistBySubadresId(id, context)).ToList();

                importSubaddressStatusCommands     = CrabSubaddressStatusMapper.Map(AdresSubadresQueries.GetTblSubadresstatussesBySubadresId(id, context)).ToList();
                importSubaddressStatusHistCommands = CrabSubaddressStatusMapper.Map(AdresSubadresQueries.GetTblSubadresstatussesHistBySubadresId(id, context)).ToList();

                importSubaddressPositionCommands     = CrabSubaddressPositionMapper.Map(AdresSubadresQueries.GetTblAdrespositiesBySubadresId(id, context)).ToList();
                importSubaddressPositionHistCommands = CrabSubaddressPositionMapper.Map(AdresSubadresQueries.GetTblAdrespositiesHistBySubadresId(id, context)).ToList();

                var allHouseNumbers = importSubaddressHistCommands.Select(x => (int)x.HouseNumberId).ToList();
                if (importSubaddressFromCrab != null)
                {
                    allHouseNumbers.Add((int)importSubaddressCommands.First().HouseNumberId);
                }

                allHouseNumbers = allHouseNumbers.Distinct().ToList();

                foreach (var houseNumber in allHouseNumbers)
                {
                    var tblHuisNummerByHuisnummerId = AdresHuisnummerQueries.GetTblHuisNummerByHuisnummerId(houseNumber, context);
                    if (tblHuisNummerByHuisnummerId != null)
                    {
                        var importHouseNumberSubadresFromCrab = CrabSubaddressHouseNumberMapper.Map(tblHuisNummerByHuisnummerId, id);
                        if (importHouseNumberSubadresFromCrab != null)
                        {
                            importHouseNumberSubaddressCommands.Add(importHouseNumberSubadresFromCrab);
                        }
                    }

                    importSubaddressMailCantonCommands.AddRange(
                        CrabSubaddressMailCantonMapper.GetCommandsFor(AdresHuisnummerQueries.GetTblHuisnummerPostkantonsByHuisnummerId(houseNumber, context), id));
                }

                importHouseNumberSubaddressCommandsHist =
                    CrabSubaddressHouseNumberMapper.Map(AdresHuisnummerQueries.GetTblHuisNummerHistByHuisnummerIds(allHouseNumbers, context), id).ToList();

                importSubaddressMailCantonCommandsHist =
                    CrabSubaddressMailCantonMapper.GetCommandsFor(AdresHuisnummerQueries.GetTblHuisnummerPostKantonHistsByHuisnummerIds(allHouseNumbers, context),
                                                                  id).ToList();
            }

            var allSubaddressCommands = importSubaddressHistCommands.Select(x =>
                                                                            Tuple.Create <dynamic, int, int, string>(x, 2, 0, $"Subadres {x.SubaddressId}"))
                                        .Concat(importSubaddressCommands.Select(x =>
                                                                                Tuple.Create <dynamic, int, int, string>(x, 2, 1, $"Subadres {x.SubaddressId}")))
                                        .Concat(importSubaddressStatusHistCommands.Select(x =>
                                                                                          Tuple.Create <dynamic, int, int, string>(x, 3, 0, $"Subadres {x.SubaddressId}")))
                                        .Concat(importSubaddressStatusCommands.Select(x =>
                                                                                      Tuple.Create <dynamic, int, int, string>(x, 3, 1, $"Subadres {x.SubaddressId}")))
                                        .Concat(importSubaddressPositionHistCommands.Select(x =>
                                                                                            Tuple.Create <dynamic, int, int, string>(x, 3, 2, $"Subadres {x.SubaddressId}")))
                                        .Concat(importSubaddressPositionCommands.Select(x =>
                                                                                        Tuple.Create <dynamic, int, int, string>(x, 3, 3, $"Subadres {x.SubaddressId}")))
                                        .Concat(importHouseNumberSubaddressCommandsHist.Select(x =>
                                                                                               Tuple.Create <dynamic, int, int, string>(x, 0, 0, $"Subadres {x.SubaddressId}")))
                                        .Concat(importHouseNumberSubaddressCommands.Select(x =>
                                                                                           Tuple.Create <dynamic, int, int, string>(x, 0, 1, $"Subadres {x.SubaddressId}")))
                                        .Concat(importSubaddressMailCantonCommandsHist.Select(x =>
                                                                                              Tuple.Create <dynamic, int, int, string>(x, 1, 0, $"Subadres {x.SubaddressId}")))
                                        .Concat(importSubaddressMailCantonCommands.Select(x =>
                                                                                          Tuple.Create <dynamic, int, int, string>(x, 1, 1, $"Subadres {x.SubaddressId}")))
                                        .ToList();

            var addressCommands = allSubaddressCommands
                                  .Where(x => x.Item1.Timestamp > from.ToCrabInstant() && x.Item1.Timestamp <= until.ToCrabInstant());

            if (importMode == ImportMode.Update) //if an update changes the subaddress' house number, make sure the commands for that house number are also sent
            {
                var houseNumbersForUpdate = importSubaddressCommands
                                            .Concat(importSubaddressHistCommands)
                                            .Where(x => x.Timestamp > from.ToCrabInstant() && x.Timestamp <= until.ToCrabInstant())
                                            .Select(x => x.HouseNumberId).ToList();

                if (houseNumbersForUpdate.Any())
                {
                    var houseNumbersBeforeUpdate = importSubaddressCommands
                                                   .Concat(importSubaddressHistCommands)
                                                   .Where(x => x.Timestamp <= from.ToCrabInstant())
                                                   .Select(x => x.HouseNumberId).ToList();

                    var newHouseNumbers = houseNumbersForUpdate.Except(houseNumbersBeforeUpdate);

                    foreach (var newHouseNumber in newHouseNumbers)
                    {
                        addressCommands = addressCommands.Concat(allSubaddressCommands.Except(addressCommands).Where(x =>
                                                                                                                     //(x.Item1 is ImportSubaddressFromCrab importSubaddressFromCrab && importSubaddressFromCrab.HouseNumberId == newHouseNumber) ||
                                                                                                                     (x.Item1 is ImportSubaddressMailCantonFromCrab importSubaddressMailCantonFromCrab && importSubaddressMailCantonFromCrab.HouseNumberId == newHouseNumber) ||
                                                                                                                     (x.Item1 is ImportHouseNumberSubaddressFromCrab importHouseNumberSubaddressFromCrab && importHouseNumberSubaddressFromCrab.HouseNumberId == newHouseNumber)));
                    }
                }
            }

            addressCommands = addressCommands.OrderBy(x => x.Item1.Timestamp)
                              .ThenBy(x => x.Item2)
                              .ThenBy(x => x.Item3);

            var commands = new List <dynamic>();

            ImportHouseNumberSubaddressFromCrab initialImportHouseNumberSubaddressFromCrab = null;

            if (importMode == ImportMode.Init)
            {
                initialImportHouseNumberSubaddressFromCrab = importHouseNumberSubaddressCommands
                                                             .Concat(importHouseNumberSubaddressCommandsHist)
                                                             .OrderBy(x => (Instant)x.Timestamp)
                                                             .First(x => x.HouseNumberId == addressCommands.First <ImportSubaddressFromCrab>().HouseNumberId);

                commands.Add(initialImportHouseNumberSubaddressFromCrab);
            }

            foreach (var adresCommand in addressCommands)
            {
                if (importMode == ImportMode.Update || !adresCommand.Item1.Equals(initialImportHouseNumberSubaddressFromCrab))
                {
                    commands.Add(adresCommand.Item1);
                }
            }

            return(commands);
        }
Ejemplo n.º 2
0
        private IEnumerable <dynamic> CreateCommandsInOrder(ImportMode importMode, CaPaKey caPaKey, DateTime from, DateTime until)
        {
            var importTerrainObjectCommands            = new List <ImportTerrainObjectFromCrab>();
            var importTerrainObjectHouseNumberCommands = new List <ImportTerrainObjectHouseNumberFromCrab>();
            var importSubaddressCommands = new List <ImportSubaddressFromCrab>();

            using (var crabEntities = _crabEntitiesFactory())
            {
                var terrainObjectIds = PerceelQueries
                                       .GetTblTerreinObjectIdsByCapaKeys(
                    caPaKey.CaPaKeyCrabNotation1,
                    caPaKey.CaPaKeyCrabNotation2,
                    crabEntities)
                                       .Concat(PerceelQueries
                                               .GetTblTerreinObjectIdsHistByCapaKeys(
                                                   caPaKey.CaPaKeyCrabNotation1,
                                                   caPaKey.CaPaKeyCrabNotation2,
                                                   crabEntities))
                                       .Distinct()
                                       .ToList();

                var terrainObjects = PerceelQueries
                                     .GetTblTerreinObjectenByTerreinObjectIds(terrainObjectIds, crabEntities);
                var terrainObjectsHist = PerceelQueries
                                         .GetTblTerreinObjectenHistByTerreinObjectIds(terrainObjectIds, crabEntities);

                importTerrainObjectCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(terrainObjects, caPaKey));
                importTerrainObjectCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(terrainObjectsHist, caPaKey));

                var terrainObjectHouseNumbers = PerceelQueries
                                                .GetTblTerreinObjectHuisNummersByTerreinObjectIds(terrainObjectIds, crabEntities);
                var terrainObjectHouseNumbersHistList = PerceelQueries
                                                        .GetTblTerreinObjectHuisNummersHistByTerreinObjectIds(terrainObjectIds, crabEntities);

                importTerrainObjectHouseNumberCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(terrainObjectHouseNumbers, caPaKey));
                importTerrainObjectHouseNumberCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(terrainObjectHouseNumbersHistList, caPaKey));

                var allHouseNumberIds = importTerrainObjectHouseNumberCommands
                                        .Select(x => (int)x.HouseNumberId)
                                        .ToList();

                var subaddresses = AdresSubadresQueries
                                   .GetTblSubAdressenByHuisnummerIds(allHouseNumberIds, crabEntities);
                var subaddressesHist = AdresSubadresQueries
                                       .GetTblSubAdressenHistByHuisnummerIds(allHouseNumberIds, crabEntities);

                var allSubadresIds = subaddresses
                                     .Select(s => s.subAdresId)
                                     .Concat(subaddressesHist.Where(s => s.subAdresId.HasValue).Select(s => s.subAdresId.Value))
                                     .Distinct()
                                     .ToList();

                foreach (var subadresId in allSubadresIds)
                {
                    var firstOccurrenceOdb = subaddresses.Where(sa => sa.subAdresId == subadresId)
                                             .OrderBy(sa => sa.beginTijd).FirstOrDefault();
                    var firstOccurrenceCdb = subaddressesHist.Where(sa => sa.subAdresId == subadresId)
                                             .OrderBy(sa => sa.beginTijd).FirstOrDefault();

                    if (firstOccurrenceCdb != null &&
                        (firstOccurrenceOdb == null || firstOccurrenceCdb.beginTijd <= firstOccurrenceOdb.beginTijd))
                    {
                        importSubaddressCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(firstOccurrenceCdb, caPaKey));
                    }
                    else if (firstOccurrenceOdb != null)
                    {
                        importSubaddressCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(firstOccurrenceOdb, caPaKey));
                    }

                    importSubaddressCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(
                                                          subaddresses.Where(sa => sa.subAdresId == subadresId && sa.eindDatum.HasValue),
                                                          caPaKey));
                    importSubaddressCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(
                                                          subaddressesHist.Where(hist => hist.subAdresId == subadresId && hist.eindDatum.HasValue),
                                                          caPaKey));

                    var removedRecord = subaddressesHist.SingleOrDefault(histRecord =>
                                                                         histRecord.subAdresId == subadresId &&
                                                                         histRecord.eindBewerking == BewerkingCodes.Remove);

                    if (removedRecord != null)
                    {
                        importSubaddressCommands.AddRange(TerrainObjectCommandsFactory.CreateFor(removedRecord.CreateBeginSituation(), caPaKey));
                    }
                }
            }

            var commands = new List <dynamic>();

            var groupedTerrainObjectCommands = importTerrainObjectCommands
                                               .GroupBy(x => x.CaPaKey)
                                               .ToDictionary(x => x.Key, x => x.ToList().OrderBy(y => (Instant)y.Timestamp));

            foreach (var groupedTerrainObjectCommand in groupedTerrainObjectCommands)
            {
                commands.Add(groupedTerrainObjectCommand.Value.First());
            }

            var allParcelCommands = importTerrainObjectCommands
                                    .Select(x =>
                                            Tuple.Create <dynamic, int, int, string>(x, 0, 0, $"CaPaKey: {x.CaPaKey}"))
                                    .Concat(importTerrainObjectHouseNumberCommands.Select(x =>
                                                                                          Tuple.Create <dynamic, int, int, string>(x, 1, 0, $"CaPaKey: {x.CaPaKey}")))
                                    .Concat(importSubaddressCommands.Select(x =>
                                                                            Tuple.Create <dynamic, int, int, string>(x, -1, 0, $"CaPaKey: {x.CaPaKey}")))
                                    .ToList();

            var allCommands = allParcelCommands
                              .Where(x => x.Item1.Timestamp <= until.ToCrabInstant() && x.Item1.Timestamp > from.ToCrabInstant())
                              .ToList();

            if (importMode == ImportMode.Update) //if an update couples the terrainobjecthousenumber, with subaddress already created before the terrainobjecthousenumber => import the subaddress
            {
                var houseNumberForUpdates = importTerrainObjectHouseNumberCommands
                                            .Where(x => x.Timestamp > from.ToCrabInstant() && x.Timestamp <= until.ToCrabInstant())
                                            .Select(x => x.HouseNumberId)
                                            .ToList();

                if (houseNumberForUpdates.Any())
                {
                    var houseNumbersBeforeUpdate = importTerrainObjectHouseNumberCommands
                                                   .Where(x => x.Timestamp <= from.ToCrabInstant())
                                                   .Select(x => x.HouseNumberId)
                                                   .ToList();

                    var newHouseNumbers = houseNumberForUpdates.Except(houseNumbersBeforeUpdate);

                    foreach (var newHouseNumber in newHouseNumbers)
                    {
                        var allNewSubaddressIds = importSubaddressCommands
                                                  .Where(subaddressFromCrab => subaddressFromCrab.HouseNumberId == newHouseNumber)
                                                  .Select(x => x.SubaddressId);

                        foreach (var newSubaddressId in allNewSubaddressIds)
                        {
                            allCommands = allCommands
                                          .Concat(allParcelCommands
                                                  .Except(allCommands)
                                                  .Where(x => x.Item1 is ImportSubaddressFromCrab importSubaddressFromCrab && importSubaddressFromCrab.SubaddressId == newSubaddressId))
                                          .ToList();
                        }
                    }
                }
            }

            allCommands = allCommands
                          .OrderBy(x => x.Item1.Timestamp)
                          .ThenBy(x => x.Item2)
                          .ThenBy(x => x.Item3)
                          .ToList();

            commands.AddRange(allCommands.Select(command => command.Item1));

            return(commands);
        }