Skip to content

Commit 23323fc

Browse files
committed
Configurações em validações no BFF de Compras
1 parent af492b2 commit 23323fc

File tree

7 files changed

+215
-2
lines changed

7 files changed

+215
-2
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.ComponentModel.DataAnnotations;
2+
3+
namespace JSE.Core.Validation
4+
{
5+
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
6+
public class CartaoExpiracaoAttribute : ValidationAttribute
7+
{
8+
public override bool IsValid(object value)
9+
{
10+
if (value == null)
11+
return false;
12+
13+
var mes = value.ToString().Split('/')[0];
14+
var ano = $"20{value.ToString().Split('/')[1]}";
15+
16+
if (int.TryParse(mes, out var month) &&
17+
int.TryParse(ano, out var year))
18+
{
19+
var d = new DateTime(year, month, 1);
20+
return d > DateTime.UtcNow;
21+
}
22+
23+
return false;
24+
}
25+
}
26+
}

src/services/JSE.Catalogo.API/Controllers/CatalogoController.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,11 @@ public async Task<Produto> Produtodetalhe(Guid id)
2828
return await _produtoRepository.ObterPorId(id);
2929
}
3030

31+
[HttpGet("catalogo/produtos/lista/{ids}")]
32+
public async Task<IEnumerable<Produto>> ObterProdutosPorId(string ids)
33+
{
34+
return await _produtoRepository.ObterProdutosPorId(ids);
35+
}
36+
3137
}
3238
}

src/services/JSE.Catalogo.API/Data/Repository/ProdutoRepository.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ public async Task<IEnumerable<Produto>> ObterTodos()
2020
return await _context.Produtos.AsNoTracking().ToListAsync();
2121
}
2222

