Commit e8b19b41a42a7ab56eabd6f414858fd0acc6c00c

Authored by geovane.filho
1 parent bcbf6614
Exists in master

Redmine #4783 Alterações no serviço de salvamento da entrada

cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/EntradaAlmoxarifadoService.java
1 package br.com.centralit.api.service; 1 package br.com.centralit.api.service;
2 2
3 -import java.util.List;  
4 import java.util.Map; 3 import java.util.Map;
5 4
6 import br.com.centralit.api.model.EntradaAlmoxarifado; 5 import br.com.centralit.api.model.EntradaAlmoxarifado;
@@ -10,6 +9,20 @@ public interface EntradaAlmoxarifadoService extends GenericService<EntradaAlmoxa @@ -10,6 +9,20 @@ public interface EntradaAlmoxarifadoService extends GenericService<EntradaAlmoxa
10 9
11 Map<String, String> buscaValoresDocumentoEntrada(Long idEntrada); 10 Map<String, String> buscaValoresDocumentoEntrada(Long idEntrada);
12 11
  12 + /**
  13 + * <p><b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a></p>
  14 + *
  15 + * <p><b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a></p>
  16 + *
  17 + * Método responsável por concluir uma entrada do almoxarifado
  18 + *
  19 + * @author geovane.filho
  20 + *
  21 + * @param entradaAlmoxarifado
  22 + * @return
  23 + */
  24 + EntradaAlmoxarifado concluir(EntradaAlmoxarifado entradaAlmoxarifado);
  25 +
13 } 26 }
14 27
15 28
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/MovimentoEstoqueService.java
@@ -209,4 +209,18 @@ public interface MovimentoEstoqueService extends GenericService&lt;MovimentoEstoque @@ -209,4 +209,18 @@ public interface MovimentoEstoqueService extends GenericService&lt;MovimentoEstoque
209 */ 209 */
210 public Collection<MovimentoEstoque> findAllByClasseReferencia(Dominio classeReferencia, Long idReferencia); 210 public Collection<MovimentoEstoque> findAllByClasseReferencia(Dominio classeReferencia, Long idReferencia);
211 211
  212 + /**
  213 + * <p><b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a></p>
  214 + *
  215 + * <p><b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a></p>
  216 + *
  217 + * Método responsável por buscar todos os códigos das operações de atendimentos e baixas que ocorreram com materiais da entrada passada como referência
  218 + *
  219 + * @author geovane.filho
  220 + *
  221 + * @param idEntrada
  222 + * @return
  223 + */
  224 + String buscarMovimentosSaidaComMateriaisDaEntrada(Long idEntrada);
  225 +
212 } 226 }
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/EntradaAlmoxarifadoServiceImpl.java
1 package br.com.centralit.api.service.impl; 1 package br.com.centralit.api.service.impl;
2 2
  3 +import java.util.Calendar;
3 import java.util.HashMap; 4 import java.util.HashMap;
4 import java.util.Map; 5 import java.util.Map;
5 6
@@ -9,7 +10,6 @@ import org.springframework.stereotype.Service; @@ -9,7 +10,6 @@ import org.springframework.stereotype.Service;
9 import org.springframework.validation.Validator; 10 import org.springframework.validation.Validator;
10 11
11 import br.com.centralit.api.dao.EntradaAlmoxarifadoDao; 12 import br.com.centralit.api.dao.EntradaAlmoxarifadoDao;
12 -import br.com.centralit.api.model.BemAlmoxarifadoCaracteristica;  
13 import br.com.centralit.api.model.EntradaAlmoxarifado; 13 import br.com.centralit.api.model.EntradaAlmoxarifado;
14 import br.com.centralit.api.model.EntradaAlmoxarifadoDocumento; 14 import br.com.centralit.api.model.EntradaAlmoxarifadoDocumento;
15 import br.com.centralit.api.model.EntradaAlmoxarifadoItem; 15 import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
@@ -27,6 +27,7 @@ import br.com.centralit.api.service.MovimentoEstoqueService; @@ -27,6 +27,7 @@ import br.com.centralit.api.service.MovimentoEstoqueService;
27 import br.com.centralit.api.service.ParceiroService; 27 import br.com.centralit.api.service.ParceiroService;
28 import br.com.centralit.api.service.UnidadeMedidaService; 28 import br.com.centralit.api.service.UnidadeMedidaService;
29 import br.com.centralit.api.service.UsuarioService; 29 import br.com.centralit.api.service.UsuarioService;
  30 +import br.com.centralit.api.service.validation.EntradaAlmoxarifadoAllValidator;
30 import br.com.centralit.framework.exception.BusinessException; 31 import br.com.centralit.framework.exception.BusinessException;
31 import br.com.centralit.framework.exception.CodigoErro; 32 import br.com.centralit.framework.exception.CodigoErro;
32 import br.com.centralit.framework.model.Dominio; 33 import br.com.centralit.framework.model.Dominio;
@@ -68,12 +69,6 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl @@ -68,12 +69,6 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
68 /** Atributo VALIDACAO_DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA. */ 69 /** Atributo VALIDACAO_DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA. */
69 private static final String VALIDACAO_DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA = "VALIDACAO.DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA"; 70 private static final String VALIDACAO_DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA = "VALIDACAO.DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA";
70 71
71 - /** Atributo VALIDACAO_DATA_RECEBIMENTO. */  
72 - private static final String VALIDACAO_DATA_RECEBIMENTO = "VALIDACAO.DATA_RECEBIMENTO";  
73 -  
74 - /** Atributo MSG_MN019. */  
75 - private static final String MSG_MN019 = "MSG.MN019";  
76 -  
77 /** Atributo entradaAlmoxarifadoDao. */ 72 /** Atributo entradaAlmoxarifadoDao. */
78 private EntradaAlmoxarifadoDao entradaAlmoxarifadoDao; 73 private EntradaAlmoxarifadoDao entradaAlmoxarifadoDao;
79 74
@@ -109,42 +104,53 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl @@ -109,42 +104,53 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
109 104
110 @Autowired 105 @Autowired
111 private ConfiguracaoParametroSistemaService configuracaoParametroSistemaService; 106 private ConfiguracaoParametroSistemaService configuracaoParametroSistemaService;
  107 +
  108 + private Validator validatorBasic;
  109 +
  110 + private Validator validatorAll;
