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 1 package br.com.centralit.api.service;
2 2  
3   -import java.util.List;
4 3 import java.util.Map;
5 4  
6 5 import br.com.centralit.api.model.EntradaAlmoxarifado;
... ... @@ -10,6 +9,20 @@ public interface EntradaAlmoxarifadoService extends GenericService<EntradaAlmoxa
10 9  
11 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 209 */
210 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 1 package br.com.centralit.api.service.impl;
2 2  
  3 +import java.util.Calendar;
3 4 import java.util.HashMap;
4 5 import java.util.Map;
5 6  
... ... @@ -9,7 +10,6 @@ import org.springframework.stereotype.Service;
9 10 import org.springframework.validation.Validator;
10 11  
11 12 import br.com.centralit.api.dao.EntradaAlmoxarifadoDao;
12   -import br.com.centralit.api.model.BemAlmoxarifadoCaracteristica;
13 13 import br.com.centralit.api.model.EntradaAlmoxarifado;
14 14 import br.com.centralit.api.model.EntradaAlmoxarifadoDocumento;
15 15 import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
... ... @@ -27,6 +27,7 @@ import br.com.centralit.api.service.MovimentoEstoqueService;
27 27 import br.com.centralit.api.service.ParceiroService;
28 28 import br.com.centralit.api.service.UnidadeMedidaService;
29 29 import br.com.centralit.api.service.UsuarioService;
  30 +import br.com.centralit.api.service.validation.EntradaAlmoxarifadoAllValidator;
30 31 import br.com.centralit.framework.exception.BusinessException;
31 32 import br.com.centralit.framework.exception.CodigoErro;
32 33 import br.com.centralit.framework.model.Dominio;
... ... @@ -68,12 +69,6 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
68 69 /** Atributo VALIDACAO_DATA_FORA_REFERENCIA_EXCLUSAO_ENTRADA. */
69 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 72 /** Atributo entradaAlmoxarifadoDao. */
78 73 private EntradaAlmoxarifadoDao entradaAlmoxarifadoDao;
79 74  
... ... @@ -109,42 +104,53 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
109 104  
110 105 @Autowired
111 106 private ConfiguracaoParametroSistemaService configuracaoParametroSistemaService;
  107 +
  108 + private Validator validatorBasic;
  109 +
  110 + private Validator validatorAll;