23+
24+
public async Task<List<Produto>> ObterProdutosPorId(string ids)
25+
{
26+
var idsGuid = ids.Split(',')
27+
.Select(id => (Ok: Guid.TryParse(id, out var x), Value: x));
28+
29+
if (!idsGuid.All(nid => nid.Ok)) return new List<Produto>();
30+
31+
var idsValue = idsGuid.Select(id => id.Value);
32+
33+
return await _context.Produtos.AsNoTracking()
34+
.Where(p => idsValue.Contains(p.Id) && p.Ativo).ToListAsync();
35+
}
36+
2337
public async Task<Produto> ObterPorId(Guid id)
2438
{
2539
return await _context.Produtos.FindAsync(id);

src/services/JSE.Catalogo.API/Models/IProdutoRepository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public interface IProdutoRepository : IRepository<Produto>
66
{
77
Task<IEnumerable<Produto>> ObterTodos();
88
Task<Produto> ObterPorId(Guid id);
9+
Task<List<Produto>> ObterProdutosPorId(string ids);
910
void Adicionar(Produto produto);
1011
void Atualizar(Produto produto);
1112
}

src/web/JSE.WebApp.MVC/Models/PedidoTransacaoViewModel.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
namespace JSE.WebApp.MVC.Models
1+
using System.ComponentModel.DataAnnotations;
2+
using System.ComponentModel;
3+
using JSE.Core.Validation;
4+
5+
namespace JSE.WebApp.MVC.Models
26
{
37
public class PedidoTransacaoViewModel
48
{
@@ -19,5 +23,27 @@ public class PedidoTransacaoViewModel
1923

2024
#endregion
2125

26+
#region Cartão
27+
28+
[Required(ErrorMessage = "Informe o número do cartão")]
29+
[DisplayName("Número do Cartão")]
30+
public string NumeroCartao { get; set; }
31+
32+
[Required(ErrorMessage = "Informe o nome do portador do cartão")]
33+
[DisplayName("Nome do Portador")]
34+
public string NomeCartao { get; set; }
35+
36+
[RegularExpression(@"(0[1-9]|1[0-2])\/[0-9]{2}", ErrorMessage = "O vencimento deve estar no padrão MM/AA")]
37+
[CartaoExpiracao(ErrorMessage = "Cartão Expirado")]
38+
[Required(ErrorMessage = "Informe o vencimento")]
39+
[DisplayName("Data de Vencimento MM/AA")]
40+
public string ExpiracaoCartao { get; set; }
41+
42+
[Required(ErrorMessage = "Informe o código de segurança")]
43+
[DisplayName("Código de Segurança")]
44+
public string CvvCartao { get; set; }
45+
46+
#endregion
47+
2248
}
2349
}

src/web/JSE.WebApp.MVC/Models/PedidoViewModel.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public class PedidoViewModel
1414
public int Status { get; set; }
1515
public DateTime Data { get; set; }
1616
public decimal ValorTotal { get; set; }
17-
1817
public decimal Desconto { get; set; }
1918
public bool VoucherUtilizado { get; set; }
2019

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
@using JSE.WebApp.MVC.Extensions
2+
@model JSE.WebApp.MVC.Models.PedidoTransacaoViewModel
3+
4+
@{
5+
ViewData["Title"] = "Confirme o seu pedido";
6+
}
7+
8+
<section class="padding-y">
9+
<div class="container">
10+
11+
<vc:Summary></vc:Summary>
12+
13+
@{
14+
if (Model.Itens.Any())
15+
{
16+
<div class="card">
17+
<div class="tracking-wrap">
18+
<div class="step active">
19+
<span class="icon">
20+
<i class="fa fa-location-arrow"></i>
21+
</span>
22+
<span class="text"> Endereço</span>
23+
</div>
24+
<div class="step active">
25+
<span class="icon">
26+
<i class="fa fa-credit-card"></i>
27+
</span>
28+
<span class="text"> Pagamento </span>
29+
</div>
30+
<div class="step">
31+
<span class="icon">
32+
<i class="fa fa-check-square"></i>
33+
</span>
34+
<span class="text"> Confirmação</span>
35+
</div>
36+
</div>
37+
<article class="card-body">
38+
<header class="mb-4">
39+
<h4 class="card-title">Seu pedido</h4>
40+
</header>
41+
<div class="row">
42+
@{
43+
foreach (var item in Model.Itens)
44+
{
45+
<div class="col-md-6">
46+
<figure class="itemside mb-3">
47+
<div class="aside">
48+
<img src="~/images/produtos/@item.Imagem" alt="@item.Nome" class="border img-xs">
49+
</div>
50+
<figcaption class="info">
51+
<p>
52+
<b>@item.Nome</b>
53+
</p>
54+
<span>@this.UnidadesPorProdutoValorTotal(item.Quantidade, item.Valor) </span>
55+
</figcaption>
56+
</figure>
57+
</div>
58+
}
59+
}
60+
61+
</div>
62+
</article>
63+
64+
<partial name="_ResumoFinanceiro" model="Model"/>
65+
66+
<form asp-action="FinalizarPedido" asp-controller="Pedido">
67+
<article class="card-body border-top">
68+
69+
<div class="card-body">
70+
<div class="row">
71+
<div class="col-md-4 col-sm-12">
72+
<div class="form-group">
73+
<label asp-for="NomeCartao"></label>
74+
<input asp-for="NomeCartao" class="form-control"/>
75+
<span asp-validation-for="NomeCartao" class="text-danger"></span>
76+
</div>
77+
</div>
78+
<div class="col-md-4 col-sm-12">
79+
<div class="form-group">
80+
<label asp-for="NumeroCartao"></label>
81+
<div class="input-group">
82+
<input asp-for="NumeroCartao" class="form-control"/>
83+
<div class="input-group-append">
84+
<span class="input-group-text">
85+
<i class="fab fa-cc-visa"></i> &nbsp; <i class="fab fa-cc-amex"></i> &nbsp;
86+
<i class="fab fa-cc-mastercard"></i>
87+
</span>
88+
</div>
89+
<span asp-validation-for="NumeroCartao" class="text-danger"></span>
90+
</div>
91+
</div>
92+
</div>
93+
</div>
94+
95+
<div class="row">
96+
<div class="col-md-4 col-sm-12">
97+
<div>
98+
<label asp-for="ExpiracaoCartao"></label>
99+
<div class="form-inline">
100+
<input style="width: 190px" asp-for="ExpiracaoCartao" class="form-control"/>
101+
<span asp-validation-for="ExpiracaoCartao" class="text-danger"></span>
102+
</div>
103+
</div>
104+
</div>
105+
<div class="col-md-4 col-sm-12">
106+
<div>
107+
<spam data-toggle="tooltip" title="" data-original-title="Os 3 dígitos informados atrás do seu cartão">
108+
<label asp-for="CvvCartao"></label> <i class="fa fa-question-circle"></i>
109+
</spam>
110+
111+
<div>
112+
<input style="width: 160px" asp-for="CvvCartao" class="form-control"/>
113+
<span asp-validation-for="CvvCartao" class="text-danger"></span>
114+
</div>
115+
</div>
116+
</div>
117+
</div>
118+
119+
</div>
120+
</article>
121+
122+
<div class="card-body border-top">
123+
<div class="text-left">
124+
<button type="submit" class="btn btn-primary float-md-right"> Finalizar Pedido <i class="fa fa-chevron-right"></i> </button>
125+
</div>
126+
127+
<a asp-controller="Pedido" asp-action="EnderecoEntrega" class="btn btn-light"> <i class="fa fa-chevron-left"></i> Voltar ao Endereço </a>
128+
</div>
129+
</form>
130+
</div>
131+
}
132+
}
133+
</div>
134+
</section>
135+
136+
@section Scripts {
137+
138+
@{
139+
await Html.RenderPartialAsync("_ValidationScriptsPartial");}
140+
141+
}

0 commit comments

Comments
 (0)