Exemplo n.º 1
0
            /// <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);
            }