From 4fcb1dbbc4d1304955d2c2b701959d29426cc299 Mon Sep 17 00:00:00 2001 From: Bruno Date: Wed, 25 Dec 2024 09:14:57 -0300 Subject: [PATCH] ajustes --- OpenAdm.Api/Controllers/HomeController.cs | 2 +- OpenAdm.Api/Controllers/ParcelaController.cs | 10 +- .../Interfaces/IParcelaService.cs | 1 + .../Interfaces/Pedidos/IPdfPedidoService.cs | 2 +- .../TransacaoFinanceiraViewModel.cs | 5 +- .../Services/ParcelaService.cs | 37 +++++- .../Services/Pedidos/PdfPedidoService.cs | 123 +++++++++++++++++- .../Pedidos/RelatorioPedidoPorPeriodo.cs | 2 +- OpenAdm.Domain/Entities/Parcela.cs | 11 ++ .../Entities/TransacaoFinanceira.cs | 29 ++++- .../Interfaces/IParcelaRepository.cs | 2 +- .../ITransacaoFinanceiraRepository.cs | 3 + .../TransacaoFinanceiraConfiguration.cs | 2 + .../Repositories/ParcelaRepository.cs | 21 ++- .../TransacaoFinanceiraRepository.cs | 20 +++ 15 files changed, 238 insertions(+), 32 deletions(-) diff --git a/OpenAdm.Api/Controllers/HomeController.cs b/OpenAdm.Api/Controllers/HomeController.cs index 0299318..50401d8 100644 --- a/OpenAdm.Api/Controllers/HomeController.cs +++ b/OpenAdm.Api/Controllers/HomeController.cs @@ -16,7 +16,7 @@ public HomeController(IHomeSevice homeEcommerSevice) _homeEcommerSevice = homeEcommerSevice; } - [ResponseCache(CacheProfileName = "Default300")] + //[ResponseCache(CacheProfileName = "Default300")] [HttpGet("adm")] public async Task ListAdm() { diff --git a/OpenAdm.Api/Controllers/ParcelaController.cs b/OpenAdm.Api/Controllers/ParcelaController.cs index b47cfc9..06aa8cc 100644 --- a/OpenAdm.Api/Controllers/ParcelaController.cs +++ b/OpenAdm.Api/Controllers/ParcelaController.cs @@ -5,7 +5,6 @@ using OpenAdm.Application.Interfaces; using OpenAdm.Application.Models.ContasAReceberModel; using OpenAdm.Application.Models.FaturasModel; -using OpenAdm.Domain.Enuns; using OpenAdm.Domain.Model; using OpenAdm.Infra.Paginacao; @@ -61,6 +60,15 @@ public async Task Pagar(PagarParcelaDto pagarFaturaAReceberDto) return Ok(fatura); } + [HttpPut("estornar")] + [ProducesResponseType(200)] + [ProducesResponseType(400)] + public async Task Estornar([FromQuery] Guid parcelaId) + { + var result = await _parcelaService.EstornarAsync(parcelaId); + return Ok(result); + } + [HttpPut("edit")] [ProducesResponseType(200)] [ProducesResponseType(400)] diff --git a/OpenAdm.Application/Interfaces/IParcelaService.cs b/OpenAdm.Application/Interfaces/IParcelaService.cs index 2fcdaeb..0e43823 100644 --- a/OpenAdm.Application/Interfaces/IParcelaService.cs +++ b/OpenAdm.Application/Interfaces/IParcelaService.cs @@ -11,6 +11,7 @@ public interface IParcelaService { Task BaixarFaturaWebHookAsync(NotificationFaturaWebHook notificationFaturaWebHook); Task GetSumAReceberAsync(); + Task EstornarAsync(Guid id); Task> FaturasDashBoardAsync(); Task PagarAsync(PagarParcelaDto pagarFaturaAReceberDto); Task EditarAsync(ParcelaEditDto parcelaEditDto); diff --git a/OpenAdm.Application/Interfaces/Pedidos/IPdfPedidoService.cs b/OpenAdm.Application/Interfaces/Pedidos/IPdfPedidoService.cs index 8e3e5fe..567acb8 100644 --- a/OpenAdm.Application/Interfaces/Pedidos/IPdfPedidoService.cs +++ b/OpenAdm.Application/Interfaces/Pedidos/IPdfPedidoService.cs @@ -10,6 +10,6 @@ byte[] GeneratePdfPedido( Pedido pedido, string empresa, string? logo); - byte[] GeneratePdfPedidoRelatorio(GerarRelatorioPedidoDto relatorioPedidoDto, string nomeFantasia); + byte[] GeneratePdfPedidoRelatorio(GerarRelatorioPedidoDto relatorioPedidoDto, string nomeFantasia, IList pedido); byte[] ProducaoPedido(IList itemPedidoProducaoViewModels, string nomeFantasia, string? logo, IList pedidos); } diff --git a/OpenAdm.Application/Models/Transacoes/TransacaoFinanceiraViewModel.cs b/OpenAdm.Application/Models/Transacoes/TransacaoFinanceiraViewModel.cs index 90ced4a..8038e71 100644 --- a/OpenAdm.Application/Models/Transacoes/TransacaoFinanceiraViewModel.cs +++ b/OpenAdm.Application/Models/Transacoes/TransacaoFinanceiraViewModel.cs @@ -14,9 +14,11 @@ public class TransacaoFinanceiraViewModel : BaseViewModel public TipoTransacaoFinanceiraEnum TipoTransacaoFinanceira { get; set; } public MeioDePagamentoEnum? MeioDePagamento { get; set; } public string? Observacao { get; set; } + public bool EhEstorno { get; set; } public static explicit operator TransacaoFinanceiraViewModel(TransacaoFinanceira transacaoFinanceira) { + var estorno = transacaoFinanceira.EhEstorno; return new TransacaoFinanceiraViewModel() { Id = transacaoFinanceira.Id, @@ -29,7 +31,8 @@ public static explicit operator TransacaoFinanceiraViewModel(TransacaoFinanceira Parcela = transacaoFinanceira.Parcela == null ? null : (ParcelaViewModel)transacaoFinanceira.Parcela, ParcelaId = transacaoFinanceira.ParcelaId, TipoTransacaoFinanceira = transacaoFinanceira.TipoTransacaoFinanceira, - Valor = transacaoFinanceira.Valor + Valor = transacaoFinanceira.Valor, + EhEstorno = estorno }; } } diff --git a/OpenAdm.Application/Services/ParcelaService.cs b/OpenAdm.Application/Services/ParcelaService.cs index 3e20381..a7c4088 100644 --- a/OpenAdm.Application/Services/ParcelaService.cs +++ b/OpenAdm.Application/Services/ParcelaService.cs @@ -19,16 +19,19 @@ public sealed class ParcelaService : IParcelaService private readonly IFaturaService _contasAReceberService; private readonly IUpdateStatusPedidoService _updateStatusPedidoService; private readonly IPedidoService _pedidoService; + private readonly ITransacaoFinanceiraRepository _transacaoFinanceiraRepository; public ParcelaService( IParcelaRepository faturaContasAReceberRepository, IFaturaService contasAReceberService, IUpdateStatusPedidoService updateStatusPedidoService, - IPedidoService pedidoService) + IPedidoService pedidoService, + ITransacaoFinanceiraRepository transacaoFinanceiraRepository) { _faturaContasAReceberRepository = faturaContasAReceberRepository; _contasAReceberService = contasAReceberService; _updateStatusPedidoService = updateStatusPedidoService; _pedidoService = pedidoService; + _transacaoFinanceiraRepository = transacaoFinanceiraRepository; } public async Task AddAsync(ParcelaCriarDto parcelaCriarDto) @@ -109,6 +112,23 @@ public async Task EditAsync(FaturaEdit faturaAReceberEdit) return (ParcelaViewModel)fatura; } + public async Task EstornarAsync(Guid id) + { + var parcela = await _faturaContasAReceberRepository.GetByIdAsync(id) + ?? throw new ExceptionApi("Não foi possível localizar a parcela!"); + + var transacao = parcela.Estornar(); + + parcela.Fatura = null!; + parcela.Transacoes = null; + await _faturaContasAReceberRepository.AdicionarTransacaoAsync(transacao); + await _faturaContasAReceberRepository.UpdateAsync(parcela); + + await _contasAReceberService.VerificarFechamentoAsync(parcela.FaturaId); + + return true; + } + public async Task ExcluirAsync(Guid id) { var parcela = await _faturaContasAReceberRepository.GetByIdAsync(id) @@ -126,14 +146,18 @@ public async Task ExcluirAsync(Guid id) public async Task> FaturasDashBoardAsync() { - var faturas = await _faturaContasAReceberRepository.SumTotalMesesAsync(TipoFaturaEnum.A_Receber); + var transacoes = await _transacaoFinanceiraRepository.SumTotalMesesAsync(TipoFaturaEnum.A_Receber); var faturasPagaDashBoardModel = new List(); - foreach (var item in faturas) + foreach (var item in transacoes) { faturasPagaDashBoardModel.Add(new ParcelaPagaDashBoardModel() { Mes = item.Key.ConverterMesIntEmNome(), Count = item.Value + .Where(x => x.Parcela != null && + x.Parcela.Fatura.Tipo == TipoFaturaEnum.A_Receber && + !x.EhEstorno) + .Sum(x => x.Valor) }); } return faturasPagaDashBoardModel; @@ -153,8 +177,11 @@ public async Task> GetByPedidoIdAsync(Guid pedidoId) return faturas.Select(x => (ParcelaViewModel)x).ToList(); } - public Task GetSumAReceberAsync() - => _faturaContasAReceberRepository.SumTotalAsync(TipoFaturaEnum.A_Receber); + public async Task GetSumAReceberAsync() + { + var parcelas = await _faturaContasAReceberRepository.ListaParcelasTotalizadorAsync(TipoFaturaEnum.A_Receber); + return parcelas.Sum(x => x.ValorAPagarAReceber); + } public async Task PagarAsync(PagarParcelaDto pagarFaturaAReceberDto) { diff --git a/OpenAdm.Application/Services/Pedidos/PdfPedidoService.cs b/OpenAdm.Application/Services/Pedidos/PdfPedidoService.cs index ba94e20..88cce9d 100644 --- a/OpenAdm.Application/Services/Pedidos/PdfPedidoService.cs +++ b/OpenAdm.Application/Services/Pedidos/PdfPedidoService.cs @@ -47,7 +47,7 @@ public sealed class PdfPedidoService : IPdfPedidoService }; private static readonly IList _colunsWidtRelatorio = new List() { - 60,90,170,90,90 + 70,90,170,90,90 }; @@ -246,7 +246,7 @@ static IContainer CellTableStyle(IContainer container) .GroupBy(x => x?.Id); - if (tamamhosItens.Any()) + if (tamamhosItens.Count() > 0) { table .Cell() @@ -294,7 +294,7 @@ static IContainer CellTableStyle(IContainer container) count++; } - if (pesosItens.Any()) + if (pesosItens.Count() > 0) { table .Cell() @@ -349,8 +349,12 @@ static IContainer CellTableStyle(IContainer container) return pdf; } - public byte[] GeneratePdfPedidoRelatorio(GerarRelatorioPedidoDto relatorioPedidoDto, string nomeFantasia) + public byte[] GeneratePdfPedidoRelatorio( + GerarRelatorioPedidoDto relatorioPedidoDto, + string nomeFantasia, IList pedidos) { + var itensPedido = pedidos.SelectMany(x => x.ItensPedido); + void HeaderCustom(IContainer container) { var titleStyle = TextStyle.Default.FontSize(18).SemiBold(); @@ -473,6 +477,113 @@ static IContainer CellTableStyle(IContainer container) .Element(CellTableStyle) .Text($"Total : {relatorioPedidoDto.Total.FormatMoney()}") .FontSize(8); + + var tamamhosItens = itensPedido + .OrderBy(x => x.Tamanho?.Numero) + .Where(x => x.Tamanho != null) + .Select(x => x.Tamanho) + .ToList() + .GroupBy(x => x?.Id); + + var pesosItens = itensPedido + .OrderBy(x => x.Peso?.Numero) + .Where(x => x.Peso != null) + .Select(x => x.Peso) + .ToList() + .GroupBy(x => x?.Id); + + + if (tamamhosItens.Any()) + { + table + .Cell() + .Element(CellStyleHeaderTable) + .Text($"Tamanhos") + .FontSize(10); + } + + var count = 0; + + foreach (var tamanhoGroup in tamamhosItens) + { + + if (count > 0) + { + table.Cell(); + } + + table.Cell(); + table.Cell(); + table.Cell(); + table.Cell(); + //table.Cell(); + var itemPedido = itensPedido + .FirstOrDefault(x => x.TamanhoId == tamanhoGroup.Key); + + var totalQuantidade = itensPedido + .Where(x => x.TamanhoId == tamanhoGroup.Key) + .ToList() + .Sum(x => x.Quantidade); + + table + .Cell() + .Element(CellTableStyle) + .Text($"{itemPedido?.Tamanho?.Descricao} : {totalQuantidade.FormatMoney()}") + .FontSize(8); + table.Cell(); + table.Cell(); + table.Cell(); + table.Cell(); + //table.Cell(); + + count++; + } + + if (pesosItens.Any()) + { + table + .Cell() + .Element(CellStyleHeaderTable) + .Text($"Pesos") + .FontSize(10); + } + + count = 0; + + foreach (var pedoGroup in pesosItens) + { + if (count > 0) + { + table.Cell(); + } + + table.Cell(); + table.Cell(); + table.Cell(); + table.Cell(); + //table.Cell(); + var itemPedido = itensPedido + .FirstOrDefault(x => x.PesoId == pedoGroup.Key); + + var totalQuantidade = itensPedido + .Where(x => x.PesoId == pedoGroup.Key) + .ToList() + .Sum(x => x.Quantidade); + + table + .Cell() + .Element(CellTableStyle) + .Text($"{itemPedido?.Peso?.Descricao} : {totalQuantidade.FormatMoney()}") + .FontSize(8); + + table.Cell(); + table.Cell(); + table.Cell(); + table.Cell(); + //table.Cell(); + + count++; + } }); page.FooterCustom(); }); @@ -482,8 +593,8 @@ static IContainer CellTableStyle(IContainer container) } public byte[] ProducaoPedido( - IList itemPedidoProducaoViewModels, - string nomeFantasia, + IList itemPedidoProducaoViewModels, + string nomeFantasia, string? logo, IList pedidos) { diff --git a/OpenAdm.Application/Services/Pedidos/RelatorioPedidoPorPeriodo.cs b/OpenAdm.Application/Services/Pedidos/RelatorioPedidoPorPeriodo.cs index 1d67a69..09c5fb7 100644 --- a/OpenAdm.Application/Services/Pedidos/RelatorioPedidoPorPeriodo.cs +++ b/OpenAdm.Application/Services/Pedidos/RelatorioPedidoPorPeriodo.cs @@ -51,7 +51,7 @@ public RelatorioPedidoPorPeriodo( pedido.DataDeCriacao); }).ToList(); - var pdf = _pdfPedidoService.GeneratePdfPedidoRelatorio(relatorioPedidoModel, _parceiroAutenticado.NomeFantasia); + var pdf = _pdfPedidoService.GeneratePdfPedidoRelatorio(relatorioPedidoModel, _parceiroAutenticado.NomeFantasia, pedidos); return (pdf, pedidos.Count); } diff --git a/OpenAdm.Domain/Entities/Parcela.cs b/OpenAdm.Domain/Entities/Parcela.cs index f784775..1030a67 100644 --- a/OpenAdm.Domain/Entities/Parcela.cs +++ b/OpenAdm.Domain/Entities/Parcela.cs @@ -135,6 +135,17 @@ public TransacaoFinanceira Pagar( observacao: observacao ?? $"Pagamento da parcela: {NumeroDaParcela}"); } + public TransacaoFinanceira Estornar() + { + return TransacaoFinanceira.NovaTransacao( + parcelaId: Id, + dataDePagamento: DateTime.Now, + valor: ValorPagoRecebido, + tipoTransacaoFinanceira: Fatura.Tipo == TipoFaturaEnum.A_Pagar ? TipoTransacaoFinanceiraEnum.Entrada : TipoTransacaoFinanceiraEnum.Saida, + meioDePagamento: null, + observacao: $"Estorno da parcela: {NumeroDaParcela}"); + } + public static Parcela NovaFatura( DateTime dataDeVencimento, int numeroDaParcela, diff --git a/OpenAdm.Domain/Entities/TransacaoFinanceira.cs b/OpenAdm.Domain/Entities/TransacaoFinanceira.cs index 0425d32..04080bc 100644 --- a/OpenAdm.Domain/Entities/TransacaoFinanceira.cs +++ b/OpenAdm.Domain/Entities/TransacaoFinanceira.cs @@ -34,6 +34,31 @@ public TransacaoFinanceira( public MeioDePagamentoEnum? MeioDePagamento { get; private set; } public string? Observacao { get; private set; } + public bool EhEstorno + { + get + { + if (Parcela == null || Parcela.Fatura == null) + { + return false; + } + + if (Parcela.Fatura.Tipo == TipoFaturaEnum.A_Pagar && + TipoTransacaoFinanceira == TipoTransacaoFinanceiraEnum.Entrada) + { + return true; + } + + if (Parcela.Fatura.Tipo == TipoFaturaEnum.A_Receber && + TipoTransacaoFinanceira == TipoTransacaoFinanceiraEnum.Saida) + { + return true; + } + + return false; + } + } + public static TransacaoFinanceira NovaTransacao( Guid? parcelaId, DateTime? dataDePagamento, @@ -45,8 +70,8 @@ public static TransacaoFinanceira NovaTransacao( { if (dataDePagamento.HasValue) { - dataDePagamento.Value.AddHours(DateTime.Now.Hour); - dataDePagamento.Value.AddMinutes(DateTime.Now.Minute); + dataDePagamento = dataDePagamento.Value.AddHours(DateTime.Now.Hour); + dataDePagamento = dataDePagamento.Value.AddMinutes(DateTime.Now.Minute); } return new TransacaoFinanceira( diff --git a/OpenAdm.Domain/Interfaces/IParcelaRepository.cs b/OpenAdm.Domain/Interfaces/IParcelaRepository.cs index 29455b8..d058d01 100644 --- a/OpenAdm.Domain/Interfaces/IParcelaRepository.cs +++ b/OpenAdm.Domain/Interfaces/IParcelaRepository.cs @@ -5,7 +5,7 @@ namespace OpenAdm.Domain.Interfaces; public interface IParcelaRepository : IGenericRepository { - Task SumTotalAsync(TipoFaturaEnum faturaEnum); + Task> ListaParcelasTotalizadorAsync(TipoFaturaEnum tipoFatura); Task> SumTotalMesesAsync(TipoFaturaEnum faturaEnum); Task GetByIdAsync(Guid id); Task GetByIdExternoAsync(string idExterno); diff --git a/OpenAdm.Domain/Interfaces/ITransacaoFinanceiraRepository.cs b/OpenAdm.Domain/Interfaces/ITransacaoFinanceiraRepository.cs index a9d9be5..02f3034 100644 --- a/OpenAdm.Domain/Interfaces/ITransacaoFinanceiraRepository.cs +++ b/OpenAdm.Domain/Interfaces/ITransacaoFinanceiraRepository.cs @@ -1,4 +1,5 @@ using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Enuns; namespace OpenAdm.Domain.Interfaces; @@ -9,4 +10,6 @@ Task> TransacoesNoPeriodoAsync( DateTime dataFinal, Guid? pedidoId, Guid? clienteId); + + Task>> SumTotalMesesAsync(TipoFaturaEnum faturaEnum); } diff --git a/OpenAdm.Infra/EntityConfiguration/TransacaoFinanceiraConfiguration.cs b/OpenAdm.Infra/EntityConfiguration/TransacaoFinanceiraConfiguration.cs index 470a114..6a226bb 100644 --- a/OpenAdm.Infra/EntityConfiguration/TransacaoFinanceiraConfiguration.cs +++ b/OpenAdm.Infra/EntityConfiguration/TransacaoFinanceiraConfiguration.cs @@ -25,6 +25,8 @@ public void Configure(EntityTypeBuilder builder) builder.Property(x => x.Observacao) .HasMaxLength(500); + builder.Ignore(x => x.EhEstorno); + builder.HasOne(x => x.Parcela) .WithMany(x => x.Transacoes) .HasForeignKey(x => x.ParcelaId) diff --git a/OpenAdm.Infra/Repositories/ParcelaRepository.cs b/OpenAdm.Infra/Repositories/ParcelaRepository.cs index 8f26aed..8e99862 100644 --- a/OpenAdm.Infra/Repositories/ParcelaRepository.cs +++ b/OpenAdm.Infra/Repositories/ParcelaRepository.cs @@ -76,20 +76,15 @@ public async Task> GetByPedidoIdAsync(Guid pedidoId) .ToListAsync(); } - public async Task SumTotalAsync(TipoFaturaEnum tipoFatura) + public async Task> ListaParcelasTotalizadorAsync(TipoFaturaEnum tipoFatura) { - try - { - return await ParceiroContext - .Parcelas - .AsNoTracking() - .Include(x => x.Fatura) - .SumAsync(x => x.Valor); - } - catch (Exception) - { - return 0; - } + return await ParceiroContext + .Parcelas + .AsNoTracking() + .Include(x => x.Fatura) + .Include(x => x.Transacoes) + .Where(x => x.Fatura.Tipo == tipoFatura) + .ToListAsync(); } public async Task> SumTotalMesesAsync(TipoFaturaEnum faturaEnum) diff --git a/OpenAdm.Infra/Repositories/TransacaoFinanceiraRepository.cs b/OpenAdm.Infra/Repositories/TransacaoFinanceiraRepository.cs index 255b3e3..3f31e75 100644 --- a/OpenAdm.Infra/Repositories/TransacaoFinanceiraRepository.cs +++ b/OpenAdm.Infra/Repositories/TransacaoFinanceiraRepository.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Enuns; using OpenAdm.Domain.Interfaces; using OpenAdm.Infra.Context; @@ -14,6 +15,25 @@ public TransacaoFinanceiraRepository(ParceiroContext parceiroContext) _parceiroContext = parceiroContext; } + public async Task>> SumTotalMesesAsync(TipoFaturaEnum faturaEnum) + { + var dataInicio = DateTime.Now.AddMonths(-3); + var dataSplit = dataInicio.ToString("MM/dd/yyyy").Split('/'); + var ano = int.Parse(dataSplit[2][..4]); + var mes = int.Parse(dataSplit[0]); + + return await _parceiroContext + .TransacoesFinanceiras + .AsNoTracking() + .Include(x => x.Parcela!.Fatura) + .Where(m => m.DataDeCriacao.Month >= mes && + m.DataDeCriacao.Year == ano) + .GroupBy(m => m.DataDeCriacao.Month) + .ToDictionaryAsync( + g => g.Key, + g => g.ToList()); + } + public async Task> TransacoesNoPeriodoAsync( DateTime dataInicial, DateTime dataFinal,