-
Notifications
You must be signed in to change notification settings - Fork 1
/
Loja.java
174 lines (146 loc) · 5.74 KB
/
Loja.java
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
/**
* Implementa uma loja virtual para vendavels de qualquer tipo,
* desde que tenham descrição, preço e dimensões.
*
* Essa classe será um singleton, isto é, permitiremos apenas
* uma instância desde objeto no sistema.
*/
public class Loja {
static final float PRECO_DEFAULT = 1.99f;
private Map<Vendavel, InfoVendavel> infoVendaveis;
private Map<Long, Usuario> usuarioByCpf; // Map<Chave, Valor> valorByChave
private Transportador entregador;
static {
System.out.println("Estou subindo a classe Loja...");
}
public Loja(Transportador entregador) {
this.infoVendaveis = new HashMap<>(); // composição
this.usuarioByCpf = new HashMap<>(); // composição
this.entregador = entregador; // agregação
}
/**
* Inclui no vendavels da loja a quantidade informado do vendavel.
*
* @param vendavel o vendavel a ser incluído
* @param quantidadeAIncluir a quantidade que será acrescentada à quantidade existente.
*/
public void incluirVendavel(Vendavel vendavel, int quantidadeAIncluir) {
InfoVendavel infoVendavel = obterInfoVendavel(vendavel);
if (infoVendavel != null) {
// vendavel já existe no estoque da loja
infoVendavel.quantidade += quantidadeAIncluir;
// se precisássemos, por alguma razão, criar outro OBJETO, aí sim precisaríamos
// atualizar o mapa, fazendo com que aquela chave apontasse para o novo objeto
//
// infoVendavel = new InfoVendavel(vendavel,
// infoVendavel.quantidade + quantidadeAIncluir, PRECO_DEFAULT);
// this.infoVendaveis.put(vendavel, infoVendavel);
// this.infoVendaveis.add(infoVendavel);
} else {
// vendavel não existe ainda, vamos incluir
infoVendavel = new InfoVendavel(vendavel, quantidadeAIncluir, PRECO_DEFAULT);
this.infoVendaveis.put(vendavel, infoVendavel);
}
}
public void atribuirPreco(Vendavel vendavel, float novoPreco) {
InfoVendavel infoVendavel = obterInfoVendavel(vendavel);
if (infoVendavel != null) {
infoVendavel.preco = novoPreco;
}
}
private InfoVendavel obterInfoVendavel(Vendavel vendavelASerConsultado) {
return this.infoVendaveis.get(vendavelASerConsultado);
}
public void cadastrarUsuario(Usuario usuario) {
final long cpf = usuario.getCpf();
Usuario usuarioJaCadastrado = obterUsuario(cpf);
if (usuarioJaCadastrado != null) {
// nada a fazer, pois o usuário já está cadastrado
return;
}
this.usuarioByCpf.put(cpf, usuario);
}
private Usuario obterUsuario(Usuario usuario) {
return obterUsuario(usuario.getCpf());
}
private Usuario obterUsuario(long cpf) {
return this.usuarioByCpf.get(cpf);
}
/**
* Efetua a venda do vendavel desejado na quantidade especificada.
*
* @param vendavel o vendavel
* @param quantidadeDesejada a quantidade
*
* @return um Recibo indicando a venda feita, se o vendavel existia (em quantidade suficiente)
* no vendavels da loja; null, caso o usuário ou o vendavel sejam desconhecidos,
* ou não haja quantidade suficiente do vendavel desejado
*/
public Recibo efetuarVenda(
Vendavel vendavel, int quantidadeDesejada, Usuario usuario) {
// a quantidade desejada é positiva?
if (quantidadeDesejada < 1) {
return null;
}
// conheço o usuário?
if (obterUsuario(usuario) == null) { // não conheço!
return null; // não efetua a venda
}
// existe o vendavel?
InfoVendavel infoVendavel = obterInfoVendavel(vendavel);
if (infoVendavel == null) {
return null; // não efetua a venda
}
if (infoVendavel.quantidade < quantidadeDesejada) {
return null; // não efetua a venda
}
// vamos efetuar a venda
infoVendavel.quantidade -= quantidadeDesejada;
// solicita a entrega
if (vendavel instanceof Produto) {
this.entregador.transportar((Produto) vendavel, usuario.getEndereco());
}
Recibo recibo = new Recibo(quantidadeDesejada * infoVendavel.preco,
usuario, vendavel, quantidadeDesejada);
return recibo;
}
/**
* @param vendavel o vendavel a ser consultado
*
* @return a quantidade em vendavels;
* 0 se não houver nenhuma unidade;
* -1 se o vendavel não é sequer vendido pela loja
*/
public int informarQuantidadeEmEstoque(Vendavel vendavel) {
InfoVendavel infoVendavel = obterInfoVendavel(vendavel);
return infoVendavel != null ? infoVendavel.quantidade : -1;
}
public void listarTodosOsItens() {
for (InfoVendavel infoVendavel : this.infoVendaveis.values()) {
Vendavel vendavel = infoVendavel.vendavel;
String descricao = vendavel.getDescricao();
Image imagem = obterImagemDaRede(vendavel.getUrlDaImagem());
float preco = infoVendavel.preco;
// ToDo exibir a descrição do item com sua imagem e seu preço nesta loja
}
}
private Image obterImagemDaRede(String url) {
// ToDo...
return null;
}
private class InfoVendavel {
Vendavel vendavel;
float preco;
int quantidade;
int vendasEfetuadas;
int avaliacaoDoVendavel;
InfoVendavel(Vendavel vendavel, int quantidade, float preco) {
this.vendavel = vendavel;
this.preco = preco;
this.quantidade = quantidade;
}
}
}