112 111
113 /** 112 /**
114 * Responsável pela criação de novas instâncias desta classe. 113 * Responsável pela criação de novas instâncias desta classe.
115 * 114 *
116 * @param entradaAlmoxarifadoDao 115 * @param entradaAlmoxarifadoDao
117 - * @param validator 116 + * @param validatorBasic
118 */ 117 */
119 @Autowired 118 @Autowired
120 - public EntradaAlmoxarifadoServiceImpl( EntradaAlmoxarifadoDao entradaAlmoxarifadoDao, @Qualifier("entradaAlmoxarifadoValidator") Validator validator ) { 119 + public EntradaAlmoxarifadoServiceImpl( EntradaAlmoxarifadoDao entradaAlmoxarifadoDao, @Qualifier("entradaAlmoxarifadoBasicValidator") Validator validatorBasic ) {
121 120
122 this.dao = entradaAlmoxarifadoDao; 121 this.dao = entradaAlmoxarifadoDao;
123 this.entradaAlmoxarifadoDao = entradaAlmoxarifadoDao; 122 this.entradaAlmoxarifadoDao = entradaAlmoxarifadoDao;
124 - this.validator = validator; 123 + this.validatorBasic = validatorBasic;
  124 +
  125 + EntradaAlmoxarifadoAllValidator entradaAlmoxarifadoAllValidator = new EntradaAlmoxarifadoAllValidator(this, movimentoEstoqueService);
  126 +
  127 + this.validatorAll = entradaAlmoxarifadoAllValidator;
  128 +
  129 + this.validator = entradaAlmoxarifadoAllValidator;
125 } 130 }
126 131
127 /** 132 /**
128 * 133 *
129 */ 134 */
130 @Override 135 @Override
131 - public EntradaAlmoxarifado save(EntradaAlmoxarifado entity) {  
132 -  
133 - this.validarEntidade(entity, this.validator);  
134 -  
135 - this.montarEntidade(entity);  
136 -  
137 - this.validarDataContabil(entity);  
138 -  
139 - this.validarDataRecebimento(entity); 136 + public EntradaAlmoxarifado save(EntradaAlmoxarifado entrada) {
  137 +
  138 + this.validarEntidade(entrada, this.validatorBasic);
  139 +
  140 + // validação de se a data contabil esta dentro do mes referencia
  141 + Calendar dataContabil = null;
  142 + if(UtilObjeto.isReferencia(entrada.getDataContabil())){
  143 + dataContabil = Calendar.getInstance();
  144 + dataContabil.setTime(entrada.getDataContabil().getTime());
  145 + }
  146 +
  147 + this.montarEntidade(entrada);
140 148
141 - EntradaAlmoxarifado entradaAlmoxarifado = (EntradaAlmoxarifado) this.entradaAlmoxarifadoDao.save(entity); 149 + EntradaAlmoxarifado entradaAlmoxarifado = (EntradaAlmoxarifado) this.entradaAlmoxarifadoDao.save(entrada);
142 150
143 configurarNotaRecebimento(entradaAlmoxarifado); 151 configurarNotaRecebimento(entradaAlmoxarifado);
144 152
145 - entity.setCodigo(String.valueOf(entradaAlmoxarifado.getNotaRecebimento()));  
146 -  
147 - this.movimentoEstoqueService.gerarMovimento(entradaAlmoxarifado); 153 + entrada.setCodigo(String.valueOf(entradaAlmoxarifado.getNotaRecebimento()));
148 154
149 return entradaAlmoxarifado; 155 return entradaAlmoxarifado;
150 } 156 }
@@ -154,54 +160,55 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl @@ -154,54 +160,55 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
154 * 160 *
155 * @author wilker.machado 161 * @author wilker.machado
156 * 162 *
157 - * @param entity 163 + * @param entrada
158 */ 164 */
159 - private void montarEntidade(EntradaAlmoxarifado entity) { 165 + private void montarEntidade(EntradaAlmoxarifado entrada) {
160 166
161 - entity.setAlmoxarifado(this.estruturaOrganizacionalService.find(entity.getAlmoxarifado().getId())); 167 + entrada.setAlmoxarifado(this.estruturaOrganizacionalService.find(entrada.getAlmoxarifado().getId()));
162 168
163 - entity.setFornecedor((Fornecedor) this.parceiroService.find(entity.getFornecedor().getId())); 169 + entrada.setFornecedor((Fornecedor) this.parceiroService.find(entrada.getFornecedor().getId()));
164 170
165 - entity.setDominioTipoEntrada(this.dominioService.find(entity.getDominioTipoEntrada().getId())); 171 + entrada.setDominioTipoEntrada(this.dominioService.find(entrada.getDominioTipoEntrada().getId()));
166 172
167 - entity.setDominioTipoRecebimento(this.dominioService.find(entity.getDominioTipoRecebimento().getId())); 173 + entrada.setDominioTipoRecebimento(this.dominioService.find(entrada.getDominioTipoRecebimento().getId()));
168 174
169 - entity.setDominioFinalidade(this.dominioService.findByChaveAndCodigo("tipoFinalidadeMaterial", entity.getDominioFinalidade().getCodigo())); 175 + entrada.setDominioFinalidade(this.dominioService.findByChaveAndCodigo("tipoFinalidadeMaterial", entrada.getDominioFinalidade().getCodigo()));
170 176
171 - if(UtilObjeto.isReferencia(entity.getUnidadeRequisitante()) && UtilObjeto.isReferencia(entity.getUnidadeRequisitante().getId())){ 177 + if(UtilObjeto.isReferencia(entrada.getUnidadeRequisitante()) && UtilObjeto.isReferencia(entrada.getUnidadeRequisitante().getId())){
172 178
173 - entity.setUnidadeRequisitante(this.estruturaOrganizacionalService.find(entity.getUnidadeRequisitante().getId())); 179 + entrada.setUnidadeRequisitante(this.estruturaOrganizacionalService.find(entrada.getUnidadeRequisitante().getId()));
174 180
175 } 181 }
176 182
177 - for (EntradaAlmoxarifadoItem entradaAlmoxarifadoItem : entity.getEntradasItem()) { 183 + for (EntradaAlmoxarifadoItem entradaAlmoxarifadoItem : entrada.getEntradasItem()) {
178 184
179 entradaAlmoxarifadoItem.setMaterial(this.materialConsumoService.find(entradaAlmoxarifadoItem.getMaterial().getId())); 185 entradaAlmoxarifadoItem.setMaterial(this.materialConsumoService.find(entradaAlmoxarifadoItem.getMaterial().getId()));
180 186
181 entradaAlmoxarifadoItem.setUnidadeMedidaEntrada(this.unidadeMedidaService.find(entradaAlmoxarifadoItem.getUnidadeMedidaEntrada().getId())); 187 entradaAlmoxarifadoItem.setUnidadeMedidaEntrada(this.unidadeMedidaService.find(entradaAlmoxarifadoItem.getUnidadeMedidaEntrada().getId()));
182 188
183 - entradaAlmoxarifadoItem.setEntrada(entity); 189 + entradaAlmoxarifadoItem.setEntrada(entrada);
184 190
185 - for (BemAlmoxarifadoCaracteristica bemAlmoxarifadoCaracteristica : entradaAlmoxarifadoItem.getCaracteristicas()) { 191 + //TODO Arrumar caracteristicas
  192 + /*for (BemAlmoxarifadoCaracteristica bemAlmoxarifadoCaracteristica : entradaAlmoxarifadoItem.getCaracteristicas()) {
186 193
187 bemAlmoxarifadoCaracteristica.setMaterialCaracteristica(this.materialCaracteristicaService.find(bemAlmoxarifadoCaracteristica.getMaterialCaracteristica().getId())); 194 bemAlmoxarifadoCaracteristica.setMaterialCaracteristica(this.materialCaracteristicaService.find(bemAlmoxarifadoCaracteristica.getMaterialCaracteristica().getId()));
188 195
189 bemAlmoxarifadoCaracteristica.setCaracteristica(bemAlmoxarifadoCaracteristica.getMaterialCaracteristica().getCaracteristica()); 196 bemAlmoxarifadoCaracteristica.setCaracteristica(bemAlmoxarifadoCaracteristica.getMaterialCaracteristica().getCaracteristica());
190 197
191 bemAlmoxarifadoCaracteristica.setEntradaItem(entradaAlmoxarifadoItem); 198 bemAlmoxarifadoCaracteristica.setEntradaItem(entradaAlmoxarifadoItem);
192 - } 199 + }*/
193 200
194 } 201 }
195 202
196 - for (EntradaAlmoxarifadoObservacao entradaObservacao : entity.getObservacoes()) { 203 + for (EntradaAlmoxarifadoObservacao entradaObservacao : entrada.getObservacoes()) {
197 204
198 entradaObservacao.setAutor(this.usuarioService.find(entradaObservacao.getAutor().getId())); 205 entradaObservacao.setAutor(this.usuarioService.find(entradaObservacao.getAutor().getId()));
199 206
200 - entradaObservacao.setEntrada(entity); 207 + entradaObservacao.setEntrada(entrada);
201 208
202 } 209 }
203 210
204 - for (EntradaAlmoxarifadoDocumento entradaDocumento : entity.getDocumentos()) { 211 + for (EntradaAlmoxarifadoDocumento entradaDocumento : entrada.getDocumentos()) {
205 212
206 entradaDocumento.setDominioTipoDocumento(this.dominioService.find(entradaDocumento.getDominioTipoDocumento().getId())); 213 entradaDocumento.setDominioTipoDocumento(this.dominioService.find(entradaDocumento.getDominioTipoDocumento().getId()));
207 214
@@ -210,38 +217,13 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl @@ -210,38 +217,13 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
210 entradaDocumento.setEmitente(this.parceiroService.find(entradaDocumento.getEmitente().getId())); 217 entradaDocumento.setEmitente(this.parceiroService.find(entradaDocumento.getEmitente().getId()));
211 } 218 }
212 219
213 - entradaDocumento.setEntrada(entity); 220 + entradaDocumento.setEntrada(entrada);
214 } 221 }
215 -  
216 - }  
217 -  
218 - /**  
219 - * Método responsável por validar se a data de recebimento e menor que a data de cadastro da entrada  
220 - *  
221 - * @author wilker.machado  
222 - *  
223 - * @param entrada  
224 - */  
225 - private void validarDataRecebimento(EntradaAlmoxarifado entrada) {  
226 -  
227 - if (UtilDate.isPrimeiraDataMenorSegundaData(entrada.getDataReferencia(), entrada.getDataRecebimento())) {  
228 -  
229 - throw new BusinessException(VALIDACAO_DATA_RECEBIMENTO, CodigoErro.REGRA_NEGOCIO.getValue());  
230 - }  
231 - }  
232 -  
233 - /**  
234 - * Método responsável por validação de se a data contabil esta dentro do mes referencia  
235 - *  
236 - * @author wilker.machado  
237 - *  
238 - * @param entrada  
239 - */  
240 - private void validarDataContabil(EntradaAlmoxarifado entrada) {  
241 -  
242 - if (!UtilDate.isDentroMes(entrada.getDataContabil(), entrada.getAlmoxarifado().getOrganizacao().getDataReferenciaVigente())) {  
243 -  
244 - throw new BusinessException(MSG_MN019, CodigoErro.REGRA_NEGOCIO.getValue()); 222 +
  223 + if (UtilObjeto.isReferencia(entrada.getDataContabil())) {
  224 + entrada.setIsContabilizada(Boolean.TRUE);
  225 + } else {
  226 + entrada.setIsContabilizada(Boolean.FALSE);
245 } 227 }
246 } 228 }
247 229
@@ -332,4 +314,11 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl @@ -332,4 +314,11 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
332 return listaValoresDocumento; 314 return listaValoresDocumento;
333 } 315 }
334 316
  317 + @Override
  318 + public EntradaAlmoxarifado concluir(EntradaAlmoxarifado entradaAlmoxarifado) {
  319 +
  320 + // TODO Auto-generated method stub
  321 + return null;
  322 + }
  323 +
