/// <summary> /// Handle /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override async Task <bool> Handle(BulkWorksRequest request, CancellationToken cancellationToken) { (string[], string[][])csv = await BulkUtils.ReadCsvAsync(request.WorksFile, cancellationToken).ConfigureAwait(false); string[] headers = csv.Item1; string[][] data = csv.Item2; if (!data.Any()) { return(false); } Obra.SetPropertyIndexes(headers); var estadosObraDict = await estadoObraRepository.GetAll() .ToDictionaryAsync(div => div.Nombre, div => div.Id) .ConfigureAwait(false); List <Obra> newObras = new List <Obra>(); HashSet <string> existentWorks = (await repository.GetAll().Select(u => u.CodigoObra).ToListAsync().ConfigureAwait(false)).ToHashSet(); foreach (string[] dataRow in data) { Obra newObra = new Obra(dataRow); if (existentWorks.Contains(newObra.CodigoObra)) { continue; } newObra.LastAction = "CREATE"; newObra.LastActionDate = DateTime.UtcNow; if (!string.IsNullOrEmpty(newObra.EstadoObra.Nombre)) { if (!estadosObraDict.ContainsKey(newObra.EstadoObra.Nombre)) { throw new Exception($"No el estado de la obra {newObra.EstadoObra.Nombre} en el maestro de tecnologias"); } newObra.IdEstadoObra = estadosObraDict[newObra.EstadoObra.Nombre]; } newObras.Add(newObra); existentWorks.Add(newObra.CodigoObra); } await repository.BulkInsertAsync(newObras).ConfigureAwait(false);; return(true); }