Commit 5158b1536751c1382c2b9970eb4732c02259113c

Authored by erick.sato
1 parent b9d13e60
Exists in master

[Redmine Atendimento #4863]Validação quantidade limite estoque

cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/MaterialLocalEstoqueDao.java
1 1 package br.com.centralit.api.dao;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.util.List;
4 5  
5 6 import br.com.centralit.api.model.EstruturaOrganizacional;
... ... @@ -23,4 +24,6 @@ public interface MaterialLocalEstoqueDao extends CitGenericDAO {
23 24 List<MaterialLocalEstoque> buscarLocaisEstoquePorIdMaterialIdAlmoxarifado(Long idMaterial, Long idAlmoxarifado);
24 25  
25 26 Boolean enderecoJaVinculadoAoMaterial(Long idMaterial, Long idEndereco);
  27 +
  28 + BigDecimal buscarQuantidadeLocalEstoquePorIdMaterialIdEndereco(Long idMaterial, Long idEndereco);
26 29 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/MaterialLocalEstoqueDaoHibernate.java
1 1 package br.com.centralit.api.dao.impl;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.util.List;
4 5  
5 6 import org.springframework.stereotype.Repository;
6 7  
  8 +import com.googlecode.genericdao.search.Search;
  9 +
7 10 import br.com.centralit.api.dao.MaterialLocalEstoqueDao;
8 11 import br.com.centralit.api.model.EstruturaOrganizacional;
9 12 import br.com.centralit.api.model.MaterialLocalEstoque;
... ... @@ -90,4 +93,28 @@ public class MaterialLocalEstoqueDaoHibernate extends CitGenericDAOImpl implemen
90 93  
91 94 return this.count(search) > 0 ? Boolean.TRUE : Boolean.FALSE;
92 95 }
  96 +
  97 + @Override
  98 + public BigDecimal buscarQuantidadeLocalEstoquePorIdMaterialIdEndereco(Long idMaterial, Long idEndereco) {
  99 +
  100 + SearchSeven search = new SearchSeven();
  101 +
  102 + search.setResultMode(Search.RESULT_SINGLE);
  103 + search.addField("quantidade");
  104 + search.addFilterEqual("materialEstoque.material.id", idMaterial);
  105 + search.addFilterEqual("endereco.id", idEndereco);
  106 +
  107 + BigDecimal quantidadeTotal = new BigDecimal("0");
  108 +
  109 + List<BigDecimal> consulta = this.search(search);
  110 +
  111 + if(consulta == null || consulta.size() == 0){
  112 + return quantidadeTotal;
  113 + }else{
  114 + for (BigDecimal qt : consulta) {
  115 + quantidadeTotal = quantidadeTotal.add(qt);
  116 + }
  117 + }
  118 + return quantidadeTotal;
  119 + }
93 120 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/MaterialLocalEstoque.java
... ... @@ -89,7 +89,7 @@ public class MaterialLocalEstoque extends PersistentObjectAuditOrganizacao {
89 89  
90 90 /** Atributo quantidade. */
91 91 @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class })
92   - private BigDecimal quantidade;
  92 + private BigDecimal quantidade = BigDecimal.ZERO;
93 93  
94 94 /** Atributo unidadeMedidaEntrada. */
95 95 @JsonView({ ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class })
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/EntradaAlmoxarifadoItemService.java
... ... @@ -3,6 +3,7 @@ package br.com.centralit.api.service;
3 3 import java.math.BigDecimal;
4 4 import java.util.Calendar;
5 5 import java.util.Collection;
  6 +import java.util.List;
6 7  
7 8 import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
8 9 import br.com.centralit.api.model.EstruturaOrganizacional;
... ... @@ -134,4 +135,6 @@ public interface EntradaAlmoxarifadoItemService extends GenericService&lt;EntradaAl
134 135 * @return Valor monetário da quantidade movimentada na devolução.
135 136 */
136 137 public BigDecimal realizaMovimentoDevolucao(MaterialConsumo materialConsumo, BigDecimal quantidadeMovimentada);
  138 +
  139 + public List<EntradaAlmoxarifadoItem> findItensPorEntradaId(Long idEntrada);
137 140 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/MaterialLocalEstoqueService.java
1 1 package br.com.centralit.api.service;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.util.List;
4 5  
5 6 import br.com.centralit.api.model.EstruturaOrganizacional;
... ... @@ -23,4 +24,6 @@ public interface MaterialLocalEstoqueService extends GenericService&lt;MaterialLoca
23 24 List<MaterialLocalEstoque> buscarLocaisEstoquePorIdMaterialIdAlmoxarifado(Long idMaterial, Long idAlmoxarifado);
24 25  
25 26 Boolean enderecoJaVinculadoAoMaterial(Long idMaterial, Long idEndereco);
  27 +
  28 + BigDecimal buscarQuantidadeLocalEstoquePorIdMaterialIdEndereco(Long idMaterial, Long idEndereco);
