PageRenderTime 28ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/lei/li3/g50/modulos/compras/FichaClienteCompras.java

https://gitlab.com/andrerfcsantos/GesthiperJava
Java | 346 lines | 258 code | 67 blank | 21 comment | 20 complexity | f37a04be6e78c52c41605714ca7f83bf MD5 | raw file
  1. package lei.li3.g50.modulos.compras;
  2. import java.io.Serializable;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Objects;
  7. import java.util.TreeMap;
  8. import java.util.TreeSet;
  9. import lei.li3.g50.excepcoes.ClienteNaoComprouProdutoException;
  10. import lei.li3.g50.modulos.dados.Compra;
  11. import lei.li3.g50.modulos.dados.Mes;
  12. import lei.li3.g50.modulos.dados.Produto;
  13. import lei.li3.g50.modulos.dados.TipoCompra;
  14. import lei.li3.g50.utilitarios.ComparatorParProdutoQuantidadeComprada;
  15. import lei.li3.g50.utilitarios.Matriz_Double_12x2;
  16. import lei.li3.g50.utilitarios.Matriz_Int_12x2;
  17. import lei.li3.g50.utilitarios.ParProdutoQuantidadeComprada;
  18. public class FichaClienteCompras implements Serializable {
  19. private static final long serialVersionUID = -8760467704570262649L;
  20. private Matriz_Int_12x2 numUnidadesCompradasClientePorMes;
  21. private Matriz_Int_12x2 numComprasClientePorMes;
  22. private Matriz_Double_12x2 dinheiroGastoClientePorMes;
  23. private TreeMap<Produto, FichaProdutoDeClienteCompras> produtosCliente;
  24. /*
  25. CONSTRUCTORES
  26. */
  27. public FichaClienteCompras() {
  28. numUnidadesCompradasClientePorMes = new Matriz_Int_12x2();
  29. numComprasClientePorMes = new Matriz_Int_12x2();
  30. dinheiroGastoClientePorMes = new Matriz_Double_12x2();
  31. produtosCliente = new TreeMap<>();
  32. }
  33. public FichaClienteCompras(FichaClienteCompras ficha) {
  34. numUnidadesCompradasClientePorMes = ficha.getNumUnidadesCompradasClientePorMes();
  35. numComprasClientePorMes = ficha.getNumComprasClientePorMes();
  36. dinheiroGastoClientePorMes = ficha.getDinheiroGastoClientePorMes();
  37. for (Map.Entry<Produto, FichaProdutoDeClienteCompras> entrada : ficha.produtosCliente.entrySet()) {
  38. this.produtosCliente.put(entrada.getKey().clone(), entrada.getValue().clone());
  39. }
  40. }
  41. public void regista_compra(Compra compra) {
  42. FichaProdutoDeClienteCompras ficha_produto;
  43. int unidades_compradas = compra.getQuantidade();
  44. double preco = compra.getPreco();
  45. Mes mes = compra.getMes();
  46. TipoCompra tipo_compra = compra.getTipoCompra();
  47. this.numUnidadesCompradasClientePorMes.addValorMesTipoCompra(mes, tipo_compra, unidades_compradas);
  48. this.numComprasClientePorMes.addValorMesTipoCompra(mes, tipo_compra, 1);
  49. this.dinheiroGastoClientePorMes.addValorMesTipoCompra(mes, tipo_compra, preco * (unidades_compradas + 0.0));
  50. try {
  51. ficha_produto = this.getFichaProdutoNoClone(compra.getProduto());
  52. } catch (ClienteNaoComprouProdutoException ex) {
  53. ficha_produto = new FichaProdutoDeClienteCompras();
  54. this.produtosCliente.put(compra.getProduto().clone(), ficha_produto);
  55. }
  56. ficha_produto.addNumComprasProdutoClienteMes(mes, tipo_compra, 1);
  57. ficha_produto.addNumUnidadesCompradasProdutoClienteMes(mes, tipo_compra, unidades_compradas);
  58. ficha_produto.addTotalGastoClienteProduto(preco * (unidades_compradas + 0.0));
  59. }
  60. /*
  61. GETTERS ESPECIFICOS CLASSE
  62. */
  63. /* Nº UNIDADES */
  64. public Matriz_Int_12x2 getNumUnidadesCompradasClientePorMes() {
  65. return numUnidadesCompradasClientePorMes.clone();
  66. }
  67. public int getNumUnidadesCompradasMes(Mes mes, TipoCompra tipo_compra) {
  68. return this.numUnidadesCompradasClientePorMes.getValorMesTipoCompra(mes, tipo_compra);
  69. }
  70. public int getNumUnidadesCompradasMeses(Mes mes1, Mes mes2, TipoCompra tipo_compra) {
  71. return this.numUnidadesCompradasClientePorMes.getValorEntreMeses(mes1, mes2, tipo_compra);
  72. }
  73. public int getTotalUnidadesCompradas() {
  74. return this.numUnidadesCompradasClientePorMes.getSomaTotal();
  75. }
  76. /* Nº COMPRAS */
  77. public Matriz_Int_12x2 getNumComprasClientePorMes() {
  78. return numComprasClientePorMes.clone();
  79. }
  80. public int getNumComprasMes(Mes mes, TipoCompra tipo_compra) {
  81. return this.numComprasClientePorMes.getValorMesTipoCompra(mes, tipo_compra);
  82. }
  83. public int getNumComprasMeses(Mes mes1, Mes mes2, TipoCompra tipo_compra) {
  84. return this.numComprasClientePorMes.getValorEntreMeses(mes1, mes2, tipo_compra);
  85. }
  86. public int getTotalCompras() {
  87. return this.numComprasClientePorMes.getSomaTotal();
  88. }
  89. /* € GASTO */
  90. public Matriz_Double_12x2 getDinheiroGastoClientePorMes() {
  91. return dinheiroGastoClientePorMes.clone();
  92. }
  93. public double getDinheiroGastoClientePorMes(Mes mes, TipoCompra tipo_compra) {
  94. return dinheiroGastoClientePorMes.getValorMesTipoCompra(mes, tipo_compra);
  95. }
  96. public double getDinheiroGastoClienteMeses(Mes mes1, Mes mes2, TipoCompra tipo_compra) {
  97. return dinheiroGastoClientePorMes.getValorEntreMeses(mes1, mes2, tipo_compra);
  98. }
  99. public double getTotalDinheiroGasto() {
  100. return this.dinheiroGastoClientePorMes.getSomaTotal();
  101. }
  102. /*OUTROS*/
  103. public boolean clienteComprouProduto(Produto produto) {
  104. return this.produtosCliente.containsKey(produto);
  105. }
  106. /*GETTERS CLASSES INFERIORES*/
  107. private FichaProdutoDeClienteCompras getFichaProdutoNoClone(Produto produto) throws ClienteNaoComprouProdutoException {
  108. FichaProdutoDeClienteCompras resultado;
  109. if (this.produtosCliente.containsKey(produto)) {
  110. resultado = this.produtosCliente.get(produto);
  111. } else {
  112. throw new ClienteNaoComprouProdutoException();
  113. }
  114. return resultado;
  115. }
  116. public Matriz_Int_12x2 getNumComprasProdutoMeses(Produto produto) throws ClienteNaoComprouProdutoException {
  117. Matriz_Int_12x2 resultado;
  118. try {
  119. resultado = this.produtosCliente.get(produto).getNumComprasProdutoClientePorMes();
  120. } catch (NullPointerException e) {
  121. throw new ClienteNaoComprouProdutoException();
  122. }
  123. return resultado;
  124. }
  125. public Matriz_Int_12x2 getNumUnidadesCompradasProdutoMeses(Produto produto) throws ClienteNaoComprouProdutoException {
  126. Matriz_Int_12x2 resultado;
  127. try {
  128. resultado = this.produtosCliente.get(produto).getNumUnidadesCompradasProdutoClientePorMes();
  129. } catch (NullPointerException e) {
  130. throw new ClienteNaoComprouProdutoException();
  131. }
  132. return resultado;
  133. }
  134. public int getNumTotalUnidadesCompradasProduto(Produto produto) throws ClienteNaoComprouProdutoException {
  135. int resultado;
  136. try {
  137. resultado = this.produtosCliente.get(produto).getNumUnidadesCompradasProdutoCliente();
  138. } catch (NullPointerException e) {
  139. throw new ClienteNaoComprouProdutoException();
  140. }
  141. return resultado;
  142. }
  143. public int getNumTotaComprasProduto(Produto produto) throws ClienteNaoComprouProdutoException {
  144. int resultado;
  145. try {
  146. resultado = this.produtosCliente.get(produto).getNumComprasProdutoCliente();
  147. } catch (NullPointerException e) {
  148. throw new ClienteNaoComprouProdutoException();
  149. }
  150. return resultado;
  151. }
  152. public double getDinheiroGastoProduto(Produto produto) throws ClienteNaoComprouProdutoException {
  153. double resultado;
  154. try {
  155. resultado = this.produtosCliente.get(produto).getTotalGastoClienteProduto();
  156. } catch (NullPointerException e) {
  157. throw new ClienteNaoComprouProdutoException();
  158. }
  159. return resultado;
  160. }
  161. /*RESULTADOS PARA QUERIES*/
  162. public int getNumeroProdutosDistintos() {
  163. return this.produtosCliente.size();
  164. }
  165. public List<ParProdutoQuantidadeComprada> getParesProdutoQuantidadeComprada() {
  166. TreeSet<ParProdutoQuantidadeComprada> pares = new TreeSet<>(new ComparatorParProdutoQuantidadeComprada());
  167. ArrayList<ParProdutoQuantidadeComprada> lista_pares = new ArrayList<>();
  168. ParProdutoQuantidadeComprada novo_par;
  169. for (Map.Entry<Produto, FichaProdutoDeClienteCompras> entrada : this.produtosCliente.entrySet()) {
  170. novo_par = new ParProdutoQuantidadeComprada(entrada.getKey(),
  171. entrada.getValue().getNumUnidadesCompradasProdutoCliente());
  172. pares.add(novo_par);
  173. }
  174. for (ParProdutoQuantidadeComprada par : pares) {
  175. lista_pares.add(par);
  176. }
  177. return (List<ParProdutoQuantidadeComprada>) lista_pares;
  178. }
  179. public Map<Mes, Integer> getNumeroProdutosDistintosPorMes() {
  180. int numeroProdsDistintosPorMes[] = new int[12];
  181. TreeMap<Mes, Integer> resultado = new TreeMap<>();
  182. for (FichaProdutoDeClienteCompras ficha_produto : this.produtosCliente.values()) {
  183. for (int i = 0; i < 12; i++) {
  184. if (ficha_produto.getNumUnidadesCompradasProdutoClienteMes(Mes.numero_to_mes(i + 1)) > 0) {
  185. numeroProdsDistintosPorMes[i]++;
  186. }
  187. }
  188. }
  189. for (int i = 0; i < 12; i++) {
  190. resultado.put(Mes.numero_to_mes(i + 1), numeroProdsDistintosPorMes[i]);
  191. }
  192. return resultado;
  193. }
  194. public List<Produto> getProdutosCliente() {
  195. ArrayList<Produto> resultado = new ArrayList<>();
  196. for (Produto produto : this.produtosCliente.keySet()) {
  197. resultado.add(produto.clone());
  198. }
  199. return (List<Produto>) resultado;
  200. }
  201. /*
  202. SETTERS
  203. */
  204. /* Nº UNIDADES */
  205. public void setNumUnidadesCompradasClientePorMes(Matriz_Int_12x2 numUnidadesCompradasClientePorMes) {
  206. this.numUnidadesCompradasClientePorMes = numUnidadesCompradasClientePorMes.clone();
  207. }
  208. public void setNumUnidadesCompradasClienteMes(Mes mes, TipoCompra tipo_compra, int valor) {
  209. this.numUnidadesCompradasClientePorMes.setValorMesTipoCompra(mes, tipo_compra, valor);
  210. }
  211. public void addNumUnidadesCompradasClienteMes(Mes mes, TipoCompra tipo_compra, int valor) {
  212. this.numUnidadesCompradasClientePorMes.addValorMesTipoCompra(mes, tipo_compra, valor);
  213. }
  214. /* Nº COMPRAS */
  215. public void setNumComprasClientePorMes(Matriz_Int_12x2 numComprasClientePorMes) {
  216. this.numComprasClientePorMes = numComprasClientePorMes.clone();
  217. }
  218. public void setNumComprasClienteMes(Mes mes, TipoCompra tipo_compra, int valor) {
  219. this.numComprasClientePorMes.setValorMesTipoCompra(mes, tipo_compra, valor);
  220. }
  221. public void addNumComprasClienteMes(Mes mes, TipoCompra tipo_compra, int valor) {
  222. this.numComprasClientePorMes.addValorMesTipoCompra(mes, tipo_compra, valor);
  223. }
  224. /* € GASTO */
  225. public void setDinheiroGastoClientePorMes(Matriz_Double_12x2 dinheiroGastoClientePorMes) {
  226. this.dinheiroGastoClientePorMes = dinheiroGastoClientePorMes.clone();
  227. }
  228. public void setDinheiroGastoClienteMes(Mes mes, TipoCompra tipo_compra, double valor) {
  229. this.dinheiroGastoClientePorMes.setValorMesTipoCompra(mes, tipo_compra, valor);
  230. }
  231. public void addDinheiroGastoClienteMes(Mes mes, TipoCompra tipo_compra, double valor) {
  232. this.dinheiroGastoClientePorMes.addValorMesTipoCompra(mes, tipo_compra, valor);
  233. }
  234. /*
  235. METODOS STANDARD
  236. */
  237. @Override
  238. public int hashCode() {
  239. int hash = 5;
  240. hash = 53 * hash + Objects.hashCode(this.numUnidadesCompradasClientePorMes);
  241. hash = 53 * hash + Objects.hashCode(this.numComprasClientePorMes);
  242. hash = 53 * hash + Objects.hashCode(this.dinheiroGastoClientePorMes);
  243. hash = 53 * hash + Objects.hashCode(this.produtosCliente);
  244. return hash;
  245. }
  246. @Override
  247. public boolean equals(Object obj) {
  248. if (this == obj) {
  249. return true;
  250. }
  251. if (obj == null) {
  252. return false;
  253. }
  254. if (getClass() != obj.getClass()) {
  255. return false;
  256. }
  257. final FichaClienteCompras other = (FichaClienteCompras) obj;
  258. return this.dinheiroGastoClientePorMes.equals(other.getDinheiroGastoClientePorMes())
  259. && this.numComprasClientePorMes.equals(other.getNumComprasClientePorMes())
  260. && this.numUnidadesCompradasClientePorMes.equals(other.getNumUnidadesCompradasClientePorMes())
  261. && this.produtosCliente.keySet().containsAll(other.produtosCliente.keySet())
  262. && this.produtosCliente.values().containsAll(other.produtosCliente.values());
  263. }
  264. @Override
  265. public String toString() {
  266. StringBuilder sb = new StringBuilder();
  267. sb.append("FichaClienteCompras{");
  268. sb.append(", Total unidades compras=").append(numUnidadesCompradasClientePorMes.getSomaTotal());
  269. sb.append(", Total Compras=").append(numComprasClientePorMes.getSomaTotal());
  270. sb.append(", € Gasto=").append(dinheiroGastoClientePorMes.getSomaTotal());
  271. sb.append(", Nº Produtos Cliente=").append(produtosCliente.size());
  272. sb.append('}');
  273. return sb.toString();
  274. }
  275. @Override
  276. public FichaClienteCompras clone() {
  277. return new FichaClienteCompras(this);
  278. }
  279. }