/src/lei/li3/g50/modulos/contabilidade/Contabilidade.java

https://gitlab.com/andrerfcsantos/GesthiperJava · Java · 368 lines · 266 code · 76 blank · 26 comment · 20 complexity · ebeb3f3d03da7b500dd40b660da1cd6a MD5 · raw file

  1. package lei.li3.g50.modulos.contabilidade;
  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.ProdutoNaoExisteException;
  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 Contabilidade implements Serializable {
  19. private static final long serialVersionUID = -6294510456940432396L;
  20. private static final int MAX_MONTH = 12;
  21. private Matriz_Int_12x2 totalComprasPorMes;
  22. private Matriz_Int_12x2 totalUnidadesVendidasPorMes;
  23. private Matriz_Double_12x2 totalFacturadoPorMes;
  24. private TreeMap<Produto, FichaProdutoContabilidade> arvoreProdutos;
  25. /*
  26. CONSTRUCTORES
  27. */
  28. public Contabilidade() {
  29. super();
  30. this.totalComprasPorMes = new Matriz_Int_12x2();
  31. this.totalUnidadesVendidasPorMes = new Matriz_Int_12x2();
  32. this.totalFacturadoPorMes = new Matriz_Double_12x2();
  33. this.arvoreProdutos = new TreeMap<>();
  34. }
  35. public Contabilidade(Matriz_Int_12x2 totalComprasPorMes,
  36. Matriz_Int_12x2 totalUnidadesVendidasPorMes, Matriz_Double_12x2 totalFacturadoPorMes,
  37. TreeMap<Produto, FichaProdutoContabilidade> arvoreProdutos,
  38. int numeroClientesDistintosPorMes[], int numeroProdutosDistintosPorMes[]) {
  39. super();
  40. this.arvoreProdutos = new TreeMap<>();
  41. this.totalComprasPorMes = totalComprasPorMes.clone();
  42. this.totalUnidadesVendidasPorMes = totalUnidadesVendidasPorMes.clone();
  43. this.totalFacturadoPorMes = totalFacturadoPorMes.clone();
  44. for (Map.Entry<Produto, FichaProdutoContabilidade> tuplo : arvoreProdutos.entrySet()) {
  45. this.arvoreProdutos.put(tuplo.getKey().clone(), tuplo.getValue().clone());
  46. }
  47. }
  48. public Contabilidade(Contabilidade contabilidade) {
  49. super();
  50. this.totalComprasPorMes = contabilidade.getTotalComprasPorMes();
  51. this.totalUnidadesVendidasPorMes = contabilidade.getTotalUnidadesVendidasPorMes();
  52. this.totalFacturadoPorMes = contabilidade.getTotalFacturadoPorMes();
  53. this.arvoreProdutos = contabilidade.getArvoreProdutos();
  54. }
  55. /*
  56. REGISTOS
  57. */
  58. public void registaProduto(Produto produto) {
  59. this.arvoreProdutos.put(produto.clone(), new FichaProdutoContabilidade());
  60. }
  61. public void registaCompra(Compra compra) {
  62. Mes mes = compra.getMes();
  63. Produto produto = compra.getProduto();
  64. TipoCompra tipo_compra = compra.getTipoCompra();
  65. int qt = compra.getQuantidade();
  66. double preco = compra.getPreco();
  67. FichaProdutoContabilidade ficha_produto;
  68. this.totalComprasPorMes.addValorMesTipoCompra(mes, tipo_compra, 1);
  69. this.totalUnidadesVendidasPorMes.addValorMesTipoCompra(mes, tipo_compra, qt);
  70. this.totalFacturadoPorMes.addValorMesTipoCompra(mes, tipo_compra, preco * (qt + 0.0));
  71. try {
  72. ficha_produto = getFichaProdutoNoClone(produto);
  73. } catch (ProdutoNaoExisteException e) {
  74. ficha_produto = new FichaProdutoContabilidade();
  75. this.arvoreProdutos.put(produto.clone(), ficha_produto);
  76. }
  77. ficha_produto.addNumComprasProdutoPorMesPorTipoCompra(mes, tipo_compra, 1);
  78. ficha_produto.addNumUnidadesProdutoVendidasPorMesPorTipoCompra(mes, tipo_compra, qt);
  79. ficha_produto.addFacturacaoProdutoPorMesPorTipoCompra(mes, tipo_compra, preco * (qt + 0.0));
  80. }
  81. /* GETTERS CLASSE SUPERIOR*/
  82. public TreeMap<Produto, FichaProdutoContabilidade> getArvoreProdutos() {
  83. TreeMap<Produto, FichaProdutoContabilidade> tmp = new TreeMap<>();
  84. for (Map.Entry<Produto, FichaProdutoContabilidade> tuplo : this.arvoreProdutos.entrySet()) {
  85. tmp.put(tuplo.getKey().clone(), tuplo.getValue().clone());
  86. }
  87. return tmp;
  88. }
  89. /* NUMERO COMPRAS */
  90. public Matriz_Int_12x2 getTotalComprasPorMes() {
  91. return totalComprasPorMes.clone();
  92. }
  93. public int getTotalCompras() {
  94. return totalComprasPorMes.getSomaTotal();
  95. }
  96. public int getTotalComprasPorMes(Mes mes) {
  97. return totalComprasPorMes.getValorMesTipoCompra(mes, TipoCompra.AMBOS);
  98. }
  99. /* UNIDADES VENDIDAS */
  100. public Matriz_Int_12x2 getTotalUnidadesVendidasPorMes() {
  101. return totalUnidadesVendidasPorMes.clone();
  102. }
  103. public int getTotalUnidadesVendidas() {
  104. return totalUnidadesVendidasPorMes.getSomaTotal();
  105. }
  106. public int getTotalUnidadesVendidasPorMes(Mes mes) {
  107. return totalUnidadesVendidasPorMes.getValorMesTipoCompra(mes, TipoCompra.AMBOS);
  108. }
  109. /* FACTURCAO */
  110. public Matriz_Double_12x2 getTotalFacturadoPorMes() {
  111. return totalFacturadoPorMes.clone();
  112. }
  113. public double getTotalFacturado() {
  114. return totalFacturadoPorMes.getSomaTotal();
  115. }
  116. public double getTotalFacturadoPorMes(Mes mes) {
  117. return totalFacturadoPorMes.getValorMesTipoCompra(mes, TipoCompra.AMBOS);
  118. }
  119. /* GETTERS CLASSES INFERIORES*/
  120. private FichaProdutoContabilidade getFichaProdutoNoClone(Produto produto) throws ProdutoNaoExisteException {
  121. FichaProdutoContabilidade ficha;
  122. if (this.arvoreProdutos.containsKey(produto)) {
  123. ficha = this.arvoreProdutos.get(produto);
  124. } else {
  125. throw new ProdutoNaoExisteException();
  126. }
  127. return ficha;
  128. }
  129. /* NUMERO COMPRAS */
  130. public Matriz_Int_12x2 getComprasProdutoMeses(Produto produto) throws ProdutoNaoExisteException {
  131. return this.getFichaProdutoNoClone(produto).getMatrizNumComprasProdutoPorMes();
  132. }
  133. public int getNumeroTotalComprasProduto(Produto produto) throws ProdutoNaoExisteException {
  134. return this.getFichaProdutoNoClone(produto).getNumComprasProduto();
  135. }
  136. public int getNumeroComprasProdutoMes(Produto produto, Mes mes) throws ProdutoNaoExisteException {
  137. return this.getFichaProdutoNoClone(produto).getNumComprasProdutoMes(mes);
  138. }
  139. public int getTotalComprasProdutoIntervaloDeMeses(Produto produto, Mes mes_inf, Mes mes_sup, TipoCompra tipo_compra) throws ProdutoNaoExisteException {
  140. return this.getFichaProdutoNoClone(produto).getNumComprasProdutoIntervaloDeMeses(mes_inf, mes_sup, tipo_compra);
  141. }
  142. /* UNIDADES COMPRADAS*/
  143. public Matriz_Int_12x2 getUnidadesProdutoVendidasMeses(Produto produto) throws ProdutoNaoExisteException {
  144. return this.getFichaProdutoNoClone(produto).getMatrizNumUnidadesProdutoVendidasPorMes();
  145. }
  146. public int getTotalUnidadesProdutoVendidas(Produto produto) throws ProdutoNaoExisteException {
  147. return this.getFichaProdutoNoClone(produto).getNumUnidadesProdutoVendidas();
  148. }
  149. public int getNumUnidadesProdutoVendidasMes(Produto produto, Mes mes) throws ProdutoNaoExisteException {
  150. return this.getFichaProdutoNoClone(produto).getNumUnidadesProdutoVendidasMes(mes);
  151. }
  152. public int getNumUnidadesProdutoVendidasPorIntervaloDeMeses(Produto produto, Mes mes_inf, Mes mes_sup, TipoCompra tipo_compra) throws ProdutoNaoExisteException {
  153. return this.getFichaProdutoNoClone(produto).getNumUnidadesProdutoVendidasIntervaloDeMeses(mes_inf, mes_sup, tipo_compra);
  154. }
  155. /* FACTURACAO */
  156. public Matriz_Double_12x2 getFacturacaoProdutoMeses(Produto produto) throws ProdutoNaoExisteException {
  157. return this.getFichaProdutoNoClone(produto).getMatrizFacturacaoProdutoPorMes();
  158. }
  159. public double getTotalFacturacaoProduto(Produto produto) throws ProdutoNaoExisteException {
  160. return this.getFichaProdutoNoClone(produto).getFacturacaoProduto();
  161. }
  162. public double getFacturacaoProdutoMes(Produto produto, Mes mes) throws ProdutoNaoExisteException {
  163. return this.getFichaProdutoNoClone(produto).getFacturacaoProdutoMes(mes);
  164. }
  165. public double getFacturacaoProdutoPorIntervaloDeMeses(Produto produto, Mes mes_inf, Mes mes_sup, TipoCompra tipo_compra) throws ProdutoNaoExisteException {
  166. return this.getFichaProdutoNoClone(produto).getFacturacaoProdutoIntervaloDeMeses(mes_inf, mes_sup, tipo_compra);
  167. }
  168. /* SETTERS CLASSE SUPERIOR*/
  169. /*NUMERO COMPRAS*/
  170. public void setTotalComprasPorMes(Matriz_Int_12x2 totalComprasPorMes) {
  171. this.totalComprasPorMes = totalComprasPorMes.clone();
  172. }
  173. public void setTotalComprasPorMesPorTipoCompra(Mes mes, TipoCompra tipo_compra, int valor) {
  174. this.totalComprasPorMes.setValorMesTipoCompra(mes, tipo_compra, valor);
  175. }
  176. public void addTotalComprasPorMesPorTipoCompra(Mes mes, TipoCompra tipo_compra, int valor) {
  177. this.totalComprasPorMes.addValorMesTipoCompra(mes, tipo_compra, valor);
  178. }
  179. /* UNIDADES VENDIDAS */
  180. public void setTotalUnidadesVendidasPorMes(Matriz_Int_12x2 totalUnidadesVendidasPorMes) {
  181. this.totalUnidadesVendidasPorMes = totalUnidadesVendidasPorMes.clone();
  182. }
  183. public void setNumUnidadesVendidasPorMesPorTipoCompra(Mes mes, TipoCompra tipo_compra, int valor) {
  184. this.totalUnidadesVendidasPorMes.setValorMesTipoCompra(mes, tipo_compra, valor);
  185. }
  186. public void addNumUnidadesVendidasPorMesPorTipoCompra(Mes mes, TipoCompra tipo_compra, int valor) {
  187. this.totalUnidadesVendidasPorMes.addValorMesTipoCompra(mes, tipo_compra, valor);
  188. }
  189. /* FACTURCAO */
  190. public void setTotalFacturadoPorMes(Matriz_Double_12x2 totalFacturadoPorMes) {
  191. this.totalFacturadoPorMes = totalFacturadoPorMes.clone();
  192. }
  193. public void setTotalFacturadoPorMesPorTipoCompra(Mes mes, TipoCompra tipo_compra, int valor) {
  194. this.totalFacturadoPorMes.setValorMesTipoCompra(mes, tipo_compra, valor);
  195. }
  196. public void addTotalFacturadoPorMesPorTipoCompra(Mes mes, TipoCompra tipo_compra, int valor) {
  197. this.totalFacturadoPorMes.addValorMesTipoCompra(mes, tipo_compra, valor);
  198. }
  199. /* SETTERS CLASSES INFERIORES*/
  200. /* UNIDADES VENDIDAS */
  201. public void setNumUnidadesProdutoVendidasPorMesPorTipoCompra(Produto produto, Mes mes, TipoCompra tipo_compra, int valor) throws ProdutoNaoExisteException {
  202. this.getFichaProdutoNoClone(produto).addNumUnidadesProdutoVendidasPorMesPorTipoCompra(mes, tipo_compra, valor);
  203. }
  204. public void addNumUnidadesProdutoVendidasPorMesPorTipoCompra(Produto produto, Mes mes, TipoCompra tipo_compra, int valor) throws ProdutoNaoExisteException {
  205. this.getFichaProdutoNoClone(produto).addNumUnidadesProdutoVendidasPorMesPorTipoCompra(mes, tipo_compra, valor);
  206. }
  207. /*NUMERO COMPRAS*/
  208. public void setNumComprasProdutoPorMesPorTipoCompra(Produto produto, Mes mes, TipoCompra tipo_compra, int valor) throws ProdutoNaoExisteException {
  209. this.getFichaProdutoNoClone(produto).setNumComprasProdutoPorMesPorTipoCompra(mes, tipo_compra, valor);
  210. }
  211. public void addNumComprasProdutoPorMesPorTipoCompra(Produto produto, Mes mes, TipoCompra tipo_compra, int valor) throws ProdutoNaoExisteException {
  212. this.getFichaProdutoNoClone(produto).addNumComprasProdutoPorMesPorTipoCompra(mes, tipo_compra, valor);
  213. }
  214. /* FACTURCAO */
  215. public void setFacturacaoProdutoPorMesPorTipoCompra(Produto produto, Mes mes, TipoCompra tipo_compra, int valor) throws ProdutoNaoExisteException {
  216. this.getFichaProdutoNoClone(produto).setFacturacaoProdutoPorMesPorTipoCompra(mes, tipo_compra, valor);
  217. }
  218. public void addFacturacaoProdutoPorMesPorTipoCompra(Produto produto, Mes mes, TipoCompra tipo_compra, int valor) throws ProdutoNaoExisteException {
  219. this.getFichaProdutoNoClone(produto).addFacturacaoProdutoPorMesPorTipoCompra(mes, tipo_compra, valor);
  220. }
  221. /*
  222. QUERIES
  223. */
  224. public List<Produto> getProdutosNaoComprados() {
  225. ArrayList<Produto> tmp = new ArrayList<>();
  226. for (Map.Entry<Produto, FichaProdutoContabilidade> par : this.arvoreProdutos.entrySet()) {
  227. if (par.getValue().getNumComprasProduto() == 0) {
  228. tmp.add(par.getKey().clone());
  229. }
  230. }
  231. return tmp;
  232. }
  233. public List<ParProdutoQuantidadeComprada> getProdutosMaisVendidos(int X) {
  234. TreeSet<ParProdutoQuantidadeComprada> pares = new TreeSet<>(new ComparatorParProdutoQuantidadeComprada());
  235. ArrayList<ParProdutoQuantidadeComprada> lista = new ArrayList<>();
  236. ParProdutoQuantidadeComprada novo_par;
  237. for (Map.Entry<Produto, FichaProdutoContabilidade> entrada : this.arvoreProdutos.entrySet()) {
  238. novo_par = new ParProdutoQuantidadeComprada(entrada.getKey().clone(), entrada.getValue().getNumUnidadesProdutoVendidas());
  239. pares.add(novo_par);
  240. }
  241. for (ParProdutoQuantidadeComprada par : pares) {
  242. lista.add(par);
  243. }
  244. if (X > arvoreProdutos.size()) {
  245. X = arvoreProdutos.size();
  246. }
  247. return lista.subList(0, X);
  248. }
  249. /* METODOS STANDARD */
  250. @Override
  251. public boolean equals(Object obj) {
  252. if (this == obj) {
  253. return true;
  254. }
  255. if (obj == null) {
  256. return false;
  257. }
  258. if (getClass() != obj.getClass()) {
  259. return false;
  260. }
  261. Contabilidade other = (Contabilidade) obj;
  262. return this.totalComprasPorMes.equals(other.totalComprasPorMes)
  263. && this.totalFacturadoPorMes.equals(other.totalFacturadoPorMes)
  264. && this.totalUnidadesVendidasPorMes.equals(other.totalUnidadesVendidasPorMes)
  265. && this.arvoreProdutos.keySet().containsAll(other.arvoreProdutos.keySet())
  266. && this.arvoreProdutos.values().containsAll(other.arvoreProdutos.values());
  267. }
  268. @Override
  269. public int hashCode() {
  270. int hash = 7;
  271. hash = 13 * hash + Objects.hashCode(this.totalComprasPorMes);
  272. hash = 13 * hash + Objects.hashCode(this.totalUnidadesVendidasPorMes);
  273. hash = 13 * hash + Objects.hashCode(this.totalFacturadoPorMes);
  274. hash = 13 * hash + Objects.hashCode(this.arvoreProdutos);
  275. return hash;
  276. }
  277. @Override
  278. public String toString() {
  279. StringBuilder sb = new StringBuilder();
  280. sb.append("Contabilidade {");
  281. sb.append("Total Compras=").append(totalComprasPorMes.getSomaTotal());
  282. sb.append(", totalUnidadesVendidasPorMes=").append(totalUnidadesVendidasPorMes.getSomaTotal());
  283. sb.append(", totalFacturadoPorMes=").append(totalFacturadoPorMes.getSomaTotal());
  284. sb.append(", Total Produtos=").append(arvoreProdutos.size());
  285. sb.append("}");
  286. return sb.toString();
  287. }
  288. @Override
  289. public Contabilidade clone() {
  290. return new Contabilidade(this);
  291. }
  292. }