Exemple #1
0
        protected List <dynamic> CreateCommandsInOrder(
            int huisnummerId,
            DateTime from,
            DateTime until)
        {
            var importHouseNumberCommands = new List <ImportHouseNumberFromCrab>();

            var tblHuisNummerByHuisnummerIdTask = Task.Run(() => RunOnContext(context =>
                                                                              AdresHuisnummerQueries.GetTblHuisNummerByHuisnummerId(huisnummerId, context)));

            var importHouseNumberHistCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                CrabHouseNumberMapper.Map(AdresHuisnummerQueries.GetTblHuisNummerHistByHuisnummerId(huisnummerId, context)).ToList()));

            var importHouseNumberStatusCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                  CrabHouseNumberStatusMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerstatussenByHuisnummerId(huisnummerId, context)).ToList()));

            var importHouseNumberStatusHistCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                      CrabHouseNumberStatusMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerstatussenHistByHuisnummerId(huisnummerId, context)).ToList()));

            var importHouseNumberPositionCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                    CrabHouseNumberPositionMapper.Map(AdresHuisnummerQueries.GetTblAdresPositiesByHuisnummerId(huisnummerId, context)).ToList()));

            var importHouseNumberPositionHistCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                        CrabHouseNumberPositionMapper.Map(AdresHuisnummerQueries.GetTblAdresPositiesHistByHuisnummerId(huisnummerId, context)).ToList()));

            var importHouseNumberMailCantonCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                      CrabHouseNumberMailCantonMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerPostkantonsByHuisnummerId(huisnummerId, context)).ToList()));

            var importHouseNumberMailCantonHistCommandsTask = Task.Run(() => RunOnContext(context =>
                                                                                          CrabHouseNumberMailCantonMapper.Map(AdresHuisnummerQueries.GetTblHuisnummerPostKantonsHistByHuisnummerId(huisnummerId, context)).ToList()));

            Task.WaitAll(
                tblHuisNummerByHuisnummerIdTask,
                importHouseNumberHistCommandsTask,
                importHouseNumberStatusCommandsTask,
                importHouseNumberStatusHistCommandsTask,
                importHouseNumberPositionCommandsTask,
                importHouseNumberPositionHistCommandsTask,
                importHouseNumberMailCantonCommandsTask,
                importHouseNumberMailCantonHistCommandsTask);

            var tblHuisNummerByHuisnummerId = tblHuisNummerByHuisnummerIdTask.Result;

            if (tblHuisNummerByHuisnummerId != null)
            {
                importHouseNumberCommands = new List <ImportHouseNumberFromCrab> {
                    CrabHouseNumberMapper.Map(tblHuisNummerByHuisnummerId)
                }
            }
            ;

            var importHouseNumberHistCommands           = importHouseNumberHistCommandsTask.Result;
            var importHouseNumberStatusCommands         = importHouseNumberStatusCommandsTask.Result;
            var importHouseNumberStatusHistCommands     = importHouseNumberStatusHistCommandsTask.Result;
            var importHouseNumberPositionCommands       = importHouseNumberPositionCommandsTask.Result;
            var importHouseNumberPositionHistCommands   = importHouseNumberPositionHistCommandsTask.Result;
            var importHouseNumberMailCantonCommands     = importHouseNumberMailCantonCommandsTask.Result;
            var importHouseNumberMailCantonHistCommands = importHouseNumberMailCantonHistCommandsTask.Result;

            var commandsByHouseNumber = importHouseNumberCommands
                                        .Concat(importHouseNumberHistCommands)
                                        .OrderBy(x => (Instant)x.Timestamp);

            var commands = new List <dynamic> {
                commandsByHouseNumber.First()
            };

            var allHouseNumberCommands = importHouseNumberHistCommands.Select(x =>
                                                                              Tuple.Create <dynamic, int, int, string>(x, 0, 0, $"Huisnummer {x.HouseNumberId}"))
                                         .Concat(importHouseNumberCommands.Select(x =>
                                                                                  Tuple.Create <dynamic, int, int, string>(x, 0, 1, $"Huisnummer {x.HouseNumberId}")))
                                         .Concat(importHouseNumberStatusHistCommands.Select(x =>
                                                                                            Tuple.Create <dynamic, int, int, string>(x, 1, 0, $"Huisnummer {x.HouseNumberId}")))
                                         .Concat(importHouseNumberStatusCommands.Select(x =>
                                                                                        Tuple.Create <dynamic, int, int, string>(x, 1, 1, $"Huisnummer {x.HouseNumberId}")))
                                         .Concat(importHouseNumberPositionHistCommands.Select(x =>
                                                                                              Tuple.Create <dynamic, int, int, string>(x, 1, 4, $"Huisnummer {x.HouseNumberId}")))
                                         .Concat(importHouseNumberPositionCommands.Select(x =>
                                                                                          Tuple.Create <dynamic, int, int, string>(x, 1, 5, $"Huisnummer {x.HouseNumberId}")))
                                         .Concat(importHouseNumberMailCantonHistCommands.Select(x =>
                                                                                                Tuple.Create <dynamic, int, int, string>(x, 1, 2, $"Huisnummer {x.HouseNumberId}")))
                                         .Concat(importHouseNumberMailCantonCommands.Select(x =>
                                                                                            Tuple.Create <dynamic, int, int, string>(x, 1, 3, $"Huisnummer {x.HouseNumberId}")))
                                         .ToList();

            var adresCommands = allHouseNumberCommands
                                .Where(x => x.Item1.Timestamp > from.ToCrabInstant() && x.Item1.Timestamp <= until.ToCrabInstant())
                                .OrderBy(x => x.Item1.Timestamp)
                                .ThenBy(x => x.Item2)
                                .ThenBy(x => x.Item3);

            commands.AddRange(adresCommands.Select(adresCommand => adresCommand.Item1));

            return(commands);
        }
        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);
        }