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);
        }
Exemple #2
0
        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);
        }