/// <summary> /// Handle /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override async Task <bool> Handle(BulkLocationsRequest request, CancellationToken cancellationToken) { (string[], string[][])csv = await BulkUtils.ReadCsvAsync(request.LocationsFile, cancellationToken).ConfigureAwait(false); string[] headers = csv.Item1; string[][] data = csv.Item2; if (!data.Any()) { return(false); } Localizacion.SetPropertyIndexes(headers); Area.SetPropertyIndexes(headers); Region.SetPropertyIndexes(headers); Pais.SetPropertyIndexes(headers); List <string> existentLocations = await repository.GetAll().Select(u => u.Nombre).ToListAsync().ConfigureAwait(false); List <Area> existentAreas = (await areaRepository.GetAll() .Select(a => new { a.Region.IdPais, Area = a }).ToListAsync().ConfigureAwait(false)) .Select(x => { var aNew = x.Area; aNew.IdPais = x.IdPais; return(aNew); }).ToList(); List <Region> existentRegions = await regionRepository.GetAll().ToListAsync().ConfigureAwait(false); List <Pais> existentPaises = await paisRepository.GetAll().ToListAsync().ConfigureAwait(false); List <Localizacion> newLocalizaciones = new List <Localizacion>(); List <Area> newAreas = new List <Area>(); List <Region> newRegions = new List <Region>(); List <Pais> newPaises = new List <Pais>(); int indexArea = existentAreas.Max(p => p.Id); int indexRegion = existentRegions.Max(p => p.Id); int indexPais = existentPaises.Max(p => p.Id); foreach (string[] dataRow in data) { Localizacion newLocalizacion = new Localizacion(dataRow); Area newArea = new Area(dataRow); Region newRegion = new Region(dataRow); Pais newPais = new Pais(dataRow); if (!string.IsNullOrEmpty(newPais.Nombre)) { if (existentPaises.Any(p => p.Nombre == newPais.Nombre)) { newPais = existentPaises.Single(p => p.Nombre == newPais.Nombre); } else if (newPaises.Any(p => p.Nombre == newPais.Nombre)) { newPais = newPaises.Single(p => p.Nombre == newPais.Nombre); } else { indexPais++; newPais.Id = indexPais; newPais.LastAction = "CREATE"; newPais.LastActionDate = DateTime.UtcNow; newPaises.Add(newPais); } if (!string.IsNullOrEmpty(newRegion.Nombre)) { if (existentRegions.Any(p => p.Nombre == newRegion.Nombre)) { newRegion = existentRegions.Single(p => p.Nombre == newRegion.Nombre); } else if (newRegions.Any(p => p.Nombre == newRegion.Nombre)) { newRegion = newRegions.Single(p => p.Nombre == newRegion.Nombre); } else { indexRegion++; newRegion.Id = indexRegion; newRegion.IdPais = newPais.Id; newRegion.LastAction = "CREATE"; newRegion.LastActionDate = DateTime.UtcNow; newRegions.Add(newRegion); } } else if (!string.IsNullOrEmpty(newArea.Nombre)) { if (existentRegions.Any(p => p.Nombre == newArea.Nombre)) { newRegion = existentRegions.Single(p => p.Nombre == newArea.Nombre); } else if (newRegions.Any(p => p.Nombre == newArea.Nombre)) { newRegion = newRegions.Single(p => p.Nombre == newArea.Nombre); } else { indexRegion++; newRegion.Id = indexRegion; newRegion.Nombre = newArea.Nombre; newRegion.IdPais = newPais.Id; newRegion.LastAction = "CREATE"; newRegion.LastActionDate = DateTime.UtcNow; newRegions.Add(newRegion); } } if (!string.IsNullOrEmpty(newArea.Nombre)) { if (existentAreas.Any(p => p.Nombre == newArea.Nombre && p.IdPais == newPais.Id)) { newArea = existentAreas.Single(p => p.Nombre == newArea.Nombre && p.IdPais == newPais.Id); } else if (newAreas.Any(p => p.Nombre == newArea.Nombre && p.IdPais == newPais.Id)) { newArea = newAreas.Single(p => p.Nombre == newArea.Nombre && p.IdPais == newPais.Id); } else { indexArea++; newArea.Id = indexArea; newArea.IdRegion = newRegion.Id; newArea.IdPais = newPais.Id; newArea.LastAction = "CREATE"; newArea.LastActionDate = DateTime.UtcNow; newAreas.Add(newArea); } } } if (existentLocations.Contains(newLocalizacion.Nombre)) { continue; } newLocalizacion.IdArea = null; if (!string.IsNullOrEmpty(newArea.Nombre)) { newLocalizacion.IdArea = newArea.Id; } newLocalizacion.LastAction = "CREATE"; newLocalizacion.LastActionDate = DateTime.UtcNow; newLocalizaciones.Add(newLocalizacion); } await paisRepository.BulkInsertAsync(newPaises).ConfigureAwait(false); await regionRepository.BulkInsertAsync(newRegions).ConfigureAwait(false); await areaRepository.BulkInsertAsync(newAreas).ConfigureAwait(false); await repository.BulkInsertAsync(newLocalizaciones).ConfigureAwait(false); //repository.AddRange(newLocalizaciones); //await repository.SaveChangesAsync().ConfigureAwait(false); return(true); }