335 } 324 }
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/MovimentoEstoqueServiceImpl.java
@@ -8,6 +8,7 @@ import java.util.HashMap; @@ -8,6 +8,7 @@ import java.util.HashMap;
8 import java.util.List; 8 import java.util.List;
9 import java.util.Map; 9 import java.util.Map;
10 10
  11 +import org.apache.commons.lang.NotImplementedException;
11 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.beans.factory.annotation.Qualifier; 13 import org.springframework.beans.factory.annotation.Qualifier;
13 import org.springframework.security.core.context.SecurityContextHolder; 14 import org.springframework.security.core.context.SecurityContextHolder;
@@ -577,4 +578,9 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst @@ -577,4 +578,9 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
577 return this.movimentoEstoqueDao.findAllByClasseReferencia(classeReferencia, idReferencia); 578 return this.movimentoEstoqueDao.findAllByClasseReferencia(classeReferencia, idReferencia);
578 } 579 }
579 580
  581 + @Override
  582 + public String buscarMovimentosSaidaComMateriaisDaEntrada(Long idEntrada) {
  583 + throw new NotImplementedException();
  584 + }
  585 +
580 } 586 }
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/validation/EntradaAlmoxarifadoAllValidator.java 0 → 100644
@@ -0,0 +1,97 @@ @@ -0,0 +1,97 @@
  1 +package br.com.centralit.api.service.validation;
  2 +
  3 +import java.math.BigDecimal;
  4 +
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.stereotype.Component;
  7 +import org.springframework.validation.Errors;
  8 +import org.springframework.validation.ValidationUtils;
  9 +import org.springframework.validation.Validator;
  10 +
  11 +import br.com.centralit.api.model.EntradaAlmoxarifado;
  12 +import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
  13 +import br.com.centralit.api.service.EntradaAlmoxarifadoService;
  14 +import br.com.centralit.api.service.MovimentoEstoqueService;
  15 +import br.com.centralit.framework.exception.CodigoErro;
  16 +import br.com.centralit.framework.util.UtilColecao;
  17 +import br.com.centralit.framework.util.UtilDate;
  18 +import br.com.centralit.framework.util.UtilObjeto;
  19 +
  20 +@Component("entradaAlmoxarifadoAllValidator")
  21 +public class EntradaAlmoxarifadoAllValidator implements Validator {
  22 +
  23 + @Autowired
  24 + private EntradaAlmoxarifadoService entradaAlmoxarifadoService;
  25 +
  26 + @Autowired
  27 + private MovimentoEstoqueService movimentoEstoqueService;
  28 +
  29 + public EntradaAlmoxarifadoAllValidator() {
  30 +
  31 + super();
  32 + }
  33 +
  34 + public EntradaAlmoxarifadoAllValidator(EntradaAlmoxarifadoService entradaAlmoxarifadoService, MovimentoEstoqueService movimentoEstoqueService ) {
  35 + super();
  36 + this.entradaAlmoxarifadoService = entradaAlmoxarifadoService;
  37 + this.movimentoEstoqueService = movimentoEstoqueService;
  38 + }
  39 +
  40 + @Override
  41 + public boolean supports(Class<?> clazz) {
  42 +
  43 + return EntradaAlmoxarifado.class.isAssignableFrom(clazz);
  44 + }
  45 +
  46 + @Override
  47 + public void validate(Object target, Errors errors) {
  48 +
  49 + ValidationUtils.rejectIfEmpty(errors, "dataContabil", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.DATA_CONTABILIZACAO");
  50 +
  51 + EntradaAlmoxarifado entrada = (EntradaAlmoxarifado) target;
  52 +
  53 + EntradaAlmoxarifado entradaOld = this.entradaAlmoxarifadoService.find(entrada.getId());
  54 +
  55 + if (UtilObjeto.isReferencia(entradaOld.getDataContabil())) {
  56 + String codigosMovimentos = this.movimentoEstoqueService.buscarMovimentosSaidaComMateriaisDaEntrada(entradaOld.getId());
  57 + boolean alteracaoData = false;
  58 +
  59 + if (!UtilObjeto.isReferencia(entrada.getDataContabil())) {
  60 + alteracaoData = true;
  61 + } else if (!UtilDate.compareCalendar(entrada.getDataContabil(), entradaOld.getDataContabil())) {
  62 + alteracaoData = true;
  63 + }
  64 +
  65 + if (alteracaoData && !codigosMovimentos.isEmpty()) {
  66 + errors.rejectValue("dataContabil", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.VALIDACAO.DATA_CONTABIL_ALTERADA_SAIDAS");
  67 + }
  68 + }
  69 +
  70 + if (UtilObjeto.isReferencia(entrada.getDataContabil())) {
  71 +
  72 + if (UtilColecao.isVazio(entrada.getDocumentos())) {
  73 + errors.rejectValue("documentos", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "CORPORATIVO.LABEL.ASSOCIAR_DOCUMENTOS");
  74 + }
  75 +
  76 + BigDecimal valorTotalItens = new BigDecimal(0L);
  77 +
  78 + // repetição para verificar a soma de todos os itens da entrada e igual ao valor da nota
  79 + int item = 1;
  80 + for (EntradaAlmoxarifadoItem entradaItem : entrada.getEntradasItem()) {
  81 + if(entradaItem.getQuantidade() == null || entradaItem.getQuantidade() == BigDecimal.ZERO){
  82 + errors.rejectValue("entradasItem", CodigoErro.VALIDACAO_CAMPOS.getValue().toString(),"VALIDACAO.QUANTIDADE_MAIOR_ZERO");
  83 + }
  84 + //TODO validacaoBensCaracteristicasObrigatorias(errors, entradaItem, item);
  85 + valorTotalItens = valorTotalItens.add(entradaItem.getValorTotal());
  86 + item++;
  87 + }
  88 +
  89 + // verificar se os valores da nota e da soma dos itens sao iguais, caso nao seja e lançada uma exceção
  90 + if (UtilObjeto.isReferencia(entrada.getValorTotalNota()) && valorTotalItens.compareTo(entrada.getValorTotalNota()) != 0) {
  91 + errors.rejectValue("valorTotalNota", CodigoErro.VALIDACAO_CAMPOS.getValue().toString(), "ALMOXARIFADO.VALIDACAO.NOTA_FISCAL_IGUAL_VALOR_INFORMADO");
  92 + }
  93 + }
  94 +
  95 + }
  96 +}
  97 +
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/validation/EntradaAlmoxarifadoBasicValidator.java 0 → 100644
@@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
  1 +package br.com.centralit.api.service.validation;
  2 +
  3 +import org.springframework.stereotype.Component;
  4 +import org.springframework.validation.Errors;
  5 +import org.springframework.validation.ValidationUtils;
  6 +import org.springframework.validation.Validator;
  7 +
  8 +import br.com.centralit.api.model.EntradaAlmoxarifado;
  9 +import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
  10 +import br.com.centralit.framework.exception.CodigoErro;
  11 +import br.com.centralit.framework.util.UtilColecao;
  12 +import br.com.centralit.framework.util.UtilDate;
  13 +import br.com.centralit.framework.util.UtilObjeto;
  14 +
  15 +@Component("entradaAlmoxarifadoBasicValidator")
  16 +public class EntradaAlmoxarifadoBasicValidator implements Validator {
  17 +
  18 + @Override
  19 + public boolean supports(Class<?> clazz) {
  20 +
  21 + return EntradaAlmoxarifado.class.isAssignableFrom(clazz);
  22 + }
  23 +
  24 + @Override
  25 + public void validate(Object target, Errors errors) {
  26 +
  27 + ValidationUtils.rejectIfEmpty(errors, "almoxarifado", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.ALMOXARIFADO");
  28 +
  29 + ValidationUtils.rejectIfEmpty(errors, "fornecedor", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.FORNECEDOR");
  30 +
  31 + ValidationUtils.rejectIfEmpty(errors, "dominioTipoEntrada", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.TIPO_ENTRADA");
  32 +
  33 + ValidationUtils.rejectIfEmpty(errors, "dominioTipoRecebimento", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.TIPO_RECEBIMENTO");
  34 +
  35 + ValidationUtils.rejectIfEmpty(errors, "dataRecebimento", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.DATA_RECEBIMENTO");
  36 +
  37 + ValidationUtils.rejectIfEmpty(errors, "valorTotalNota", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.VALOR_TOTAL_NOTA");
  38 +
  39 + ValidationUtils.rejectIfEmpty(errors, "dominioFinalidade", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.FINALIDADE");
  40 +
  41 + EntradaAlmoxarifado entrada = (EntradaAlmoxarifado) target;
  42 +
  43 + if (UtilDate.isPrimeiraDataMenorSegundaData(entrada.getDataReferencia(), entrada.getDataRecebimento())) {
  44 + errors.rejectValue("dataRecebimento", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "VALIDACAO.DATA_RECEBIMENTO");
  45 + }
  46 +
  47 + if (UtilObjeto.isReferencia(entrada.getDataContabil())) {
  48 + if (!UtilDate.isDentroMes(entrada.getDataContabil(), entrada.getAlmoxarifado().getOrganizacao().getDataReferenciaVigente())) {
  49 + errors.rejectValue("dataContabil", CodigoErro.REGRA_NEGOCIO.getValue().toString(), "MSG.MN019");
  50 + }
  51 + }
  52 +
  53 + ValidationUtils.rejectIfEmpty(errors, "valorTotalNota", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.VALOR_TOTAL_NOTA");
  54 +
  55 + if (UtilColecao.isVazio(entrada.getEntradasItem())) {
  56 + errors.rejectValue("entradasItem", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.MATERIAIS");
  57 + }
  58 +
  59 + }
  60 +}
  61 +
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/validation/EntradaAlmoxarifadoValidator.java
@@ -1,39 +0,0 @@ @@ -1,39 +0,0 @@
1 -package br.com.centralit.api.service.validation;  
2 -  
3 -import org.springframework.stereotype.Component;  
4 -import org.springframework.validation.Errors;  
5 -import org.springframework.validation.ValidationUtils;  
6 -import org.springframework.validation.Validator;  
7 -  
8 -import br.com.centralit.api.model.EntradaAlmoxarifado;  
9 -import br.com.centralit.framework.exception.CodigoErro;  
10 -  
11 -@Component("entradaAlmoxarifadoValidator")  
12 -public class EntradaAlmoxarifadoValidator implements Validator {  
13 -  
14 - @Override  
15 - public boolean supports(Class<?> clazz) {  
16 -  
17 - return EntradaAlmoxarifado.class.isAssignableFrom(clazz);  
18 - }  
19 -  
20 - @Override  
21 - public void validate(Object target, Errors errors) {  
22 -  
23 - ValidationUtils.rejectIfEmpty(errors, "almoxarifado", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.ALMOXARIFADO");  
24 -  
25 - ValidationUtils.rejectIfEmpty(errors, "dataRecebimento", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.DATA_RECEBIMENTO");  
26 -  
27 - ValidationUtils.rejectIfEmpty(errors, "dataContabil", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.DATA_CONTABILIZACAO");  
28 -  
29 - ValidationUtils.rejectIfEmpty(errors, "dominioTipoEntrada", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.TIPO_ENTRADA");  
30 -  
31 - ValidationUtils.rejectIfEmpty(errors, "dominioTipoRecebimento", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.TIPO_RECEBIMENTO");  
32 -  
33 - ValidationUtils.rejectIfEmpty(errors, "fornecedor", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.FORNECEDOR");  
34 -  
35 - ValidationUtils.rejectIfEmpty(errors, "valorTotalNota", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.VALOR_TOTAL_NOTA");  
36 -  
37 - }  
38 -}  
39 -  
cit-almoxarifado-web/src/main/java/br/com/centralit/controller/EntradaAlmoxarifadoController.java
@@ -106,5 +106,11 @@ public class EntradaAlmoxarifadoController extends GenericController&lt;EntradaAlmo @@ -106,5 +106,11 @@ public class EntradaAlmoxarifadoController extends GenericController&lt;EntradaAlmo
106 106
107 return responseBody; 107 return responseBody;
108 } 108 }
  109 +
  110 + @RequestMapping(method = RequestMethod.POST, value = "/concluir")
  111 + @ResponseBody
  112 + public ResponseBodyWrapper concluir(@RequestBody EntradaAlmoxarifado entradaAlmoxarifado) {
  113 + return new ResponseBodyWrapper(this.entradaAlmoxarifadoService.concluir(entradaAlmoxarifado), getEditView());
  114 + }
109 115
110 } 116 }
cit-almoxarifado-web/src/main/java/br/com/centralit/listener/StartupListenerAlmoxarifado.java
@@ -306,6 +306,10 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat @@ -306,6 +306,10 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
306 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.DOCUMENTOS", "Documentos", dominio, modulo)); 306 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.DOCUMENTOS", "Documentos", dominio, modulo));
307 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.VALOR_TOTAL_MATERIAL_SUBTOTAL", "Valor total do material (Subtotal)", dominio, modulo)); 307 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.VALOR_TOTAL_MATERIAL_SUBTOTAL", "Valor total do material (Subtotal)", dominio, modulo));
308 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.UN_MEDIDA", "Un. medida", dominio, modulo)); 308 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.UN_MEDIDA", "Un. medida", dominio, modulo));
  309 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.CONCLUIR_ENTRADA", "Concluir entrada", dominio, modulo));
  310 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.CONCLUIR_ENTRADA_BTN", "Concluir", dominio, modulo));
  311 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.CONCLUIR_E_CONTABILIZAR_ENTRADA", "Concluir e contabilizar", dominio, modulo));
  312 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.CONCLUIR_E_DESCONTABILIZAR_ENTRADA", "Concluir e descontabilizar", dominio, modulo));
309 } 313 }
310 314
311 private void gerarValidacao(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) { 315 private void gerarValidacao(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
@@ -333,6 +337,8 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat @@ -333,6 +337,8 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
333 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_IS_SUPERIOR_REMOVER", "O endereço de estoque a ser removido, foi vinculado como superior a outros endereço. Caso prossiga com a operação, também será removido todos os endereços vinculados a este. Deseja continuar?", dominio, modulo)); 337 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_IS_SUPERIOR_REMOVER", "O endereço de estoque a ser removido, foi vinculado como superior a outros endereço. Caso prossiga com a operação, também será removido todos os endereços vinculados a este. Deseja continuar?", dominio, modulo));
334 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_TODOS_MATERIAIS", "A definição de endereço de estoque para todos os materias não poderá ser desfeita após salvar o registro. Deseja realmente adicionar este endereço para todos os materiais?", dominio, modulo)); 338 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_TODOS_MATERIAIS", "A definição de endereço de estoque para todos os materias não poderá ser desfeita após salvar o registro. Deseja realmente adicionar este endereço para todos os materiais?", dominio, modulo));
335 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_VINCULO_CICLICO", "Não é permitido vincular o endereço de estoque superior, pois este endereço tem como endereço superior o registro que está sendo alterado. Favor remover ou escolher outro endereço de estoque superior.", dominio, modulo)); 339 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_VINCULO_CICLICO", "Não é permitido vincular o endereço de estoque superior, pois este endereço tem como endereço superior o registro que está sendo alterado. Favor remover ou escolher outro endereço de estoque superior.", dominio, modulo));
  340 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENTRADA_DESCONTABILIZACAO_COM_SAIDAS", "Você não pode descontabilizar esta entrada pois existem as seguintes saídas com materiais da mesma: ", dominio, modulo));
  341 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.DATA_CONTABIL_ALTERADA_SAIDAS", "Você não pode alterar a data de contabilização após realizar atendimentos e baixas em materiais desta entrada!", dominio, modulo));
336 } 342 }
337 343
338 private void gerarMensagem(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) { 344 private void gerarMensagem(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
@@ -349,6 +355,9 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat @@ -349,6 +355,9 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
349 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.DATA_BAIXA_FORA_REFERENCIA_VIGENTE", "Data de conclusão tem que estar dentro da referência vigente", dominio, modulo)); 355 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.DATA_BAIXA_FORA_REFERENCIA_VIGENTE", "Data de conclusão tem que estar dentro da referência vigente", dominio, modulo));
350 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.REQUISICAO_DIFERENTE_NAO_CONCLUIDA_PRONTA_ATENDIMENTO", "Somente requisições de consumo com status Não concluída e Pronta para atendimento pode ser editada!", dominio, modulo)); 356 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.REQUISICAO_DIFERENTE_NAO_CONCLUIDA_PRONTA_ATENDIMENTO", "Somente requisições de consumo com status Não concluída e Pronta para atendimento pode ser editada!", dominio, modulo));
351 internacionalizacaoList.add(new Internacionalizacao("MSG.EXISTE_REQUISICAO_DISPONIVEL_CENTROCUSTO_ALMOXARIFADO_UR", "Centro de custo, almoxarifado, unidade requisitante e materiais de consumo estão presentes na requisição: ", dominio, modulo)); 357 internacionalizacaoList.add(new Internacionalizacao("MSG.EXISTE_REQUISICAO_DISPONIVEL_CENTROCUSTO_ALMOXARIFADO_UR", "Centro de custo, almoxarifado, unidade requisitante e materiais de consumo estão presentes na requisição: ", dominio, modulo));
  358 +
  359 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ENTRADA_CONTABILIZADA", "Entrada contabilizada com sucesso!", dominio, modulo));
  360 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ENTRADA_DESCONTABILIZADA", "Entrada descontabilizada com sucesso!", dominio, modulo));