26 29 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/EntradaAlmoxarifadoItemServiceImpl.java
... ... @@ -259,4 +259,9 @@ public class EntradaAlmoxarifadoItemServiceImpl extends GenericServiceImpl&lt;Entra
259 259 return retorno;
260 260 }
261 261  
  262 + @Override
  263 + public List<EntradaAlmoxarifadoItem> findItensPorEntradaId(Long idEntrada) {
  264 + return (List)this.entradaAlmoxarifadoItemDao.buscarPorAtributo("entrada.id", idEntrada);
  265 + }
  266 +
262 267 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/EntradaAlmoxarifadoServiceImpl.java
1 1 package br.com.centralit.api.service.impl;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.util.ArrayList;
4 5 import java.util.Calendar;
5 6 import java.util.Collection;
... ... @@ -16,12 +17,14 @@ import org.springframework.validation.Validator;
16 17 import br.com.centralit.api.dao.EntradaAlmoxarifadoDao;
17 18 import br.com.centralit.api.model.BemAlmoxarifadoCaracteristica;
18 19 import br.com.centralit.api.model.ContaContabilMovimento;
  20 +import br.com.centralit.api.model.EnderecoEstoque;
19 21 import br.com.centralit.api.model.EntradaAlmoxarifado;
20 22 import br.com.centralit.api.model.EntradaAlmoxarifadoDocumento;
21 23 import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
22 24 import br.com.centralit.api.model.EntradaAlmoxarifadoObservacao;
23 25 import br.com.centralit.api.model.MaterialCaracteristica;
24 26 import br.com.centralit.api.model.MaterialConsumo;
  27 +import br.com.centralit.api.model.MaterialLocalEstoque;
25 28 import br.com.centralit.api.model.MovimentoEstoque;
26 29 import br.com.centralit.api.service.BemAlmoxarifadoCaracteristicaService;
27 30 import br.com.centralit.api.service.ConfiguracaoParametroSistemaService;
... ... @@ -34,6 +37,7 @@ import br.com.centralit.api.service.EstruturaOrganizacionalService;
34 37 import br.com.centralit.api.service.InternacionalizacaoService;
35 38 import br.com.centralit.api.service.MaterialCaracteristicaService;
36 39 import br.com.centralit.api.service.MaterialConsumoService;
  40 +import br.com.centralit.api.service.MaterialLocalEstoqueService;
37 41 import br.com.centralit.api.service.MovimentoEstoqueService;
38 42 import br.com.centralit.api.service.ParceiroService;
39 43 import br.com.centralit.api.service.RascunhoService;
... ... @@ -131,6 +135,9 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
131 135 @Autowired
132 136 private InternacionalizacaoService internacionalizacaoService;
133 137  
  138 + @Autowired
  139 + private MaterialLocalEstoqueService materialLocalEstoqueService;
  140 +
134 141 private Dominio idioma;
135 142  
136 143 private Validator validatorBasic;
... ... @@ -173,6 +180,8 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
173 180  
174 181 this.validarCaracteristicasObrigatorias(entrada);
175 182  
  183 + this.validarQuantidadeMaterialEstoque(entrada);
  184 +