112 111  
113 112 /**
114 113 * Responsável pela criação de novas instâncias desta classe.
115 114 *
116 115 * @param entradaAlmoxarifadoDao
117   - * @param validator
  116 + * @param validatorBasic
118 117 */
119 118 @Autowired
120   - public EntradaAlmoxarifadoServiceImpl( EntradaAlmoxarifadoDao entradaAlmoxarifadoDao, @Qualifier("entradaAlmoxarifadoValidator") Validator validator ) {
  119 + public EntradaAlmoxarifadoServiceImpl( EntradaAlmoxarifadoDao entradaAlmoxarifadoDao, @Qualifier("entradaAlmoxarifadoBasicValidator") Validator validatorBasic ) {
121 120  
122 121 this.dao = entradaAlmoxarifadoDao;
123 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 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 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 155 return entradaAlmoxarifado;
150 156 }
... ... @@ -154,54 +160,55 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
154 160 *
155 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 185 entradaAlmoxarifadoItem.setMaterial(this.materialConsumoService.find(entradaAlmoxarifadoItem.getMaterial().getId()));
180 186  
181 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 194 bemAlmoxarifadoCaracteristica.setMaterialCaracteristica(this.materialCaracteristicaService.find(bemAlmoxarifadoCaracteristica.getMaterialCaracteristica().getId()));
188 195  
189 196 bemAlmoxarifadoCaracteristica.setCaracteristica(bemAlmoxarifadoCaracteristica.getMaterialCaracteristica().getCaracteristica());
190 197  
191 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 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 213 entradaDocumento.setDominioTipoDocumento(this.dominioService.find(entradaDocumento.getDominioTipoDocumento().getId()));
207 214  
... ... @@ -210,38 +217,13 @@ public class EntradaAlmoxarifadoServiceImpl extends GenericServiceImpl&lt;EntradaAl
210 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 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 8 import java.util.List;
9 9 import java.util.Map;
10 10  
  11 +import org.apache.commons.lang.NotImplementedException;
11 12 import org.springframework.beans.factory.annotation.Autowired;
12 13 import org.springframework.beans.factory.annotation.Qualifier;
13 14 import org.springframework.security.core.context.SecurityContextHolder;
... ... @@ -577,4 +578,9 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
577 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 @@
  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 @@
  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   -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 106  
107 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 306 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.DOCUMENTOS", "Documentos", dominio, modulo));
307 307 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.VALOR_TOTAL_MATERIAL_SUBTOTAL", "Valor total do material (Subtotal)", dominio, modulo));
308 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 315 private void gerarValidacao(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
... ... @@ -333,6 +337,8 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
333 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 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 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 344 private void gerarMensagem(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
... ... @@ -349,6 +355,9 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
349 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 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 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 2  
3 3 citApp.controller('EntradaAlmoxarifadoController', ['$scope', '$filter', 'FileUploader', 'EntradaAlmoxarifadoRepository', 'EstruturaOrganizacionalAlmoxarifadoRepository', '$translate', '$timeout',
4 4 'DominioRepository', 'FornecedorRepository', 'MaterialConsumoRepository', 'EntradaAlmoxarifadoItemRepository', 'MaterialLocalEstoqueRepository',
  5 + 'MovimentoEstoqueRepository',
5 6 function EntradaAlmoxarifadoController($scope, $filter, FileUploader, EntradaAlmoxarifadoRepository, EstruturaOrganizacionalAlmoxarifadoRepository,
6 7 $translate, $timeout, DominioRepository , FornecedorRepository, MaterialConsumoRepository, EntradaAlmoxarifadoItemRepository,
7   - MaterialLocalEstoqueRepository) {
  8 + MaterialLocalEstoqueRepository, MovimentoEstoqueRepository) {
8 9  
9 10 var CODIGO_DOMINIO_TIPO_RECEBIMENTO_COMPRA_ORCAMENTARIA = 1;
10 11  
11 12 $scope.entradaAlmoxarifado = {};
  13 +
  14 + $scope.entradaAlmoxarifadoOriginal = {};
12 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 119  
117 120 EntradaAlmoxarifadoRepository.get(entradaAlmoxarifado.id).then(function(result) {
118 121 $scope.entradaAlmoxarifado = result.originalElement;
  122 +
  123 + $scope.entradaAlmoxarifadoOriginal = angular.copy($scope.entradaAlmoxarifado);
  124 +
119 125 if($scope.entradaAlmoxarifado.fornecedor){
120 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 130 $scope.dominiosTipoRecebimento.forEach(function(item){
... ... @@ -130,6 +137,14 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
130 137 $scope.edit = edit;
131 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 150 $scope.findAutoCompleteAlmoxarifado = function(value){
... ... @@ -390,10 +405,28 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
390 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 423 // SALVA O EntradaAlmoxarifado
395   - $scope.saveOrUpdate = function(){
  424 + $scope.saveOrUpdate = function(dataContabil){
396 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 431 // validar o formulario, retorna true se o formulario e as regras estiverem OK
399 432 var formularioValido = validarFormulario($scope.entradaAlmoxarifadoForm);
... ... @@ -418,15 +451,69 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
418 451  
419 452 EntradaAlmoxarifadoRepository.save($scope.entradaAlmoxarifado).then(function(result) {
420 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 459 $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO'));
422 460  
423 461 // depois de salvar a entrada ja tendo uma referencia do id, esse metodo ira salvar os documentos se existir
424 462 salvarListaDocumentos(entradaTemp);
425   - $scope.resetForm();
426 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 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 519 var salvarListaDocumentos = function(entradaTemp){
... ... @@ -655,7 +742,7 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
655 742 $scope.enderecosMaterial = [];
656 743 }
657 744  
658   - if ($scope.entradaItem.material) {
  745 + if ($scope.entradaItem && $scope.entradaItem.material) {
659 746 $scope.unidadesMedidasEntrada = $scope.entradaItem.material.tiposUnidadeMedidaEntrada.map(function(item){
660 747 if (item.isPadrao && !$scope.entradaItem.unidadeMedidaEntrada) {
661 748 $scope.entradaItem.unidadeMedidaEntrada = item.unidadeMedida;
... ... @@ -680,15 +767,17 @@ citApp.controller(&#39;EntradaAlmoxarifadoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;FileUp
680 767 //Watch para controlar as mudanças da quantidade na entrada de materiais
681 768 $scope.$watch('entradaItem.$quantidadeEntrada', function() {
682 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 785 //Watch para controlar as mudanças da unidade de medida na entrada de materiais
697 786 $scope.$watch('entradaItem.unidadeMedidaEntrada', function() {
698 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 798 //Watch para controlar as mudanças do valor total da entrada de materiais
708 799 $scope.$watch('entradaItem.valorTotal', function() {
709 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 4  
5 5 function EntradaAlmoxarifadoRepository() {
6 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 13 AbstractRepository.extend(EntradaAlmoxarifadoRepository);
... ...
cit-almoxarifado-web/src/main/webapp/html/entradaAlmoxarifado/dialog_contabilizar_entrada.html 0 → 100644
... ... @@ -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 2 <div class="bar-buttons-action fixed" >
3 3 <div class="row">
4 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 24 <i class="fa fa-eraser yellow-dark"></i> <translate>LABEL.LIMPAR</translate>
10 25 </button>
11 26 <button
... ... @@ -16,7 +31,8 @@
16 31 <i class="fa fa-print"></i>
17 32 <translate>LABEL.GERAR_RELATORIO</translate>
18 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 36 <i class="fa fa-search"></i> <translate>LABEL.PESQUISAR</translate>
21 37 </button>
22 38 </div>
... ... @@ -34,6 +50,10 @@
34 50 <!-- .row -->
35 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 57 <breadcrumb ng-workspace="workspace"></breadcrumb>
38 58  
39 59 <p>
... ...
cit-almoxarifado-web/src/main/webapp/html/entradaAlmoxarifado/entradaAlmoxarifadoList.html
... ... @@ -14,6 +14,11 @@
14 14 <translate>LABEL.VISUALIZAR</translate>
15 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 22 <button class="btn btn-clear" ng-click="remove();">
18 23 <i class="fa fa-times red"></i>
19 24 <translate>LABEL.REMOVER</translate>
... ... @@ -43,6 +48,6 @@
43 48  
44 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 53 </div><!-- .page-content -->
... ...