private async Task <IEnumerable <SaleFileDataError> > ValidateSpreadsheetRow(SaleFileData saleFileData, SaleFile saleFile, int line, int month) { var ListSaleFileDataError = new List <SaleFileDataError>(); if (!string.IsNullOrEmpty(saleFileData.EanCode)) { var network = (await _shopUserRepository.CustomFind(x => x.Shop.Cnpj.Equals(saleFileData.Cnpj), x => x.Shop)).FirstOrDefault(); if (network != null) { var product = (await _productRepository.CustomFind(x => x.Ean.Equals(saleFileData.EanCode))).FirstOrDefault(); if (product != null) { saleFileData.Product = product.Id; saleFileData.SaleFileSkuStatus = await _saleFileSkuStatusRepository.GetById((int)FileSKUStatusEnum.AutomaticValidate); } } } if (String.IsNullOrEmpty(saleFileData.ProductDescription)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Código produto em branco.", SaleFile = saleFile, Line = line }); } if (String.IsNullOrEmpty(saleFileData.Resale)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Revenda em branco.", SaleFile = saleFile, Line = line }); } if (String.IsNullOrEmpty(saleFileData.ShopCode) || saleFileData.ShopCode == "0") { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Código Loja em branco.", SaleFile = saleFile, Line = line }); } if (Convert.ToDateTime(saleFileData.SaleDate) == DateTime.MinValue) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Data inválida.", SaleFile = saleFile, Line = line }); } else if (Convert.ToDateTime(saleFileData.SaleDate).Month != month) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Data fora do período informado.", SaleFile = saleFile, Line = line }); } if (String.IsNullOrEmpty(saleFileData.RequestNumber)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Número Pedido em branco.", SaleFile = saleFile, Line = line }); } if (String.IsNullOrEmpty(saleFileData.Cnpj)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "CNPJ em branco.", SaleFile = saleFile, Line = line, }); } else if (!String.IsNullOrEmpty(saleFileData.Cnpj)) { if (!Validation.ValidaCnpj(saleFileData.Cnpj)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = $"CNPJ {saleFileData.Cnpj} inválido.", SaleFile = saleFile, Line = line }); } else { var hasCnpj = await _shopRepository.CustomFind(x => x.Cnpj.Equals(saleFileData.Cnpj)); if (!hasCnpj.Any()) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = $"CNPJ {saleFileData.Cnpj} não encontrado.", SaleFile = saleFile, Line = line }); } } } if (String.IsNullOrEmpty(saleFileData.CpfSalesman)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "CPF em branco.", SaleFile = saleFile, Line = line }); } else if (!String.IsNullOrEmpty(saleFileData.CpfSalesman)) { var user = (await _userRepository.CustomFind(x => x.Cpf.Contains(saleFileData.CpfSalesman), x => x.Office)).FirstOrDefault(); if (user != null && user.Office.Id != (int)OfficeEnum.Salesman) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Usuario não é um vendedor.", SaleFile = saleFile, Line = line }); } if (!Validation.ValidaCPF(saleFileData.CpfSalesman)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "CPF inválido.", SaleFile = saleFile, Line = line }); } } if (String.IsNullOrEmpty(saleFileData.NameSalesman)) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Nome em branco.", SaleFile = saleFile, Line = line }); } else if (!saleFileData.NameSalesman.ToCharArray().All(t => !char.IsDigit(t))) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Nome inválido.", SaleFile = saleFile, Line = line, }); } if (saleFileData.Amount == 0) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Quantidade em branco.", SaleFile = saleFile, Line = line }); } if (saleFileData.Amount < 0) { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Quantidade de unidades negativa.", SaleFile = saleFile, Line = line }); } return(ListSaleFileDataError); }
public async Task <bool> DoProcessesSale() { if (DateTime.Now.Day == 10) { var saleFile = new SaleFile { CreatedAt = DateTime.Now, CurrentMonth = DateTime.Now.AddMonths(-1).Month, CurrentYear = DateTime.Now.AddMonths(-1).Year, FileName = "", FileStatus = await _fileStatusRepository.GetById((int)FileStatusEnum.InProgress), Network = await _networkRepository.GetById((int)NetworkEnum.Havan), User = (await _userRepository.CustomFind(x => x.Cpf.Equals("rhuscaya"))).First() }; var skuPendingClassification = await _saleFileSkuStatusRepository.GetAll(); var products = await _productRepository.GetAll(); _saleFileRepository.Save(saleFile); for (var i = 1; i <= DateTime.DaysInMonth(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month); i++) { using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://cliente.havan.com.br/ClubePontuacao/Api/"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "5cb8d9a916c33a25efdf0dd1"); var result = await client.PostAsync("Venda/Lotes", new StringContent(JsonConvert.SerializeObject(new { inicio = new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, i) }), Encoding.UTF8, "application/json")); if (result.IsSuccessStatusCode && result.StatusCode == System.Net.HttpStatusCode.OK) { var json = await result.Content.ReadAsStringAsync(); var havanSaleIntegration = JsonConvert.DeserializeObject <HavanSaleIntegrationDto>(json); foreach (var item in havanSaleIntegration.Lotes.First().Itens) { var productId = 0; var skuValidated = skuPendingClassification.Where(x => x.Id == (int)FileSKUStatusEnum.PendingClassification).First(); if (products.Where(x => x.Ean.Equals(item.Produto.Ean)).Any()) { skuValidated = skuPendingClassification.Where(x => x.Id == (int)FileSKUStatusEnum.AutomaticValidate).First(); productId = products.Where(x => x.Ean.Equals(item.Produto.Ean)).First().Id; } _saleFileDataRepository.Save(new SaleFileData { SaleFile = saleFile, SaleFileSkuStatus = skuValidated, Amount = item.Venda.Quantidade, Cnpj = item.Venda.CnpjLoja, CpfSalesman = item.Vendedor.Cpf, CreatedAt = DateTime.Now, NameSalesman = item.Vendedor.Nome, Product = productId, ProductDescription = item.Produto.Descricao, RequestNumber = item.Venda.NumeroCupomNota.ToString(), SaleDate = item.Venda.Data, Resale = "Havan" }); } } else { _logger.Fatal($"Atualização de hierarquia havan - ocorreu uma falha ao tentar acessar api de colaboradores da havan - {result.RequestMessage}"); } } } return(await _unitOfWork.CommitAsync()); } return(false); }
private async Task <(IEnumerable <SaleFileDataError> errorList, IEnumerable <SaleFileData> dataList)> ValidateSaleTab(SaleFile saleFile, ExcelWorksheet saleTab) { var ListSaleFileDataError = new List <SaleFileDataError>(); var ListSaleFileData = new List <SaleFileData>(); for (var row = 2; row <= saleTab.Dimension.End.Row; row++) { if (saleTab.Cells[row, 1].Value != null && saleTab.Cells[row, 2].Value != null && saleTab.Cells[row, 3].Value != null && saleTab.Cells[row, 4].Value != null && saleTab.Cells[row, 5].Value != null && saleTab.Cells[row, 7].Value != null && saleTab.Cells[row, 8].Value != null && saleTab.Cells[row, 9].Value != null && saleTab.Cells[row, 10].Value != null && saleTab.Cells[row, 11].Value != null) { var saleFileData = new SaleFileData { ShopCode = (saleTab.Cells[row, 2].Value != null) ? saleTab.Cells[row, 2].Value.ToString().Replace(".0", "") : String.Empty, Cnpj = (saleTab.Cells[row, 3].Value != null) ? saleTab.Cells[row, 3].Value.ToString().PadLeft(14, '0').Replace("-", "").Replace("/", "").Replace(".", "").Replace(".0", "") : String.Empty, CpfSalesman = (saleTab.Cells[row, 4].Value != null) ? saleTab.Cells[row, 4].Value.ToString().PadLeft(11, '0').Replace("-", "").Replace(".", "").Replace(".0", "").Trim() : String.Empty, RequestNumber = (saleTab.Cells[row, 10].Value != null) ? saleTab.Cells[row, 10].Value.ToString().Replace(".0", "") : String.Empty, SaleDate = (saleTab.Cells[row, 9].Value != null) && Validation.CheckValidDateFromBr(saleTab.Cells[row, 9].Value.ToString()) ? new DateTime(int.Parse(saleTab.Cells[row, 9].Value.ToString().Split('/')[2]), int.Parse(saleTab.Cells[row, 9].Value.ToString().Split('/')[1]), int.Parse(saleTab.Cells[row, 9].Value.ToString().Split('/')[0])) : DateTime.MinValue, ProductDescription = (saleTab.Cells[row, 7].Value != null) ? saleTab.Cells[row, 7].Value.ToString().Replace("'", "").Substring(0, saleTab.Cells[row, 7].Value.ToString().Length - 1) : String.Empty, Amount = (saleTab.Cells[row, 8].Value != null) ? Convert.ToInt16(saleTab.Cells[row, 8].Value.ToString().Replace(".0", "")) : 0, Category = (saleTab.Cells[row, 6].Value != null) ? saleTab.Cells[row, 6].Value.ToString() : String.Empty, NameSalesman = (saleTab.Cells[row, 5].Value != null) ? saleTab.Cells[row, 5].Value.ToString() : String.Empty, Resale = (saleTab.Cells[row, 1].Value != null) ? saleTab.Cells[row, 1].Value.ToString() : String.Empty, CreatedAt = DateTime.Now, SaleFile = saleFile, SaleFileSkuStatus = await _saleFileSkuStatusRepository.GetById((int)FileSKUStatusEnum.PendingClassification), Product = 0, EanCode = (saleTab.Cells[row, 11].Value != null) ? saleTab.Cells[row, 11].Value.ToString() : String.Empty, }; ListSaleFileDataError.AddRange(await ValidateSpreadsheetRow(saleFileData, saleFile, row, saleFile.CurrentMonth)); ListSaleFileData.Add(saleFileData); } else { ListSaleFileDataError.Add(new SaleFileDataError { CreatedAt = DateTime.Now, Description = "Possui uma coluna não preenchida", SaleFile = saleFile, Line = row }); } } return(ListSaleFileDataError, ListSaleFileData); }
public async Task ProcessesSaleFile_GeneratingSaleData_ReturningTrueAndSales() { var saleFileDataList = new List <SaleFileData>(); var saleFile = new SaleFile { Id = 1, CurrentMonth = 1, CurrentYear = 2019, Network = new Network { Id = 1 } }; saleFileDataList.Add(new SaleFileData { Product = 1, CpfSalesman = "00000000000", Cnpj = "12579125000105", SaleFile = saleFile, Amount = 1 }); _mockSaleFileDataRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <SaleFileData, bool> > >(), It.IsAny <Expression <Func <SaleFileData, object> > >(), It.IsAny <Expression <Func <SaleFileData, object> > >())).ReturnsAsync(saleFileDataList); _mockParticipantProductRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <ParticipantProduct, bool> > >())).ReturnsAsync(new List <ParticipantProduct> { new ParticipantProduct { CurrentMonth = 1, CurrentYear = 2019, Product = new Product { Id = 1 }, Network = new Network { Id = 1 }, Punctuation = 10 } }); _mockFocusProductRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <FocusProduct, bool> > >())).ReturnsAsync(new List <FocusProduct> { new FocusProduct { CurrentMonth = 1, CurrentYear = 2019, Product = new Product { Id = 1 }, Network = new Network { Id = 1 }, Punctuation = 10 } }); _mockFileStatusRepository.Setup(x => x.GetById(It.IsAny <int>())).ReturnsAsync(new FileStatus { Id = (int)FileStatusEnum.ProcessedSales }); _mockProductRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <Product, bool> > >())).ReturnsAsync(new List <Product> { new Product { Id = 1, Name = "teste" } }); _mockShopRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <Shop, bool> > >())).ReturnsAsync(new List <Shop> { new Shop { Id = 1, Name = "teste", Cnpj = "12579125000105" } }); _mockUserRepository.Setup(x => x.CustomFind(It.IsAny <Expression <Func <User, bool> > >(), It.IsAny <Expression <Func <User, object> > >())).ReturnsAsync(new List <User> { new User { Id = 1, Name = "teste", Cpf = "00000000000", UserStatus = new UserStatus { Id = (int)UserStatusEnum.Active } } }); _mockUnitOfWork.Setup(x => x.CommitAsync()).ReturnsAsync(true); var saleProcessesService = new SaleProcessesService( _mockEmailService.Object, _mockSaleFileDataErrorRepository.Object, _mockSaleFileDataRepository.Object, _mockSaleFileRepository.Object, _mockFileStatusRepository.Object, _mockUserRepository.Object, _mockUserStatusRepository.Object, _mockINetworkRepository.Object, _mockShopRepository.Object, _mockShopUserRepository.Object, _mockProductRepository.Object, _mockFocusProductRepository.Object, _mockParticipantProductRepository.Object, _mockOfficeRepository.Object, _mockUnitOfWork.Object, _mockSaleRepository.Object, _mockLogger.Object, _mockSaleFileSkuStatusRepository.Object, _mockCategoryProductRepository.Object, _mockUserPunctuationRepository.Object, _mockUserPunctuationSourceRepository.Object); var result = await saleProcessesService.ProcessesSaleFile(); Assert.True(result.saved); Assert.NotEmpty(result.sales); Assert.Equal(10, result.sales.First().Punctuation); }