-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
145 lines (120 loc) · 4.86 KB
/
Copy pathProgram.cs
File metadata and controls
145 lines (120 loc) · 4.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
// Banco de Memória
var carros = new List<Carro>
{
new ("BRA2E16", "Onix LT", 120),
new ("XYZ1234", "Renegade", 250),
new ("ABC1D23", "HB20", 110),
new ("ACD2H18", "Creta", 200),
new ("BCA3E19", "T-Cross", 220),
new ("DEF4G20", "HR-V", 230),
new ("GHI5J21", "Kicks", 180),
new ("JKL6K22", "Compass", 270),
new ("MNO7L23", "Corolla", 300)
};
app.MapGet("/", () => "API Localiza Clone rodando! Acesse /carros");
app.MapGet("/carros", () => carros);
app.MapGet("/carros/disponiveis", () => carros.Where(c => c.Disponivel));
app.MapPost("/alugar", (string placa, string cliente, int dias) =>
{
var carro = carros.FirstOrDefault(c => c.Placa.Equals(placa, StringComparison.OrdinalIgnoreCase));
if (carro == null)
return Results.NotFound("Carro não encontrado");
if (!carro.Disponivel)
return Results.BadRequest("Carro já está alugado ou reservado");
carro.Disponivel = false;
carro.DataAluguel = DateTime.Now;
carro.DiasContratados = dias;
carro.ClienteAtual = cliente;
var total = carro.ValorDiaria * dias;
return Results.Ok(new { Mensagem = $"Alugado para {cliente}", Total = total });
});
app.MapPost("/devolver", (string placa, int diasUsados) =>
{
var carro = carros.FirstOrDefault(c => c.Placa.Equals(placa, StringComparison.OrdinalIgnoreCase));
if (carro == null)
return Results.NotFound("Carro não encontrado");
var atraso = diasUsados - carro.DiasContratados;
decimal totalFinal;
if (atraso <= 0)
{
totalFinal = carro.ValorDiaria * diasUsados;
carro.ResetarEstado(); // Libera o carro após a devolução
return Results.Ok(new { Mensagem = "Devolução realizada dentro do prazo", Total = totalFinal });
}
else
{
var multa = atraso * carro.ValorDiaria * 0.5m; // 50% de multa por dia de atraso
totalFinal = (carro.DiasContratados * carro.ValorDiaria) + multa + (atraso * carro.ValorDiaria);
carro.ResetarEstado(); // Libera o carro após a devolução
return Results.Ok(new { Mensagem = $"Atraso de {atraso} dia(s)! Multa de 50% aplicada.", Multa = multa, Total = totalFinal });
}
});
app.MapGet("/reserva", () =>
carros.Where(c => c.DataReserva != null)
.Select(c => new { c.Placa, c.Modelo, c.DataReserva, c.ClienteAtual }));
app.MapPost("/reservar", (string placa, string cliente, DateTime dataReserva, int dias) =>
{
var carro = carros.FirstOrDefault(c => c.Placa.Equals(placa, StringComparison.OrdinalIgnoreCase));
if (carro == null)
return Results.NotFound("Carro não encontrado");
if (!carro.Disponivel)
return Results.BadRequest("Carro já está alugado/reservado");
if (dataReserva.Date <= DateTime.Now.Date)
{
carro.Disponivel = false;
carro.ClienteAtual = cliente;
carro.DataReserva = dataReserva;
carro.DataAluguel = dataReserva;
carro.DiasContratados = dias;
return Results.Ok(new { Mensagem = $"Alugado para {cliente}", Total = carro.ValorDiaria * dias });
}
else
{
carro.Disponivel = false; // Bloqueia para não alugar para outro
carro.ClienteAtual = cliente;
carro.DataReserva = dataReserva;
carro.DataAluguel = null;
carro.DiasContratados = dias;
return Results.Ok(new { Mensagem = $"RESERVADO para {cliente} no dia {dataReserva:dd/MM/yyyy}", Total = carro.ValorDiaria * dias });
}
});
app.MapGet("/relatorio", () =>
{
var total = carros.Count;
// Disponíveis: Disponivel true
var disponiveis = carros.Count(c => c.Disponivel);
// Reservados: bloqueados, com reserva marcada e ainda sem data de aluguel ativa
var reservados = carros.Count(c => !c.Disponivel && c.DataReserva != null && c.DataAluguel == null);
// Alugados: bloqueados e com aluguel ativo
var alugados = carros.Count(c => !c.Disponivel && c.DataAluguel != null);
var taxaOcupacao = total > 0 ? (double)(alugados + reservados) / total * 100 : 0;
return Results.Ok(new
{
TotalCarros = total,
CarrosDisponiveis = disponiveis,
CarrosAlugados = alugados,
CarrosReservados = reservados,
TaxaOcupacao = $"{taxaOcupacao:F1}%"
});
});
app.Run();
record Carro(string Placa, string Modelo, decimal ValorDiaria)
{
public bool Disponivel { get; set; } = true;
public DateTime? DataAluguel { get; set; }
public int DiasContratados { get; set; }
public string? ClienteAtual { get; set; }
public DateTime? DataReserva { get; set; }
public bool Reservado => DataReserva != null;
public void ResetarEstado()
{
Disponivel = true;
ClienteAtual = null;
DataAluguel = null;
DataReserva = null;
DiasContratados = 0;
}
}