diff --git a/OpenAdm.Api/Controllers/PedidoController.cs b/OpenAdm.Api/Controllers/PedidoController.cs index a4fcac1..3e1be1b 100644 --- a/OpenAdm.Api/Controllers/PedidoController.cs +++ b/OpenAdm.Api/Controllers/PedidoController.cs @@ -1,9 +1,7 @@ -using Azure; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; using OpenAdm.Api.Attributes; using OpenAdm.Application.Dtos.Response; using OpenAdm.Application.Interfaces; -using OpenAdm.Application.Models.Categorias; using OpenAdm.Application.Models.Pedidos; using OpenAdm.Domain.Interfaces; using OpenAdm.Infra.Paginacao; diff --git a/OpenAdm.Api/Controllers/Pedidos/CreatePedidoAdmController.cs b/OpenAdm.Api/Controllers/Pedidos/CreatePedidoAdmController.cs new file mode 100644 index 0000000..464ae8a --- /dev/null +++ b/OpenAdm.Api/Controllers/Pedidos/CreatePedidoAdmController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using OpenAdm.Api.Attributes; +using OpenAdm.Application.Dtos.Pedidos; +using OpenAdm.Application.Interfaces.Pedidos; + +namespace OpenAdm.Api.Controllers.Pedidos; + +[ApiController] +[Route("pedidos-adm")] +[Autentica] +[AutenticaParceiro] +[IsFuncionario] +public class CreatePedidoAdmController : ControllerBase +{ + private readonly ICreatePedidoAdmService _createPedidoAdmService; + + public CreatePedidoAdmController(ICreatePedidoAdmService createPedidoAdmService) + { + _createPedidoAdmService = createPedidoAdmService; + } + + [HttpPost("create")] + public async Task CreatePedido(PedidoAdmCreateDto pedidoAdmCreateDto) + { + var result = await _createPedidoAdmService.CreateAsync(pedidoAdmCreateDto); + + return Ok(new { result }); + } +} diff --git a/OpenAdm.Application/Dtos/Pedidos/PedidoAdmCreateDto.cs b/OpenAdm.Application/Dtos/Pedidos/PedidoAdmCreateDto.cs new file mode 100644 index 0000000..1dbaca2 --- /dev/null +++ b/OpenAdm.Application/Dtos/Pedidos/PedidoAdmCreateDto.cs @@ -0,0 +1,10 @@ +using OpenAdm.Domain.Model.Pedidos; + +namespace OpenAdm.Application.Dtos.Pedidos; + +public class PedidoAdmCreateDto +{ + public Guid UsuarioId { get; set; } + public IList Itens { get; set; } = []; +} + diff --git a/OpenAdm.Application/Interfaces/IUsuarioService.cs b/OpenAdm.Application/Interfaces/IUsuarioService.cs index 6078dad..56191f1 100644 --- a/OpenAdm.Application/Interfaces/IUsuarioService.cs +++ b/OpenAdm.Application/Interfaces/IUsuarioService.cs @@ -10,6 +10,7 @@ public interface IUsuarioService { Task GetUsuarioByIdAsync(); Task GetUsuarioByIdAdmAsync(Guid id); + Task GetUsuarioByIdValidacaoAsync(Guid id); Task> GetAllUsuariosAsync(); Task CreateUsuarioAsync(CreateUsuarioDto createUsuarioDto); Task UpdateUsuarioAsync(UpdateUsuarioDto updateUsuarioDto); diff --git a/OpenAdm.Application/Interfaces/Pedidos/ICreatePedidoAdmService.cs b/OpenAdm.Application/Interfaces/Pedidos/ICreatePedidoAdmService.cs new file mode 100644 index 0000000..5084514 --- /dev/null +++ b/OpenAdm.Application/Interfaces/Pedidos/ICreatePedidoAdmService.cs @@ -0,0 +1,8 @@ +using OpenAdm.Application.Dtos.Pedidos; + +namespace OpenAdm.Application.Interfaces.Pedidos; + +public interface ICreatePedidoAdmService +{ + Task CreateAsync(PedidoAdmCreateDto pedidoAdmCreateDto); +} diff --git a/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs b/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs index 86d8be9..c939a94 100644 --- a/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs +++ b/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs @@ -16,6 +16,7 @@ public class UsuarioViewModel : BaseModel public int? PedidosEntregue { get; set; } public int? PedidosCancelados { get; set; } public decimal? TotalPedido { get; set; } + public bool IsAtacado { get; set; } public UsuarioViewModel ToModel(Usuario entity, int? quantidadeDePedido = null) { @@ -29,6 +30,7 @@ public UsuarioViewModel ToModel(Usuario entity, int? quantidadeDePedido = null) Nome = entity.Nome; Cnpj = entity.Cnpj; Cpf = entity.Cpf; + IsAtacado = entity.IsAtacado; return this; } diff --git a/OpenAdm.Application/Services/Pedidos/CreatePedidoAdmService.cs b/OpenAdm.Application/Services/Pedidos/CreatePedidoAdmService.cs new file mode 100644 index 0000000..1d8a5c2 --- /dev/null +++ b/OpenAdm.Application/Services/Pedidos/CreatePedidoAdmService.cs @@ -0,0 +1,67 @@ +using OpenAdm.Application.Dtos.Pedidos; +using OpenAdm.Application.Interfaces; +using OpenAdm.Application.Interfaces.Pedidos; +using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Enuns; +using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Interfaces; + +namespace OpenAdm.Application.Services.Pedidos; + +public class CreatePedidoAdmService : ICreatePedidoAdmService +{ + private readonly IPedidoRepository _pedidoRepository; + private readonly IProcessarPedidoService _processarPedidoService; + private readonly IItemTabelaDePrecoRepository _itemTabelaDePrecoRepository; + private readonly IFaturaService _faturaService; + private readonly IUsuarioService _usuarioService; + + public CreatePedidoAdmService( + IPedidoRepository pedidoRepository, + IProcessarPedidoService processarPedidoService, + IItemTabelaDePrecoRepository itemTabelaDePrecoRepository, + IFaturaService faturaService, + IUsuarioService usuarioService) + { + _pedidoRepository = pedidoRepository; + _processarPedidoService = processarPedidoService; + _itemTabelaDePrecoRepository = itemTabelaDePrecoRepository; + _faturaService = faturaService; + _usuarioService = usuarioService; + } + + public async Task CreateAsync(PedidoAdmCreateDto pedidoAdmCreateDto) + { + if (pedidoAdmCreateDto.Itens.Count == 0) + { + throw new ExceptionApi("Informe os itens do pedido!"); + } + var usuario = await _usuarioService.GetUsuarioByIdValidacaoAsync(id: pedidoAdmCreateDto.UsuarioId); + var date = DateTime.Now; + var pedido = new Pedido(Guid.NewGuid(), date, date, 0, StatusPedido.Aberto, usuario.Id); + + var produtosIds = pedidoAdmCreateDto.Itens.Select(x => x.ProdutoId).ToList(); + var itensTabelaDePreco = await _itemTabelaDePrecoRepository.GetItensTabelaDePrecoByIdProdutosAsync(produtosIds); + + pedido.ProcessarItensPedido(pedidoAdmCreateDto.Itens); + + await _pedidoRepository.AddAsync(pedido); + await _processarPedidoService.ProcessarCreateAsync(pedido.Id); + + + await _faturaService.CriarContasAReceberAsync(new() + { + DataDoPrimeiroVencimento = DateTime.Now.AddMonths(1), + Desconto = null, + MeioDePagamento = null, + Observacao = $"Pedido: {pedido.Numero}", + PedidoId = pedido.Id, + QuantidadeDeParcelas = 1, + Total = pedido.ValorTotal, + UsuarioId = pedido.UsuarioId, + Tipo = TipoFaturaEnum.A_Receber + }); + + return true; + } +} diff --git a/OpenAdm.Application/Services/UsuarioService.cs b/OpenAdm.Application/Services/UsuarioService.cs index 39cbd77..1bb7707 100644 --- a/OpenAdm.Application/Services/UsuarioService.cs +++ b/OpenAdm.Application/Services/UsuarioService.cs @@ -165,4 +165,14 @@ public async Task TemTelefoneCadastradoAsync() var usuario = await _usuarioAutenticado.GetUsuarioAutenticadoAsync(); return !string.IsNullOrWhiteSpace(usuario.Telefone); } + + public async Task GetUsuarioByIdValidacaoAsync(Guid id) + { + var usuario = await _usuarioRepository.GetUsuarioByIdAsync(id) + ?? throw new ExceptionApi("Não foi possível localizar o cadastro do usuario"); + + var usuarioViewModel = new UsuarioViewModel().ToModel(usuario, 0); + + return usuarioViewModel; + } } diff --git a/OpenAdm.IoC/DependencyInjectyApplication.cs b/OpenAdm.IoC/DependencyInjectyApplication.cs index c8eafc9..3746ff5 100644 --- a/OpenAdm.IoC/DependencyInjectyApplication.cs +++ b/OpenAdm.IoC/DependencyInjectyApplication.cs @@ -13,6 +13,7 @@ public static class DependencyInjectyApplication public static void InjectServices(this IServiceCollection services) { services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped();