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); }
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); }