352 } 361 }
353 } 362 }
354 363
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/EntradaAlmoxarifadoController.js
@@ -2,13 +2,16 @@ @@ -2,13 +2,16 @@
2 2
3 citApp.controller('EntradaAlmoxarifadoController', ['$scope', '$filter', 'FileUploader', 'EntradaAlmoxarifadoRepository', 'EstruturaOrganizacionalAlmoxarifadoRepository', '$translate', '$timeout', 3 citApp.controller('EntradaAlmoxarifadoController', ['$scope', '$filter', 'FileUploader', 'EntradaAlmoxarifadoRepository', 'EstruturaOrganizacionalAlmoxarifadoRepository', '$translate', '$timeout',
4 'DominioRepository', 'FornecedorRepository', 'MaterialConsumoRepository', 'EntradaAlmoxarifadoItemRepository', 'MaterialLocalEstoqueRepository', 4 'DominioRepository', 'FornecedorRepository', 'MaterialConsumoRepository', 'EntradaAlmoxarifadoItemRepository', 'MaterialLocalEstoqueRepository',
  5 + 'MovimentoEstoqueRepository',
5 function EntradaAlmoxarifadoController($scope, $filter, FileUploader, EntradaAlmoxarifadoRepository, EstruturaOrganizacionalAlmoxarifadoRepository, 6 function EntradaAlmoxarifadoController($scope, $filter, FileUploader, EntradaAlmoxarifadoRepository, EstruturaOrganizacionalAlmoxarifadoRepository,
6 $translate, $timeout, DominioRepository , FornecedorRepository, MaterialConsumoRepository, EntradaAlmoxarifadoItemRepository, 7 $translate, $timeout, DominioRepository , FornecedorRepository, MaterialConsumoRepository, EntradaAlmoxarifadoItemRepository,
7 - MaterialLocalEstoqueRepository) { 8 + MaterialLocalEstoqueRepository, MovimentoEstoqueRepository) {
8 9
9 var CODIGO_DOMINIO_TIPO_RECEBIMENTO_COMPRA_ORCAMENTARIA = 1; 10 var CODIGO_DOMINIO_TIPO_RECEBIMENTO_COMPRA_ORCAMENTARIA = 1;
10 11
11 $scope.entradaAlmoxarifado = {}; 12 $scope.entradaAlmoxarifado = {};
  13 +
  14 + $scope.entradaAlmoxarifadoOriginal = {};
12 $scope.edit = true; 15 $scope.edit = true;
13 16
14 /** 17 /**
@@ -116,8 +119,12 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -116,8 +119,12 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
116 119
117 EntradaAlmoxarifadoRepository.get(entradaAlmoxarifado.id).then(function(result) { 120 EntradaAlmoxarifadoRepository.get(entradaAlmoxarifado.id).then(function(result) {
118 $scope.entradaAlmoxarifado = result.originalElement; 121 $scope.entradaAlmoxarifado = result.originalElement;
  122 +
  123 + $scope.entradaAlmoxarifadoOriginal = angular.copy($scope.entradaAlmoxarifado);
  124 +
119 if($scope.entradaAlmoxarifado.fornecedor){ 125 if($scope.entradaAlmoxarifado.fornecedor){
120 $scope.entradaAlmoxarifado.fornecedor['pessoa.nome'] = $scope.entradaAlmoxarifado.fornecedor.pessoa.nome; 126 $scope.entradaAlmoxarifado.fornecedor['pessoa.nome'] = $scope.entradaAlmoxarifado.fornecedor.pessoa.nome;
  127 + $scope.entradaAlmoxarifadoOriginal.fornecedor['pessoa.nome'] = $scope.entradaAlmoxarifadoOriginal.fornecedor.pessoa.nome;
121 } 128 }
122 129
123 $scope.dominiosTipoRecebimento.forEach(function(item){ 130 $scope.dominiosTipoRecebimento.forEach(function(item){
@@ -130,6 +137,14 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -130,6 +137,14 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
130 $scope.edit = edit; 137 $scope.edit = edit;
131 $scope.setLoading(false); 138 $scope.setLoading(false);
132 }); 139 });
  140 +
  141 + MovimentoEstoqueRepository.buscarMovimentosSaidaComMateriaisDaEntrada($scope.entradaAlmoxarifado.id).then(function(result) {
  142 + if (result.saidas) {
  143 + $scope.bloquearDataContabil = true;
  144 + } else {
  145 + $scope.bloquearDataContabil = false;
  146 + }
  147 + });
133 }; 148 };
134 149
135 $scope.findAutoCompleteAlmoxarifado = function(value){ 150 $scope.findAutoCompleteAlmoxarifado = function(value){
@@ -390,10 +405,28 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -390,10 +405,28 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
390 $scope.valorTotalMateriais = converterMoedaToNumber(entradaItem.valorTotal) + $scope.valorTotalMateriais; 405 $scope.valorTotalMateriais = converterMoedaToNumber(entradaItem.valorTotal) + $scope.valorTotalMateriais;
391 }); 406 });
392 }; 407 };
  408 +
  409 + $scope.saveOrUpdateContabilizar = function(contabilizar) {
  410 +
  411 + $scope.entradaAlmoxarifado.isEntradaConcluida = true;
  412 + $scope.entradaAlmoxarifadoOriginal.isEntradaConcluida = true;
  413 +
  414 + if (contabilizar) {
  415 + $scope.dataContabilFinal = $scope.entradaAlmoxarifado.dataContabil;
  416 + $scope.dataContabilFinalBloqueada = $scope.entradaAlmoxarifado.dataContabil;
  417 + $scope.$openModal('modal-contabilizar-entrada.html', 'lg');
  418 + } else {
  419 + $scope.saveOrUpdate(null);
  420 + }
  421 + };
393 422
394 // SALVA O EntradaAlmoxarifado 423 // SALVA O EntradaAlmoxarifado
395 - $scope.saveOrUpdate = function(){ 424 + $scope.saveOrUpdate = function(dataContabil){
396 $scope.entradaAlmoxarifadoForm.$submitted = true; 425 $scope.entradaAlmoxarifadoForm.$submitted = true;
  426 + $scope.entradaAlmoxarifadoForm.dadosEntradaForm.$submitted = true;
  427 + $scope.entradaAlmoxarifadoForm.materiaisForm.$submitted = true;
  428 + $scope.entradaAlmoxarifadoForm.documentosForm.$submitted = true;
  429 + $scope.entradaAlmoxarifadoForm.observacoesForm.$submitted = true;
397 430
398 // validar o formulario, retorna true se o formulario e as regras estiverem OK 431 // validar o formulario, retorna true se o formulario e as regras estiverem OK
399 var formularioValido = validarFormulario($scope.entradaAlmoxarifadoForm); 432 var formularioValido = validarFormulario($scope.entradaAlmoxarifadoForm);
@@ -418,15 +451,69 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -418,15 +451,69 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
418 451
419 EntradaAlmoxarifadoRepository.save($scope.entradaAlmoxarifado).then(function(result) { 452 EntradaAlmoxarifadoRepository.save($scope.entradaAlmoxarifado).then(function(result) {
420 $scope.entradaAlmoxarifado = result.originalElement; 453 $scope.entradaAlmoxarifado = result.originalElement;
  454 +
  455 + if ($scope.entradaAlmoxarifado.fornecedor) {
  456 + $scope.entradaAlmoxarifado.fornecedor['pessoa.nome'] = $scope.entradaAlmoxarifado.fornecedor.pessoa.nome;
  457 + }
  458 +
421 $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO')); 459 $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO'));
422 460
423 // depois de salvar a entrada ja tendo uma referencia do id, esse metodo ira salvar os documentos se existir 461 // depois de salvar a entrada ja tendo uma referencia do id, esse metodo ira salvar os documentos se existir
424 salvarListaDocumentos(entradaTemp); 462 salvarListaDocumentos(entradaTemp);
425 - $scope.resetForm();  
426 $scope.setLoading(false); 463 $scope.setLoading(false);
  464 +
  465 + var dataContabilAntiga = angular.copy($scope.entradaAlmoxarifado.dataContabil);
  466 +
  467 + $scope.setLoadingSalva(true);
  468 +
  469 + if (dataContabilAntiga && !dataContabil) {
  470 + MovimentoEstoqueRepository.buscarMovimentosSaidaComMateriaisDaEntrada($scope.entradaAlmoxarifado.id).then(function(result) {
  471 + if (result.saidas) {
  472 + $scope.setLoading(false);
  473 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.VALIDACAO.ENTRADA_DESCONTABILIZACAO_COM_SAIDAS') + result.saidas);
  474 + } else {
  475 + concluir(dataContabil);
  476 + }
  477 + });
  478 + } else {
  479 + concluir(dataContabil);
  480 + }
427 }); 481 });
428 } 482 }
429 }; 483 };
  484 +
  485 + var concluir = function(dataContabil) {
  486 + var dataContabilAntiga = angular.copy($scope.entradaAlmoxarifado.dataContabil);
  487 + var error = true;
  488 + $scope.entradaAlmoxarifado.dataContabil = dataContabil;
  489 +
  490 + $scope.entradaAlmoxarifado.valorTotalNota = converterMoedaToNumber($scope.entradaAlmoxarifado.valorTotalNota);
  491 +
  492 + EntradaAlmoxarifadoRepository.concluir($scope.entradaAlmoxarifado).then(function(result) {
  493 + $scope.resetForm();
  494 + error = false;
  495 + $scope.entradaAlmoxarifado = result.originalElement;
  496 + $scope.entradaAlmoxarifado.dataRecebimento = $filter('date')($scope.entradaAlmoxarifado.dataRecebimento, "dd/MM/yyyy");
  497 + $scope.entradaAlmoxarifado.dataContabil = $filter('date')($scope.entradaAlmoxarifado.dataContabil, "dd/MM/yyyy");
  498 + $scope.entradaAlmoxarifado.dataReferencia = $filter('date')($scope.entradaAlmoxarifado.dataReferencia, "dd/MM/yyyy");
  499 + if ($scope.entradaAlmoxarifado.fornecedor) {
  500 + $scope.entradaAlmoxarifado.fornecedor['pessoa.nome'] = $scope.entradaAlmoxarifado.fornecedor.pessoa.nome;
  501 + }
  502 + $scope.setLoading(false);
  503 + if (dataContabil) {
  504 + $scope.showAlert("success", $translate.instant('ALMOXARIFADO.MSG.ENTRADA_CONTABILIZADA'));
  505 + $scope.contabilizado = true;
  506 + } else {
  507 + $scope.showAlert("success", $translate.instant('ALMOXARIFADO.MSG.ENTRADA_DESCONTABILIZADA'));
  508 + }
  509 + });
  510 +
  511 + $timeout(function() {
  512 + if (error) {
  513 + $scope.entradaAlmoxarifado.dataContabil = dataContabilAntiga;
  514 + }
  515 + }, 1000);
  516 + };
430 517
431 // metodo utilizado para percorrer a lista de documentos persistidos e verificar com a lista de documentos temporarios para verificacao de qual anexo pertence a qual documento 518 // metodo utilizado para percorrer a lista de documentos persistidos e verificar com a lista de documentos temporarios para verificacao de qual anexo pertence a qual documento
432 var salvarListaDocumentos = function(entradaTemp){ 519 var salvarListaDocumentos = function(entradaTemp){
@@ -655,7 +742,7 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -655,7 +742,7 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
655 $scope.enderecosMaterial = []; 742 $scope.enderecosMaterial = [];
656 } 743 }
657 744
658 - if ($scope.entradaItem.material) { 745 + if ($scope.entradaItem && $scope.entradaItem.material) {
659 $scope.unidadesMedidasEntrada = $scope.entradaItem.material.tiposUnidadeMedidaEntrada.map(function(item){ 746 $scope.unidadesMedidasEntrada = $scope.entradaItem.material.tiposUnidadeMedidaEntrada.map(function(item){
660 if (item.isPadrao && !$scope.entradaItem.unidadeMedidaEntrada) { 747 if (item.isPadrao && !$scope.entradaItem.unidadeMedidaEntrada) {
661 $scope.entradaItem.unidadeMedidaEntrada = item.unidadeMedida; 748 $scope.entradaItem.unidadeMedidaEntrada = item.unidadeMedida;
@@ -680,15 +767,17 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -680,15 +767,17 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
680 //Watch para controlar as mudanças da quantidade na entrada de materiais 767 //Watch para controlar as mudanças da quantidade na entrada de materiais
681 $scope.$watch('entradaItem.$quantidadeEntrada', function() { 768 $scope.$watch('entradaItem.$quantidadeEntrada', function() {
682 $timeout(function(){ 769 $timeout(function(){
683 - if($scope.entradaItem.$quantidadeEntrada && $scope.entradaItem.unidadeMedidaEntrada){  
684 - $scope.entradaItem.quantidade = $scope.entradaItem.$quantidadeEntrada * $scope.entradaItem.unidadeMedidaEntrada.quantidadePadrao;  
685 - } else {  
686 - delete $scope.entradaItem.quantidade;  
687 - }  
688 - if($scope.entradaItem.quantidade && $scope.entradaItem.valorTotal){  
689 - $scope.entradaItem.valorUnitario = $scope.entradaItem.valorTotal / $scope.entradaItem.quantidade;  
690 - } else {  
691 - delete $scope.entradaItem.valorUnitario; 770 + if ($scope.entradaItem) {
  771 + if($scope.entradaItem.$quantidadeEntrada && $scope.entradaItem.unidadeMedidaEntrada){
  772 + $scope.entradaItem.quantidade = $scope.entradaItem.$quantidadeEntrada * $scope.entradaItem.unidadeMedidaEntrada.quantidadePadrao;
  773 + } else {
  774 + delete $scope.entradaItem.quantidade;
  775 + }
  776 + if($scope.entradaItem.quantidade && $scope.entradaItem.valorTotal){
  777 + $scope.entradaItem.valorUnitario = $scope.entradaItem.valorTotal / $scope.entradaItem.quantidade;
  778 + } else {
  779 + delete $scope.entradaItem.valorUnitario;
  780 + }
692 } 781 }
693 }); 782 });
694 }); 783 });
@@ -696,10 +785,12 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -696,10 +785,12 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
696 //Watch para controlar as mudanças da unidade de medida na entrada de materiais 785 //Watch para controlar as mudanças da unidade de medida na entrada de materiais
697 $scope.$watch('entradaItem.unidadeMedidaEntrada', function() { 786 $scope.$watch('entradaItem.unidadeMedidaEntrada', function() {
698 $timeout(function(){ 787 $timeout(function(){
699 - if($scope.entradaItem.$quantidadeEntrada && $scope.entradaItem.unidadeMedidaEntrada){  
700 - $scope.entradaItem.quantidade = $scope.entradaItem.$quantidadeEntrada * $scope.entradaItem.unidadeMedidaEntrada.quantidadePadrao;  
701 - } else {  
702 - delete $scope.entradaItem.quantidade; 788 + if ($scope.entradaItem) {
  789 + if($scope.entradaItem.$quantidadeEntrada && $scope.entradaItem.unidadeMedidaEntrada){
  790 + $scope.entradaItem.quantidade = $scope.entradaItem.$quantidadeEntrada * $scope.entradaItem.unidadeMedidaEntrada.quantidadePadrao;
  791 + } else {
  792 + delete $scope.entradaItem.quantidade;
  793 + }
703 } 794 }
704 }); 795 });
705 }); 796 });
@@ -707,10 +798,12 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp @@ -707,10 +798,12 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
707 //Watch para controlar as mudanças do valor total da entrada de materiais 798 //Watch para controlar as mudanças do valor total da entrada de materiais
708 $scope.$watch('entradaItem.valorTotal', function() { 799 $scope.$watch('entradaItem.valorTotal', function() {
709 $timeout(function(){ 800 $timeout(function(){
710 - if($scope.entradaItem.quantidade && $scope.entradaItem.valorTotal){  
711 - $scope.entradaItem.valorUnitario = $scope.entradaItem.valorTotal / $scope.entradaItem.quantidade;  
712 - } else {  
713 - delete $scope.entradaItem.valorUnitario; 801 + if ($scope.entradaItem) {
  802 + if($scope.entradaItem.quantidade && $scope.entradaItem.valorTotal){
  803 + $scope.entradaItem.valorUnitario = $scope.entradaItem.valorTotal / $scope.entradaItem.quantidade;
  804 + } else {
  805 + delete $scope.entradaItem.valorUnitario;
  806 + }
714 } 807 }
715 }); 808 });
716 }); 809 });
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/repository/EntradaAlmoxarifadoRepository.js
@@ -4,6 +4,10 @@ citApp.factory(&#39;EntradaAlmoxarifadoRepository&#39;, [&#39;RestangularAlmoxarifado&#39;, &#39;Abs @@ -4,6 +4,10 @@ citApp.factory(&#39;EntradaAlmoxarifadoRepository&#39;, [&#39;RestangularAlmoxarifado&#39;, &#39;Abs
4 4
5 function EntradaAlmoxarifadoRepository() { 5 function EntradaAlmoxarifadoRepository() {
6 AbstractRepository.call(this, restangularAlmoxarifado, 'rest/entradaAlmoxarifado'); 6 AbstractRepository.call(this, restangularAlmoxarifado, 'rest/entradaAlmoxarifado');
  7 +
  8 + this.concluir = function(entrada) {
  9 + return restangularAlmoxarifado.all(this.route + '/concluir').post(entrada);
  10 + };
7 } 11 }
8 12
9 AbstractRepository.extend(EntradaAlmoxarifadoRepository); 13 AbstractRepository.extend(EntradaAlmoxarifadoRepository);
cit-almoxarifado-web/src/main/webapp/html/entradaAlmoxarifado/dialog_contabilizar_entrada.html 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +<ng-form name="formContabilizacao" autocomplete="off">
  2 + <div class="modal-header">
  3 + <button class="btn btn-clear" type="button" ng-click="contabilizar(formContabilizacao, dataContabilFinal);">
  4 + <i class="fa fa-save green"></i>
  5 + <translate>ALMOXARIFADO.LABEL.CONCLUIR_E_CONTABILIZAR_ENTRADA</translate>
  6 + </button>
  7 +
  8 + <button title="{{$translate.instant('LABEL.CANCELAR')}}" alt="{{$translate.instant('LABEL.CANCELAR')}}" ng-click="$dismiss('cancel');" class="btn btn-clear" type="button">
  9 + <i class="fa fa-times red"></i>
  10 + <translate>LABEL.CANCELAR</translate>
  11 + </button>
  12 + </div>
  13 +
  14 + <div class="modal-body">
  15 + <fieldset>
  16 + <div class="scrollbar-inner">
  17 + <legend style="font-size: 20px">
  18 + <translate>LABEL.DATA_CONTABILIZACAO</translate>
  19 + </legend>
  20 + <fieldset>
  21 + <div class="row">
  22 + <div ng-if="bloquearDataContabil" class="col-sm-4">
  23 + <label-input-data ng-id="entrada.dataContabil" ng-obrigatorio="true" ng-model="dataContabilFinalBloqueada" ng-label="LABEL.DATA_CONTABILIZACAO"
  24 + ng-disabled="bloquearDataContabil" ng-form="formContabilizacao" label-info-tooltip="{{$translate.instant('ALMOXARIFADO.VALIDACAO.DATA_CONTABIL_ALTERADA_SAIDAS')}}"/>
  25 + </div>
  26 + <div ng-show="!bloquearDataContabil" class="col-sm-4">
  27 + <label-input-data ng-id="dataContabilFinal" ng-obrigatorio="true" ng-model="dataContabilFinal" ng-label="LABEL.DATA_CONTABILIZACAO" ng-disabled="bloquearDataContabil"
  28 + ng-form="formContabilizacao" />
  29 + </div>
  30 + </div>
  31 + </fieldset>
  32 + </div>
  33 + </fieldset>
  34 + </div>
  35 +</ng-form>
cit-almoxarifado-web/src/main/webapp/html/entradaAlmoxarifado/entradaAlmoxarifadoEdit.html
@@ -2,10 +2,25 @@ @@ -2,10 +2,25 @@
2 <div class="bar-buttons-action fixed" > 2 <div class="bar-buttons-action fixed" >
3 <div class="row"> 3 <div class="row">
4 <div class="col-sm-9 text-left"> 4 <div class="col-sm-9 text-left">
5 - <button title="{{$translate.instant('LABEL.SALVAR')}}" alt="{{$translate.instant('LABEL.SALVAR')}}" class="btn btn-clear" ng-click="saveOrUpdate()" ng-if="edit" type="button">  
6 - <i class="fa fa-save green"></i> <translate>LABEL.SALVAR</translate>  
7 - </button>  
8 - <button title="{{$translate.instant('LABEL.LIMPAR')}}" alt="{{$translate.instant('LABEL.LIMPAR')}}" class="btn btn-clear" type="button" ng-show="entradaAlmoxarifado.id === undefined" ng-click="resetForm();" > 5 + <div ng-show="edit" class="btn-group dropdown" role="group" dropdown>
  6 + <button class="btn btn-clear" ng-if="edit" title="{{$translate.instant('ALMOXARIFADO.LABEL.CONCLUIR_ENTRADA')}}"
  7 + alt="{{$translate.instant('ALMOXARIFADO.LABEL.CONCLUIR_ENTRADA')}}" dropdown-toggle type="button">
  8 + <i class="fa fa-save green"></i> <translate>ALMOXARIFADO.LABEL.CONCLUIR_ENTRADA</translate><span class="fa fa-caret-down icon-on-right"></span>
  9 + </button>
  10 + <ul class="dropdown-menu-center dropdown-menu dropdown-caret" role="menu">
  11 + <li ng-show="entradaAlmoxarifado.dataContabil === null">
  12 + <a href="#void" ng-click="saveOrUpdateContabilizar(false)" ><i class="fa fa-save orange"></i> <translate>ALMOXARIFADO.LABEL.CONCLUIR_ENTRADA_BTN</translate></a>
  13 + </li>
  14 + <li>
  15 + <a href="#void" ng-click="saveOrUpdateContabilizar(true)" ><i class="fa fa-save green"></i> <translate>ALMOXARIFADO.LABEL.CONCLUIR_E_CONTABILIZAR_ENTRADA</translate></a>
  16 + </li>
  17 + <li ng-show="entradaAlmoxarifado.dataContabil !== null">
  18 + <a href="#void" ng-click="saveOrUpdateContabilizar(false)" ><i class="fa fa-save orange"></i> <translate>ALMOXARIFADO.LABEL.CONCLUIR_E_DESCONTABILIZAR_ENTRADA</translate></a>
  19 + </li>
  20 + </ul>
  21 + </div>
  22 + <button title="{{$translate.instant('LABEL.LIMPAR')}}" alt="{{$translate.instant('LABEL.LIMPAR')}}" class="btn btn-clear" type="button" ng-show="entradaAlmoxarifado.id === undefined"
  23 + ng-click="resetForm();" >
9 <i class="fa fa-eraser yellow-dark"></i> <translate>LABEL.LIMPAR</translate> 24 <i class="fa fa-eraser yellow-dark"></i> <translate>LABEL.LIMPAR</translate>
10 </button> 25 </button>
11 <button 26 <button
@@ -16,7 +31,8 @@ @@ -16,7 +31,8 @@
16 <i class="fa fa-print"></i> 31 <i class="fa fa-print"></i>
17 <translate>LABEL.GERAR_RELATORIO</translate> 32 <translate>LABEL.GERAR_RELATORIO</translate>
18 </button> 33 </button>
19 - <button title="{{$translate.instant('LABEL.PESQUISAR')}}" alt="{{$translate.instant('LABEL.PESQUISAR')}}" class="btn btn-clear" type="button" ng-click="$showPageSearchWorkspace(workspace); atualizarLista('EntradaAlmoxarifadoListControllerId');"> 34 + <button title="{{$translate.instant('LABEL.PESQUISAR')}}" alt="{{$translate.instant('LABEL.PESQUISAR')}}" class="btn btn-clear" type="button"
  35 + ng-click="$showPageSearchWorkspace(workspace); atualizarLista('searchEntradaAlmoxarifado');">
20 <i class="fa fa-search"></i> <translate>LABEL.PESQUISAR</translate> 36 <i class="fa fa-search"></i> <translate>LABEL.PESQUISAR</translate>
21 </button> 37 </button>
22 </div> 38 </div>
@@ -34,6 +50,10 @@ @@ -34,6 +50,10 @@
34 <!-- .row --> 50 <!-- .row -->
35 </div> 51 </div>
36 52
  53 + <script type="text/ng-template" id="modal-contabilizar-entrada.html">
  54 + <div ng-include src="'/cit-almoxarifado-web/html/entrada/dialog_contabilizar_entrada.html'" />
  55 + </script>
  56 +
37 <breadcrumb ng-workspace="workspace"></breadcrumb> 57 <breadcrumb ng-workspace="workspace"></breadcrumb>
38 58
39 <p> 59 <p>
cit-almoxarifado-web/src/main/webapp/html/entradaAlmoxarifado/entradaAlmoxarifadoList.html
@@ -14,6 +14,11 @@ @@ -14,6 +14,11 @@
14 <translate>LABEL.VISUALIZAR</translate> 14 <translate>LABEL.VISUALIZAR</translate>
15 </button> 15 </button>
16 16
  17 + <button title="{{$translate.instant('LABEL.EDITAR')}}" alt="{{$translate.instant('LABEL.EDITAR')}}" class="btn btn-clear" ng-click="abrirVisualizar(true);" type="button">
  18 + <i class="fa fa-pencil blue"></i>
  19 + <translate>LABEL.EDITAR</translate>
  20 + </button>
  21 +
17 <button class="btn btn-clear" ng-click="remove();"> 22 <button class="btn btn-clear" ng-click="remove();">
18 <i class="fa fa-times red"></i> 23 <i class="fa fa-times red"></i>
19 <translate>LABEL.REMOVER</translate> 24 <translate>LABEL.REMOVER</translate>
@@ -43,6 +48,6 @@ @@ -43,6 +48,6 @@
43 48
44 <breadcrumb ng-workspace="workspace"></breadcrumb> 49 <breadcrumb ng-workspace="workspace"></breadcrumb>
45 50
46 - <list-view ng-lista="entradaAlmoxarifadoList" ng-repository="EntradaAlmoxarifadoRepository" ng-use-custom-remove="false" ng-headers="headers" ng-filter-criteria="filterCriteria" ng-item-selecionado="entradaAlmoxarifadoChecked"></list-view>  
47 - 51 + <list-view ng-lista="entradaAlmoxarifadoList" ng-repository="EntradaAlmoxarifadoRepository" ng-use-custom-remove="false" ng-headers="headers" ng-filter-criteria="filterCriteria"
  52 + ng-item-selecionado="entradaAlmoxarifadoChecked"></list-view>
48 </div><!-- .page-content --> 53 </div><!-- .page-content -->