176 185 EntradaAlmoxarifado entradaAlmoxarifado = (EntradaAlmoxarifado) this.entradaAlmoxarifadoDao.save(entrada);
177 186  
178 187 configurarNotaRecebimento(entradaAlmoxarifado);
... ... @@ -231,8 +240,12 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
231 240 public EntradaAlmoxarifado merge(EntradaAlmoxarifado entrada) {
232 241  
233 242 this.validarEntidade(entrada, this.validatorBasic);
  243 + for (EntradaAlmoxarifadoItem entradaAlmoxarifadoItem : entrada.getEntradasItem()) {
  244 + buscaCaracteristicaItem(entradaAlmoxarifadoItem);
  245 + }
234 246 this.montarEntidade(entrada);
235 247 this.validarCaracteristicasObrigatorias(entrada);
  248 + this.validarQuantidadeMaterialEstoque(entrada);
236 249 return (EntradaAlmoxarifado) this.entradaAlmoxarifadoDao.merge(entrada);
237 250 }
238 251  
... ... @@ -461,5 +474,49 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
461 474 }
462 475  
463 476 }
  477 +
  478 + private void validarQuantidadeMaterialEstoque(EntradaAlmoxarifado entrada){
  479 +
  480 + StringBuilder mensagem = new StringBuilder();
  481 + HashMap<MaterialLocalEstoque, BigDecimal> hashMaterialLocalEstoque = new HashMap<MaterialLocalEstoque, BigDecimal>();
  482 +
  483 + for (EntradaAlmoxarifadoItem entradaAlmoxarifadoItem : entrada.getEntradasItem()) {
  484 + if(hashMaterialLocalEstoque.get(entradaAlmoxarifadoItem.getMaterialLocalEstoque()) != null){
  485 + hashMaterialLocalEstoque.put(entradaAlmoxarifadoItem.getMaterialLocalEstoque(), hashMaterialLocalEstoque.get(entradaAlmoxarifadoItem.getMaterialLocalEstoque()).add(entradaAlmoxarifadoItem.getQuantidade()));
  486 + }else{
  487 + hashMaterialLocalEstoque.put(entradaAlmoxarifadoItem.getMaterialLocalEstoque(), entradaAlmoxarifadoItem.getQuantidade());
  488 + }
  489 + }
  490 +
  491 + if(UtilObjeto.isReferencia(entrada)){
  492 + List<EntradaAlmoxarifadoItem> itensSalvos = this.entradaAlmoxarifadoItemService.findItensPorEntradaId(entrada.getId());
  493 + for (EntradaAlmoxarifadoItem entradaAlmoxarifadoItem : itensSalvos) {
  494 + if(hashMaterialLocalEstoque.get(entradaAlmoxarifadoItem.getMaterialLocalEstoque()) != null){
  495 + hashMaterialLocalEstoque.put(entradaAlmoxarifadoItem.getMaterialLocalEstoque(), hashMaterialLocalEstoque.get(entradaAlmoxarifadoItem.getMaterialLocalEstoque()).subtract(entradaAlmoxarifadoItem.getQuantidade()));
  496 + }else{
  497 + hashMaterialLocalEstoque.put(entradaAlmoxarifadoItem.getMaterialLocalEstoque(), entradaAlmoxarifadoItem.getQuantidade());
  498 + }
  499 + }
  500 + }
  501 +
  502 + for (Map.Entry<MaterialLocalEstoque,BigDecimal> materialLocQt : hashMaterialLocalEstoque.entrySet()) {
  503 +
  504 + MaterialLocalEstoque localEstoque = this.materialLocalEstoqueService.find(materialLocQt.getKey().getId());
  505 + MaterialConsumo material = localEstoque.getMaterialEstoque().getMaterial();
  506 + EnderecoEstoque enderecoEstoque = localEstoque.getEndereco();
  507 +
  508 +
  509 + if(materialLocQt.getValue().add(localEstoque.getQuantidade()).doubleValue() > localEstoque.getCapacidade().doubleValue()){
  510 + String validacao = this.internacionalizacaoService.getTranslate("ALMOXARIFADO.MSG.VALIDACAO_QUANTIDADE_SUPERIOR_CAPACIDADE_ENDERECO_ESTOQUE", this.getIdioma());
  511 + validacao = String.format(validacao, material.getDescricao(), enderecoEstoque.getDescricao());
  512 + validacao += "</br></br>";
  513 + mensagem.append(validacao);
  514 + }
  515 + }
  516 +
  517 + if(StringUtils.isNotBlank(mensagem.toString())){
  518 + throw new BusinessException(mensagem.toString(), CodigoErro.REGRA_NEGOCIO.getValue());
  519 + }
  520 + }
464 521  
465 522 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/MaterialLocalEstoqueServiceImpl.java
1 1 package br.com.centralit.api.service.impl;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.util.List;
4 5  
5 6 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -124,5 +125,10 @@ public class MaterialLocalEstoqueServiceImpl extends GenericServiceImpl&lt;Material
124 125 public Boolean enderecoJaVinculadoAoMaterial(Long idMaterial, Long idEndereco) {
125 126 return this.materailLocalEstoqueDao.enderecoJaVinculadoAoMaterial(idMaterial, idEndereco);
126 127 }
  128 +
  129 + @Override
  130 + public BigDecimal buscarQuantidadeLocalEstoquePorIdMaterialIdEndereco(Long idMaterial, Long idEndereco) {
  131 + return this.materailLocalEstoqueDao.buscarQuantidadeLocalEstoquePorIdMaterialIdEndereco(idMaterial, idEndereco);
  132 + }
127 133  
128 134 }
... ...
cit-almoxarifado-web/src/main/java/br/com/centralit/listener/StartupListenerAlmoxarifado.java
... ... @@ -381,6 +381,7 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
381 381 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ACAO_COM_SAIDAS_POSTERIORES", "Você não pode realizar esta ação pois existem as seguintes saídas com materiais desta entrada: ", dominio, modulo));
382 382 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.VALIDACAO_PRECO_MEDIO_MATERIAL_CONSUMO", "Valor médio do material é superior a ", dominio, modulo));
383 383 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.VALIDACAO_CARACTERISTICA_OBRIGATORIA", "No item %s, há caracteristicas obrigatórias que devem ser preenchidas.", dominio, modulo));
  384 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.VALIDACAO_QUANTIDADE_SUPERIOR_CAPACIDADE_ENDERECO_ESTOQUE", "O material %s ultrapassa a capacidade suportada do material no endereço de estoque %s.", dominio, modulo));
384 385 }
385 386 }
386 387  
... ...