Commit b8f36bb7e34450e815e4c5e82424bf24b0a0c1b7

Authored by Erick.sato
2 parents 00e6fa5c 38bf80fa
Exists in master

Merge branch 'tarefa-3822' into adm-1.16.0

# Conflicts:
#	cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/RequisicaoConsumoDao.java
#	cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/RequisicaoConsumoDaoHibernate.java
#	cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/RequisicaoConsumoItemService.java
#	cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/RequisicaoConsumoService.java
#	cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/EntradaAlmoxarifadoItemServiceImpl.java
#	cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/RequisicaoConsumoServiceImpl.java
#	cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/AtendimentoRequisicaoConsumoListController.js
#	cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoList.html
Showing 53 changed files with 2551 additions and 629 deletions   Show diff stats
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/AtendimentoRequisicaoConsumoFIFODao.java 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +package br.com.centralit.api.dao;
  2 +
  3 +import br.com.centralit.framework.dao.arquitetura.CitGenericDAO;
  4 +
  5 +public interface AtendimentoRequisicaoConsumoFIFODao extends CitGenericDAO {}
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/MaterialEstoqueFIFOItemDao.java
1 1 package br.com.centralit.api.dao;
2 2  
  3 +import java.util.List;
  4 +
  5 +import br.com.centralit.api.model.MaterialEstoqueFIFOItem;
3 6 import br.com.centralit.framework.dao.arquitetura.CitGenericDAO;
4 7  
5 8 public interface MaterialEstoqueFIFOItemDao extends CitGenericDAO {
  9 +
  10 + List<MaterialEstoqueFIFOItem> findFIFOsByMaterial(long idMaterial);
6 11  
7 12 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/MovimentoEstoqueDao.java
1 1 package br.com.centralit.api.dao;
2 2  
3 3 import java.math.BigDecimal;
  4 +import java.util.ArrayList;
4 5 import java.util.Calendar;
5 6 import java.util.Collection;
6 7 import java.util.List;
7   -import java.util.Map;
8 8  
9 9 import br.com.centralit.api.model.EstruturaOrganizacional;
10 10 import br.com.centralit.api.model.MaterialConsumo;
... ... @@ -116,7 +116,7 @@ public interface MovimentoEstoqueDao extends CitGenericDAO {
116 116 * @param dataFim
117 117 * @return
118 118 */
119   - List<Map<String, Object>> getQuantidadeMaterialAtendido(MaterialConsumo materialConsumo, EstruturaOrganizacional almoxarifado, EstruturaOrganizacional unidadeRequisitante, Calendar dataInicio, Calendar dataFim, List<Long> idsDominiosTipoStatusRequisicao);
  119 + List<ArrayList<Object>> getQuantidadeMaterialAtendido(MaterialConsumo materialConsumo, EstruturaOrganizacional almoxarifado, EstruturaOrganizacional unidadeRequisitante, Calendar dataInicio, Calendar dataFim, List<Long> idsDominiosTipoStatusRequisicao);
120 120  
121 121 /**
122 122 * <p><b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a></p>
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/RequisicaoConsumoDao.java
... ... @@ -4,9 +4,12 @@ import java.util.Calendar;
4 4 import java.util.Collection;
5 5 import java.util.List;
6 6  
  7 +import com.googlecode.genericdao.search.SearchResult;
  8 +
7 9 import br.com.centralit.api.model.EstruturaOrganizacional;
8 10 import br.com.centralit.api.model.MaterialConsumo;
9 11 import br.com.centralit.api.model.RequisicaoConsumo;
  12 +import br.com.centralit.api.viewHelper.AtendimentoVH;
10 13 import br.com.centralit.api.viewHelper.RequisicaoVH;
11 14 import br.com.centralit.framework.dao.arquitetura.CitGenericDAO;
12 15  
... ... @@ -117,4 +120,9 @@ public interface RequisicaoConsumoDao extends CitGenericDAO {
117 120 List<Object> getMateriaisForReport(Long requisicaoId,boolean isFIFO);
118 121 String findtipoStatusRequisicaoPorMaterial(Long requisicaoId);
119 122  
  123 + SearchResult filtrarRequisicoesAtendimento(AtendimentoVH atendimentoVH);
  124 +
  125 + List<RequisicaoConsumo> findRequisicoesParaAtendimento(AtendimentoVH atendimentoVH);
  126 +
  127 +
120 128 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/RequisicaoConsumoItemDao.java
... ... @@ -26,7 +26,9 @@ public interface RequisicaoConsumoItemDao extends CitGenericDAO {
26 26 * @param statusFinalizado
27 27 * @return
28 28 */
29   - Long findRequisicaoAnteriorPorMaterial(MaterialConsumo materialConsumo, EstruturaOrganizacional unidadeRequisitante, Dominio statusFinalizado, Dominio statusParcialmenteAtendida, Dominio statusAtendida);
  29 + Long findRequisicaoAnteriorPorMaterial(MaterialConsumo materialConsumo, EstruturaOrganizacional unidadeRequisitante, Dominio statusFinalizado, Dominio statusParcialmenteAtendida);
  30 +
  31 + List<RequisicaoConsumoItem> findItensRequisicaoPorMaterial(Long idRequisicao, Long idMaterial);
30 32  
31 33 List<RequisicaoConsumoItem> listarRequisicaoCosumoItemByIdRequisicao(Long requisicaoId);
32 34  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/AtendimentoRequisicaoConsumoFIFODaoHibernate.java 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +package br.com.centralit.api.dao.impl;
  2 +
  3 +import org.springframework.stereotype.Repository;
  4 +
  5 +import br.com.centralit.api.dao.AtendimentoRequisicaoConsumoFIFODao;
  6 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemFIFO;
  7 +import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl;
  8 +
  9 +@Repository("atendimentoRequisicaoConsumoFIFODao")
  10 +public class AtendimentoRequisicaoConsumoFIFODaoHibernate extends CitGenericDAOImpl implements AtendimentoRequisicaoConsumoFIFODao {
  11 + public AtendimentoRequisicaoConsumoFIFODaoHibernate() {
  12 + super(AtendimentoRequisicaoConsumoItemFIFO.class);
  13 + }
  14 +}
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/MaterialEstoqueFIFOItemDaoHibernate.java
1 1 package br.com.centralit.api.dao.impl;
2 2  
  3 +import java.util.List;
  4 +
3 5 import org.springframework.stereotype.Repository;
4 6  
  7 +import com.googlecode.genericdao.search.Sort;
  8 +
5 9 import br.com.centralit.api.dao.MaterialEstoqueFIFOItemDao;
6 10 import br.com.centralit.api.model.MaterialEstoqueFIFOItem;
7 11 import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl;
  12 +import br.com.centralit.framework.dao.arquitetura.SearchSeven;
8 13  
9 14 @Repository("materialEstoqueFIFOItemDao")
10 15 public class MaterialEstoqueFIFOItemDaoHibernate extends CitGenericDAOImpl implements MaterialEstoqueFIFOItemDao {
... ... @@ -12,5 +17,17 @@ public class MaterialEstoqueFIFOItemDaoHibernate extends CitGenericDAOImpl imple
12 17 public MaterialEstoqueFIFOItemDaoHibernate() {
13 18 super(MaterialEstoqueFIFOItem.class);
14 19 }
  20 +
  21 + @Override
  22 + public List<MaterialEstoqueFIFOItem> findFIFOsByMaterial(long idMaterial) {
  23 +
  24 + SearchSeven search = new SearchSeven(this.persistentClass);
  25 +
  26 + search.addFilterEqual("material.id", idMaterial);
  27 +
  28 + search.addSort(Sort.asc("id"));
  29 +
  30 + return this.search(search, this.persistentClass);
  31 + }
15 32  
16 33 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/MovimentoEstoqueDaoHibernate.java
1 1 package br.com.centralit.api.dao.impl;
2 2  
3 3 import java.math.BigDecimal;
  4 +import java.util.ArrayList;
4 5 import java.util.Calendar;
5 6 import java.util.Collection;
  7 +import java.util.HashMap;
6 8 import java.util.List;
7 9 import java.util.Map;
8 10  
... ... @@ -13,6 +15,7 @@ import org.springframework.stereotype.Repository;
13 15  
14 16 import br.com.centralit.api.dao.MovimentoEstoqueDao;
15 17 import br.com.centralit.api.model.DominioAlmoxarifado;
  18 +import br.com.centralit.api.model.DominioMaterial;
16 19 import br.com.centralit.api.model.EstruturaOrganizacional;
17 20 import br.com.centralit.api.model.MaterialConsumo;
18 21 import br.com.centralit.api.model.MovimentoEstoque;
... ... @@ -25,8 +28,6 @@ import br.com.centralit.framework.util.UtilColecao;
25 28 import br.com.centralit.framework.util.UtilObjeto;
26 29  
27 30 import com.googlecode.genericdao.search.Field;
28   -import com.googlecode.genericdao.search.Filter;
29   -import com.googlecode.genericdao.search.Search;
30 31  
31 32 /**
32 33 * <p>
... ... @@ -173,38 +174,71 @@ public class MovimentoEstoqueDaoHibernate extends CitGenericDAOImpl implements M
173 174 /**
174 175 * {@inheritDoc}
175 176 */
  177 + @SuppressWarnings("unchecked")
176 178 @Override
177   - public List<Map<String, Object>> getQuantidadeMaterialAtendido(MaterialConsumo materialConsumo, EstruturaOrganizacional almoxarifado, EstruturaOrganizacional unidadeRequisitante, Calendar dataInicio, Calendar dataFim, List<Long> idsDominiosTipoStatusRequisicao) {
178   -
179   - SearchSeven search = new SearchSeven();
  179 + public List<ArrayList<Object>> getQuantidadeMaterialAtendido(MaterialConsumo materialConsumo, EstruturaOrganizacional almoxarifado, EstruturaOrganizacional unidadeRequisitante, Calendar dataInicio, Calendar dataFim, List<Long> idsDominiosTipoStatusRequisicao) {
180 180  
181   - search.setResultMode(Search.RESULT_MAP);
  181 + Map<String, Object> parametros = new HashMap<String, Object>();
  182 + StringBuilder sql = new StringBuilder();
182 183  
183   - search.addField("atendimentoRequisicaoConsumoItem.quantidade");
  184 + sql.append("select atendimento.dataAtendimento, ");
  185 + sql.append(" (select sum(quantidade) from alm_rc_at_item_endereco where alm_rc_at_item_endereco.at_req_consumoitem_id = atendimentoItem.id) as quantidade ");
  186 + sql.append(" from alm_me_movimentoestoque me ");
  187 + sql.append(" inner join dominio dominio on dominio.id = me.dominioClasseReferencia_id ");
  188 + sql.append(" left join alm_rc_atendimentoitem atendimentoItem on atendimentoItem.id = me.idClasseReferencia ");
  189 + sql.append(" left join alm_rc_atendimento atendimento on atendimento.id = atendimentoItem.AtendimentoReqConsumo_Id ");
  190 + sql.append(" left join alm_rc_item rci on rci.id = atendimentoItem.requisicaoConsumoItem_id ");
  191 + sql.append(" left join alm_requisicaoconsumo rc on rc.id = rci.requisicaoConsumo_id ");
184 192  
185   - search.addField("atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumo.dataAtendimento");
  193 + sql.append(" where dominio.codigo = :codigoDominio and dominio.chave = :chaveDominio ");
186 194  
187   - search.addFilterEqual("material.id", materialConsumo.getId());
  195 + parametros.put("codigoDominio", DominioMaterial.REFERENCIA_ATENDIMENTO_ALMOXARIFADO_ITEM);
  196 + parametros.put("chaveDominio", "classeReferencia");
188 197  
189   - search.addFilterEqual("atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.requisicaoConsumo.almoxarifado.id", almoxarifado.getId());
  198 + sql.append(" and me.material_id = :materialConsumoId ");
  199 + parametros.put("materialConsumoId", materialConsumo.getId());
  200 +
  201 + sql.append(" and rc.almoxarifado_id = :almoxarifadoId ");
  202 + parametros.put("almoxarifadoId", almoxarifado.getId());
190 203  
191 204 if(UtilObjeto.isReferencia(unidadeRequisitante)){
192 205  
193   - search.addFilterEqual("atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.requisicaoConsumo.unidadeRequisitante.id", unidadeRequisitante.getId());
  206 + sql.append(" and rc.unidadeRequisitante_id = :unidadeRequisitanteId ");
  207 + parametros.put("unidadeRequisitanteId", unidadeRequisitante.getId());
194 208 }
195 209  
196 210 if(!UtilColecao.isVazio(idsDominiosTipoStatusRequisicao)){
197   - search.addFilterIn("atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.requisicaoConsumo.tipoStatusRequisicao.id", idsDominiosTipoStatusRequisicao);
  211 +
  212 + sql.append(" and rc.tipoStatusRequisicao_id in ").append(addFilterIn(idsDominiosTipoStatusRequisicao));
198 213 }
199 214  
200 215 if(UtilObjeto.isReferencia(dataInicio) && UtilObjeto.isReferencia(dataFim)){
201 216  
202   - search.addFilterAnd(
203   - Filter.greaterOrEqual("atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumo.dataAtendimento", dataInicio),
204   - Filter.lessOrEqual("atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumo.dataAtendimento", dataFim));
  217 + sql.append(" and (atendimento.dataAtendimento >= :dataInicio and atendimento.dataAtendimento <= :dataFim) ");
  218 + parametros.put("dataInicio", dataInicio);
  219 + parametros.put("dataFim", dataFim);
  220 + }
  221 +
  222 + Query query = em().createNativeQuery(sql.toString());
  223 +
  224 + for(java.util.Map.Entry<String, Object> parametro : parametros.entrySet()){
  225 + query.setParameter(parametro.getKey(), parametro.getValue());
205 226 }
206 227  
207   - return this.search(search);
  228 + return query.getResultList();
  229 + }
  230 +
  231 + private String addFilterIn(List<Long> ids){
  232 + String in = "(";
  233 +
  234 + for (Long id : ids) {
  235 + in += id + ",";
  236 + }
  237 +
  238 + in = in.substring(0, in.length() - 1);
  239 +
  240 + in += ")";
  241 + return in;
208 242 }
209 243  
210 244 @Override
... ... @@ -254,7 +288,7 @@ public class MovimentoEstoqueDaoHibernate extends CitGenericDAOImpl implements M
254 288 SearchSeven search = new SearchSeven();
255 289  
256 290 search.addFilterEqual("dominioClasseReferencia.id", classeReferencia.getId());
257   - search.addFilterEqual("idClasseReferencia", idReferencia);
  291 + search.addFilterEqual("idClasseReferencia", null);
258 292  
259 293 return search(search);
260 294 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/RequisicaoConsumoDaoHibernate.java
1 1 package br.com.centralit.api.dao.impl;
2 2  
3 3 import java.math.BigDecimal;
  4 +import java.util.ArrayList;
4 5 import java.util.Calendar;
5 6 import java.util.Collection;
6 7 import java.util.HashSet;
... ... @@ -9,6 +10,12 @@ import java.util.Set;
9 10  
10 11 import org.springframework.stereotype.Repository;
11 12  
  13 +import com.googlecode.genericdao.search.Field;
  14 +import com.googlecode.genericdao.search.Filter;
  15 +import com.googlecode.genericdao.search.Search;
  16 +import com.googlecode.genericdao.search.SearchResult;
  17 +import com.googlecode.genericdao.search.Sort;
  18 +
12 19 import br.com.centralit.api.dao.RequisicaoConsumoDao;
13 20 import br.com.centralit.api.model.AtendimentoRequisicaoConsumo;
14 21 import br.com.centralit.api.model.DominioAlmoxarifado;
... ... @@ -16,6 +23,7 @@ import br.com.centralit.api.model.EstruturaOrganizacional;
16 23 import br.com.centralit.api.model.MaterialConsumo;
17 24 import br.com.centralit.api.model.RequisicaoConsumo;
18 25 import br.com.centralit.api.model.RequisicaoConsumoItem;
  26 +import br.com.centralit.api.viewHelper.AtendimentoVH;
19 27 import br.com.centralit.api.viewHelper.RequisicaoVH;
20 28 import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl;
21 29 import br.com.centralit.framework.dao.arquitetura.SearchSeven;
... ... @@ -23,9 +31,6 @@ import br.com.centralit.framework.util.UtilColecao;
23 31 import br.com.centralit.framework.util.UtilObjeto;
24 32 import br.com.centralit.framework.util.UtilString;
25 33  
26   -import com.googlecode.genericdao.search.Filter;
27   -import com.googlecode.genericdao.search.Sort;
28   -
29 34 /**
30 35 * <p>
31 36 * <img src="http://centralit.com.br/images/logo_central.png">
... ... @@ -369,4 +374,67 @@ public class RequisicaoConsumoDaoHibernate extends CitGenericDAOImpl implements
369 374  
370 375 return (List<Object>) resultListNativeQuery(sql.toString());
371 376 }
  377 +
  378 +@SuppressWarnings({ "unchecked", "rawtypes" })
  379 + @Override
  380 + public SearchResult filtrarRequisicoesAtendimento(AtendimentoVH atendimentoVH) {
  381 +
  382 + SearchSeven searchSeven = new SearchSeven(atendimentoVH.getSearchParams());
  383 + searchSeven.setResultMode(Search.RESULT_SINGLE);
  384 +
  385 + searchSeven.setDistinct(true);
  386 +
  387 + addFilterMaterialConsumo(atendimentoVH, searchSeven);
  388 + addFilterUnidadeRequisitante(atendimentoVH, searchSeven);
  389 +
  390 + List<Field> fields = new ArrayList<Field>();
  391 + List<Sort> sorts = new ArrayList<Sort>();
  392 + fields.add(new Field("id"));
  393 + sorts.add(new Sort("id"));
  394 + searchSeven.setFields(fields);
  395 + searchSeven.setSorts(sorts);
  396 + List<Long> ids = this.search(searchSeven);
  397 +
  398 + SearchResult result = new SearchResult();
  399 + result.setTotalCount(this.count(searchSeven));
  400 +
  401 + fields = new ArrayList<Field>();
  402 + searchSeven = new SearchSeven(atendimentoVH.getSearchParams());
  403 + searchSeven.setResultMode(Search.RESULT_MAP);
  404 + for (String field : atendimentoVH.getSearchParams().getFields()) {
  405 + fields.add(new Field(field));
  406 + }
  407 + searchSeven.setFields(fields);
  408 + searchSeven.addFilterIn("id", ids);
  409 + searchSeven.setFirstResult(0);
  410 + result.setResult(this.search(searchSeven));
  411 +
  412 + return result;
  413 + }
  414 +
  415 + private void addFilterUnidadeRequisitante(AtendimentoVH atendimentoVH, SearchSeven searchSeven) {
  416 + if(!UtilColecao.isVazio(atendimentoVH.getIdsUnidadesRequisitantes())){
  417 + searchSeven.addFilterIn("unidadeRequisitante.id", atendimentoVH.getIdsUnidadesRequisitantes());
  418 + }
  419 + }
  420 +
  421 + private void addFilterMaterialConsumo(AtendimentoVH atendimentoVH, SearchSeven searchSeven) {
  422 + if(!UtilColecao.isVazio(atendimentoVH.getIdsMaterais())){
  423 + searchSeven.addFilterIn("requisicaoConsumoItens.materialConsumo.id", atendimentoVH.getIdsMaterais());
  424 + }
  425 + }
  426 +
  427 + @Override
  428 + public List<RequisicaoConsumo> findRequisicoesParaAtendimento(AtendimentoVH atendimentoVH) {
  429 +
  430 + SearchSeven searchSeven = new SearchSeven();
  431 +
  432 + if (!UtilColecao.isVazio(atendimentoVH.getIdsRequisicao())) {
  433 +
  434 + searchSeven.addFilterIn("id", atendimentoVH.getIdsRequisicao());
  435 + }
  436 +
  437 + return this.search(searchSeven);
  438 + }
  439 +
372 440 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/dao/impl/RequisicaoConsumoItemDaoHibernate.java
... ... @@ -166,13 +166,13 @@ public class RequisicaoConsumoItemDaoHibernate extends CitGenericDAOImpl impleme
166 166 * {@inheritDoc}
167 167 */
168 168 @Override
169   - public Long findRequisicaoAnteriorPorMaterial(MaterialConsumo materialConsumo, EstruturaOrganizacional unidadeRequisitante, Dominio statusFinalizado, Dominio statusParcialmenteAtendida, Dominio statusAtendida) {
  169 + public Long findRequisicaoAnteriorPorMaterial(MaterialConsumo materialConsumo, EstruturaOrganizacional unidadeRequisitante, Dominio statusFinalizado, Dominio statusParcialmenteAtendida) {
170 170  
171 171 StringBuilder str = new StringBuilder();
172 172 str.append("select RequisicaoConsumo.id ");
173   - str.append("from RequisicaoConsumoItem as RequisicaoConsumoItem ");
174   - str.append("inner join RequisicaoConsumo RequisicaoConsumo on RequisicaoConsumo.id = RequisicaoConsumoItem.requisicaoconsumo_id ");
175   - str.append("where (RequisicaoConsumo.tipostatusrequisicao_id = :dominioFinalizado OR RequisicaoConsumo.tipostatusrequisicao_id = :dominioParcialmenteAtendida OR RequisicaoConsumo.tipostatusrequisicao_id = :dominioAtendida) AND RequisicaoConsumoItem.materialConsumo_id = :idMaterial AND RequisicaoConsumo.unidaderequisitante_id = :idUnidadeRequisitante ");
  173 + str.append("from alm_rc_item as RequisicaoConsumoItem ");
  174 + str.append("inner join alm_requisicaoconsumo RequisicaoConsumo on RequisicaoConsumo.id = RequisicaoConsumoItem.requisicaoconsumo_id ");
  175 + str.append("where (RequisicaoConsumo.tipostatusrequisicao_id = :dominioFinalizado OR RequisicaoConsumo.tipostatusrequisicao_id = :dominioParcialmenteAtendida) AND RequisicaoConsumoItem.materialConsumo_id = :idMaterial AND RequisicaoConsumo.unidaderequisitante_id = :idUnidadeRequisitante ");
176 176 str.append("order by RequisicaoConsumo.id desc");
177 177  
178 178 Query query = em().createNativeQuery(str.toString());
... ... @@ -181,7 +181,6 @@ public class RequisicaoConsumoItemDaoHibernate extends CitGenericDAOImpl impleme
181 181 query.setParameter("idUnidadeRequisitante", unidadeRequisitante.getId());
182 182 query.setParameter("dominioFinalizado", statusFinalizado.getId());
183 183 query.setParameter("dominioParcialmenteAtendida", statusParcialmenteAtendida.getId());
184   - query.setParameter("dominioAtendida", statusAtendida.getId());
185 184  
186 185 query.setMaxResults(1);
187 186  
... ... @@ -196,5 +195,18 @@ public class RequisicaoConsumoItemDaoHibernate extends CitGenericDAOImpl impleme
196 195 return UtilObjeto.isReferencia(result) ? result.longValue() : null;
197 196 }
198 197  
  198 + @Override
  199 + public List<RequisicaoConsumoItem> findItensRequisicaoPorMaterial(Long idRequisicao, Long idMaterial) {
  200 +
  201 + SearchSeven searchSeven = new SearchSeven();
  202 +
  203 + searchSeven.addFilterEqual("requisicaoConsumo.id", idRequisicao);
  204 +
  205 + searchSeven.addFilterEqual("materialConsumo.id", idMaterial);
  206 +
  207 + return this.search(searchSeven);
  208 +
  209 + }
  210 +
199 211  
200 212 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/AtendimentoRequisicaoConsumo.java
... ... @@ -11,13 +11,17 @@ import javax.persistence.FetchType;
11 11 import javax.persistence.GeneratedValue;
12 12 import javax.persistence.GenerationType;
13 13 import javax.persistence.Id;
14   -import javax.persistence.ManyToOne;
15 14 import javax.persistence.OneToMany;
  15 +import javax.persistence.OneToOne;
16 16 import javax.persistence.Table;
17 17 import javax.persistence.Temporal;
18 18 import javax.persistence.TemporalType;
19 19 import javax.persistence.Transient;
20 20  
  21 +import org.hibernate.envers.AuditTable;
  22 +import org.hibernate.envers.Audited;
  23 +
  24 +import br.com.centralit.api.framework.json.ViewsAdmMateriais;
21 25 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
22 26 import br.com.centralit.framework.json.JsonCalendarSimpleDateDeserializer;
23 27 import br.com.centralit.framework.json.JsonCalendarSimpleDateSerializer;
... ... @@ -61,6 +65,8 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
61 65 * @author rogerio.costa
62 66 *
63 67 */
  68 +@Audited
  69 +@AuditTable(value = "alm_rc_atendimento_aud")
64 70 @Entity
65 71 @Table(name="alm_rc_atendimento")
66 72 @JsonIgnoreProperties({"$selecionarRequisicoes", "$dataFinalizacao"})
... ... @@ -88,13 +94,13 @@ public class AtendimentoRequisicaoConsumo extends PersistentObjectAuditOrganizac
88 94 private String numeroAtendimento;
89 95  
90 96 /** Atributo requisicaoConsumo. */
91   - @ManyToOne(fetch = FetchType.LAZY, optional = false)
  97 + @OneToOne(fetch = FetchType.LAZY, optional = false)
92 98 @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoListView.class })
93 99 private RequisicaoConsumo requisicaoConsumo;
94 100  
95 101 /** Atributo atendimentoRequisicaoConsumoItems. */
96   - @OneToMany(fetch = FetchType.LAZY, mappedBy = "atendimentoRequisicaoConsumo", cascade = CascadeType.ALL, orphanRemoval = true)
97   - @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  102 + @OneToMany(fetch = FetchType.LAZY, mappedBy = "atendimentoRequisicaoConsumo", cascade = CascadeType.ALL)
  103 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class })
98 104 private Collection<AtendimentoRequisicaoConsumoItem> atendimentoRequisicaoConsumoItems;
99 105  
100 106 @Transient
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/AtendimentoRequisicaoConsumoItem.java
1 1 package br.com.centralit.api.model;
2 2  
3 3 import java.math.BigDecimal;
  4 +import java.util.Collection;
4 5  
  6 +import javax.persistence.CascadeType;
5 7 import javax.persistence.Entity;
6 8 import javax.persistence.FetchType;
7 9 import javax.persistence.GeneratedValue;
... ... @@ -9,8 +11,13 @@ import javax.persistence.GenerationType;
9 11 import javax.persistence.Id;
10 12 import javax.persistence.JoinColumn;
11 13 import javax.persistence.ManyToOne;
  14 +import javax.persistence.OneToMany;
12 15 import javax.persistence.Table;
13 16  
  17 +import org.hibernate.envers.AuditTable;
  18 +import org.hibernate.envers.Audited;
  19 +
  20 +import br.com.centralit.api.framework.json.ViewsAdmMateriais;
14 21 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
15 22 import br.com.centralit.framework.json.Views;
16 23 import br.com.centralit.framework.model.arquitetura.PersistentObjectAuditOrganizacao;
... ... @@ -50,9 +57,11 @@ import com.fasterxml.jackson.annotation.JsonView;
50 57 * @author rogerio.costa
51 58 *
52 59 */
  60 +@Audited
  61 +@AuditTable(value = "alm_rc_atenditem_aud")
53 62 @Entity
54   -@Table(name="alm_rc_atendimentoitem")
55   -@JsonIgnoreProperties({"$info", "$verInfo", "$quantidade"})
  63 +@Table(name = "alm_rc_atendimentoitem")
  64 +@JsonIgnoreProperties({ "$info", "$verInfo", "$quantidade", "$locaisEstoque", "$hasError", "$somaQtdAtendida" })
56 65 public class AtendimentoRequisicaoConsumoItem extends PersistentObjectAuditOrganizacao {
57 66  
58 67 /** Atributo serialVersionUID. */
... ... @@ -67,21 +76,30 @@ public class AtendimentoRequisicaoConsumoItem extends PersistentObjectAuditOrgan
67 76 /** Atributo atendimentoRequisicaoConsumo. */
68 77 @ManyToOne(fetch = FetchType.LAZY, optional = false)
69 78 @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class, Views.MaterialConsultaInfo.class })
70   - @JoinColumn(name="AtendimentoReqConsumo_Id")
  79 + @JoinColumn(name = "AtendimentoReqConsumo_Id")
71 80 private AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo;
72 81  
73   - @ManyToOne(fetch = FetchType.LAZY, optional = false)
74   - @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class, ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class, Views.MaterialConsultaInfo.class })
  82 + @ManyToOne(fetch = FetchType.LAZY)
  83 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class,
  84 + ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class, Views.MaterialConsultaInfo.class,
  85 + ViewsAdmMateriais.RequisicaoConsumoEditView.class })
75 86 private RequisicaoConsumoItem requisicaoConsumoItem;
76 87  
77 88 /** Atributo material. */
78 89 @ManyToOne(fetch = FetchType.LAZY, optional = false)
79   - @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class, ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  90 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class,
  91 + ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class,
  92 + ViewsAdmMateriais.RequisicaoConsumoEditView.class })
80 93 private MaterialConsumo material;
81 94  
82   - /** Atributo quantidade. */
83   - @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class, ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class, Views.MaterialConsultaInfo.class })
84   - private BigDecimal quantidade;
  95 + @OneToMany(fetch = FetchType.LAZY, mappedBy = "atendimentoRequisicaoConsumoItem", cascade = CascadeType.ALL, orphanRemoval = true)
  96 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class,
  97 + ViewsAdmMateriais.RequisicaoConsumoEditView.class })
  98 + private Collection<AtendimentoRequisicaoConsumoItemEndereco> atendimentoRequisicaoConsumoItemEnderecos;
  99 +
  100 + @OneToMany(fetch = FetchType.LAZY, mappedBy = "atendimentoRequisicaoConsumoItem", cascade = CascadeType.ALL)
  101 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  102 + private Collection<AtendimentoRequisicaoConsumoItemFIFO> atendimentoRequisicaoConsumoItemFIFOs;
85 103  
86 104 /**
87 105 * Retorna o valor do atributo <code>id</code>
... ... @@ -144,26 +162,6 @@ public class AtendimentoRequisicaoConsumoItem extends PersistentObjectAuditOrgan
144 162 }
145 163  
146 164 /**
147   - * Retorna o valor do atributo <code>quantidade</code>
148   - *
149   - * @return <code>BigDecimal</code>
150   - */
151   - public BigDecimal getQuantidade() {
152   -
153   - return quantidade;
154   - }
155   -
156   - /**
157   - * Define o valor do atributo <code>quantidade</code>.
158   - *
159   - * @param quantidade
160   - */
161   - public void setQuantidade(BigDecimal quantidade) {
162   -
163   - this.quantidade = quantidade;
164   - }
165   -
166   - /**
167 165 * Retorna o valor do atributo <code>requisicaoConsumoItem</code>
168 166 *
169 167 * @return <code>RequisicaoConsumoItem</code>
... ... @@ -183,4 +181,35 @@ public class AtendimentoRequisicaoConsumoItem extends PersistentObjectAuditOrgan
183 181 this.requisicaoConsumoItem = requisicaoConsumoItem;
184 182 }
185 183  
  184 + public Collection<AtendimentoRequisicaoConsumoItemEndereco> getAtendimentoRequisicaoConsumoItemEnderecos() {
  185 + return atendimentoRequisicaoConsumoItemEnderecos;
  186 + }
  187 +
  188 + public void setAtendimentoRequisicaoConsumoItemEnderecos(
  189 + Collection<AtendimentoRequisicaoConsumoItemEndereco> atendimentoRequisicaoConsumoItemEnderecos) {
  190 + this.atendimentoRequisicaoConsumoItemEnderecos = atendimentoRequisicaoConsumoItemEnderecos;
  191 + }
  192 +
  193 + public BigDecimal getQuantidade() {
  194 + BigDecimal quantidade = BigDecimal.ZERO;
  195 +
  196 + if (atendimentoRequisicaoConsumoItemEnderecos != null) {
  197 + for (AtendimentoRequisicaoConsumoItemEndereco itemEndereco : atendimentoRequisicaoConsumoItemEnderecos) {
  198 + quantidade = quantidade
  199 + .add(itemEndereco.getQuantidade() != null ? itemEndereco.getQuantidade() : BigDecimal.ZERO);
  200 + }
  201 + }
  202 +
  203 + return quantidade;
  204 + }
  205 +
  206 + public Collection<AtendimentoRequisicaoConsumoItemFIFO> getAtendimentoRequisicaoConsumoItemFIFOs() {
  207 + return atendimentoRequisicaoConsumoItemFIFOs;
  208 + }
  209 +
  210 + public void setAtendimentoRequisicaoConsumoItemFIFOs(
  211 + Collection<AtendimentoRequisicaoConsumoItemFIFO> atendimentoRequisicaoConsumoItemFIFOs) {
  212 + this.atendimentoRequisicaoConsumoItemFIFOs = atendimentoRequisicaoConsumoItemFIFOs;
  213 + }
  214 +
186 215 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/AtendimentoRequisicaoConsumoItemEndereco.java 0 → 100644
... ... @@ -0,0 +1,110 @@
  1 +package br.com.centralit.api.model;
  2 +
  3 +import java.math.BigDecimal;
  4 +
  5 +import javax.persistence.Entity;
  6 +import javax.persistence.FetchType;
  7 +import javax.persistence.GeneratedValue;
  8 +import javax.persistence.GenerationType;
  9 +import javax.persistence.Id;
  10 +import javax.persistence.JoinColumn;
  11 +import javax.persistence.ManyToOne;
  12 +import javax.persistence.Table;
  13 +import javax.persistence.Transient;
  14 +
  15 +import org.hibernate.envers.AuditTable;
  16 +import org.hibernate.envers.Audited;
  17 +
  18 +import br.com.centralit.api.framework.json.ViewsAdmMateriais;
  19 +import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
  20 +import br.com.centralit.framework.json.Views;
  21 +import br.com.centralit.framework.model.arquitetura.PersistentObject;
  22 +
  23 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  24 +import com.fasterxml.jackson.annotation.JsonView;
  25 +
  26 +@Audited
  27 +@AuditTable(value = "alm_rc_at_item_end_aud")
  28 +@Entity
  29 +@Table(name = "alm_rc_at_item_endereco")
  30 +@JsonIgnoreProperties({"$hasError"})
  31 +public class AtendimentoRequisicaoConsumoItemEndereco extends PersistentObject {
  32 +
  33 + private static final long serialVersionUID = 1L;
  34 +
  35 + @Id
  36 + @GeneratedValue(strategy = GenerationType.AUTO)
  37 + @JsonView({ Views.GenericView.class })
  38 + private Long id;
  39 +
  40 + @JsonView({Views.GenericView.class })
  41 + private BigDecimal quantidade;
  42 +
  43 + @ManyToOne(fetch = FetchType.LAZY, optional = false)
  44 + @JsonView({ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class})
  45 + private MaterialLocalEstoque materialLocalEstoque;
  46 +
  47 + @ManyToOne(fetch = FetchType.LAZY, optional = false)
  48 + @JsonView({ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class})
  49 + @JoinColumn(name = "at_req_consumoitem_id")
  50 + private AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem;
  51 +
  52 + @Transient
  53 + @JsonView({ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  54 + private BigDecimal quantidadeAnterior;
  55 +
  56 + @Override
  57 + public Long getId() {
  58 + return this.id;
  59 + }
  60 +
  61 + public void setId(Long id) {
  62 + this.id = id;
  63 + }
  64 +
  65 + public BigDecimal getQuantidade() {
  66 + return quantidade;
  67 + }
  68 +
  69 + public void setQuantidade(BigDecimal quantidade) {
  70 + this.quantidade = quantidade;
  71 + }
  72 +
  73 + public MaterialLocalEstoque getMaterialLocalEstoque() {
  74 + return materialLocalEstoque;
  75 + }
  76 +
  77 + public void setMaterialLocalEstoque(MaterialLocalEstoque materialLocalEstoque) {
  78 + this.materialLocalEstoque = materialLocalEstoque;
  79 + }
  80 +
  81 + public AtendimentoRequisicaoConsumoItem getAtendimentoRequisicaoConsumoItem() {
  82 + return atendimentoRequisicaoConsumoItem;
  83 + }
  84 +
  85 + public void setAtendimentoRequisicaoConsumoItem(
  86 + AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem) {
  87 + this.atendimentoRequisicaoConsumoItem = atendimentoRequisicaoConsumoItem;
  88 + }
  89 +
  90 + public BigDecimal getQuantidadeAnterior() {
  91 + if(quantidadeAnterior == null){
  92 + if(quantidade == null){
  93 + quantidadeAnterior = BigDecimal.ZERO;
  94 + }else{
  95 + if(atendimentoRequisicaoConsumoItem == null || atendimentoRequisicaoConsumoItem.getAtendimentoRequisicaoConsumo() == null || atendimentoRequisicaoConsumoItem.getAtendimentoRequisicaoConsumo().getDataInativo() != null){
  96 + quantidadeAnterior = BigDecimal.ZERO;
  97 + }else{
  98 + quantidadeAnterior = quantidade;
  99 + }
  100 + }
  101 + }
  102 +
  103 + return quantidadeAnterior;
  104 + }
  105 +
  106 + public void setQuantidadeAnterior(BigDecimal quantidadeAnterior) {
  107 + this.quantidadeAnterior = quantidadeAnterior;
  108 + }
  109 +
  110 +}
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/AtendimentoRequisicaoConsumoItemFIFO.java 0 → 100644
... ... @@ -0,0 +1,90 @@
  1 +package br.com.centralit.api.model;
  2 +
  3 +import java.math.BigDecimal;
  4 +
  5 +import javax.persistence.Column;
  6 +import javax.persistence.Entity;
  7 +import javax.persistence.FetchType;
  8 +import javax.persistence.GeneratedValue;
  9 +import javax.persistence.GenerationType;
  10 +import javax.persistence.Id;
  11 +import javax.persistence.JoinColumn;
  12 +import javax.persistence.ManyToOne;
  13 +import javax.persistence.Table;
  14 +
  15 +import org.hibernate.envers.AuditTable;
  16 +import org.hibernate.envers.Audited;
  17 +
  18 +import com.fasterxml.jackson.annotation.JsonView;
  19 +
  20 +import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
  21 +import br.com.centralit.framework.json.Views;
  22 +import br.com.centralit.framework.model.arquitetura.PersistentObjectAuditOrganizacao;
  23 +
  24 +@Audited
  25 +@AuditTable(value = "alm_rc_atitfifo_aud")
  26 +@Entity
  27 +@Table(name = "alm_rc_atendimentoitemfifo")
  28 +public class AtendimentoRequisicaoConsumoItemFIFO extends PersistentObjectAuditOrganizacao {
  29 +
  30 + /** Atributo serialVersionUID. */
  31 + private static final long serialVersionUID = -1011361588461933352L;
  32 +
  33 + /** Atributo id. */
  34 + @Id
  35 + @GeneratedValue(strategy = GenerationType.AUTO)
  36 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoItem.class, Views.GenericView.class })
  37 + private Long id;
  38 +
  39 + @ManyToOne(fetch = FetchType.LAZY, optional = true)
  40 + private MaterialEstoqueFIFOItem materialEstoqueFIFOItem;
  41 +
  42 + @Column(precision = 20, scale = 4, nullable = false)
  43 + private BigDecimal quantidadeUtilizada;
  44 +
  45 + @ManyToOne(fetch = FetchType.LAZY, optional = false)
  46 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  47 + @JoinColumn(name = "at_req_consumoitem_id")
  48 + private AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem;
  49 +
  50 + public AtendimentoRequisicaoConsumoItemFIFO(){};
  51 +
  52 + public AtendimentoRequisicaoConsumoItemFIFO(AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem, MaterialEstoqueFIFOItem materialEstoqueFIFOItem, BigDecimal quantidadeMovimentada) {
  53 + this.atendimentoRequisicaoConsumoItem = atendimentoRequisicaoConsumoItem;
  54 + this.materialEstoqueFIFOItem = materialEstoqueFIFOItem;
  55 + this.quantidadeUtilizada = quantidadeMovimentada;
  56 + }
  57 +
  58 + public Long getId() {
  59 + return id;
  60 + }
  61 +
  62 + public void setId(Long id) {
  63 + this.id = id;
  64 + }
  65 +
  66 + public MaterialEstoqueFIFOItem getMaterialEstoqueFIFOItem() {
  67 + return materialEstoqueFIFOItem;
  68 + }
  69 +
  70 + public void setMaterialEstoqueFIFOItem(MaterialEstoqueFIFOItem materialEstoqueFIFOItem) {
  71 + this.materialEstoqueFIFOItem = materialEstoqueFIFOItem;
  72 + }
  73 +
  74 + public BigDecimal getQuantidadeUtilizada() {
  75 + return quantidadeUtilizada;
  76 + }
  77 +
  78 + public void setQuantidadeUtilizada(BigDecimal quantidadeUtilizada) {
  79 + this.quantidadeUtilizada = quantidadeUtilizada;
  80 + }
  81 +
  82 + public AtendimentoRequisicaoConsumoItem getAtendimentoRequisicaoConsumoItem() {
  83 + return atendimentoRequisicaoConsumoItem;
  84 + }
  85 +
  86 + public void setAtendimentoRequisicaoConsumoItem(AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem) {
  87 + this.atendimentoRequisicaoConsumoItem = atendimentoRequisicaoConsumoItem;
  88 + }
  89 +
  90 +}
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/DominioAlmoxarifado.java
... ... @@ -25,17 +25,17 @@ public class DominioAlmoxarifado {
25 25 /** Atributo TIPO_STATUS_REQUISICAO. */
26 26 public static final String TIPO_STATUS_REQUISICAO = "tipoStatusRequisicao";
27 27  
28   - /** Atributo TIPO_STATUS_NAO_CONCLUIDA. */
29   - public static final Long TIPO_STATUS_NAO_CONCLUIDA = 1L;
30   -
  28 + /** Atributo TIPO_STATUS_ATENDIDA_PARCIALMENTE. */
  29 + public static final Long TIPO_STATUS_ATENDIDA_PARCIALMENTE = 1L;
  30 +
31 31 /** Atributo TIPO_STATUS_PRONTA_PARA_ATENDIMENTO. */
32 32 public static final Long TIPO_STATUS_PRONTA_PARA_ATENDIMENTO = 2L;
  33 +
  34 + /** Atributo TIPO_STATUS_NAO_CONCLUIDA. */
  35 + public static final Long TIPO_STATUS_NAO_CONCLUIDA = 3L;
33 36  
34   - /** Atributo TIPO_STATUS_ATENDIDA_PARCIALMENTE. */
35   - public static final Long TIPO_STATUS_ATENDIDA_PARCIALMENTE = 3L;
36   -
37   - /** Atributo TIPO_STATUS_ATENDIDA. */
38   - public static final Long TIPO_STATUS_ATENDIDA = 4L;
  37 + /** Atributo TIPO_STATUS_DEVOLVIDA. */
  38 + public static final Long TIPO_STATUS_DEVOLVIDA = 4L;
39 39  
40 40 /** Atributo TIPO_STATUS_FINALIZADA. */
41 41 public static final Long TIPO_STATUS_FINALIZADA = 5L;
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/EnderecoEstoque.java
... ... @@ -85,7 +85,7 @@ public class EnderecoEstoque extends PersistentObjectAuditOrganizacao {
85 85 private String sigla;
86 86  
87 87 @Column(name = "descricao", length = 400, nullable = false)
88   - @JsonView({ ViewsAdmMateriais.EnderecoEstoqueView.class, Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class })
  88 + @JsonView({ ViewsAdmMateriais.EnderecoEstoqueView.class, Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class })
89 89 private String descricao;
90 90  
91 91 @ManyToOne(fetch = FetchType.LAZY, optional = true)
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/MaterialEstoque.java
... ... @@ -18,6 +18,7 @@ import org.hibernate.envers.Audited;
18 18  
19 19 import com.fasterxml.jackson.annotation.JsonView;
20 20  
  21 +import br.com.centralit.api.framework.json.ViewsAdmMateriais;
21 22 import br.com.centralit.framework.json.Views;
22 23 import br.com.centralit.framework.model.arquitetura.PersistentObjectAuditOrganizacao;
23 24 import br.com.centralit.framework.util.UtilObjeto;
... ... @@ -71,7 +72,7 @@ public class MaterialEstoque extends PersistentObjectAuditOrganizacao {
71 72  
72 73 /** Atributo material. */
73 74 @OneToOne(fetch = FetchType.LAZY, optional = false)
74   - @JsonView({ Views.MaterialLocalEstoqueView.class })
  75 + @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class })
75 76 private MaterialConsumo material;
76 77  
77 78 /** Atributo locaisEstoque. */
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/MaterialEstoqueFIFOItem.java
... ... @@ -18,18 +18,30 @@ import br.com.centralit.framework.model.arquitetura.PersistentObjectAuditOrganiz
18 18  
19 19 /**
20 20 *
21   - * <p><img src="http://centralit.com.br/images/logo_central.png"></p>
  21 + * <p>
  22 + * <img src="http://centralit.com.br/images/logo_central.png">
  23 + * </p>
22 24 *
23   - * <p><b>Company: </b> Central IT - Governança Corporativa - </p>
  25 + * <p>
  26 + * <b>Company: </b> Central IT - Governança Corporativa -
  27 + * </p>
24 28 *
25   - * <p><b>Title: </b></p>
  29 + * <p>
  30 + * <b>Title: </b>
  31 + * </p>
26 32 *
27   - * <p><b>Description: </b></p>
  33 + * <p>
  34 + * <b>Description: </b>
  35 + * </p>
28 36 *
29   - * <p><b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a></p>
  37 + * <p>
  38 + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a>
  39 + * </p>
30 40 *
31   - * <p><b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a></p>
32   - *
  41 + * <p>
  42 + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a>
  43 + * </p>
  44 + *
33 45 * @since 29/04/2016 - 15:55:15
34 46 *
35 47 * @version 1.0.0
... ... @@ -45,16 +57,16 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
45 57 /** Atributo serialVersionUID. */
46 58 private static final long serialVersionUID = 1170228299223134768L;
47 59 private static int SCALE_DIVISOR_DECIMAL = 4;
48   -
  60 +
49 61 /** Atributo id. */
50 62 @Id
51 63 @GeneratedValue(strategy = GenerationType.AUTO)
52 64 private Long id;
53   -
  65 +
54 66 /** Atributo material. */
55 67 @ManyToOne(fetch = FetchType.LAZY, optional = false)
56 68 private MaterialConsumo material;
57   -
  69 +
58 70 /** Atributo materialEstoque. */
59 71 @ManyToOne(fetch = FetchType.LAZY, optional = true)
60 72 private MaterialEstoque materialEstoque;
... ... @@ -62,7 +74,7 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
62 74 /** Atributo materialEstoqueInativo. */
63 75 @ManyToOne(fetch = FetchType.LAZY, optional = true)
64 76 private MaterialEstoque materialEstoqueInativo;
65   -
  77 +
66 78 /** Atributo quantidadeInicial. */
67 79 @Column(precision = 20, scale = 4, nullable = false)
68 80 private BigDecimal quantidadeInicial;
... ... @@ -70,7 +82,7 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
70 82 /** Atributo quantidadeRestante. */
71 83 @Column(precision = 20, scale = 4, nullable = false)
72 84 private BigDecimal quantidadeRestante;
73   -
  85 +
74 86 /** Atributo valorUnitario. */
75 87 @Column(precision = 20, scale = 4, nullable = false)
76 88 private BigDecimal valorUnitario;
... ... @@ -78,20 +90,20 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
78 90 /** Atributo valorSobra. */
79 91 @Column(precision = 20, scale = 4, nullable = false)
80 92 private BigDecimal valorSobra;
81   -
  93 +
82 94 /** Atributo valorTotal. */
83 95 @Column(precision = 20, scale = 4, nullable = false)
84 96 private BigDecimal valorTotal;
85   -
  97 +
86 98 @ManyToOne(fetch = FetchType.EAGER, optional = false)
87 99 private EntradaAlmoxarifadoItem entradaItem;
88   -
89   -
  100 +
90 101 protected MaterialEstoqueFIFOItem() {
91 102 super();
92 103 }
93 104  
94   - public MaterialEstoqueFIFOItem( MaterialEstoque materialEstoque, BigDecimal quantidadeInicial, BigDecimal valorTotal, EntradaAlmoxarifadoItem entradaItem ) {
  105 + public MaterialEstoqueFIFOItem(MaterialEstoque materialEstoque, BigDecimal quantidadeInicial, BigDecimal valorTotal,
  106 + EntradaAlmoxarifadoItem entradaItem) {
95 107 super();
96 108 this.material = materialEstoque.getMaterial();
97 109 this.materialEstoque = materialEstoque;
... ... @@ -99,7 +111,7 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
99 111 this.quantidadeRestante = quantidadeInicial;
100 112 this.valorTotal = valorTotal;
101 113 this.valorUnitario = valorTotal.divide(quantidadeInicial, SCALE_DIVISOR_DECIMAL, RoundingMode.CEILING);
102   - this.valorSobra = valorTotal.min(this.valorUnitario.multiply(quantidadeInicial));
  114 + this.valorSobra = valorTotal.subtract(this.valorUnitario.multiply(quantidadeInicial));
103 115 this.entradaItem = entradaItem;
104 116 }
105 117  
... ... @@ -123,70 +135,63 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
123 135 this.id = id;
124 136 }
125 137  
126   -
127 138 /**
128 139 * Retorna o valor do atributo <code>material</code>
129 140 *
130 141 * @return <code>MaterialConsumo</code>
131 142 */
132 143 public MaterialConsumo getMaterial() {
133   -
  144 +
134 145 return material;
135 146 }
136 147  
137   -
138 148 /**
139 149 * Define o valor do atributo <code>material</code>.
140 150 *
141   - * @param material
  151 + * @param material
142 152 */
143 153 public void setMaterial(MaterialConsumo material) {
144   -
  154 +
145 155 this.material = material;
146 156 }
147 157  
148   -
149   -
150 158 /**
151 159 * Retorna o valor do atributo <code>materialEstoque</code>
152 160 *
153 161 * @return <code>MaterialEstoque</code>
154 162 */
155 163 public MaterialEstoque getMaterialEstoque() {
156   -
  164 +
157 165 return materialEstoque;
158 166 }
159 167  
160   -
161 168 /**
162 169 * Define o valor do atributo <code>materialEstoque</code>.
163 170 *
164   - * @param materialEstoque
  171 + * @param materialEstoque
165 172 */
166 173 public void setMaterialEstoque(MaterialEstoque materialEstoque) {
167   -
  174 +
168 175 this.materialEstoque = materialEstoque;
169 176 }
170 177  
171   -
172 178 /**
173 179 * Retorna o valor do atributo <code>materialEstoqueInativo</code>
174 180 *
175 181 * @return <code>MaterialEstoque</code>
176 182 */
177 183 public MaterialEstoque getMaterialEstoqueInativo() {
178   -
  184 +
179 185 return materialEstoqueInativo;
180 186 }
181 187  
182   -
183 188 /**
184 189 * Define o valor do atributo <code>materialEstoqueInativo</code>.
185 190 *
186   - * @param materialEstoqueInativo
  191 + * @param materialEstoqueInativo
187 192 */
188 193 public void setMaterialEstoqueInativo(MaterialEstoque materialEstoqueInativo) {
189   -
  194 +
190 195 this.materialEstoqueInativo = materialEstoqueInativo;
191 196 }
192 197  
... ... @@ -196,128 +201,117 @@ public class MaterialEstoqueFIFOItem extends PersistentObjectAuditOrganizacao {
196 201 * @return <code>BigDecimal</code>
197 202 */
198 203 public BigDecimal getQuantidadeInicial() {
199   -
  204 +
200 205 return quantidadeInicial;
201 206 }
202 207  
203   -
204 208 /**
205 209 * Define o valor do atributo <code>quantidadeInicial</code>.
206 210 *
207   - * @param quantidadeInicial
  211 + * @param quantidadeInicial
208 212 */
209 213 public void setQuantidadeInicial(BigDecimal quantidadeInicial) {
210   -
  214 +
211 215 this.quantidadeInicial = quantidadeInicial;
212 216 }
213 217  
214   -
215 218 /**
216 219 * Retorna o valor do atributo <code>quantidadeRestante</code>
217 220 *
218 221 * @return <code>BigDecimal</code>
219 222 */
220 223 public BigDecimal getQuantidadeRestante() {
221   -
  224 +
222 225 return quantidadeRestante;
223 226 }
224 227  
225   -
226 228 /**
227 229 * Define o valor do atributo <code>quantidadeRestante</code>.
228 230 *
229   - * @param quantidadeRestante
  231 + * @param quantidadeRestante
230 232 */
231 233 public void setQuantidadeRestante(BigDecimal quantidadeRestante) {
232   -
  234 +
233 235 this.quantidadeRestante = quantidadeRestante;
234 236 }
235 237  
236   -
237 238 /**
238 239 * Retorna o valor do atributo <code>valorUnitario</code>
239 240 *
240 241 * @return <code>BigDecimal</code>
241 242 */
242 243 public BigDecimal getValorUnitario() {
243   -
  244 +
244 245 return valorUnitario;
245 246 }
246 247  
247   -
248 248 /**
249 249 * Define o valor do atributo <code>valorUnitario</code>.
250 250 *
251   - * @param valorUnitario
  251 + * @param valorUnitario
252 252 */
253 253 public void setValorUnitario(BigDecimal valorUnitario) {
254   -
  254 +
255 255 this.valorUnitario = valorUnitario;
256 256 }
257 257  
258   -
259 258 /**
260 259 * Retorna o valor do atributo <code>valorSobra</code>
261 260 *
262 261 * @return <code>BigDecimal</code>
263 262 */
264 263 public BigDecimal getValorSobra() {
265   -
  264 +
266 265 return valorSobra;
267 266 }
268 267  
269   -
270 268 /**
271 269 * Define o valor do atributo <code>valorSobra</code>.
272 270 *
273   - * @param valorSobra
  271 + * @param valorSobra
274 272 */
275 273 public void setValorSobra(BigDecimal valorSobra) {
276   -
  274 +
277 275 this.valorSobra = valorSobra;
278 276 }
279 277  
280   -
281 278 /**
282 279 * Retorna o valor do atributo <code>valorTotal</code>
283 280 *
284 281 * @return <code>BigDecimal</code>
285 282 */
286 283 public BigDecimal getValorTotal() {
287   -
  284 +
288 285 return valorTotal;
289 286 }
290 287  
291   -
292 288 /**
293 289 * Define o valor do atributo <code>valorTotal</code>.
294 290 *
295   - * @param valorTotal
  291 + * @param valorTotal
296 292 */
297 293 public void setValorTotal(BigDecimal valorTotal) {
298   -
  294 +
299 295 this.valorTotal = valorTotal;
300 296 }
301 297  
302   -
303 298 /**
304 299 * Retorna o valor do atributo <code>entradaItem</code>
305 300 *
306 301 * @return <code>EntradaAlmoxarifadoItem</code>
307 302 */
308 303 public EntradaAlmoxarifadoItem getEntradaItem() {
309   -
  304 +
310 305 return entradaItem;
311 306 }
312 307  
313   -
314 308 /**
315 309 * Define o valor do atributo <code>entradaItem</code>.
316 310 *
317   - * @param entradaItem
  311 + * @param entradaItem
318 312 */
319 313 public void setEntradaItem(EntradaAlmoxarifadoItem entradaItem) {
320   -
  314 +
321 315 this.entradaItem = entradaItem;
322 316 }
323 317  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/MaterialLocalEstoque.java
... ... @@ -68,7 +68,7 @@ public class MaterialLocalEstoque extends PersistentObjectAuditOrganizacao {
68 68  
69 69 /** Atributo materialEstoque. */
70 70 @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.PERSIST)
71   - @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class })
  71 + @JsonView({Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class })
72 72 private MaterialEstoque materialEstoque;
73 73  
74 74 /** Atributo materialEstoqueInativo. */
... ... @@ -77,7 +77,7 @@ public class MaterialLocalEstoque extends PersistentObjectAuditOrganizacao {
77 77  
78 78 /** Atributo endereco. */
79 79 @ManyToOne(fetch = FetchType.LAZY, optional = false)
80   - @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class })
  80 + @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class })
81 81 private EnderecoEstoque endereco;
82 82  
83 83 /** Atributo enderecoInativo. */
... ... @@ -88,7 +88,7 @@ public class MaterialLocalEstoque extends PersistentObjectAuditOrganizacao {
88 88 private BigDecimal capacidade;
89 89  
90 90 /** Atributo quantidade. */
91   - @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class })
  91 + @JsonView({ Views.MaterialLocalEstoqueView.class, ViewsAdmMateriais.TransferenciaEnderecoEstoqueView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class })
92 92 private BigDecimal quantidade = BigDecimal.ZERO;
93 93  
94 94 /** Atributo unidadeMedidaEntrada. */
... ... @@ -255,4 +255,28 @@ public class MaterialLocalEstoque extends PersistentObjectAuditOrganizacao {
255 255 this.capacidade = capacidade;
256 256 }
257 257  
  258 + @Override
  259 + public int hashCode() {
  260 + final int prime = 31;
  261 + int result = super.hashCode();
  262 + result = prime * result + ((id == null) ? 0 : id.hashCode());
  263 + return result;
  264 + }
  265 +
  266 + @Override
  267 + public boolean equals(Object obj) {
  268 + if (this == obj)
  269 + return true;
  270 + if (!super.equals(obj))
  271 + return false;
  272 + if (getClass() != obj.getClass())
  273 + return false;
  274 + MaterialLocalEstoque other = (MaterialLocalEstoque) obj;
  275 + if (id == null) {
  276 + if (other.id != null)
  277 + return false;
  278 + } else if (!id.equals(other.id))
  279 + return false;
  280 + return true;
  281 + }
258 282 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/RequisicaoConsumo.java
... ... @@ -10,18 +10,25 @@ import javax.persistence.FetchType;
10 10 import javax.persistence.GeneratedValue;
11 11 import javax.persistence.GenerationType;
12 12 import javax.persistence.Id;
  13 +import javax.persistence.JoinColumn;
13 14 import javax.persistence.ManyToOne;
14 15 import javax.persistence.OneToMany;
  16 +import javax.persistence.OneToOne;
15 17 import javax.persistence.Table;
16 18 import javax.persistence.Temporal;
17 19 import javax.persistence.TemporalType;
18 20  
  21 +import org.hibernate.envers.AuditTable;
  22 +import org.hibernate.envers.Audited;
  23 +import org.hibernate.envers.NotAudited;
  24 +
19 25 import br.com.centralit.api.framework.json.ViewsAdmMateriais;
20 26 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
21 27 import br.com.centralit.framework.json.JsonCalendarSimpleDateDeserializer;
22 28 import br.com.centralit.framework.json.JsonCalendarSimpleDateSerializer;
23 29 import br.com.centralit.framework.json.Views;
24 30 import br.com.centralit.framework.model.Dominio;
  31 +import br.com.centralit.framework.model.Usuario;
25 32 import br.com.centralit.framework.model.arquitetura.PersistentObjectAuditOrganizacao;
26 33  
27 34 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
... ... @@ -61,9 +68,11 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
61 68 * @author rogerio.costa
62 69 *
63 70 */
  71 +@Audited
  72 +@AuditTable(value = "alm_requisicaoconsumo_aud")
64 73 @Entity
65   -@Table(name="alm_requisicaoconsumo")
66   -@JsonIgnoreProperties({"$checked"})
  74 +@Table(name = "alm_requisicaoconsumo")
  75 +@JsonIgnoreProperties({ "$checked" })
67 76 public class RequisicaoConsumo extends PersistentObjectAuditOrganizacao {
68 77  
69 78 public static final Long TIPO_STATUS_REQUISICAO_NAO_CONCLUIDA_CODIGO = 1L;
... ... @@ -82,17 +91,23 @@ public class RequisicaoConsumo extends PersistentObjectAuditOrganizacao {
82 91 /** Atributo id. */
83 92 @Id
84 93 @GeneratedValue(strategy = GenerationType.AUTO)
85   - @JsonView({ Views.GenericView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class })
  94 + @JsonView({ Views.GenericView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class,
  95 + ViewsAlmoxarifado.DevolucaoEditView.class })
86 96 private Long id;
87 97  
88 98 /** Atributo almoxaifado. */
89 99 @ManyToOne(fetch = FetchType.LAZY, optional = false)
90   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoListView.class, ViewsAlmoxarifado.DevolucaoEditView.class, Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  100 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class,
  101 + ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoListView.class,
  102 + ViewsAlmoxarifado.DevolucaoEditView.class, Views.MaterialConsultaInfo.class,
  103 + ViewsAdmMateriais.RequisicaoConsumo.class })
91 104 private EstruturaOrganizacional almoxarifado;
92 105  
93 106 /** Atributo centroCusto. */
  107 + @NotAudited
94 108 @ManyToOne(fetch = FetchType.LAZY)
95   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  109 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, Views.MaterialConsultaInfo.class,
  110 + ViewsAdmMateriais.RequisicaoConsumo.class })
96 111 private CentroCusto centroCusto;
97 112  
98 113 /** Atributo dataRequisicao. */
... ... @@ -100,47 +115,68 @@ public class RequisicaoConsumo extends PersistentObjectAuditOrganizacao {
100 115 @Temporal(TemporalType.TIMESTAMP)
101 116 @JsonSerialize(using = JsonCalendarSimpleDateSerializer.class)
102 117 @JsonDeserialize(using = JsonCalendarSimpleDateDeserializer.class)
103   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class,
104   - ViewsAlmoxarifado.DevolucaoListView.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  118 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class,
  119 + ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class,
  120 + ViewsAlmoxarifado.DevolucaoListView.class, ViewsAdmMateriais.RequisicaoConsumo.class })
105 121 private Calendar dataRequisicao;
106 122  
107 123 @Column(name = "dataFinalizacaoAtendimento", nullable = true)
108 124 @Temporal(TemporalType.TIMESTAMP)
109 125 @JsonSerialize(using = JsonCalendarSimpleDateSerializer.class)
110 126 @JsonDeserialize(using = JsonCalendarSimpleDateDeserializer.class)
111   - @JsonView({ ViewsAlmoxarifado.DevolucaoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoListView.class,
112   - Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  127 + @JsonView({ ViewsAlmoxarifado.DevolucaoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class,
  128 + ViewsAlmoxarifado.DevolucaoListView.class, Views.MaterialConsultaInfo.class,
  129 + ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAdmMateriais.RequisicaoConsumo.class })
113 130 private Calendar dataFinalizacaoAtendimento;
114 131  
115 132 /** Atributo materiais. */
116   - @OneToMany(fetch = FetchType.LAZY, mappedBy = "requisicaoConsumo", cascade = CascadeType.ALL, orphanRemoval = true)
117   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class,
118   - Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  133 + @OneToMany(fetch = FetchType.LAZY, mappedBy = "requisicaoConsumo", cascade = CascadeType.ALL)
  134 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class,
  135 + ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class,
  136 + Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumo.class })
119 137 private Collection<RequisicaoConsumoItem> requisicaoConsumoItens;
120 138  
121 139 /** Atributo numeroRequisicao. */
122 140 @Column(length = 30)
123   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class,
124   - ViewsAlmoxarifado.DevolucaoListView.class, Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  141 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class,
  142 + ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoEditView.class,
  143 + ViewsAlmoxarifado.DevolucaoListView.class, Views.MaterialConsultaInfo.class,
  144 + ViewsAdmMateriais.RequisicaoConsumo.class })
125 145 private String numeroRequisicao;
126 146  
127 147 /** Atributo observacoes. */
  148 + @NotAudited
128 149 @OneToMany(fetch = FetchType.LAZY, mappedBy = "requisicaoConsumo", cascade = CascadeType.ALL, orphanRemoval = true)
129 150 @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAdmMateriais.RequisicaoConsumo.class })
130 151 private Collection<RequisicaoObservacao> observacoes;
131 152  
132 153 /** Atributo statusRequisicao. */
133 154 @ManyToOne(fetch = FetchType.LAZY, optional = false)
134   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAdmMateriais.AtendimentoRequisicaoConsumoItemView.class, Views.MaterialConsultaInfo.class,
135   - ViewsAdmMateriais.RequisicaoConsumo.class })
  155 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class,
  156 + ViewsAdmMateriais.AtendimentoRequisicaoConsumoItemView.class, Views.MaterialConsultaInfo.class,
  157 + ViewsAdmMateriais.RequisicaoConsumo.class })
136 158 private Dominio tipoStatusRequisicao;
137 159  
138 160 /** Atributo unidadeRequisitante. */
139 161 @ManyToOne(fetch = FetchType.LAZY, optional = false)
140   - @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class, ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoListView.class,
141   - ViewsAlmoxarifado.DevolucaoEditView.class, Views.MaterialConsultaInfo.class, ViewsAdmMateriais.RequisicaoConsumo.class })
  162 + @JsonView({ ViewsAdmMateriais.RequisicaoConsumoEditView.class,
  163 + ViewsAlmoxarifado.RequisicaoConsumoAutoCompleteView.class, ViewsAlmoxarifado.DevolucaoListView.class,
  164 + ViewsAlmoxarifado.DevolucaoEditView.class, Views.MaterialConsultaInfo.class,
  165 + ViewsAdmMateriais.RequisicaoConsumo.class })
142 166 private EstruturaOrganizacional unidadeRequisitante;
143 167  
  168 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  169 + private boolean emAtendimento;
  170 +
  171 + @ManyToOne(fetch = FetchType.LAZY)
  172 + @JoinColumn(name = "atendente_id")
  173 + @JsonView({ ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class })
  174 + private Usuario atendente;
  175 +
  176 + @OneToOne(mappedBy = "requisicaoConsumo", fetch = FetchType.LAZY)
  177 + @JsonView({ViewsAlmoxarifado.AtendimentoRequisicaoConsumoEditView.class, ViewsAdmMateriais.RequisicaoConsumoEditView.class})
  178 + private AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo;
  179 +
144 180 /**
145 181 * Retorna o valor do atributo <code>id</code>
146 182 *
... ... @@ -344,4 +380,28 @@ public class RequisicaoConsumo extends PersistentObjectAuditOrganizacao {
344 380 this.dataFinalizacaoAtendimento = dataFinalizacaoAtendimento;
345 381 }
346 382  
  383 + public boolean isEmAtendimento() {
  384 + return emAtendimento;
  385 + }
  386 +
  387 + public void setEmAtendimento(boolean emAtendimento) {
  388 + this.emAtendimento = emAtendimento;
  389 + }
  390 +
  391 + public Usuario getAtendente() {
  392 + return atendente;
  393 + }
  394 +
  395 + public void setAtendente(Usuario atendente) {
  396 + this.atendente = atendente;
  397 + }
  398 +
  399 + public AtendimentoRequisicaoConsumo getAtendimentoRequisicaoConsumo() {
  400 + return atendimentoRequisicaoConsumo;
  401 + }
  402 +
  403 + public void setAtendimentoRequisicaoConsumo(
  404 + AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo) {
  405 + this.atendimentoRequisicaoConsumo = atendimentoRequisicaoConsumo;
  406 + }
347 407 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/RequisicaoConsumoItem.java
... ... @@ -10,6 +10,9 @@ import javax.persistence.Id;
10 10 import javax.persistence.ManyToOne;
11 11 import javax.persistence.Table;
12 12  
  13 +import org.hibernate.envers.AuditTable;
  14 +import org.hibernate.envers.Audited;
  15 +
13 16 import br.com.centralit.api.framework.json.ViewsAdmMateriais;
14 17 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
15 18 import br.com.centralit.framework.json.Views;
... ... @@ -51,6 +54,8 @@ import com.fasterxml.jackson.annotation.JsonView;
51 54 * @author rogerio.costa
52 55 *
53 56 */
  57 +@Audited
  58 +@AuditTable(value = "alm_rc_item_aud")
54 59 @JsonIgnoreProperties({ "$quantidadeAtendida", "$quantidadeADevolver", "$TIPO_DECIMAL", "$index" })
55 60 @Entity
56 61 @Table(name="alm_rc_item")
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/AtendimentoRequisicaoConsumoFIFOService.java 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +package br.com.centralit.api.service;
  2 +
  3 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemFIFO;
  4 +import br.com.centralit.framework.service.arquitetura.GenericService;
  5 +
  6 +public interface AtendimentoRequisicaoConsumoFIFOService extends GenericService<AtendimentoRequisicaoConsumoItemFIFO, Long> {
  7 +}
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/AtendimentoRequisicaoConsumoService.java
... ... @@ -4,6 +4,7 @@ import java.util.List;
4 4  
5 5 import br.com.centralit.api.model.AtendimentoRequisicaoConsumo;
6 6 import br.com.centralit.api.viewHelper.InformacoesAtendimentoVH;
  7 +import br.com.centralit.api.viewHelper.ValidacaoAtendimentoRequisicaoConsumoVH;
7 8 import br.com.centralit.framework.service.arquitetura.GenericService;
8 9  
9 10 /**
... ... @@ -65,4 +66,10 @@ public interface AtendimentoRequisicaoConsumoService extends GenericService&lt;Aten
65 66  
66 67 boolean removerAtendimentoRequisicao(String idsRequisicaoConsumo, Long idOrganizacao);
67 68  
  69 + Boolean finalizarRequisicoes(List<Long> idsRequisicao, Long idOrganizacao);
  70 +
  71 + Boolean excluirAtendimentos(List<Long> idsRequisicao, Long idOrganizacao);
  72 +
  73 + ValidacaoAtendimentoRequisicaoConsumoVH validarQuantidadesAtendidas(AtendimentoRequisicaoConsumo entity);
  74 +
68 75 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/EntradaAlmoxarifadoItemService.java
... ... @@ -139,4 +139,6 @@ public interface EntradaAlmoxarifadoItemService extends GenericService&lt;EntradaAl
139 139 public List<EntradaAlmoxarifadoItem> findItensPorEntradaId(Long idEntrada);
140 140  
141 141 Boolean existeItemVinculadoAMaterialLocalEstoque(Long idMaterialLocalEstoque);
  142 +
  143 + public BigDecimal getValorFIFOPorMaterial(MaterialConsumo materialConsumo, BigDecimal quantidadeMovimentada);
142 144 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/MaterialEstoqueFIFOItemService.java
1 1 package br.com.centralit.api.service;
2 2  
  3 +import java.util.List;
  4 +
3 5 import br.com.centralit.api.model.MaterialEstoqueFIFOItem;
4 6 import br.com.centralit.framework.service.arquitetura.GenericService;
5 7  
6 8 public interface MaterialEstoqueFIFOItemService extends GenericService<MaterialEstoqueFIFOItem, Long> {
  9 +
  10 + List<MaterialEstoqueFIFOItem> findFIFOsByMaterial(long idMaterial);
7 11  
8 12 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/RequisicaoConsumoItemService.java
... ... @@ -45,4 +45,6 @@ public interface RequisicaoConsumoItemService extends GenericService&lt;RequisicaoC
45 45  
46 46 List<RequisicaoConsumoItem> listarRequisicaoCosumoItemByIdRequisicao(Long requisicaoId);
47 47  
  48 + List<RequisicaoConsumoItem> findItensRequisicaoPorMaterial(Long idRequisicao, Long idMaterial);
  49 +
48 50 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/RequisicaoConsumoService.java
... ... @@ -4,9 +4,12 @@ import java.util.Calendar;
4 4 import java.util.Collection;
5 5 import java.util.List;
6 6  
  7 +import com.googlecode.genericdao.search.SearchResult;
  8 +
7 9 import br.com.centralit.api.model.EstruturaOrganizacional;
8 10 import br.com.centralit.api.model.MaterialConsumo;
9 11 import br.com.centralit.api.model.RequisicaoConsumo;
  12 +import br.com.centralit.api.viewHelper.AtendimentoVH;
10 13 import br.com.centralit.api.viewHelper.RequisicaoVH;
11 14 import br.com.centralit.framework.model.Dominio;
12 15 import br.com.centralit.framework.service.arquitetura.GenericService;
... ... @@ -127,4 +130,12 @@ public interface RequisicaoConsumoService extends GenericService&lt;RequisicaoConsu
127 130 List<Object> getResumoContabilForReport(Long requisicaoId,boolean isFIFO);
128 131 List<Object> getMateriaisForReport(Long requisicaoId,boolean isFIFO);
129 132 String findtipoStatusRequisicaoPorMaterial(Long requisicaoId);
  133 + SearchResult filtrarRequisicoesAtendimento(AtendimentoVH atendimentoVH);
  134 +
  135 + List<RequisicaoConsumo> findRequisicoesParaAtendimento(AtendimentoVH atendimentoVH);
  136 +
  137 + Boolean atualizarSituacaoAtendimento(Long idRequisicao, boolean situacaoAtendimento);
  138 +
  139 + Boolean atualizarSituacaoAtendimentoRequisicoes(RequisicaoVH requisicaoVH);
  140 +
130 141 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/AtendimentoRequisicaoConsumoFIFOServiceImpl.java 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +package br.com.centralit.api.service.impl;
  2 +
  3 +import org.springframework.beans.factory.annotation.Autowired;
  4 +import org.springframework.stereotype.Service;
  5 +
  6 +import br.com.centralit.api.dao.AtendimentoRequisicaoConsumoFIFODao;
  7 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemFIFO;
  8 +import br.com.centralit.api.service.AtendimentoRequisicaoConsumoFIFOService;
  9 +import br.com.centralit.framework.service.arquitetura.GenericServiceImpl;
  10 +
  11 +@Service("atendimentoRequisicaoConsumoFIFOService")
  12 +public class AtendimentoRequisicaoConsumoFIFOServiceImpl extends GenericServiceImpl<AtendimentoRequisicaoConsumoItemFIFO, Long> implements AtendimentoRequisicaoConsumoFIFOService {
  13 +
  14 + private AtendimentoRequisicaoConsumoFIFODao atendimentoRequisicaoConsumoFIFODao;
  15 +
  16 + @Autowired
  17 + public AtendimentoRequisicaoConsumoFIFOServiceImpl(AtendimentoRequisicaoConsumoFIFODao atendimentoRequisicaoConsumoFIFODao) {
  18 + this.dao = atendimentoRequisicaoConsumoFIFODao;
  19 + this.atendimentoRequisicaoConsumoFIFODao = atendimentoRequisicaoConsumoFIFODao;
  20 + }
  21 +
  22 +}
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/AtendimentoRequisicaoConsumoItemServiceImpl.java
... ... @@ -149,7 +149,6 @@ public class AtendimentoRequisicaoConsumoItemServiceImpl extends GenericServiceI
149 149 public void superRemove(AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem) {
150 150  
151 151 AtendimentoRequisicaoConsumoItem entity = this.find(atendimentoRequisicaoConsumoItem.getId());
152   -
153 152 super.remove(entity);
154 153 }
155 154  
... ... @@ -164,8 +163,6 @@ public class AtendimentoRequisicaoConsumoItemServiceImpl extends GenericServiceI
164 163 idsDominiosTipoStatusRequisicao.add(statusFinalizado.getId());
165 164 Dominio statusParcialmenteAtendida = this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA_PARCIALMENTE);
166 165 idsDominiosTipoStatusRequisicao.add(statusParcialmenteAtendida.getId());
167   - Dominio statusAtendida = this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA);
168   - idsDominiosTipoStatusRequisicao.add(statusAtendida.getId());
169 166  
170 167 RequisicaoConsumoItem requisicaoConsumoItem = this.requisicaoConsumoItemService.find(atendimentoRequisicaoConsumoItem.getRequisicaoConsumoItem().getId());
171 168  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/AtendimentoRequisicaoConsumoServiceImpl.java
... ... @@ -2,10 +2,13 @@ package br.com.centralit.api.service.impl;
2 2  
3 3 import java.math.BigDecimal;
4 4 import java.util.ArrayList;
  5 +import java.util.Collection;
5 6 import java.util.HashMap;
6 7 import java.util.List;
7 8 import java.util.Map;
  9 +import java.util.Map.Entry;
8 10  
  11 +import org.apache.commons.lang3.StringUtils;
9 12 import org.springframework.beans.factory.annotation.Autowired;
10 13 import org.springframework.beans.factory.annotation.Qualifier;
11 14 import org.springframework.stereotype.Service;
... ... @@ -14,19 +17,32 @@ import org.springframework.validation.Validator;
14 17 import br.com.centralit.api.dao.AtendimentoRequisicaoConsumoDao;
15 18 import br.com.centralit.api.model.AtendimentoRequisicaoConsumo;
16 19 import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItem;
  20 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemEndereco;
  21 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemFIFO;
17 22 import br.com.centralit.api.model.DominioAlmoxarifado;
  23 +import br.com.centralit.api.model.DominioMaterial;
  24 +import br.com.centralit.api.model.MaterialEstoqueFIFOItem;
  25 +import br.com.centralit.api.model.MaterialLocalEstoque;
  26 +import br.com.centralit.api.model.MovimentoEstoque;
  27 +import br.com.centralit.api.model.RequisicaoConsumoItem;
  28 +import br.com.centralit.api.service.AtendimentoRequisicaoConsumoFIFOService;
18 29 import br.com.centralit.api.service.AtendimentoRequisicaoConsumoItemService;
19 30 import br.com.centralit.api.service.AtendimentoRequisicaoConsumoService;
  31 +import br.com.centralit.api.service.ConfiguracaoParametroSistemaService;
20 32 import br.com.centralit.api.service.ContaContabilMovimentoService;
21 33 import br.com.centralit.api.service.DominioService;
  34 +import br.com.centralit.api.service.InternacionalizacaoService;
22 35 import br.com.centralit.api.service.MaterialConsumoService;
  36 +import br.com.centralit.api.service.MaterialEstoqueFIFOItemService;
  37 +import br.com.centralit.api.service.MaterialLocalEstoqueService;
23 38 import br.com.centralit.api.service.MovimentoEstoqueService;
24   -import br.com.centralit.api.service.ConfiguracaoParametroSistemaService;
25 39 import br.com.centralit.api.service.RequisicaoConsumoItemService;
26 40 import br.com.centralit.api.service.RequisicaoConsumoService;
27 41 import br.com.centralit.api.viewHelper.InformacoesAtendimentoVH;
  42 +import br.com.centralit.api.viewHelper.ValidacaoAtendimentoRequisicaoConsumoVH;
28 43 import br.com.centralit.framework.exception.BusinessException;
29 44 import br.com.centralit.framework.exception.CodigoErro;
  45 +import br.com.centralit.framework.model.Dominio;
30 46 import br.com.centralit.framework.service.arquitetura.GenericServiceImpl;
31 47 import br.com.centralit.framework.util.UtilColecao;
32 48 import br.com.centralit.framework.util.UtilDate;
... ... @@ -98,7 +114,28 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
98 114  
99 115 @Autowired
100 116 private ContaContabilMovimentoService contaContabilMovimentoService;
  117 +
  118 + @Autowired
  119 + private InternacionalizacaoService internacionalizacaoService;
  120 +
  121 + @Autowired
  122 + private MaterialLocalEstoqueService materialLocalEstoqueService;
  123 +
  124 + @Autowired
  125 + private MaterialEstoqueFIFOItemService materialEstoqueFIFOItemService;
  126 +
  127 + @Autowired
  128 + private AtendimentoRequisicaoConsumoFIFOService atendimentoRequisicaoConsumoFIFOService;
101 129  
  130 + private Dominio idioma;
  131 +
  132 + private Dominio getIdioma() {
  133 + if(!UtilObjeto.isReferencia(idioma)){
  134 + idioma = this.dominioService.findByChaveAndCodigo("tipoIdioma", Dominio.TIPO_IDIOMA_PT_BR_CODIGO);
  135 + }
  136 + return idioma;
  137 + }
  138 +
102 139 /**
103 140 * Responsável pela criação de novas instâncias desta classe.
104 141 *
... ... @@ -119,35 +156,99 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
119 156 @Override
120 157 public AtendimentoRequisicaoConsumo save(AtendimentoRequisicaoConsumo entity) {
121 158  
122   -// this.validarEntidade(entity, this.validator);
123   -
  159 + this.validarEntidade(entity, this.validator);
  160 +
  161 + ValidacaoAtendimentoRequisicaoConsumoVH validacao = this.validarQuantidadesAtendidas(entity);
  162 + if(StringUtils.isNotBlank(validacao.getMensagemErro())){
  163 + throw new BusinessException(validacao.getMensagemErro(), CodigoErro.REGRA_NEGOCIO.getValue());
  164 + }
  165 +
124 166 if (!UtilColecao.isVazio(entity.getAtendimentos())) {
125 167  
126 168 for (AtendimentoRequisicaoConsumo atendimento : entity.getAtendimentos()) {
127   -
  169 +
128 170 if(atendimento.getId() == null && atendimento.getDataAtendimento() == null){
129 171 atendimento.setDataAtendimento(entity.getDataAtendimento());
  172 +
  173 + atendimento.setRequisicaoConsumo(this.requisicaoConsumoService.find(atendimento.getRequisicaoConsumo().getId()));
  174 +
  175 + this.validarDataAtendimento(atendimento);
  176 +
  177 + this.montarEntidade(atendimento);
  178 +
  179 + this.atualizarStatusRquisicao(atendimento);
  180 +
  181 + if(atendimento.getId() == null){
  182 + configurarNumeroAtendimento(atendimento);
  183 + }
  184 +
  185 + super.save(atendimento);
  186 +
  187 + this.movimentoEstoqueService.gerarMovimentoAtendimento(atendimento);
  188 +
  189 + this.requisicaoConsumoService.atualizarSituacaoAtendimento(atendimento.getRequisicaoConsumo().getId(), false);
  190 +
  191 + }else{
  192 + boolean registroExcluido = false;
  193 + if(atendimento.getDataInativo() != null){
  194 + atendimento.setDataInativo(null);
  195 + registroExcluido = true;
  196 + }
  197 + atendimento.setDataAtendimento(entity.getDataAtendimento());
  198 + this.merge(atendimento, registroExcluido);
130 199 }
  200 + }
131 201  
132   - this.montarEntidade(atendimento);
133   -
134   - this.validarDataAtendimento(atendimento);
  202 + }
135 203  
136   - this.atualizarStatusRquisicao(atendimento);
  204 + return new AtendimentoRequisicaoConsumo();
  205 + }
137 206  
138   - if(atendimento.getId() == null){
139   - configurarNumeroAtendimento(atendimento);
  207 + @Override
  208 + public ValidacaoAtendimentoRequisicaoConsumoVH validarQuantidadesAtendidas(AtendimentoRequisicaoConsumo entity) {
  209 + final int QUANTIDADE_ATENDIDA = 0;
  210 + final int QUANTIDADE_ATENDIDA_ANTERIOR = 1;
  211 +
  212 + Map<MaterialLocalEstoque, BigDecimal[]> somatorioQuantidadesAtentidasPorMaterial = new HashMap<MaterialLocalEstoque, BigDecimal[]>();
  213 +
  214 + for(AtendimentoRequisicaoConsumo atendimento : entity.getAtendimentos()){
  215 + for(AtendimentoRequisicaoConsumoItem atendimentoItem : atendimento.getAtendimentoRequisicaoConsumoItems()){
  216 + for(AtendimentoRequisicaoConsumoItemEndereco itemEndereco : atendimentoItem.getAtendimentoRequisicaoConsumoItemEnderecos()){
  217 + if(itemEndereco.getQuantidade() != null){
  218 + if(somatorioQuantidadesAtentidasPorMaterial.containsKey(itemEndereco.getMaterialLocalEstoque())){
  219 +
  220 + somatorioQuantidadesAtentidasPorMaterial.put(itemEndereco.getMaterialLocalEstoque(),
  221 + new BigDecimal[]{somatorioQuantidadesAtentidasPorMaterial.get(itemEndereco.getMaterialLocalEstoque())[QUANTIDADE_ATENDIDA].add(itemEndereco.getQuantidade()), itemEndereco.getQuantidadeAnterior()});
  222 +
  223 + }else{
  224 + somatorioQuantidadesAtentidasPorMaterial.put(itemEndereco.getMaterialLocalEstoque(), new BigDecimal[]{itemEndereco.getQuantidade(), itemEndereco.getQuantidadeAnterior()});
  225 + }
  226 + }
140 227 }
141   -
142   - super.save(atendimento);
143   -
144   - this.movimentoEstoqueService.gerarMovimentoAtendimento(atendimento);
145   -
146 228 }
147   -
148 229 }
149   -
150   - return new AtendimentoRequisicaoConsumo();
  230 +
  231 + List<MaterialLocalEstoque> materiaisRejeitados = new ArrayList<MaterialLocalEstoque>();
  232 +
  233 + for(Entry<MaterialLocalEstoque, BigDecimal[]> somaItem : somatorioQuantidadesAtentidasPorMaterial.entrySet()){
  234 +
  235 + if(somaItem.getValue()[QUANTIDADE_ATENDIDA].compareTo(somaItem.getKey().getQuantidade().add(somaItem.getValue()[QUANTIDADE_ATENDIDA_ANTERIOR])) > 0){
  236 + materiaisRejeitados.add(materialLocalEstoqueService.find(somaItem.getKey().getId()));
  237 + }
  238 + }
  239 +
  240 + String mensagem = "";
  241 + if(!materiaisRejeitados.isEmpty()){
  242 + mensagem = internacionalizacaoService.getTranslate("ALMOXARIFADO.VALIDACAO.SOMA_ITENS_ATENDER_MAIOR_ESTOQUE", getIdioma());
  243 + mensagem += "<br/><br/><ul>";
  244 + for(MaterialLocalEstoque materialLocalEstoque: materiaisRejeitados){
  245 + mensagem += "<li>Material: <b>" + materialLocalEstoque.getMaterialEstoque().getMaterial().getDescricao() + "</b></li>";
  246 + mensagem += "<li>Endereço de estoque: <b>" + materialLocalEstoque.getEndereco().getDescricao() + "</b></li><br/>";
  247 + }
  248 + mensagem += "</ul>";
  249 + }
  250 +
  251 + return new ValidacaoAtendimentoRequisicaoConsumoVH(materiaisRejeitados, mensagem);
151 252 }
152 253  
153 254 /**
... ... @@ -157,42 +258,66 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
157 258 * @author wilker.machado
158 259 *
159 260 * @param entity
  261 + * @param registroExcluido
160 262 * @return
161 263 */
162   - @Override
163   - public AtendimentoRequisicaoConsumo merge(AtendimentoRequisicaoConsumo entity) {
  264 + public AtendimentoRequisicaoConsumo merge(AtendimentoRequisicaoConsumo entity, boolean registroExcluido) {
164 265  
165   - if (this.movimentoEstoqueService.existeMovimentacaoDepois(entity, "atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumo.id")) {
  266 + if (this.movimentoEstoqueService.existeMovimentacaoDepois(entity, "idClasseReferencia")) {
166 267  
167 268 throw new BusinessException(VALIDACAO_ERRO_EDICAO_EXISTE_MOVIMENTACAO, CodigoErro.REGRA_NEGOCIO.getValue());
168 269 }
  270 +
  271 + if(!registroExcluido){
  272 + removerLancamentosPassados(entity);
  273 + }
169 274  
170   - if (!UtilColecao.isVazio(entity.getAtendimentos())) {
  275 + entity.setRequisicaoConsumo(this.requisicaoConsumoService.find(entity.getRequisicaoConsumo().getId()));
  276 + this.validarDataAtendimento(entity);
  277 +
  278 + this.montarEntidade(entity);
171 279  
172   - for (AtendimentoRequisicaoConsumo atendimento : entity.getAtendimentos()) {
  280 + this.atualizarStatusRquisicao(entity);
173 281  
174   - this.montarEntidade(atendimento);
  282 + super.merge(entity);
175 283  
176   - this.validarDataAtendimento(atendimento);
  284 + this.movimentoEstoqueService.gerarMovimentoAtendimento(entity);
177 285  
178   - this.atualizarStatusRquisicao(atendimento);
  286 + this.requisicaoConsumoService.atualizarSituacaoAtendimento(entity.getRequisicaoConsumo().getId(), false);
179 287  
180   - AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo = super.merge(atendimento);
181 288  
182   - //Apaga movimentos de estoque
183   - this.movimentoEstoqueService.removerMovimentosAtendimento(atendimentoRequisicaoConsumo);
  289 + return entity;
184 290  
185   - //Apaga movimentos contabeis
186   - for (AtendimentoRequisicaoConsumoItem atendimentoItem : atendimento.getAtendimentoRequisicaoConsumoItems()){
187   - this.contaContabilMovimentoService.removerMovimentosAtendimento(atendimentoItem.getId());
188   - }
189   - this.movimentoEstoqueService.gerarMovimentoAtendimento(atendimentoRequisicaoConsumo);
190   - }
  291 + }
191 292  
  293 + private void removerLancamentosPassados(AtendimentoRequisicaoConsumo atendimento) {
  294 +
  295 + Collection<AtendimentoRequisicaoConsumoItem> listaItensTemp = this.find(atendimento.getId()).getAtendimentoRequisicaoConsumoItems();
  296 + for (AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem : listaItensTemp) {
  297 + AtendimentoRequisicaoConsumoItem item = this.atendimentoRequisicaoConsumoItemService.find(atendimentoRequisicaoConsumoItem.getId());
  298 +
  299 + for (AtendimentoRequisicaoConsumoItemFIFO atendimentoRequisicaoConsumoItemFIFO : item.getAtendimentoRequisicaoConsumoItemFIFOs()) {
  300 + MaterialEstoqueFIFOItem materialEstoqueFIFOItem = this.materialEstoqueFIFOItemService.find(atendimentoRequisicaoConsumoItemFIFO.getMaterialEstoqueFIFOItem().getId());
  301 + materialEstoqueFIFOItem.setQuantidadeRestante(materialEstoqueFIFOItem.getQuantidadeRestante().add(atendimentoRequisicaoConsumoItemFIFO.getQuantidadeUtilizada()));
  302 + materialEstoqueFIFOItem.setValorSobra(materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()));
  303 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  304 + }
  305 +
  306 + for (AtendimentoRequisicaoConsumoItemEndereco atendimentoRequisicaoConsumoItemEndereco : atendimentoRequisicaoConsumoItem.getAtendimentoRequisicaoConsumoItemEnderecos()) {
  307 + MaterialLocalEstoque materialLocalEstoque = this.materialLocalEstoqueService.find(atendimentoRequisicaoConsumoItemEndereco.getMaterialLocalEstoque().getId());
  308 + materialLocalEstoque.setQuantidade(materialLocalEstoque.getQuantidade().add(atendimentoRequisicaoConsumoItemEndereco.getQuantidade()));
  309 + this.materialLocalEstoqueService.merge(materialLocalEstoque);
  310 +
  311 + }
  312 +
  313 + Collection<MovimentoEstoque> movimentosEstoque = this.movimentoEstoqueService.findAllByClasseReferencia(this.dominioService.findByChaveAndCodigo(DominioMaterial.CLASSE_REFERENCIA, DominioMaterial.REFERENCIA_ATENDIMENTO_ALMOXARIFADO_ITEM), atendimentoRequisicaoConsumoItem.getId());
  314 + for (MovimentoEstoque movimentoEstoque : movimentosEstoque) {
  315 + this.movimentoEstoqueService.remove(movimentoEstoque);
  316 + }
  317 +
  318 + atendimentoRequisicaoConsumoFIFOService.removeList(new ArrayList(item.getAtendimentoRequisicaoConsumoItemFIFOs()));
  319 +
192 320 }
193   -
194   - return new AtendimentoRequisicaoConsumo();
195   -
196 321 }
197 322  
198 323 /**
... ... @@ -218,34 +343,8 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
218 343 * @param entity
219 344 */
220 345 private void atualizarStatusRquisicao(AtendimentoRequisicaoConsumo entity) {
221   -
222   - Boolean atendidoCompletamente = Boolean.TRUE;
223   -
224   - for (AtendimentoRequisicaoConsumoItem atendimentoItem : entity.getAtendimentoRequisicaoConsumoItems()) {
225   -
226   - if(atendimentoItem.getQuantidade() == null){
227   - continue;
228   - }
229   -
230   - if (atendimentoItem.getQuantidade().add(atendimentoItem.getRequisicaoConsumoItem().getQuantidadeAtendida()).doubleValue() != atendimentoItem.getRequisicaoConsumoItem().getQuantidade().doubleValue()) {
231   -
232   - atendidoCompletamente = Boolean.FALSE;
233   - }
234   -
235   - atendimentoItem.getRequisicaoConsumoItem().setQuantidadeAtendida(atendimentoItem.getRequisicaoConsumoItem().getQuantidadeAtendida().add(atendimentoItem.getQuantidade()));
236   -
237   - }
238   -
239   - if (atendidoCompletamente) {
240   -
241   - entity.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA));
242   -
243   - } else {
244   -
245   - entity.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA_PARCIALMENTE));
246   -
247   - }
248   -
  346 +
  347 + entity.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA_PARCIALMENTE));
249 348 }
250 349  
251 350 /**
... ... @@ -257,58 +356,62 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
257 356 */
258 357 private void montarEntidade(AtendimentoRequisicaoConsumo entity) {
259 358  
260   - entity.setRequisicaoConsumo(this.requisicaoConsumoService.find(entity.getRequisicaoConsumo().getId()));
261   -
262   - List<AtendimentoRequisicaoConsumoItem> listaSemAtendimentosComQuantidadeZero = new ArrayList<AtendimentoRequisicaoConsumoItem>();
263   -
264   - for (AtendimentoRequisicaoConsumoItem atendimentoItem : entity.getAtendimentoRequisicaoConsumoItems()) {
265   - if(atendimentoItem.getQuantidade() == null){
266   - continue;
267   - }else{
268   - listaSemAtendimentosComQuantidadeZero.add(atendimentoItem);
  359 + if(entity.getRequisicaoConsumo().getRequisicaoConsumoItens().size() != entity.getAtendimentoRequisicaoConsumoItems().size()){
  360 + for (RequisicaoConsumoItem reqItem : entity.getRequisicaoConsumo().getRequisicaoConsumoItens()) {
  361 + if(reqItem.getDataInativo() != null){
  362 + continue;
  363 + }
  364 + boolean addItem = false;
  365 + for (AtendimentoRequisicaoConsumoItem atendReqItem : entity.getAtendimentoRequisicaoConsumoItems()) {
  366 + if(atendReqItem.getMaterial().getId().doubleValue() != reqItem.getMaterialConsumo().getId().doubleValue()){
  367 + addItem = true;
  368 + }else{
  369 + addItem = false;
  370 + break;
  371 + }
  372 + }
  373 + if(addItem){
  374 + AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem = new AtendimentoRequisicaoConsumoItem();
  375 + atendimentoRequisicaoConsumoItem.setMaterial(reqItem.getMaterialConsumo());
  376 + atendimentoRequisicaoConsumoItem.setRequisicaoConsumoItem(reqItem);
  377 +
  378 + AtendimentoRequisicaoConsumoItemEndereco itemEndereco = new AtendimentoRequisicaoConsumoItemEndereco();
  379 + itemEndereco.setMaterialLocalEstoque(this.materialLocalEstoqueService.buscarLocaisEstoquePorIdMaterial(reqItem.getMaterialConsumo().getId()).get(0));
  380 + List<AtendimentoRequisicaoConsumoItemEndereco> endItem = new ArrayList<>();
  381 + endItem.add(itemEndereco);
  382 + atendimentoRequisicaoConsumoItem.setAtendimentoRequisicaoConsumoItemEnderecos(endItem);
  383 + entity.getAtendimentoRequisicaoConsumoItems().add(atendimentoRequisicaoConsumoItem);
  384 + }
269 385 }
270 386 }
271   -
272   - entity.setAtendimentoRequisicaoConsumoItems(new ArrayList<AtendimentoRequisicaoConsumoItem>());
273   -
274   - for (AtendimentoRequisicaoConsumoItem atendimentoItem : listaSemAtendimentosComQuantidadeZero) {
  387 +
  388 + boolean todosItensSemQuantidade = true;
  389 + for (AtendimentoRequisicaoConsumoItem atendimentoItem : entity.getAtendimentoRequisicaoConsumoItems()) {
  390 +
  391 + atendimentoItem.setDataInativo(null);
  392 + RequisicaoConsumoItem requisicaoConsumoItem = this.requisicaoConsumoItemService.find(atendimentoItem.getRequisicaoConsumoItem().getId());
  393 + requisicaoConsumoItem.setQuantidadeAtendida(atendimentoItem.getQuantidade());
  394 +
275 395 atendimentoItem.setAtendimentoRequisicaoConsumo(entity);
276 396 atendimentoItem.setOrganizacao(getUsuario().getOrganizacao());
277   - atendimentoItem.setRequisicaoConsumoItem(this.requisicaoConsumoItemService.find(atendimentoItem.getRequisicaoConsumoItem().getId()));
278   -
279   - atendimentoItem.setMaterial(this.materialConsumoService.find(atendimentoItem.getMaterial().getId()));
280   - BigDecimal qtdMaterialEmEstoque = this.materialConsumoService.getQuantidadeAtualMaterial(atendimentoItem.getMaterial().getId(), getUsuario().getOrganizacao().getId());
281   -
282   - if (!atendimentoItem.isNew()) {
283   -
284   - AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItemOld = this.atendimentoRequisicaoConsumoItemService.find(atendimentoItem.getId());
285   -
286   - atendimentoItem.getRequisicaoConsumoItem().setQuantidadeAtendida(atendimentoItem.getRequisicaoConsumoItem().getQuantidadeAtendida().subtract(atendimentoRequisicaoConsumoItemOld.getQuantidade()));
287   -
288   - qtdMaterialEmEstoque = qtdMaterialEmEstoque.add(atendimentoRequisicaoConsumoItemOld.getQuantidade());
289   -
290   - }
291   - if (!UtilObjeto.isReferencia(qtdMaterialEmEstoque) || qtdMaterialEmEstoque.compareTo(atendimentoItem.getQuantidade()) < 0) {
292   -
293   - throw new BusinessException(VALIDACAO_QUANTIDADE_A_ATENDER_SUPERIOR_A_QTD_ESTOQUE, CodigoErro.REGRA_NEGOCIO.getValue(), atendimentoItem.getMaterial().getDescricao());
294   -
295   - }
296   -
297   - if (atendimentoItem.getRequisicaoConsumoItem().getQuantidade().compareTo(atendimentoItem.getQuantidade().add(atendimentoItem.getRequisicaoConsumoItem().getQuantidadeAtendida())) < 0) {
298   -
299   - throw new BusinessException(VALIDACAO_QUANTIDADE_ATENDIDA_E_QUANTIDADE_SUPERIOR, CodigoErro.REGRA_NEGOCIO.getValue());
300   -
  397 + atendimentoItem.setRequisicaoConsumoItem(requisicaoConsumoItem);
  398 +
  399 + for (AtendimentoRequisicaoConsumoItemEndereco atendimentoRequisicaoConsumoItemEndereco : atendimentoItem.getAtendimentoRequisicaoConsumoItemEnderecos()) {
  400 +
  401 + atendimentoRequisicaoConsumoItemEndereco.setAtendimentoRequisicaoConsumoItem(atendimentoItem);
  402 + if(atendimentoRequisicaoConsumoItemEndereco.getQuantidade() == null || atendimentoRequisicaoConsumoItemEndereco.getQuantidade().compareTo(new BigDecimal("0")) == 0){
  403 + atendimentoRequisicaoConsumoItemEndereco.setQuantidade(new BigDecimal(0));
  404 + }else{
  405 + todosItensSemQuantidade = false;
  406 + }
  407 +
301 408 }
302   -
303   -// if (!UtilObjeto.isReferencia(atendimentoItem.getQuantidade()) || atendimentoItem.getQuantidade().doubleValue() <= 0) {
304   -//
305   -// throw new BusinessException(VALIDACAO_QUANTIDADE_ZERADA_NEGATIVA, CodigoErro.REGRA_NEGOCIO.getValue(), atendimentoItem.getMaterial().getDescricao());
306   -// }
307   -
308   - entity.getAtendimentoRequisicaoConsumoItems().add(atendimentoItem);
309   -
  409 +
  410 + this.requisicaoConsumoItemService.merge(requisicaoConsumoItem);
  411 + }
  412 + if(todosItensSemQuantidade){
  413 + throw new BusinessException("ALMOXARIFADO.VALIDACAO.TODAS_QUANTIDADE_ATENDIDA_EM_BRANCO", CodigoErro.REGRA_NEGOCIO.getValue());
310 414 }
311   -
312 415 }
313 416  
314 417 /**
... ... @@ -316,42 +419,24 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
316 419 */
317 420 @Override
318 421 public boolean remove(AtendimentoRequisicaoConsumo entity) {
  422 +
  423 + entity.setRequisicaoConsumo(this.requisicaoConsumoService.find(entity.getRequisicaoConsumo().getId()));
319 424  
320 425 this.validarDataAtendimento(entity);
321   -
322   - if (this.movimentoEstoqueService.existeMovimentacaoDepois(entity, "atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumo.id")) {
323   -
324   - throw new BusinessException(VALIDACAO_ERRO_EXCLUSAO_EXISTE_MOVIMENTACAO, CodigoErro.REGRA_NEGOCIO.getValue());
325   - }
326   -
327   - Boolean prontaParaAtendimento = Boolean.TRUE;
  426 +
  427 + removerLancamentosPassados(entity);
328 428  
329 429 for (AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem : entity.getAtendimentoRequisicaoConsumoItems()) {
330 430  
331   - this.atendimentoRequisicaoConsumoItemService.superRemove(atendimentoRequisicaoConsumoItem);
332   -
333 431 atendimentoRequisicaoConsumoItem.getRequisicaoConsumoItem().setQuantidadeAtendida(atendimentoRequisicaoConsumoItem.getRequisicaoConsumoItem().getQuantidadeAtendida().subtract(atendimentoRequisicaoConsumoItem.getQuantidade()));
  432 + this.atendimentoRequisicaoConsumoItemService.superRemove(atendimentoRequisicaoConsumoItem);
334 433  
335   - if (atendimentoRequisicaoConsumoItem.getRequisicaoConsumoItem().getQuantidadeAtendida().compareTo(BigDecimal.valueOf(0)) == 0) {
336   -
337   - prontaParaAtendimento = Boolean.FALSE;
338   - }
339 434  
340   - //Remove movimentos contacontabil
341   - this.contaContabilMovimentoService.removerMovimentosAtendimento(atendimentoRequisicaoConsumoItem.getId());
342 435 }
343 436  
344   - if (prontaParaAtendimento) {
  437 + entity.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_PRONTA_PARA_ATENDIMENTO));
345 438  
346   - entity.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_PRONTA_PARA_ATENDIMENTO));
347   -
348   - } else {
349   -
350   - entity.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA_PARCIALMENTE));
351   - }
352   -
353   - //Remove movimentos estoque
354   - this.movimentoEstoqueService.removerMovimentosAtendimento(entity);
  439 + this.requisicaoConsumoService.atualizarSituacaoAtendimento(entity.getRequisicaoConsumo().getId(), false);
355 440  
356 441 return super.remove(entity);
357 442 }
... ... @@ -421,20 +506,7 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
421 506 */
422 507 private void configurarNumeroAtendimento(AtendimentoRequisicaoConsumo entity) {
423 508  
424   - if(entity.getOrganizacao() == null && entity.getRequisicaoConsumo() != null && entity.getRequisicaoConsumo().getOrganizacao() != null){
425   - entity.setOrganizacao(entity.getRequisicaoConsumo().getOrganizacao());
426   - }
427   -
428   - AtendimentoRequisicaoConsumo ultimoRegistro =
429   - (AtendimentoRequisicaoConsumo) atendimentoRequisicaoConsumoDao.buscarUltimoRegistroComOrdenadoParametrizada("numeroAtendimento", entity.getOrganizacao().getId());
430   -
431   - Long sequencial = null;
432   - if (UtilObjeto.isReferencia(ultimoRegistro)) {
433   - sequencial = ultimoRegistro.getNumeroAtendimento() == null ? null : Long.parseLong(ultimoRegistro.getNumeroAtendimento());
434   - }
435   - String codigo = configuracaoParametroSistemaService.gerarNumeroIdentificacao(sequencial, entity.getOrganizacao());
436   -
437   - entity.setNumeroAtendimento(codigo);
  509 + entity.setNumeroAtendimento(entity.getRequisicaoConsumo().getNumeroRequisicao());
438 510 }
439 511  
440 512 @Override
... ... @@ -453,7 +525,34 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
453 525 arrayLong[i] = Long.parseLong(array[i]);
454 526 }
455 527 }
456   - for (Long idRequisicao : arrayLong) {
  528 + if(arrayLong != null){
  529 + for (Long idRequisicao : arrayLong) {
  530 + List<AtendimentoRequisicaoConsumo> listaAtendimentoPorRequisicaoConsumo = this.listaAtendimentoPorRequisicaoConsumo(idRequisicao, idOrganizacao);
  531 + for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
  532 + this.remove(atendimentoRequisicaoConsumo);
  533 + }
  534 + }
  535 + }
  536 + return true;
  537 + }
  538 +
  539 + @Override
  540 + public Boolean finalizarRequisicoes(List<Long> idsRequisicao, Long idOrganizacao) {
  541 + for (Long idRequisicao : idsRequisicao) {
  542 + List<AtendimentoRequisicaoConsumo> listaAtendimentoPorRequisicaoConsumo = this.listaAtendimentoPorRequisicaoConsumo(idRequisicao, idOrganizacao);
  543 + for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
  544 + atendimentoRequisicaoConsumo.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_FINALIZADA));
  545 + atendimentoRequisicaoConsumo.getRequisicaoConsumo().setDataFinalizacaoAtendimento(UtilDate.getDataAtualCalendar());
  546 + super.merge(atendimentoRequisicaoConsumo);
  547 + this.requisicaoConsumoService.atualizarSituacaoAtendimento(atendimentoRequisicaoConsumo.getRequisicaoConsumo().getId(), false);
  548 + }
  549 + }
  550 + return true;
  551 + }
  552 +
  553 + @Override
  554 + public Boolean excluirAtendimentos(List<Long> idsRequisicao, Long idOrganizacao) {
  555 + for (Long idRequisicao : idsRequisicao) {
457 556 List<AtendimentoRequisicaoConsumo> listaAtendimentoPorRequisicaoConsumo = this.listaAtendimentoPorRequisicaoConsumo(idRequisicao, idOrganizacao);
458 557 for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
459 558 this.remove(atendimentoRequisicaoConsumo);
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/ConfiguracaoNotificacaoRessuprimentoServiceImpl.java
... ... @@ -321,13 +321,17 @@ public class ConfiguracaoNotificacaoRessuprimentoServiceImpl extends GenericServ
321 321 Date previousExecution = cron.getTimeAfter(date);
322 322 long timeMili = previousExecution.getTime() - date.getTime();
323 323 if(timeMili <= 0 || timeMili > (horasDia * minutoHora * segundoMinuto * milisegundos)){
324   - timeMili = 4 * minutoHora * segundoMinuto * milisegundos;
  324 + timeMili = getMilisegundosCron(minutoHora, segundoMinuto, milisegundos);
325 325 }
326 326 entity.setMilissegundoCron(timeMili + (5 * 1000));
327 327 } catch (ParseException e) {
328   - entity.setMilissegundoCron(4l * minutoHora * segundoMinuto * milisegundos);
  328 + entity.setMilissegundoCron(getMilisegundosCron(minutoHora, segundoMinuto, milisegundos));
329 329 }
330 330 }
  331 +
  332 + private long getMilisegundosCron(int minutoHora, int segundoMinuto, int milisegundos){
  333 + return new Long((4 * minutoHora * segundoMinuto * milisegundos));
  334 + }
331 335  
332 336 /**
333 337 * <p>
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/EntradaAlmoxarifadoItemServiceImpl.java
... ... @@ -15,6 +15,7 @@ import br.com.centralit.api.model.ContaContabilMovimento;
15 15 import br.com.centralit.api.model.EntradaAlmoxarifadoItem;
16 16 import br.com.centralit.api.model.EstruturaOrganizacional;
17 17 import br.com.centralit.api.model.MaterialConsumo;
  18 +import br.com.centralit.api.model.MaterialEstoqueFIFOItem;
18 19 import br.com.centralit.api.model.MaterialEstoque;
19 20 import br.com.centralit.api.model.MovimentoEstoque;
20 21 import br.com.centralit.api.service.ConfiguracaoParametroSistemaService;
... ... @@ -22,6 +23,7 @@ import br.com.centralit.api.service.ContaContabilMovimentoAlmoxarifadoService;
22 23 import br.com.centralit.api.service.EntradaAlmoxarifadoItemService;
23 24 import br.com.centralit.api.service.EstruturaOrganizacionalService;
24 25 import br.com.centralit.api.service.MaterialConsumoService;
  26 +import br.com.centralit.api.service.MaterialEstoqueFIFOItemService;
25 27 import br.com.centralit.api.service.MaterialEstoqueService;
26 28 import br.com.centralit.api.service.MovimentoEstoqueService;
27 29 import br.com.centralit.framework.exception.BusinessException;
... ... @@ -78,6 +80,8 @@ public class EntradaAlmoxarifadoItemServiceImpl extends GenericServiceImpl&lt;Entra
78 80  
79 81 @Autowired
80 82 private ContaContabilMovimentoAlmoxarifadoService contaContabilMovimentoAlmoxarifadoService;
  83 + @Autowired
  84 + private MaterialEstoqueFIFOItemService materialEstoqueFIFOItemService;
81 85  
82 86 @Autowired
83 87 private MaterialEstoqueService materialEstoqueService;
... ... @@ -204,6 +208,37 @@ public class EntradaAlmoxarifadoItemServiceImpl extends GenericServiceImpl&lt;Entra
204 208 public Collection<EntradaAlmoxarifadoItem> obterEntradaItemComSaldoPorMaterial(Long idMaterial) {
205 209 return this.entradaAlmoxarifadoItemDao.obterEntradaItemComSaldoPorMaterial(idMaterial);
206 210 }
  211 +
  212 + public BigDecimal getValorFIFOPorMaterial(MaterialConsumo materialConsumo, BigDecimal quantidadeMovimentada) {
  213 + BigDecimal retorno = BigDecimal.ZERO;
  214 +
  215 + List<MaterialEstoqueFIFOItem> fifOsByMaterial = this.materialEstoqueFIFOItemService.findFIFOsByMaterial(materialConsumo.getId());
  216 +
  217 + for (MaterialEstoqueFIFOItem materialEstoqueFIFOItem : fifOsByMaterial) {
  218 +
  219 + if (materialEstoqueFIFOItem.getQuantidadeRestante().compareTo(quantidadeMovimentada) > 0) {
  220 + retorno = retorno.add(quantidadeMovimentada.multiply(materialEstoqueFIFOItem.getValorUnitario()));
  221 + materialEstoqueFIFOItem.setQuantidadeRestante(materialEstoqueFIFOItem.getQuantidadeRestante().subtract(quantidadeMovimentada));
  222 + materialEstoqueFIFOItem.setValorSobra(materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()));
  223 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  224 + break;
  225 +
  226 + } else if (materialEstoqueFIFOItem.getQuantidadeRestante().compareTo(quantidadeMovimentada) == 0) {
  227 + retorno = retorno.add(materialEstoqueFIFOItem.getValorSobra()).add(materialEstoqueFIFOItem.getValorSobra());
  228 + materialEstoqueFIFOItem.setQuantidadeRestante(materialEstoqueFIFOItem.getQuantidadeRestante().subtract(quantidadeMovimentada));
  229 + materialEstoqueFIFOItem.setValorSobra(materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()));
  230 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  231 + break;
  232 +
  233 + } else {
  234 + retorno = retorno.add((materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()))).add(materialEstoqueFIFOItem.getValorSobra());
  235 + quantidadeMovimentada = quantidadeMovimentada.subtract(materialEstoqueFIFOItem.getQuantidadeRestante());
  236 + materialEstoqueFIFOItem.setQuantidadeRestante(BigDecimal.ZERO);
  237 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  238 + }
  239 + }
  240 + return retorno;
  241 + }
207 242  
208 243 /**
209 244 * {@inheritDoc}
... ... @@ -213,24 +248,29 @@ public class EntradaAlmoxarifadoItemServiceImpl extends GenericServiceImpl&lt;Entra
213 248 public BigDecimal realizaMovimentoSaida(MaterialConsumo materialConsumo, BigDecimal quantidadeMovimentada) {
214 249 BigDecimal retorno = BigDecimal.ZERO;
215 250  
216   - /*Collection<EntradaAlmoxarifadoItem> entradaAlmoxarifadoItems = this.obterEntradaItemComSaldoPorMaterial(materialConsumo.getId());
  251 + /* Collection<EntradaAlmoxarifadoItem> entradaAlmoxarifadoItems = this.obterEntradaItemComSaldoPorMaterial(materialConsumo.getId());
217 252  
218 253 for (EntradaAlmoxarifadoItem itemEntrada : entradaAlmoxarifadoItems) {
219   - if (itemEntrada.getQuantidadeSaldo().compareTo(quantidadeMovimentada) > 0) {
  254 +
  255 +
  256 + if (itemEntrada.getMaterialLocalEstoque().getQuantidade().compareTo(quantidadeMovimentada) > 0) {
220 257 retorno = retorno.add(quantidadeMovimentada.multiply(itemEntrada.getValorUnitario()));
221   - itemEntrada.setQuantidadeSaldo(itemEntrada.getQuantidadeSaldo().subtract(quantidadeMovimentada));
  258 + itemEntrada.getMaterialLocalEstoque().setQuantidade(itemEntrada.getMaterialLocalEstoque().getQuantidade().subtract(quantidadeMovimentada));
222 259 this.save(itemEntrada);
223 260 break;
224   - } else if (itemEntrada.getQuantidadeSaldo().compareTo(quantidadeMovimentada) == 0) {
  261 +
  262 + } else if (itemEntrada.getMaterialLocalEstoque().getQuantidade().compareTo(quantidadeMovimentada) == 0) {
225 263 retorno = retorno.add((quantidadeMovimentada.multiply(itemEntrada.getValorUnitario())).add(itemEntrada.getValorSobra()));
226   - itemEntrada.setQuantidadeSaldo(itemEntrada.getQuantidadeSaldo().subtract(quantidadeMovimentada));
  264 + itemEntrada.getMaterialLocalEstoque().setQuantidade(itemEntrada.getMaterialLocalEstoque().getQuantidade().subtract(quantidadeMovimentada));
227 265 this.save(itemEntrada);
228 266 break;
  267 +
229 268 } else {
230   - retorno = retorno.add((itemEntrada.getQuantidadeSaldo().multiply(itemEntrada.getValorUnitario())).add(itemEntrada.getValorSobra()));
231   - quantidadeMovimentada = quantidadeMovimentada.subtract(itemEntrada.getQuantidadeSaldo());
232   - itemEntrada.setQuantidadeSaldo(BigDecimal.ZERO);
  269 + retorno = retorno.add((itemEntrada.getMaterialLocalEstoque().getQuantidade().multiply(itemEntrada.getValorUnitario())).add(itemEntrada.getValorSobra()));
  270 + quantidadeMovimentada = quantidadeMovimentada.subtract(itemEntrada.getMaterialLocalEstoque().getQuantidade());
  271 + itemEntrada.getMaterialLocalEstoque().setQuantidade(BigDecimal.ZERO);
233 272 this.save(itemEntrada);
  273 +
234 274 }
235 275 }*/
236 276  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/MaterialEstoqueFIFOItemServiceImpl.java
1 1 package br.com.centralit.api.service.impl;
2 2  
  3 +import java.util.List;
  4 +
3 5 import org.springframework.beans.factory.annotation.Autowired;
4 6 import org.springframework.beans.factory.annotation.Qualifier;
5 7 import org.springframework.stereotype.Service;
... ... @@ -32,4 +34,9 @@ public class MaterialEstoqueFIFOItemServiceImpl extends GenericServiceImpl&lt;Mater
32 34 return super.remove(fifoItem);
33 35 }
34 36  
  37 + @Override
  38 + public List<MaterialEstoqueFIFOItem> findFIFOsByMaterial(long idMaterial) {
  39 + return materialEstoqueFIFOItemDao.findFIFOsByMaterial(idMaterial);
  40 + }
  41 +
35 42 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/MaterialLocalEstoqueServiceImpl.java
... ... @@ -68,9 +68,14 @@ public class MaterialLocalEstoqueServiceImpl extends GenericServiceImpl&lt;Material
68 68 }else{
69 69 if(entity.getLocalPrincipal()){
70 70 for (MaterialLocalEstoque materialLocalEstoque : locaisParMaterial) {
71   - if(materialLocalEstoque.getId() != entity.getId()){
  71 + if(entity.getId() != null){
  72 + if(materialLocalEstoque.getId().doubleValue() != entity.getId().doubleValue()){
  73 + materialLocalEstoque.setLocalPrincipal(Boolean.FALSE);
  74 + this.merge(materialLocalEstoque);
  75 + }
  76 + }else{
72 77 materialLocalEstoque.setLocalPrincipal(Boolean.FALSE);
73   - this.merge(materialLocalEstoque);
  78 + this.merge(materialLocalEstoque);
74 79 }
75 80 }
76 81 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/MovimentoEstoqueServiceImpl.java
... ... @@ -2,6 +2,7 @@ package br.com.centralit.api.service.impl;
2 2  
3 3 import java.math.BigDecimal;
4 4 import java.math.RoundingMode;
  5 +import java.sql.Timestamp;
5 6 import java.util.ArrayList;
6 7 import java.util.Calendar;
7 8 import java.util.Collection;
... ... @@ -19,6 +20,8 @@ import org.springframework.validation.Validator;
19 20 import br.com.centralit.api.dao.MovimentoEstoqueDao;
20 21 import br.com.centralit.api.model.AtendimentoRequisicaoConsumo;
21 22 import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItem;
  23 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemEndereco;
  24 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItemFIFO;
22 25 import br.com.centralit.api.model.BaixaAlmoxarifado;
23 26 import br.com.centralit.api.model.BaixaAlmoxarifadoItem;
24 27 import br.com.centralit.api.model.Devolucao;
... ... @@ -33,6 +36,7 @@ import br.com.centralit.api.model.MaterialEstoque;
33 36 import br.com.centralit.api.model.MaterialEstoqueFIFOItem;
34 37 import br.com.centralit.api.model.MaterialLocalEstoque;
35 38 import br.com.centralit.api.model.MovimentoEstoque;
  39 +import br.com.centralit.api.service.AtendimentoRequisicaoConsumoFIFOService;
36 40 import br.com.centralit.api.service.AtendimentoRequisicaoConsumoItemService;
37 41 import br.com.centralit.api.service.BaixaAlmoxarifadoItemService;
38 42 import br.com.centralit.api.service.ConfiguracaoParametroSistemaService;
... ... @@ -54,6 +58,7 @@ import br.com.centralit.framework.model.Usuario;
54 58 import br.com.centralit.framework.model.arquitetura.PersistentObjectAudit;
55 59 import br.com.centralit.framework.service.arquitetura.GenericServiceImpl;
56 60 import br.com.centralit.framework.util.UtilColecao;
  61 +import br.com.centralit.framework.util.UtilDate;
57 62 import br.com.centralit.framework.util.UtilObjeto;
58 63  
59 64 /**
... ... @@ -89,9 +94,9 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
89 94  
90 95 private static int SCALE_DIVISOR_DECIMAL = 4;
91 96  
92   - private static final String ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_ATENDIMENTO_REQUISICAO_CONSUMO_DATA_ATENDIMENTO = "atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumo.dataAtendimento";
  97 + private static final int ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_ATENDIMENTO_REQUISICAO_CONSUMO_DATA_ATENDIMENTO = 0;
93 98  
94   - private static final String ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE = "atendimentoRequisicaoConsumoItem.quantidade";
  99 + private static final int ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE = 1;
95 100  
96 101 /** Atributo movimentoEstoqueDao. */
97 102 private MovimentoEstoqueDao movimentoEstoqueDao;
... ... @@ -140,6 +145,9 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
140 145 @Autowired
141 146 private MaterialEstoqueFIFOItemService materialEstoqueFIFOItemService;
142 147  
  148 + @Autowired
  149 + private AtendimentoRequisicaoConsumoFIFOService atendimentoRequisicaoConsumoFIFOService;
  150 +
143 151  
144 152 /**
145 153 * Responsável pela criação de novas instâncias desta classe.
... ... @@ -373,6 +381,10 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
373 381 }
374 382 } else if (movimentoEstoque.getDominioClasseReferencia().getCodigo().equals(DominioMaterial.REFERENCIA_ATENDIMENTO_ALMOXARIFADO_ITEM)) {
375 383  
  384 +
  385 +
  386 +
  387 +
376 388 throw new NotImplementedException();
377 389 } else if (movimentoEstoque.getDominioClasseReferencia().getCodigo().equals(DominioMaterial.REFERENCIA_BAIXA_ALMOXARIFADO_ITEM)) {
378 390  
... ... @@ -414,36 +426,82 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
414 426 List<MovimentoEstoque> movimentos = new ArrayList<MovimentoEstoque>();
415 427  
416 428 for (AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem : atendimento.getAtendimentoRequisicaoConsumoItems()) {
417   -
418   - if(atendimentoRequisicaoConsumoItem.getQuantidade() == null){
419   - atendimentoRequisicaoConsumoItem.setQuantidade(new BigDecimal(0));;
  429 +
  430 + BigDecimal valorMovimentoFIFO = processaFIFOAtendimentoRequisicao(atendimentoRequisicaoConsumoItem);
  431 + BigDecimal valorMovimentoMediaMovel = this.materialEstoqueService.findByIdMaterial(atendimentoRequisicaoConsumoItem.getMaterial().getId()).getValorUnitarioMedio();
  432 +
  433 + for (AtendimentoRequisicaoConsumoItemEndereco atendimentoRequisicaoConsumoItemEndereco : atendimentoRequisicaoConsumoItem.getAtendimentoRequisicaoConsumoItemEnderecos()) {
  434 +
  435 + MovimentoEstoque movimentoEstoque = new MovimentoEstoque(atendimento.getDataAtendimento(), atendimentoRequisicaoConsumoItemEndereco.getQuantidade().multiply(BigDecimal.valueOf(-1)),
  436 + valorMovimentoFIFO.multiply(BigDecimal.valueOf(-1)), valorMovimentoMediaMovel.multiply(BigDecimal.valueOf(-1)), tipoMovimento); //Movimentos negativos pois o valor esta saindo do estoque.
  437 +
  438 + movimentoEstoque.setDominioClasseReferencia(classeReferenciaAtendimento);
  439 + movimentoEstoque.setIdClasseReferencia(atendimentoRequisicaoConsumoItem.getId());
  440 + movimentoEstoque.setMaterialLocalEstoque(atendimentoRequisicaoConsumoItemEndereco.getMaterialLocalEstoque());
  441 + movimentoEstoque.setMaterialEstoque(movimentoEstoque.getMaterialEstoque());
  442 + movimentoEstoque.setMaterial(atendimentoRequisicaoConsumoItem.getMaterial());
  443 +
  444 + String tipoAvaliacao = this.configuracaoParametroSistemaService.getParametro("TIPO_AVALIACAO_MONETARIA_ESTOQUE", atendimento.getOrganizacao()).getValor();
  445 +
  446 + MaterialConsumo materialConsumo = this.materialConsumoService.find(movimentoEstoque.getMaterial().getId());
  447 +
  448 + if (DominioAlmoxarifado.TIPO_AVALIACAO_MONETARIA_FIFO_NOME == tipoAvaliacao) { //Realiza movimento de saida em conta contábil baseado em FIFO se estiver configurado como tal.
  449 + this.contaContabilMovimentoService.salvaMovimentoSaidaAtendimento(materialConsumo.getContaContabil(), valorMovimentoFIFO, classeReferenciaAtendimento, atendimentoRequisicaoConsumoItem.getId());
  450 + } else { //Realiza movimento de saida em conta contábil baseado em Média Móvel (Padrão)
  451 + this.contaContabilMovimentoService.salvaMovimentoSaidaAtendimento(materialConsumo.getContaContabil(), valorMovimentoMediaMovel, classeReferenciaAtendimento, atendimentoRequisicaoConsumoItem.getId());
  452 + }
  453 +
  454 + MaterialLocalEstoque materialLocalEstoque = this.materialLocalEstoqueService.find(atendimentoRequisicaoConsumoItemEndereco.getMaterialLocalEstoque().getId());
  455 + materialLocalEstoque.setQuantidade(materialLocalEstoque.getQuantidade().subtract(atendimentoRequisicaoConsumoItemEndereco.getQuantidade()));
  456 + this.materialLocalEstoqueService.merge(materialLocalEstoque);
  457 +
  458 + movimentos.add(movimentoEstoque);
420 459 }
421   -
422   - BigDecimal valorMovimentoFIFO = this.entradaAlmoxarifadoItemService.realizaMovimentoSaida(atendimentoRequisicaoConsumoItem.getMaterial(), atendimentoRequisicaoConsumoItem.getQuantidade());
423   - BigDecimal valorMovimentoMediaMovel = BigDecimal.ZERO;//BigDecimal valorMovimentoMediaMovel = this.materialEstoqueSaldoMedioService.realizaMovimentoSaida(atendimentoRequisicaoConsumoItem.getMaterial(), atendimentoRequisicaoConsumoItem.getQuantidade());
424   -
425   - MovimentoEstoque movimentoEstoque = new MovimentoEstoque(atendimento.getDataAtendimento(), atendimentoRequisicaoConsumoItem.getQuantidade().multiply(BigDecimal.valueOf(-1)),
426   - valorMovimentoFIFO.multiply(BigDecimal.valueOf(-1)), valorMovimentoMediaMovel.multiply(BigDecimal.valueOf(-1)), tipoMovimento); //Movimentos negativos pois o valor esta saindo do estoque.
427   -
428   - //TODO Corrigir movimento de atendimento com versão nova
429 460  
430   - /*movimentoEstoque.setAtendimentoRequisicaoConsumoItem(atendimentoRequisicaoConsumoItem);
431   - movimentoEstoque.setLocalEstoque(this.materialLocalEstoqueService.find(getUsuario().getOrganizacao().getId()));
432   - movimentoEstoque.setMaterial(atendimentoRequisicaoConsumoItem.getMaterial());*/
  461 + }
433 462  
434   - movimentos.add(movimentoEstoque);
  463 + this.saveList(movimentos);
435 464  
436   - String tipoAvaliacao = this.configuracaoParametroSistemaService.getParametro("TIPO_AVALIACAO_MONETARIA_ESTOQUE", atendimento.getOrganizacao()).getValor();
  465 + }
437 466  
438   - if (DominioAlmoxarifado.TIPO_AVALIACAO_MONETARIA_FIFO_NOME == tipoAvaliacao) { //Realiza movimento de saida em conta contábil baseado em FIFO se estiver configurado como tal.
439   - this.contaContabilMovimentoService.salvaMovimentoSaidaAtendimento(movimentoEstoque.getMaterial().getContaContabil(), valorMovimentoFIFO, classeReferenciaAtendimento, atendimentoRequisicaoConsumoItem.getId());
440   - } else { //Realiza movimento de saida em conta contábil baseado em Média Móvel (Padrão)
441   - this.contaContabilMovimentoService.salvaMovimentoSaidaAtendimento(movimentoEstoque.getMaterial().getContaContabil(), valorMovimentoMediaMovel, classeReferenciaAtendimento, atendimentoRequisicaoConsumoItem.getId());
  467 + private BigDecimal processaFIFOAtendimentoRequisicao(AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem) {
  468 + BigDecimal retorno = BigDecimal.ZERO;
  469 +
  470 + List<MaterialEstoqueFIFOItem> fifOsByMaterial = this.materialEstoqueFIFOItemService.findFIFOsByMaterial(atendimentoRequisicaoConsumoItem.getMaterial().getId());
  471 + BigDecimal quantidadeMovimentada = atendimentoRequisicaoConsumoItem.getQuantidade();
  472 + List<AtendimentoRequisicaoConsumoItemFIFO> itemFIFOs = new ArrayList<AtendimentoRequisicaoConsumoItemFIFO>();
  473 +
  474 + for (MaterialEstoqueFIFOItem materialEstoqueFIFOItem : fifOsByMaterial) {
  475 +
  476 + if (materialEstoqueFIFOItem.getQuantidadeRestante().compareTo(atendimentoRequisicaoConsumoItem.getQuantidade()) > 0) {
  477 + retorno = retorno.add(quantidadeMovimentada.multiply(materialEstoqueFIFOItem.getValorUnitario()));
  478 + materialEstoqueFIFOItem.setQuantidadeRestante(materialEstoqueFIFOItem.getQuantidadeRestante().subtract(quantidadeMovimentada));
  479 + materialEstoqueFIFOItem.setValorSobra(materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()));
  480 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  481 + itemFIFOs.add(new AtendimentoRequisicaoConsumoItemFIFO(atendimentoRequisicaoConsumoItem, materialEstoqueFIFOItem, quantidadeMovimentada));
  482 + break;
  483 +
  484 + } else if (materialEstoqueFIFOItem.getQuantidadeRestante().compareTo(quantidadeMovimentada) == 0) {
  485 + retorno = retorno.add(materialEstoqueFIFOItem.getValorSobra()).add(materialEstoqueFIFOItem.getValorSobra());
  486 + materialEstoqueFIFOItem.setQuantidadeRestante(materialEstoqueFIFOItem.getQuantidadeRestante().subtract(quantidadeMovimentada));
  487 + materialEstoqueFIFOItem.setValorSobra(materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()));
  488 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  489 + itemFIFOs.add(new AtendimentoRequisicaoConsumoItemFIFO(atendimentoRequisicaoConsumoItem, materialEstoqueFIFOItem, quantidadeMovimentada));
  490 + break;
  491 +
  492 + } else {
  493 + retorno = retorno.add((materialEstoqueFIFOItem.getQuantidadeRestante().multiply(materialEstoqueFIFOItem.getValorUnitario()))).add(materialEstoqueFIFOItem.getValorSobra());
  494 + quantidadeMovimentada = quantidadeMovimentada.subtract(materialEstoqueFIFOItem.getQuantidadeRestante());
  495 + materialEstoqueFIFOItem.setQuantidadeRestante(BigDecimal.ZERO);
  496 + this.materialEstoqueFIFOItemService.merge(materialEstoqueFIFOItem);
  497 + itemFIFOs.add(new AtendimentoRequisicaoConsumoItemFIFO(atendimentoRequisicaoConsumoItem, materialEstoqueFIFOItem, quantidadeMovimentada));
442 498 }
443 499 }
444   -
445   - this.saveList(movimentos);
446   -
  500 +
  501 + itemFIFOs = this.atendimentoRequisicaoConsumoFIFOService.saveList(itemFIFOs);
  502 + atendimentoRequisicaoConsumoItem.setAtendimentoRequisicaoConsumoItemFIFOs(itemFIFOs);
  503 +
  504 + return retorno;
447 505 }
448 506  
449 507 @Override
... ... @@ -489,7 +547,10 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
489 547  
490 548 MovimentoEstoque ultimoMovimentoAtendimento = this.movimentoEstoqueDao.ultimoMovimento(entity, joinClass);
491 549  
492   - return this.movimentoEstoqueDao.existeMovimentacaoDepoisDoMovimento(ultimoMovimentoAtendimento, usuarioLogado.getOrganizacao());
  550 + if(ultimoMovimentoAtendimento != null){
  551 + return this.movimentoEstoqueDao.existeMovimentacaoDepoisDoMovimento(ultimoMovimentoAtendimento, usuarioLogado.getOrganizacao());
  552 + }
  553 + return false;
493 554 }
494 555  
495 556 /**
... ... @@ -500,28 +561,22 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
500 561  
501 562 BigDecimal result = BigDecimal.valueOf(0);
502 563  
503   - List<Map<String, Object>> valoresAtendidos = this.movimentoEstoqueDao.getQuantidadeMaterialAtendido(materialConsumo, almoxarifado, unidadeRequisitante, dataInicio, dataFim, idsDominiosTipoStatusRequisicao);
  564 + List<ArrayList<Object>> valoresAtendidos = this.movimentoEstoqueDao.getQuantidadeMaterialAtendido(materialConsumo, almoxarifado, unidadeRequisitante, dataInicio, dataFim, idsDominiosTipoStatusRequisicao);
504 565  
505 566 if (!UtilColecao.isVazio(valoresAtendidos)) {
506 567  
507 568 Map<String, List<BigDecimal>> mapaDeMesesPorQuantidade = new HashMap<String, List<BigDecimal>>();
508 569  
509   - for (Map<String, Object> mapaPropriedades : valoresAtendidos) {
510   -
  570 + for (Object list : valoresAtendidos) {
  571 + Object[] listaPropriedades = (Object[]) list;
511 572 if (mensal) {
512 573  
513   - this.divideValoresPorMesEAno(mapaPropriedades, mapaDeMesesPorQuantidade);
  574 + this.divideValoresPorMesEAno(listaPropriedades, mapaDeMesesPorQuantidade);
514 575  
515 576 } else {
  577 +
  578 + result = result.add(listaPropriedades[ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE] != null ? (BigDecimal) listaPropriedades[ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE] : BigDecimal.ZERO);
516 579  
517   - for (String chave : mapaPropriedades.keySet()) {
518   -
519   - if (chave.equalsIgnoreCase(ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE)) {
520   -
521   - result = result.add((BigDecimal) mapaPropriedades.get(chave));
522   -
523   - }
524   - }
525 580 }
526 581 }
527 582  
... ... @@ -555,7 +610,7 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
555 610  
556 611 for(BigDecimal valor : mapaDeMesesPorQuantidade.get(chave)){
557 612  
558   - valorSomadoMensal = valorSomadoMensal.add(valor);
  613 + valorSomadoMensal = valorSomadoMensal.add(valor != null ? valor : BigDecimal.ZERO);
559 614  
560 615 }
561 616  
... ... @@ -577,9 +632,9 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
577 632 * @param mapaDeMesesPorQuantidade2
578 633 * @return
579 634 */
580   - private void divideValoresPorMesEAno(Map<String, Object> mapaPropriedades, Map<String, List<BigDecimal>> mapaDeMesesPorQuantidade) {
581   -
582   - Calendar data = (Calendar) mapaPropriedades.get(ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_ATENDIMENTO_REQUISICAO_CONSUMO_DATA_ATENDIMENTO);
  635 + private void divideValoresPorMesEAno(Object[] listaPropriedades, Map<String, List<BigDecimal>> mapaDeMesesPorQuantidade) {
  636 +
  637 + Calendar data = UtilDate.getCalendarDoTimestamp((Timestamp) listaPropriedades[ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_ATENDIMENTO_REQUISICAO_CONSUMO_DATA_ATENDIMENTO]);
583 638  
584 639 Integer mes = data.get(Calendar.MONTH);
585 640  
... ... @@ -592,7 +647,7 @@ public class MovimentoEstoqueServiceImpl extends GenericServiceImpl&lt;MovimentoEst
592 647 mapaDeMesesPorQuantidade.put(chave, new ArrayList<BigDecimal>());
593 648 }
594 649  
595   - BigDecimal valor = (BigDecimal) mapaPropriedades.get(ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE);
  650 + BigDecimal valor = (BigDecimal) listaPropriedades[ATENDIMENTO_REQUISICAO_CONSUMO_ITEM_QUANTIDADE];
596 651  
597 652 mapaDeMesesPorQuantidade.get(chave).add(valor);
598 653  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/RequisicaoConsumoItemServiceImpl.java
... ... @@ -116,7 +116,11 @@ public class RequisicaoConsumoItemServiceImpl extends GenericServiceImpl&lt;Requisi
116 116 requisicaoConsumoItem.setRequisicaoConsumo(requisicaoConsumo);
117 117 requisicaoConsumoItem.setMaterialConsumo(materialConsumo);
118 118 requisicaoConsumoItem.setQuantidade(requisicaoConsumoItemTransient.getQuantidade());
119   -
  119 +
  120 + if(requisicaoConsumoItemTransient.getId() != null){
  121 + requisicaoConsumoItem.setId(requisicaoConsumoItemTransient.getId());
  122 + }
  123 +
120 124 return requisicaoConsumoItem;
121 125 }
122 126  
... ... @@ -142,10 +146,15 @@ public class RequisicaoConsumoItemServiceImpl extends GenericServiceImpl&lt;Requisi
142 146 public Long findRequisicaoAnteriorPorMaterial(MaterialConsumo materialConsumo, EstruturaOrganizacional unidadeRequisitante) {
143 147  
144 148 Dominio statusFinalizado = this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_FINALIZADA);
145   - Dominio statusAtendida = this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA);
146 149 Dominio statusParcialmenteAtendida = this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_ATENDIDA_PARCIALMENTE);
147 150  
148   - return this.requisicaoConsumoItemDao.findRequisicaoAnteriorPorMaterial(materialConsumo, unidadeRequisitante, statusFinalizado, statusParcialmenteAtendida, statusAtendida);
  151 + return this.requisicaoConsumoItemDao.findRequisicaoAnteriorPorMaterial(materialConsumo, unidadeRequisitante, statusFinalizado, statusParcialmenteAtendida);
  152 + }
  153 +
  154 +
  155 + @Override
  156 + public List<RequisicaoConsumoItem> findItensRequisicaoPorMaterial(Long idRequisicao, Long idMaterial) {
  157 + return this.requisicaoConsumoItemDao.findItensRequisicaoPorMaterial(idRequisicao, idMaterial);
149 158 }
150 159  
151 160  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/RequisicaoConsumoServiceImpl.java
... ... @@ -11,6 +11,8 @@ import org.springframework.security.core.context.SecurityContextHolder;
11 11 import org.springframework.stereotype.Service;
12 12 import org.springframework.validation.Validator;
13 13  
  14 +import com.googlecode.genericdao.search.SearchResult;
  15 +
14 16 import br.com.centralit.api.dao.RequisicaoConsumoDao;
15 17 import br.com.centralit.api.model.DominioAlmoxarifado;
16 18 import br.com.centralit.api.model.EstruturaOrganizacional;
... ... @@ -27,6 +29,7 @@ import br.com.centralit.api.service.ModuloService;
27 29 import br.com.centralit.api.service.RequisicaoConsumoItemService;
28 30 import br.com.centralit.api.service.RequisicaoConsumoService;
29 31 import br.com.centralit.api.service.UsuarioService;
  32 +import br.com.centralit.api.viewHelper.AtendimentoVH;
30 33 import br.com.centralit.api.viewHelper.RequisicaoVH;
31 34 import br.com.centralit.framework.exception.BusinessException;
32 35 import br.com.centralit.framework.exception.CodigoErro;
... ... @@ -109,7 +112,7 @@ public class RequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;RequisicaoC
109 112 /** Atributo centroCustoService. */
110 113 @Autowired
111 114 private CentroCustoService centroCustoService;
112   -
  115 +
113 116 @Autowired
114 117 public RequisicaoConsumoServiceImpl( RequisicaoConsumoDao requisicaoConsumoDao, @Qualifier("requisicaoConsumoValidator") Validator validator ) {
115 118  
... ... @@ -287,6 +290,12 @@ public class RequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;RequisicaoC
287 290 throw new BusinessException("PORTAL.MSG.MN020", CodigoErro.REGRA_NEGOCIO.getValue());
288 291  
289 292 }
  293 +
  294 + RequisicaoConsumo requisicaoConsumo = this.find(idRequisicaoConsumo);
  295 +
  296 + for (RequisicaoConsumoItem requisicaoConsumoItem : requisicaoConsumo.getRequisicaoConsumoItens()) {
  297 + this.requisicaoConsumoItemService.remove(requisicaoConsumoItem);
  298 + }
290 299  
291 300 return super.removeById(idRequisicaoConsumo);
292 301  
... ... @@ -343,7 +352,10 @@ public class RequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;RequisicaoC
343 352 private void montarEntidade(RequisicaoConsumo requisicaoConsumo) {
344 353  
345 354 // MONTA OS DADOS RELACIONADOS MATERIAL DE CONSUMO
346   - this.requisicaoConsumoItemService.montarRequisicaoConsumoItemMateriaisConsumo(requisicaoConsumo);
  355 + for (RequisicaoConsumoItem requisicaoConsumoItem : requisicaoConsumo.getRequisicaoConsumoItens()) {
  356 + requisicaoConsumoItem.setRequisicaoConsumo(requisicaoConsumo);
  357 + }
  358 +// this.requisicaoConsumoItemService.montarRequisicaoConsumoItemMateriaisConsumo(requisicaoConsumo);
347 359  
348 360 // TRANSIENT OBSERVACOES
349 361 if (!UtilColecao.isVazio(requisicaoConsumo.getObservacoes())) {
... ... @@ -358,6 +370,11 @@ public class RequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;RequisicaoC
358 370 }
359 371  
360 372 requisicaoConsumo.setCentroCusto(UtilObjeto.isReferencia(requisicaoConsumo.getCentroCusto()) ? this.centroCustoService.find(requisicaoConsumo.getCentroCusto().getId()) : null);
  373 +
  374 + if(requisicaoConsumo.getOrganizacao() == null){
  375 + Usuario usuarioLogado = (Usuario) usuarioService.find(( (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal() ).getId());
  376 + requisicaoConsumo.setOrganizacao(usuarioLogado.getOrganizacao());
  377 + }
361 378 }
362 379  
363 380 /**
... ... @@ -531,4 +548,58 @@ public class RequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;RequisicaoC
531 548 public String findtipoStatusRequisicaoPorMaterial(Long requisicaoId) {
532 549 return requisicaoConsumoDao.findtipoStatusRequisicaoPorMaterial(requisicaoId);
533 550 }
  551 +@Override
  552 + public SearchResult filtrarRequisicoesAtendimento(AtendimentoVH atendimentoVH) {
  553 + return this.requisicaoConsumoDao.filtrarRequisicoesAtendimento(atendimentoVH);
  554 + }
  555 +
  556 + @Override
  557 + public List<RequisicaoConsumo> findRequisicoesParaAtendimento(AtendimentoVH atendimentoVH) {
  558 + List<RequisicaoConsumo> requisicoes = this.requisicaoConsumoDao.findRequisicoesParaAtendimento(atendimentoVH);
  559 + if(atendimentoVH.isBloquearAtendimento()){
  560 + this.atualizarStatusAtendimento(requisicoes);
  561 + }
  562 +
  563 + for (RequisicaoConsumo requisicaoConsumo : requisicoes) {
  564 + List<RequisicaoConsumoItem> listaItens = new ArrayList<>();
  565 + for (RequisicaoConsumoItem requisicaoConsumoItem : requisicaoConsumo.getRequisicaoConsumoItens()) {
  566 + if(requisicaoConsumoItem.getDataInativo() == null){
  567 + listaItens.add(requisicaoConsumoItem);
  568 + }
  569 + }
  570 + requisicaoConsumo.setRequisicaoConsumoItens(listaItens);
  571 + }
  572 +
  573 + return requisicoes;
  574 + }
  575 +
  576 + private void atualizarStatusAtendimento(List<RequisicaoConsumo> requisicoes) {
  577 + Usuario usuarioLogado = (Usuario) usuarioService.find(( (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal() ).getId());
  578 + for (RequisicaoConsumo requisicaoConsumo : requisicoes) {
  579 + requisicaoConsumo.setEmAtendimento(Boolean.TRUE);
  580 + requisicaoConsumo.setAtendente(usuarioLogado);
  581 + super.merge(requisicaoConsumo);
  582 + flush();
  583 + }
  584 +
  585 + }
  586 +
  587 + @Override
  588 + public Boolean atualizarSituacaoAtendimento(Long idRequisicao, boolean situacaoAtendimento) {
  589 + RequisicaoConsumo requisicaoConsumo = this.find(idRequisicao);
  590 + requisicaoConsumo.setEmAtendimento(situacaoAtendimento);
  591 + if(!situacaoAtendimento){
  592 + requisicaoConsumo.setAtendente(null);
  593 + }
  594 + super.merge(requisicaoConsumo);
  595 + return true;
  596 + }
  597 +
  598 + @Override
  599 + public Boolean atualizarSituacaoAtendimentoRequisicoes(RequisicaoVH requisicaoVH) {
  600 + for (Long idRequisicao : requisicaoVH.getIdsRequisicoes()) {
  601 + this.atualizarSituacaoAtendimento(idRequisicao, requisicaoVH.getStatusAtendimentoRequsicao());
  602 + }
  603 + return true;
  604 + }
534 605 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/validation/AtendimentoRequisicaoConsumoItemValidator.java
... ... @@ -22,7 +22,7 @@ public class AtendimentoRequisicaoConsumoItemValidator implements Validator {
22 22  
23 23 ValidationUtils.rejectIfEmpty(errors, "atendimentoRequisicaoConsumo", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.ATENDIMENTOREQUISICAOCONSUMO");
24 24  
25   - ValidationUtils.rejectIfEmpty(errors, "materialConsumo", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.MATERIALCONSUMO");
  25 + ValidationUtils.rejectIfEmpty(errors, "material", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.MATERIALCONSUMO");
26 26  
27 27 ValidationUtils.rejectIfEmpty(errors, "quantidade", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.QUANTIDADE");
28 28  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/validation/RequisicaoConsumoItemValidator.java
... ... @@ -22,7 +22,7 @@ public class RequisicaoConsumoItemValidator implements Validator {
22 22  
23 23 ValidationUtils.rejectIfEmpty(errors, "requisicaoConsumo", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.REQUISICAOCONSUMO");
24 24  
25   - ValidationUtils.rejectIfEmpty(errors, "material", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.MATERIAL");
  25 + ValidationUtils.rejectIfEmpty(errors, "materialConsumo", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "LABEL.MATERIAL");
26 26  
27 27 ValidationUtils.rejectIfEmpty(errors, "quantidade", CodigoErro.VALIDACAO_CAMPOS_OBRIGATORIOS.getValue().toString(), "ALMOXARIFADO.LABEL.QUANTIDADE");
28 28  
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/viewHelper/ValidacaoAtendimentoRequisicaoConsumoVH.java 0 → 100644
... ... @@ -0,0 +1,40 @@
  1 +package br.com.centralit.api.viewHelper;
  2 +
  3 +import java.util.List;
  4 +
  5 +import br.com.centralit.api.model.MaterialLocalEstoque;
  6 +import br.com.centralit.framework.json.Views;
  7 +
  8 +import com.fasterxml.jackson.annotation.JsonView;
  9 +
  10 +public class ValidacaoAtendimentoRequisicaoConsumoVH {
  11 +
  12 + @JsonView({ Views.GenericView.class })
  13 + private List<MaterialLocalEstoque> materiaisLocalEstoque;
  14 +
  15 + @JsonView({ Views.GenericView.class })
  16 + private String mensagemErro;
  17 +
  18 + public ValidacaoAtendimentoRequisicaoConsumoVH(List<MaterialLocalEstoque> materiaisLocalEstoque, String mensagemErro) {
  19 + super();
  20 + this.materiaisLocalEstoque = materiaisLocalEstoque;
  21 + this.mensagemErro = mensagemErro;
  22 + }
  23 +
  24 + public List<MaterialLocalEstoque> getMateriaisLocalEstoque() {
  25 + return materiaisLocalEstoque;
  26 + }
  27 +
  28 + public void setMateriaisLocalEstoque(
  29 + List<MaterialLocalEstoque> materiaisLocalEstoque) {
  30 + this.materiaisLocalEstoque = materiaisLocalEstoque;
  31 + }
  32 +
  33 + public String getMensagemErro() {
  34 + return mensagemErro;
  35 + }
  36 +
  37 + public void setMensagemErro(String mensagemErro) {
  38 + this.mensagemErro = mensagemErro;
  39 + }
  40 +}
... ...
cit-almoxarifado-web/src/main/java/br/com/centralit/controller/AtendimentoRequisicaoConsumoController.java
1 1 package br.com.centralit.controller;
2 2  
  3 +import java.util.List;
  4 +
3 5 import org.apache.commons.lang3.SerializationUtils;
4 6 import org.hibernate.exception.ConstraintViolationException;
5 7 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -10,10 +12,15 @@ import org.springframework.web.bind.annotation.RequestMethod;
10 12 import org.springframework.web.bind.annotation.RequestParam;
11 13 import org.springframework.web.bind.annotation.ResponseBody;
12 14  
  15 +import com.googlecode.genericdao.search.Search;
  16 +import com.googlecode.genericdao.search.SearchResult;
  17 +
13 18 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
14 19 import br.com.centralit.api.model.AtendimentoRequisicaoConsumo;
  20 +import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItem;
15 21 import br.com.centralit.api.model.RequisicaoConsumo;
16 22 import br.com.centralit.api.service.AtendimentoRequisicaoConsumoService;
  23 +import br.com.centralit.api.viewHelper.AtendimentoVH;
17 24 import br.com.centralit.api.viewHelper.InformacoesAtendimentoVH;
18 25 import br.com.centralit.framework.controller.GenericController;
19 26 import br.com.centralit.framework.dao.arquitetura.SearchSeven;
... ... @@ -23,9 +30,6 @@ import br.com.centralit.framework.model.SearchParams;
23 30 import br.com.centralit.framework.view.GridVH;
24 31 import br.com.centralit.framework.view.ResultResponseVH;
25 32  
26   -import com.googlecode.genericdao.search.Search;
27   -import com.googlecode.genericdao.search.SearchResult;
28   -
29 33 /**
30 34 * <p><img src="http://centralit.com.br/images/logo_central.png"></p>
31 35 *
... ... @@ -195,5 +199,46 @@ public class AtendimentoRequisicaoConsumoController extends GenericController&lt;At
195 199  
196 200 return new ResponseBodyWrapper(this.atendimentoRequisicaoConsumoService.removerAtendimentoRequisicao(idsRequisicaoConsumo, idOrganizacao), this.getEditView());
197 201 }
  202 +
  203 + @RequestMapping(value = "/finalizarRequisicoes", method = RequestMethod.POST, produces = "application/json")
  204 + @ResponseBody
  205 + public Boolean finalizarRequisicoes(@RequestBody AtendimentoVH atendimentoVH) {
  206 +
  207 + return this.atendimentoRequisicaoConsumoService.finalizarRequisicoes(atendimentoVH.getIdsRequisicao(), atendimentoVH.getIdOrganizacao());
  208 +
  209 + }
  210 +
  211 + @RequestMapping(value = "/validarFinalizacaoRequisicoes", method = RequestMethod.POST, produces = "application/json")
  212 + @ResponseBody
  213 + public Boolean validarFinalizacaoRequisicoes(@RequestBody AtendimentoVH atendimentoVH) {
  214 +
  215 + for (Long idRequisicaoConsumo : atendimentoVH.getIdsRequisicao()) {
  216 + List<AtendimentoRequisicaoConsumo> listaAtendimentoPorRequisicaoConsumo = this.atendimentoRequisicaoConsumoService.listaAtendimentoPorRequisicaoConsumo(idRequisicaoConsumo, atendimentoVH.getIdOrganizacao());
  217 + for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
  218 + for (AtendimentoRequisicaoConsumoItem atendimentoRequisicaoConsumoItem : atendimentoRequisicaoConsumo.getAtendimentoRequisicaoConsumoItems()) {
  219 + if(atendimentoRequisicaoConsumoItem.getRequisicaoConsumoItem().getQuantidade().compareTo(atendimentoRequisicaoConsumoItem.getQuantidade()) > 0){
  220 + return false;
  221 + }
  222 + }
  223 + }
  224 + }
  225 + return true;
  226 + }
  227 +
  228 + @RequestMapping(value = "/excluirAtendimentos", method = RequestMethod.POST, produces = "application/json")
  229 + @ResponseBody
  230 + public Boolean excluirAtendimentos(@RequestBody AtendimentoVH atendimentoVH) {
  231 +
  232 + return this.atendimentoRequisicaoConsumoService.excluirAtendimentos(atendimentoVH.getIdsRequisicao(), atendimentoVH.getIdOrganizacao());
  233 +
  234 + }
  235 +
  236 + @RequestMapping(value = "/validaQuantidadesAtendidas", method = RequestMethod.POST)
  237 + @ResponseBody
  238 + public ResponseBodyWrapper validaQuantidadesAtendidas(@RequestBody AtendimentoRequisicaoConsumo entity){
  239 +
  240 + return new ResponseBodyWrapper(this.atendimentoRequisicaoConsumoService.validarQuantidadesAtendidas(entity), this.getEditView());
  241 +
  242 + }
198 243  
199 244 }
... ...
cit-almoxarifado-web/src/main/java/br/com/centralit/controller/RequisicaoConsumoController.java
1 1 package br.com.centralit.controller;
2 2  
3   -import java.util.Collection;
  3 +import java.util.ArrayList;
4 4 import java.util.List;
5 5  
6 6 import org.apache.commons.lang3.SerializationUtils;
7 7 import org.hibernate.exception.ConstraintViolationException;
8 8 import org.springframework.beans.factory.annotation.Autowired;
9 9 import org.springframework.stereotype.Controller;
  10 +import org.springframework.web.bind.annotation.PathVariable;
10 11 import org.springframework.web.bind.annotation.RequestBody;
11 12 import org.springframework.web.bind.annotation.RequestMapping;
12 13 import org.springframework.web.bind.annotation.RequestMethod;
13 14 import org.springframework.web.bind.annotation.RequestParam;
14 15 import org.springframework.web.bind.annotation.ResponseBody;
15 16  
  17 +import com.googlecode.genericdao.search.SearchResult;
  18 +
16 19 import br.com.centralit.api.framework.json.ViewsAdmMateriais;
17 20 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
18 21 import br.com.centralit.api.model.RequisicaoConsumo;
  22 +import br.com.centralit.api.model.RequisicaoConsumoItem;
  23 +import br.com.centralit.api.service.RequisicaoConsumoItemService;
19 24 import br.com.centralit.api.service.RequisicaoConsumoService;
  25 +import br.com.centralit.api.viewHelper.AtendimentoVH;
20 26 import br.com.centralit.api.viewHelper.RequisicaoVH;
21 27 import br.com.centralit.framework.controller.GenericController;
22 28 import br.com.centralit.framework.json.ResponseBodyWrapper;
23 29 import br.com.centralit.framework.json.Views;
  30 +import br.com.centralit.framework.util.UtilColecao;
  31 +import br.com.centralit.framework.view.GridVH;
  32 +import br.com.centralit.framework.view.ResultResponseVH;
24 33  
25 34 /**
26 35 * <p>
... ... @@ -60,6 +69,9 @@ public class RequisicaoConsumoController extends GenericController&lt;RequisicaoCon
60 69  
61 70 /** Atributo requisicaoConsumoService. */
62 71 private RequisicaoConsumoService requisicaoConsumoService;
  72 +
  73 + @Autowired
  74 + private RequisicaoConsumoItemService requisicaoConsumoItemService;
63 75  
64 76 @Autowired
65 77 public RequisicaoConsumoController(RequisicaoConsumoService requisicaoConsumoService) {
... ... @@ -192,10 +204,78 @@ public class RequisicaoConsumoController extends GenericController&lt;RequisicaoCon
192 204 */
193 205 @RequestMapping(value = "/atenderRequisicoes", method = RequestMethod.POST, produces = "application/json")
194 206 @ResponseBody
195   - public ResponseBodyWrapper atenderRequisicoes (@RequestBody Collection<Long> requisicoesIds) {
  207 + public ResponseBodyWrapper atenderRequisicoes (@RequestBody AtendimentoVH atendimentoVH) {
  208 +
  209 + List<RequisicaoConsumo> requisicoes = this.requisicaoConsumoService.findRequisicoesParaAtendimento(atendimentoVH);
  210 +
  211 + if(!UtilColecao.isVazio(atendimentoVH.getIdsMaterais())){
  212 + for (RequisicaoConsumo requisicaoConsumo : requisicoes) {
  213 + List<RequisicaoConsumoItem> itens = new ArrayList<RequisicaoConsumoItem>();
  214 + for (Long idMaterial : atendimentoVH.getIdsMaterais()) {
  215 + itens.addAll(this.requisicaoConsumoItemService.findItensRequisicaoPorMaterial(requisicaoConsumo.getId(), idMaterial));
  216 +
  217 + }
  218 + requisicaoConsumo.setRequisicaoConsumoItens(itens);
  219 + }
  220 + }
  221 +
  222 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(requisicoes, ViewsAdmMateriais.RequisicaoConsumoEditView.class);
  223 +
  224 + return responseBody;
  225 + }
  226 +
  227 + @RequestMapping(value = "/filtrarRequisicoesAtendimento", method = RequestMethod.POST, produces = "application/json")
  228 + @ResponseBody
  229 + public ResponseBodyWrapper filtrarRequisicoesAtendimento(@RequestBody AtendimentoVH atendimentoVH) {
  230 + SearchResult searchResult = requisicaoConsumoService.filtrarRequisicoesAtendimento(atendimentoVH);
  231 +
  232 + GridVH gridVH = new GridVH();
  233 + gridVH.setObjects(searchResult.getResult());
  234 + gridVH.addTotalItensTotalPages(atendimentoVH.getSearchParams(), Long.valueOf(searchResult.getTotalCount()));
  235 +
  236 + ResultResponseVH resultResponseVH = new ResultResponseVH(gridVH);
  237 +
  238 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(resultResponseVH, this.getListView());
  239 +
  240 + return responseBody;
  241 + }
  242 +
  243 + @RequestMapping(value = "/atualizarSituacaoAtendimento", method = RequestMethod.GET, produces = "application/json")
  244 + @ResponseBody
  245 + public ResponseBodyWrapper atualizarSituacaoAtendimento(@RequestParam(value = "idRequisicao") Long idRequisicao, @RequestParam(value = "situacaoAtendimento") boolean situacaoAtendimento) {
  246 +
  247 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(this.requisicaoConsumoService.atualizarSituacaoAtendimento(idRequisicao, situacaoAtendimento), getEditView());
  248 +
  249 + return responseBody;
  250 + }
  251 +
  252 + @RequestMapping(value = "/atualizarSituacaoAtendimentoRequisicoes", method = RequestMethod.POST, produces = "application/json")
  253 + @ResponseBody
  254 + public Boolean atualizarSituacaoAtendimentoRequisicoes(@RequestBody RequisicaoVH requisicaoVH) {
  255 +
  256 + return this.requisicaoConsumoService.atualizarSituacaoAtendimentoRequisicoes(requisicaoVH);
  257 +
  258 + }
  259 +
  260 + @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  261 + @ResponseBody
  262 + public ResponseBodyWrapper getObject(@PathVariable("id") Long id) {
  263 +
  264 + RequisicaoConsumo requisicaoConsumo = this.requisicaoConsumoService.getReference(id);
  265 +
  266 + List<RequisicaoConsumoItem> itens = new ArrayList<>();
  267 +
  268 + for (RequisicaoConsumoItem requisicaoConsumoItem : requisicaoConsumo.getRequisicaoConsumoItens()) {
  269 + if(requisicaoConsumoItem.getDataInativo() == null){
  270 + itens.add(requisicaoConsumoItem);
  271 + }
  272 + }
  273 +
  274 + requisicaoConsumo.setRequisicaoConsumoItens(itens);
  275 +
  276 + ResultResponseVH<RequisicaoConsumo> resultResponseVH = new ResultResponseVH<RequisicaoConsumo>(requisicaoConsumo);
196 277  
197   - ResponseBodyWrapper responseBody = new ResponseBodyWrapper(this.requisicaoConsumoService.findList((List<Long>) requisicoesIds),
198   - ViewsAdmMateriais.RequisicaoConsumoEditView.class);
  278 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(resultResponseVH, this.getEditView());
199 279  
200 280 return responseBody;
201 281 }
... ...
cit-almoxarifado-web/src/main/java/br/com/centralit/listener/StartupListenerAlmoxarifado.java
... ... @@ -322,6 +322,23 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
322 322  
323 323 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.ATENDIMENTO_S", "Atendimento(s)", dominio, modulo));
324 324 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.BAIXA_S", "Baixa(s)", dominio, modulo));
  325 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.EXCLUIR_ATENDIMENTO", "Excluir atendimento", dominio, modulo));
  326 +
  327 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.STATUS_ATUAL", "Status atual", dominio, modulo));
  328 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.FILTRAR", "Filtrar", dominio, modulo));
  329 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.LIMPAR_BUSCA_AVANCADA", "Limpar busca avançada", dominio, modulo));
  330 +
  331 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.ATENDIMENTO_REQUISICAO", "Atendimento de requisição consumo", dominio, modulo));
  332 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.ATENDIMENTO_INICIADO", "Atendimento iniciado", dominio, modulo));
  333 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.INTERROMPER_ATENDIMENTO_INICIADO", "Interromper atendimento iniciado", dominio, modulo));
  334 +
  335 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.ENDERECOS_ESTOQUE", "Endereços de estoque", dominio, modulo));
  336 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.MULTIPLOS_ENDERECOS", "Multiplos Endereços", dominio, modulo));
  337 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.ATENDIMENTO_INICIADO_USUARIO", "Atendimento iniciado por", dominio, modulo));
  338 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.CANCELAR_ATENDIMENTO_INICIADO", "Cancelar atendimento", dominio, modulo));
  339 +
  340 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.MOSTRAR_ATENDIMENTOS_CONCLUIDOS", "Mostrar materiais já atendidos por completo", dominio, modulo));
  341 +
325 342 }
326 343  
327 344 private void gerarValidacao(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
... ... @@ -358,12 +375,20 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
358 375 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.EXCLUSAO_ENTRADA_IMPOSSIVEL", "Já houve movimentação com os materiais provenientes dessa entrada, ela não poderá mais ser excluída do sistema.", dominio, modulo));
359 376 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.ENDERECO_ESTOQUE_NEGADA_ALTERAR_ACOMODA_MATERIAL", "Não é permitido alterar esse endereço para não acomoda materiais, pois o endereço já está vinculado a materiais de consumo.", dominio, modulo));
360 377 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.CONTABILIZAR_ENTRADA_ITEM_SEM_ENDERECO", "Não é possível contabilizar a entrada pois existem materiais sem endereço de estoque definido!", dominio, modulo));
  378 +
  379 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.SOMA_ITENS_ATENDER_MAIOR_ESTOQUE", "A soma das quantidades informadas para atendimento ultrapassam o saldo disponivel no endereço de estoque selecionado no(s) seguinte(s) material(ais):", dominio, modulo));
  380 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.SOMA_ITENS_ATENDER_MAIOR_ESTOQUE_TOOLTIP", "A soma das quantidades à atender informadas para este material ultrapassaram o saldo disponivel no(s) endereço(s) de estoque.", dominio, modulo));
  381 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.QUANTIDADE_ATENDER_SUPERIOR_SALDO_ESTOQUE", "A quantidade a ser atendida é superior ao saldo disponível no(s) seguinte(s) endereço(s) de estoque: ", dominio, modulo));
  382 +
  383 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.QUANTIDADE_ATENDIDA_MAIOR_REQUISITADA", "A quantidade a ser atendida é superior a quantidade requisitada.", dominio, modulo));
  384 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.TODAS_QUANTIDADE_ATENDIDA_EM_BRANCO", "Ao menos um item 'Atender' deve ser preenchido para registrar o atendimento.", dominio, modulo));
  385 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.REMOVER_TODOS_ITENS_REQUISICAO_CONSUMO", "Não é permitido remover todos os materiais de consumo.", dominio, modulo));
361 386 }
362 387  
363 388 private void gerarMensagem(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
364 389 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ATENDA_AO_MENOS_UMA_REQUISICAO", "Por favor, atenda ao menos uma requisição antes de continuar.", dominio, modulo));
365 390 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CATALOGOS_CADASTRADOS_OPCOES", "Os seguintes catálogos existem no sistema com a mesma lista de materiais que você selecionou no seu cadastro, você pode selecionar uma das opções ou continuar salvando o cadastro atual.", dominio, modulo));
366   - internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICOES", "Confirma a operação de finzalizar a(s) requisição(ões)?", dominio, modulo));
  391 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICOES", "Confirma a operação de finalizar a(s) requisição(ões)?", dominio, modulo));
367 392 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.MATERIAIS_CONSUMO_REQUISICAO_OBRIGATORIO", "Materiais de consumo são obrigatórios!", dominio, modulo));
368 393 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.MATERIAIS_QUANTIDADE_ZERO", "A quantidade dos itens que estão selecionados para baixa não pode ser zero!", dominio, modulo));
369 394 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.MATERIAL_ESTOQUE_SEM_ESTOQUE", "O material selecionado não contém saldo no estoque", dominio, modulo));
... ... @@ -397,6 +422,26 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
397 422 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ENTRADA_ENDERECOS_ESTOQUE_DESVINCULADOS_MATERIAL", "Todos os materiais desta entrada tiveram seu endereço de estoque retirados!", dominio, modulo));
398 423 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ENTRADA_ENDERECOS_ESTOQUE_PADRAO_VINCULADOS_MATERIAL", "Todos os materiais desta entrada que tinham endereços padrões neste almoxarifado foram vinculados a ele!", dominio, modulo));
399 424 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.EXCLUSAO_ULTIMO_ITEM_ENTRADA", "É necessário existir ao menos um item nesta lista, para continuar exclua a entrada inteira ou adicione outro item primeiro!", dominio, modulo));
  425 +
  426 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.FINALIZAR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL", "A finalização de atendimento somente é permitido para requisições com a situação igual a 'Atendida parcialmente'.", dominio, modulo));
  427 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.EXCLUIR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL_FINALIZADA", "A exclusão de atendimento somente é permitido para requisições com a situação igual a 'Atendida parcialmente' ou 'Finalizada'.", dominio, modulo));
  428 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICAO", "Confirma finalização das requisições selecionados?", dominio, modulo));
  429 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_EXCLUSAO_ATENDIMENTO_REQUISICAO", "Confirma exclusão dos atendimentos selecionados?", dominio, modulo));
  430 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.NAO_PERMITIDO_ATENDER_REQUISICAO_FINALIZADA", "Atendimento não permitido pois há requisições finalizadas selecionadas para atendimento. Desmarque as requisições finalizadas e clique novamente em 'Atender'.", dominio, modulo));
  431 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.DATA_FINALIZACAO_FORA_REFERENCIA", "Exclusão não permitida. Data de finalização da requisição %s fora da referência vigente.", dominio, modulo));
  432 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.INFO_FILTRO_MATERIAL_REQUISICAO", "O atendimento será realizado para os materiais selecionados na busca avançada.", dominio, modulo));
  433 +
  434 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.REMOVER_REQUISICAO_ATENDIMENTO", "Remover requisição deste atendimento", dominio, modulo));
  435 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.REQUISICAO_EM_ATENDIMENTO", "está em atendimento pelo atendente ", dominio, modulo));
  436 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.DESMARQUE_REQUISICAO_EM_ATENDIMENTO", "Desmarque esta requisição de consumo para prosseguir o atendimento.", dominio, modulo));
  437 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ATENDER_MAIS_DE_UM_ENDERECO", "Atender utilizando mais de um endereco", dominio, modulo));
  438 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.INTERROMPER_ATENDIMENTO_NAO_INICIADO", "Somente é permitido realizar essa ação para requisições que foram iniciadas o atendimento por você. Desmarque as requisições que não foram iniciadas o atendimento para prosseguir.", dominio, modulo));
  439 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.INTERROMPER_ATENDIMENTO_INICIADO_OUTRO_ATENDENTE", "Somente é permitido realizar essa ação para requisições que foram iniciadas o atendimento por você. Desmarque as requisições que foram iniciadas por outros atendentes para prosseguir.", dominio, modulo));
  440 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICAO_NAO_ATENDIDA_COMPLETAMENTE", "Há requisições selecionados que não tiveram o atendimento completo, deseja realmente finalizar essas requisições?", dominio, modulo));
  441 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_ALERTA_EXCLUSAO_ATENDIMENTO_REQUISICAO", "Deseja mesmo excluir o atendimento da requisição selecionada? Essa ação devolverá a quantidade de materiais fornecida para o estoque, bem como seus os movimentos financeiros e retornará a requisição para o status ‘Pronta para atendimento’.", dominio, modulo));
  442 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_SALVAR_FINALIZAR_REQUISICAO", "Confirma a operação de finalizar a requisição?", dominio, modulo));
  443 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.INFO_ATENDIMENTOS_INICIADOS", "Os atendimentos destas requisições estão disponíveis apenas para você até você salvar ou cancelar as mesmas. Outro usuário não poderá acessá-las enquanto isso.", dominio, modulo));
  444 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.INFO_ATENDIMENTO_INICIADO", "O atendimento dessa requisição está disponível apenas para você até você salvar ou cancelar a mesma. Outro usuário não poderá acessá-la enquanto isso.", dominio, modulo));
400 445 }
401 446 }
402 447  
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/AtendimentoRequisicaoConsumoController.js
... ... @@ -10,6 +10,7 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
10 10 'RequisicaoConsumoRepository',
11 11 'EstruturaOrganizacionalAlmoxarifadoRepository',
12 12 'DominioRepository', 'EstruturaOrganizacionalPatrimonioRepository',
  13 + 'MaterialLocalEstoqueRepository',
13 14 function AtendimentoRequisicaoConsumoController($scope,
14 15 $translate,
15 16 $timeout,
... ... @@ -18,16 +19,15 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
18 19 AtendimentoRequisicaoConsumoItemRepository,
19 20 RequisicaoConsumoRepository,
20 21 EstruturaOrganizacionalAlmoxarifadoRepository,
21   - DominioRepository, EstruturaOrganizacionalPatrimonioRepository) {
  22 + DominioRepository, EstruturaOrganizacionalPatrimonioRepository,
  23 + MaterialLocalEstoqueRepository) {
22 24  
23 25 $scope.TIPO_STATUS_REQUISICAO = "tipoStatusRequisicao";
24 26  
  27 + $scope.TIPO_STATUS_ATENDIDA_PARCIALMENTE = 1;
  28 +
25 29 $scope.TIPO_STATUS_PRONTA_PARA_ATENDIMENTO = 2;
26 30  
27   - $scope.TIPO_STATUS_ATENDIDA_PARCIALMENTE = 3;
28   -
29   - $scope.TIPO_STATUS_ATENDIDA = 4;
30   -
31 31 $scope.TIPO_STATUS_FINALIZADA = 5;
32 32  
33 33 $scope.atendimentoRequisicaoConsumo = {};
... ... @@ -56,7 +56,13 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
56 56  
57 57 // Atualiza pagina de pesquisa
58 58 $scope.atualizaPaginaPesquisa = function () {
  59 +
  60 + var requisicaoVH = { idsRequisicoes : $scope.idsRequisicoesSelecionados, statusAtendimentoRequsicao : false};
  61 +
  62 + RequisicaoConsumoRepository.atualizarSituacaoAtendimentoRequisicoes(requisicaoVH).then(function(result) {
59 63 angular.element('#searchAtendimentoRequisicaoConsumo').scope().fetchResult();
  64 + });
  65 +
60 66 };
61 67  
62 68 $scope.removerAtendimentoRequisicao = function(){
... ... @@ -83,6 +89,24 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
83 89 }
84 90 });
85 91 };
  92 +
  93 + $scope.removerRequisicaoDoAtendimento = function(index){
  94 + $scope.$openModalConfirm({
  95 + message: $translate.instant('MSG.CONFIRMA_EXCLUSAO'),
  96 + callback: function(){
  97 + var requisicaoRemover = $scope.atendimentos[index];
  98 + RequisicaoConsumoRepository.atualizarSituacaoAtendimento(requisicaoRemover.requisicaoConsumo.id, false).then(function(result) {
  99 + $scope.atendimentos.splice(index, 1);
  100 + $scope.$modalConfirmInstance.dismiss('cancel');
  101 + if($scope.atendimentos.length == 0){
  102 + $scope.$showPageSearchWorkspace($scope.workspace);
  103 + $scope.atualizaPaginaPesquisa();
  104 + }
  105 + });
  106 +
  107 + }
  108 + });
  109 + };
86 110  
87 111  
88 112 // Limpa o formulario preenchido
... ... @@ -208,17 +232,6 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
208 232 angular.copy(filterCriteriaTemp, $scope.filterCriteria);
209 233  
210 234  
211   -// EstruturaOrganizacionalPatrimonioRepository.getAlmoxarifadoPadrao($scope.usuarioLogado.organizacao.id).then(function(result){
212   -// $scope.estruturaAlmoxarifadoPadrao = {};
213   -// if(result.originalElement.estruturaOrganizacional){
214   -// $scope.estruturaAlmoxarifadoPadrao = result.originalElement.estruturaOrganizacional;
215   -// }
216   -// });
217   -
218   -
219   - DominioRepository.buscaDominioByCodigoAndChave($scope.TIPO_STATUS_ATENDIDA ,$scope.TIPO_STATUS_REQUISICAO).then(function(result) {
220   - $scope.tipoStatusRequisicaoAtendida = result.originalElement;
221   - });
222 235 DominioRepository.buscaDominioByCodigoAndChave($scope.TIPO_STATUS_ATENDIDA_PARCIALMENTE ,$scope.TIPO_STATUS_REQUISICAO).then(function(result) {
223 236 $scope.tipoStatusRequisicaoAtendidaParcialmente = result.originalElement;
224 237 });
... ... @@ -271,62 +284,115 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
271 284 });
272 285 };
273 286  
274   - $scope.prepararAtendimentoRequisicoes = function(listaSelecionados) {
275   - $scope.edit = true;
  287 + $scope.prepararAtendimentoRequisicoes = function(atendimentoVH, edit) {
  288 + $scope.edit = edit;
276 289 $scope.atendimentos = [];
277 290 $scope.idsRequisicoesSelecionados = [];
  291 + $scope.atendimentoRequisicaoConsumo.dataAtendimento = new Date();
278 292 $scope.requisicoesSelecionadas = [];
279   - $scope.requisicoesSelecionadas = listaSelecionados;
280   - listaSelecionados.forEach(function(requisicao){
281   - $scope.idsRequisicoesSelecionados.push(requisicao.id);
282   - });
  293 + $scope.requisicoesSelecionadas = atendimentoVH.requisicoesSelecionadas;
  294 +
  295 + delete atendimentoVH.requisicoesSelecionadas;
  296 +
  297 + $scope.idsRequisicoesSelecionados = atendimentoVH.idsRequisicao;
  298 +
283 299 if ($scope.idsRequisicoesSelecionados && $scope.requisicoesSelecionadas && $scope.idsRequisicoesSelecionados.length > 0) {
284   -
285   - if (verificarSelecaoRequisicaoAtendida()) {
286   - $scope.showAlert("warning", $translate.instant('ALMOXARIFADO.MSG.REQUISICAO_JA_ATENDIDA'));
287   - } else {
288   - iniciarAtendimentoRequisicoes();
289   - }
  300 + atendimentoVH.bloquearAtendimento = $scope.edit;
  301 + iniciarAtendimentoRequisicoes(atendimentoVH);
290 302 } else {
291 303 $scope.showAlert("warning", $translate.instant('MSG.NENHUM_ITEM_SELECIONADO'));
292 304 }
293 305 };
294 306  
295   - function verificarSelecaoRequisicaoAtendida() {
296   - var hasRequisicaoAtendida = false;
297   - $scope.requisicoesSelecionadas.forEach(function (requisicao) {
298   - if (requisicao["tipoStatusRequisicao.codigo"] == $scope.TIPO_STATUS_ATENDIDA) {
299   - hasRequisicaoAtendida = true;
300   - return;
301   - }
302   - });
303   -
304   - return hasRequisicaoAtendida;
305   - }
306   -
307   - function iniciarAtendimentoRequisicoes() {
  307 + function iniciarAtendimentoRequisicoes(atendimentoVH) {
308 308 $scope.setLoadingPesquisa(true);
309   - RequisicaoConsumoRepository.atenderRequisicoes($scope.idsRequisicoesSelecionados).then(function(result){
  309 + RequisicaoConsumoRepository.atenderRequisicoes(atendimentoVH).then(function(result){
310 310 result.forEach(function (requisicao) {
311 311 $scope.addRequisicaoConsumoAoAtendimento(requisicao.originalElement);
312 312 });
313   - $scope.$openModal('/cit-almoxarifado-web/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoEditModal.html', 'lg');
  313 + //$scope.$openModal('/cit-almoxarifado-web/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoEditModal.html', 'lg');
  314 + $scope.$showPageEditWorkspace($scope.workspace);
314 315 $scope.setLoading(false);
315 316 });
316 317 }
317 318  
318 319 $scope.addRequisicaoConsumoAoAtendimento = function(req){
319   - var atendimento = {requisicaoConsumo : req};
320   - if(atendimento.requisicaoConsumo.tipoStatusRequisicao.codigo == $scope.TIPO_STATUS_PRONTA_PARA_ATENDIMENTO
321   - || atendimento.requisicaoConsumo.tipoStatusRequisicao.codigo == $scope.TIPO_STATUS_ATENDIDA_PARCIALMENTE){
  320 + if(req.atendimentoRequisicaoConsumo){
  321 + var atendimento = req.atendimentoRequisicaoConsumo;
  322 + delete req.atendimentoRequisicaoConsumo;
  323 +
  324 + atendimento.requisicaoConsumo = req;
  325 +
  326 +
  327 + var contem = false;
  328 + for(var index = atendimento.atendimentoRequisicaoConsumoItems.length - 1; index >= 0; index--){
  329 + atendimento.requisicaoConsumo.requisicaoConsumoItens.forEach(function(item){
  330 + if(item.id === atendimento.atendimentoRequisicaoConsumoItems[index].requisicaoConsumoItem.id){
  331 + contem = true;
  332 + }
  333 + });
  334 +
  335 + if(!contem){
  336 + atendimento.atendimentoRequisicaoConsumoItems.splice(index, 1);
  337 + }else{
  338 + contem = false;
  339 + }
  340 + }
  341 +
  342 + atendimento.atendimentoRequisicaoConsumoItems.forEach(function(atendimentoItem){
  343 + atendimentoItem.$locaisEstoque = [];
  344 + MaterialLocalEstoqueRepository.buscarLocaisEstoquePorIdMaterialIdAlmoxarifado(atendimentoItem.material.id, req.almoxarifado.id).then(function(result) {
  345 + result.forEach(function(localEstoque){
  346 + var atendimentoRequisicaoConsumoItemEndereco = {
  347 + materialLocalEstoque: localEstoque.originalElement
  348 + };
  349 +
  350 + atendimentoItem.$locaisEstoque.push(atendimentoRequisicaoConsumoItemEndereco);
  351 + });
  352 + });
  353 +
  354 + atendimentoItem.$somaQtdAtendida = 0;
  355 + if(atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.length > 1){
  356 + atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.forEach(function(atendimentoItemEndereco){
  357 + atendimentoItem.$somaQtdAtendida += parseFloat(atendimentoItemEndereco.quantidade);
  358 + });
  359 + }
  360 +
  361 + buscarInformacoesParaAtendimento(atendimentoItem);
  362 + });
  363 + $scope.atendimentos.push(atendimento);
  364 +
  365 + }else{
  366 + var atendimento = {requisicaoConsumo : req};
  367 +
322 368 atendimento.requisicaoConsumo.requisicaoConsumoItens.forEach(function (requisicaoConsumoItem) {
323 369 if(!atendimento.atendimentoRequisicaoConsumoItems){
324 370 atendimento.atendimentoRequisicaoConsumoItems = [];
325 371 }
  372 +
326 373 var atendimentoItem = {
327 374 material : requisicaoConsumoItem.materialConsumo,
328   - requisicaoConsumoItem : requisicaoConsumoItem
  375 + requisicaoConsumoItem : requisicaoConsumoItem,
  376 + $locaisEstoque: [],
  377 + atendimentoRequisicaoConsumoItemEnderecos: []
329 378 };
  379 +
  380 + MaterialLocalEstoqueRepository.buscarLocaisEstoquePorIdMaterialIdAlmoxarifado(requisicaoConsumoItem.materialConsumo.id, req.almoxarifado.id).then(function(result) {
  381 + result.forEach(function(localEstoque){
  382 + var atendimentoRequisicaoConsumoItemEndereco = {
  383 + materialLocalEstoque: localEstoque.originalElement
  384 + };
  385 +
  386 + atendimentoItem.$locaisEstoque.push(atendimentoRequisicaoConsumoItemEndereco);
  387 +
  388 + if(localEstoque.localPrincipal){
  389 + atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.push(atendimentoRequisicaoConsumoItemEndereco);
  390 + }
  391 + });
  392 + });
  393 +
  394 + buscarInformacoesParaAtendimento(atendimentoItem);
  395 +
330 396 atendimento.atendimentoRequisicaoConsumoItems.push(atendimentoItem);
331 397 });
332 398 $scope.atendimentos.push(atendimento);
... ... @@ -352,16 +418,39 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
352 418 $scope.finalizarRequisicoes($scope.atendimentoRequisicaoConsumo);
353 419 } else {
354 420 $scope.setLoadingSalva(true);
355   - AtendimentoRequisicaoConsumoRepository.save($scope.atendimentoRequisicaoConsumo).then(function(result) {
356   - $scope.resetForm();
357   - $scope.listaSelecionados = [];
358   - $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO'));
359   - $scope.atendimentoRequisicaoConsumoForm.$submitted = false;
360   - $scope.$modalInstance.dismiss('cancel');
361   - angular.element('#searchAtendimentoRequisicaoConsumo').scope().fetchResult();
362   - $scope.resetForm();
363   - $scope.setLoading(false);
364   - });
  421 + AtendimentoRequisicaoConsumoRepository.validaQuantidadesAtendidas($scope.atendimentoRequisicaoConsumo).then(function(result){
  422 + if(result.materiaisLocalEstoque.length > 0){
  423 + $scope.atendimentos.forEach(function(atendimento){
  424 + atendimento.atendimentoRequisicaoConsumoItems.forEach(function(atendimentoItem){
  425 + atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.forEach(function(itemEndereco){
  426 + result.materiaisLocalEstoque.forEach(function(localEstoque){
  427 + if(itemEndereco.materialLocalEstoque.id === localEstoque.id){
  428 + atendimentoItem.$hasError = true;
  429 + itemEndereco.$hasError = true;
  430 + }
  431 + });
  432 +
  433 + });
  434 + });
  435 + });
  436 + $scope.showAlert("error", result.mensagemErro, " ", false);
  437 + $scope.setLoading(false);
  438 + }else{
  439 + AtendimentoRequisicaoConsumoRepository.save($scope.atendimentoRequisicaoConsumo).then(function(result) {
  440 + $scope.resetForm();
  441 + $scope.listaSelecionados = [];
  442 + $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO'));
  443 + $scope.atendimentoRequisicaoConsumoForm.$submitted = false;
  444 + angular.element('#searchAtendimentoRequisicaoConsumo').scope().fetchResult();
  445 + $scope.resetForm();
  446 +
  447 + $scope.$showPageSearchWorkspace($scope.workspace);
  448 + $scope.atualizaPaginaPesquisa();
  449 +
  450 + $scope.setLoading(false);
  451 + });
  452 + }
  453 + });
365 454 }
366 455 } else {
367 456 $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.ATENDA_AO_MENOS_UMA_REQUISICAO'), " ", false);
... ... @@ -371,6 +460,70 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
371 460 }
372 461  
373 462 };
  463 +
  464 + $scope.validarQuantidadesAtendidas = function(){
  465 + $scope.setLoading(true);
  466 + $scope.atendimentoRequisicaoConsumo.atendimentos = [];
  467 + angular.copy($scope.atendimentos, $scope.atendimentoRequisicaoConsumo.atendimentos);
  468 +
  469 + limparLinhasComErro();
  470 +
  471 + AtendimentoRequisicaoConsumoRepository.validaQuantidadesAtendidas($scope.atendimentoRequisicaoConsumo).then(function(result){
  472 + if(result.materiaisLocalEstoque.length > 0){
  473 + $scope.atendimentos.forEach(function(atendimento){
  474 + atendimento.atendimentoRequisicaoConsumoItems.forEach(function(atendimentoItem){
  475 + atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.forEach(function(itemEndereco){
  476 + result.materiaisLocalEstoque.forEach(function(localEstoque){
  477 + if(itemEndereco.materialLocalEstoque.id === localEstoque.id){
  478 + atendimentoItem.$hasError = true;
  479 + itemEndereco.$hasError = true;
  480 + }
  481 + });
  482 + });
  483 + });
  484 + });
  485 + $scope.showAlert("error", result.mensagemErro, " ", false);
  486 + $scope.setLoading(false);
  487 + }
  488 +
  489 + $scope.setLoading(false);
  490 + });
  491 + }
  492 +
  493 + $scope.validarQuantidadeAtendidaMaiorQuantidadeRequisitada = function(atendimentoItem){
  494 + atendimentoItem.$somaQtdAtendida = 0;
  495 + atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.forEach(function(atendimentoItemEndereco){
  496 + atendimentoItem.$somaQtdAtendida += parseFloat(atendimentoItemEndereco.quantidade);
  497 + });
  498 +
  499 + if(atendimentoItem.$somaQtdAtendida > atendimentoItem.requisicaoConsumoItem.quantidade){
  500 + atendimentoItem.$hasError = true;
  501 + $scope.showAlert("error", $translate.instant('ALMOXARIFADO.VALIDACAO.QUANTIDADE_ATENDIDA_MAIOR_REQUISITADA'), " ", false);
  502 + }
  503 + }
  504 +
  505 + $scope.validarQuantidades = function(atendimentoItem){
  506 + $scope.validarQuantidadesAtendidas();
  507 + $scope.validarQuantidadeAtendidaMaiorQuantidadeRequisitada(atendimentoItem);
  508 + }
  509 +
  510 + function limparLinhasComErro(){
  511 + $scope.atendimentos.forEach(function(atendimento){
  512 + atendimento.atendimentoRequisicaoConsumoItems.forEach(function(atendimentoItem){
  513 + atendimentoItem.atendimentoRequisicaoConsumoItemEnderecos.forEach(function(itemEndereco){
  514 + atendimentoItem.$hasError = false;
  515 + itemEndereco.$hasError = false;
  516 + });
  517 + });
  518 + });
  519 + }
  520 +
  521 + $scope.teste = function(item){
  522 + if(item){
  523 + $scope.aplicarValidacaoDecimal(item);
  524 + $scope.validarQuantidadesAtendidas();
  525 + }
  526 + }
374 527  
375 528 $scope.saveEdit = function(isFinalizado){
376 529 $scope.atendimentoRequisicaoConsumoForm.$submitted = true;
... ... @@ -451,8 +604,9 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
451 604 $scope.finalizarRequisicoes = function(atendimentoRequisicaoConsumo){
452 605 if($scope.idsRequisicoesSelecionados && $scope.idsRequisicoesSelecionados.length > 0){
453 606 $scope.$openModalConfirm({
454   - message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICOES'),
  607 + message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_SALVAR_FINALIZAR_REQUISICAO'),
455 608 callback: function () {
  609 + $scope.$modalConfirmInstance.dismiss('cancel');
456 610 $scope.setLoadingSalva(true);
457 611 AtendimentoRequisicaoConsumoRepository.save(atendimentoRequisicaoConsumo).then(function(result) {
458 612 var idsRequisicoesSelecionados = [];
... ... @@ -462,13 +616,13 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
462 616 RequisicaoConsumoRepository.finalizarRequisicoes({idsRequisicoes : idsRequisicoesSelecionados,
463 617 dataFinalizacao : atendimentoRequisicaoConsumo.$dataFinalizacao}).then(function() {
464 618 angular.element('#searchAtendimentoRequisicaoConsumo').scope().fetchResult();
465   - $scope.$modalConfirmInstance.dismiss('cancel');
466   - $scope.$modalInstance.dismiss('cancel');
467 619 $scope.listaSelecionados = [];
468 620 $scope.resetForm();
469 621 $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO'));
470 622 $scope.atendimentoRequisicaoConsumoForm.$submitted = false;
471 623 $scope.setLoading(false);
  624 + $scope.$showPageSearchWorkspace($scope.workspace);
  625 + $scope.atualizaPaginaPesquisa();
472 626 });
473 627 });
474 628 }
... ... @@ -478,21 +632,94 @@ citApp.controller( &#39;AtendimentoRequisicaoConsumoController&#39;,
478 632 }
479 633 };
480 634  
481   - $scope.buscarInformacoesParaAtendimento = function(atendimentoRequisicaoConsumoItem){
  635 + function buscarInformacoesParaAtendimento(atendimentoRequisicaoConsumoItem){
482 636 atendimentoRequisicaoConsumoItem.organizacao = $scope.estruturaAlmoxarifadoPadrao;
483   - atendimentoRequisicaoConsumoItem.$verInfo = !atendimentoRequisicaoConsumoItem.$verInfo;
484   - if(atendimentoRequisicaoConsumoItem.$verInfo){
485   - $scope.setLoadingPesquisa(true);
486   - AtendimentoRequisicaoConsumoItemRepository.getInformacoesParaRequisicao(atendimentoRequisicaoConsumoItem).then(function(result) {
487   - atendimentoRequisicaoConsumoItem.$info = result.originalElement;
488   - $scope.scrollToCadastro('#tableAtendimentos');
489   - $scope.setLoading(false);
490   - });
491   - }
  637 + AtendimentoRequisicaoConsumoItemRepository.getInformacoesParaRequisicao(atendimentoRequisicaoConsumoItem).then(function(result) {
  638 + atendimentoRequisicaoConsumoItem.$info = result.originalElement;
  639 + });
492 640 };
493 641  
494 642 $scope.apresentarInfoAtendimentoItem = function(atendimento){
495 643 atendimento.$verInfo = !atendimento.$verInfo;
496 644 };
  645 +
  646 + $scope.openModalEnderecosMaterial = function(enderecosItem, enderecosAdicionados, atendimento, atendimentoItem){
  647 + $scope.atendimentoEmEdicao = atendimento;
  648 + $scope.atendimentoItemEmEdicao = atendimentoItem;
  649 +
  650 + $scope.listaEnderecosSelect = [];
  651 +
  652 + if(enderecosAdicionados[0] && enderecosAdicionados[0].materialLocalEstoque){
  653 + if(enderecosAdicionados.length > 0){
  654 + enderecosItem.forEach(function(enderecoItem){
  655 + var contem = false;
  656 + enderecosAdicionados.forEach(function(enderecoAdicionado){
  657 + if(enderecoItem.materialLocalEstoque.id === enderecoAdicionado.materialLocalEstoque.id){
  658 + contem = true;
  659 + }
  660 + });
  661 +
  662 + if(!contem){
  663 + $scope.listaEnderecosSelect.push(enderecoItem);
  664 + }else{
  665 + contem = false;
  666 + }
  667 + });
  668 + }else{
  669 + $scope.listaEnderecosSelect = angular.copy(enderecosItem);
  670 + }
  671 + }else{
  672 + enderecosAdicionados = [];
  673 + $scope.listaEnderecosSelect = angular.copy(enderecosItem);
  674 + }
  675 +
  676 + $scope.listaEnderecosAdicionados = enderecosAdicionados;
  677 + $scope.$openModal('modal-atendimento-item-enderecos.html', 'md');
  678 + }
  679 +
  680 + $scope.addEnderecoToList = function(item){
  681 + if($scope.listaEnderecosAdicionados.indexOf(item) == -1){
  682 + $scope.listaEnderecosAdicionados.push(item);
  683 + $scope.listaEnderecosSelect.splice($scope.listaEnderecosSelect.indexOf(item), 1);
  684 + }
  685 + };
  686 +
  687 + $scope.selectAllEnderecos = function(check){
  688 + $scope.listaEnderecosAdicionados.forEach(function (item) {
  689 + item.$checkedChBox = check;
  690 + });
  691 + };
  692 +
  693 + $scope.removeEnderecoFromList = function(){
  694 + for(var i = $scope.listaEnderecosAdicionados.length - 1; i >= 0; i--){
  695 + if($scope.listaEnderecosAdicionados[i].$checkedChBox){
  696 + $scope.listaEnderecosSelect.push($scope.listaEnderecosAdicionados[i]);
  697 + $scope.listaEnderecosAdicionados.splice(i, 1);
  698 + }
  699 + }
  700 + }
  701 +
  702 + $scope.saveListaEnderecos = function(){
  703 + var hasError = false;
  704 + var mensagemErro = $translate.instant('ALMOXARIFADO.VALIDACAO.QUANTIDADE_ATENDER_SUPERIOR_SALDO_ESTOQUE');
  705 + $scope.atendimentoItemEmEdicao.$somaQtdAtendida = 0;
  706 + $scope.listaEnderecosAdicionados.forEach(function(item){
  707 + if(item.materialLocalEstoque.quantidade + parseFloat(item.quantidadeAnterior) < parseFloat(item.quantidade)){
  708 + hasError = true;
  709 + mensagemErro += "<br />" + item.materialLocalEstoque.endereco.descricao;
  710 + }
  711 +
  712 + if(item.quantidade && !hasError){
  713 + $scope.atendimentoItemEmEdicao.$somaQtdAtendida += parseFloat(item.quantidade);
  714 + }
  715 + });
  716 +
  717 + if(!hasError){
  718 + $scope.atendimentoItemEmEdicao.atendimentoRequisicaoConsumoItemEnderecos = angular.copy($scope.listaEnderecosAdicionados);
  719 + $scope.$modalInstance.dismiss('cancel');
  720 + }else{
  721 + $scope.showAlert('error', mensagemErro, " ", false);
  722 + }
  723 + }
497 724  
498 725 }]);
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/AtendimentoRequisicaoConsumoListController.js
1 1 'use strict';
2 2  
3   -citApp.controller('AtendimentoRequisicaoConsumoListController', ['$scope', 'AtendimentoRequisicaoConsumoRepository', '$translate', '$timeout', 'DominioRepository', 'RequisicaoConsumoRepository',
4   - function AtendimentoRequisicaoConsumoListController($scope, AtendimentoRequisicaoConsumoRepository, $translate, $timeout, DominioRepository, RequisicaoConsumoRepository) {
  3 +citApp.controller('AtendimentoRequisicaoConsumoListController', ['$scope', 'AtendimentoRequisicaoConsumoRepository', '$translate',
  4 + '$timeout', 'DominioRepository', 'RequisicaoConsumoRepository',
  5 + 'EstruturaOrganizacionalAlmoxarifadoRepository','MaterialConsumoRepository','$filter',
  6 + function AtendimentoRequisicaoConsumoListController($scope, AtendimentoRequisicaoConsumoRepository, $translate,
  7 + $timeout, DominioRepository, RequisicaoConsumoRepository, EstruturaOrganizacionalAlmoxarifadoRepository, MaterialConsumoRepository, $filter) {
5 8 $scope.$showAdvancedFilters = false;
  9 + $scope.permiteInterromperAtendimento = false;
6 10 $scope.listaSelecionados = [];
7 11 $scope.resetForm = function() {
8 12 angular.element("#editAtendimentoRequisicaoConsumo").scope().resetForm();
... ... @@ -10,38 +14,51 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
10 14  
11 15 $scope.recarregar = function() {
12 16  
  17 + $scope.filtrarCustomizado = false;
  18 + $scope.atendimentoVH = {};
  19 + $scope.listaUnidadesRequisitantesSelecionadas = [];
  20 + $scope.listaMateriaisConsumoSelecionados = [];
  21 + $scope.listaSelecionados = [];
13 22 // DEFINE CABEÇALHOS DA LISTAGEM
14 23 $scope.headers = [ {title : $translate.instant('ALMOXARIFADO.LABEL.NUMERO_REQUISICAO'), value : 'numeroRequisicao' } ,
15 24 {title : $translate.instant('ALMOXARIFADO.LABEL.STATUS_REQUISICAO'), value : 'tipoStatusRequisicao.descricao' } ,
16   - {title : $translate.instant('ALMOXARIFADO.LABEL.DATA_REQUISICAO'), value : 'dataRequisicao' , filter : 'dateBR'} ,
  25 + {title : $translate.instant('ALMOXARIFADO.LABEL.DATA_REQUISICAO'), value : 'dataRequisicao' , filter : 'dateBR', tamanho : 28} ,
17 26 {title : $translate.instant('ALMOXARIFADO.LABEL.UNIDADE_REQUISITANTE'), value : 'unidadeRequisitante.nome' } ,
18   - {title : $translate.instant('ALMOXARIFADO.LABEL.ALMOXARIFADO'), value : 'almoxarifado.nome' } ,
19   - {title : $translate.instant('ALMOXARIFADO.LABEL.CENTRO_CUSTO'), value : 'centroCusto.descricao' }];
  27 + {title : $translate.instant('ALMOXARIFADO.LABEL.ALMOXARIFADO'), value : 'almoxarifado.nome' },
  28 + {title : $translate.instant('ALMOXARIFADO.LABEL.ATENDIMENTO_INICIADO_USUARIO'), value : 'atendente.username'}];
20 29 // DIFINE FILTROS DE PESQUISA E CAMPOS QUE DEVEM SER APRESENTADOS NA LISTAGEM
21 30 $scope.filterCriteria = {
22 31 start : 1,
23 32 dir : 'asc',
24   - sort : 'id',
  33 + sort : 'desc:numeroRequisicao;tipoStatusRequisicao.codigo',
25 34 limit : 10,
26   - fields: ['id', 'numeroRequisicao', 'tipoStatusRequisicao.descricao', 'dataRequisicao', 'unidadeRequisitante.nome', 'almoxarifado.nome', 'centroCusto.descricao', 'tipoStatusRequisicao.codigo'],
  35 + fields: ['id', 'numeroRequisicao', 'tipoStatusRequisicao.descricao', 'dataRequisicao', 'unidadeRequisitante.nome', 'almoxarifado.nome', 'tipoStatusRequisicao.codigo',
  36 + 'emAtendimento', 'atendente.id', 'atendente.username'],
27 37 filters : [ {type : 'numeric-range', field : 'numeroRequisicao' } ,
28 38 {type : 'dominio', field : 'tipoStatusRequisicao.descricao', listaDominio : []} ,
29 39 {type : 'date-range', field : 'dataRequisicao' } ,
30 40 {type : 'string', field : 'unidadeRequisitante.nome' } ,
31   - {type : 'string', field : 'almoxarifado.nome' } ,
32   - {type : 'string', field : 'centroCusto.descricao' }]
  41 + {type : 'string', field : 'almoxarifado.nome' },
  42 + {type : 'string', field : 'atendente.username' }]
33 43 };
34   -
35   - $scope.filterCriteria.filters.push({type: 'string', field: 'tipoStatusRequisicao.nome', value: 'FINALIZADA', comparison: 'ne', notFilter : true});
  44 +
  45 + $scope.filterCriteria.filters.push({type: 'string', field: 'tipoStatusRequisicao.nome', value: 'DEVOLVIDA', comparison: 'ne', notFilter : true});
36 46 $scope.filterCriteria.filters.push({type: 'string', field: 'tipoStatusRequisicao.nome', value: 'NAO_CONCLUIDA', comparison: 'ne', notFilter : true});
  47 +
37 48 };
38 49  
39 50 $scope.recarregar();
  51 +
  52 + $scope.limparBuscaAvancada = function(){
  53 + $scope.atendimentoVH = {};
  54 + $scope.listaUnidadesRequisitantesSelecionadas = [];
  55 + $scope.listaMateriaisConsumoSelecionados = [];
  56 + };
40 57  
41 58 DominioRepository.findAllDominio('tipoStatusRequisicao').then(function(result) {
42 59 var listaDominio = [];
43 60 angular.forEach(result, function(dominio){
44   - if(dominio.nome != 'FINALIZADA' && dominio.nome != 'NAO_CONCLUIDA'){
  61 + if(dominio.nome != 'NAO_CONCLUIDA' && dominio.nome != 'DEVOLVIDA'){
45 62 listaDominio.push(dominio)
46 63 }
47 64  
... ... @@ -50,15 +67,22 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
50 67 });
51 68  
52 69 // ABRI AtendimentoRequisicaoConsumo SELECIONADA
53   - $scope.abrirVisualizar = function(edit){
54   - var requisicaoConsumo = $scope.atendimentoRequisicaoConsumoChecked;
55   -
56   - if(!requisicaoConsumo) {
57   - $scope.showAlert('warning', !edit ? $translate.instant('MSG.SELECIONE_UM_ITEM_PARA_VISUALIZACAO') : $translate.instant('MSG.SELECIONE_UM_ITEM_PARA_EDICAO'));
  70 + $scope.abrirVisualizar = function(){
  71 +
  72 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  73 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
58 74 return;
59 75 }
60   - angular.element('#editAtendimentoRequisicaoConsumo').scope().getAtendimentoRequisicaoConsumo(requisicaoConsumo, edit);
61   - $scope.$showPageEditWorkspace($scope.workspace);
  76 +
  77 + var idsRequisicoesSelecionados = [];
  78 + $scope.listaSelecionados.forEach(function(requisicao){
  79 + idsRequisicoesSelecionados.push(requisicao.id);
  80 + });
  81 + $scope.atendimentoVH.idsRequisicao = idsRequisicoesSelecionados;
  82 + $scope.atendimentoVH.requisicoesSelecionadas = $scope.listaSelecionados;
  83 + $scope.listaSelecionados = [];
  84 + angular.element('#editAtendimentoRequisicaoConsumo').scope().prepararAtendimentoRequisicoes($scope.atendimentoVH, false);
  85 + $scope.recarregar();
62 86 };
63 87  
64 88 $scope.removerAtendimentoRequisicao = function(){
... ... @@ -85,13 +109,308 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
85 109 };
86 110  
87 111 $scope.iniciarAtendimento = function(){
88   - angular.element('#editAtendimentoRequisicaoConsumo').scope().prepararAtendimentoRequisicoes($scope.listaSelecionados);
  112 +
  113 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  114 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  115 + return;
  116 + }
  117 +
  118 + var permiteAtender = true;
  119 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  120 + if(requisicaoSelecionado['tipoStatusRequisicao.codigo'] == 5){
  121 + permiteAtender = false;
  122 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.NAO_PERMITIDO_ATENDER_REQUISICAO_FINALIZADA'));
  123 + }
  124 + if(requisicaoSelecionado.emAtendimento && requisicaoSelecionado['atendente.id'] != $scope.usuarioLogado.id){
  125 + permiteAtender = false;
  126 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.LABEL.REQUISICAO_CONSUMO') + ' ' + requisicaoSelecionado.numeroRequisicao
  127 + + ' ' + $translate.instant('ALMOXARIFADO.MSG.REQUISICAO_EM_ATENDIMENTO') + ' ' + requisicaoSelecionado['atendente.username']
  128 + + ' ' + $translate.instant('ALMOXARIFADO.MSG.DESMARQUE_REQUISICAO_EM_ATENDIMENTO'));
  129 + return;
  130 + }
  131 + });
  132 +
  133 + if(permiteAtender){
  134 +
  135 + var idsRequisicoesSelecionados = [];
  136 + $scope.listaSelecionados.forEach(function(requisicao){
  137 + idsRequisicoesSelecionados.push(requisicao.id);
  138 + });
  139 + $scope.atendimentoVH.idsRequisicao = idsRequisicoesSelecionados;
  140 + $scope.atendimentoVH.requisicoesSelecionadas = $scope.listaSelecionados;
  141 + $scope.listaSelecionados = [];
  142 + angular.element('#editAtendimentoRequisicaoConsumo').scope().prepararAtendimentoRequisicoes($scope.atendimentoVH, true);
  143 + $scope.recarregar();
  144 + }
  145 + };
  146 + function getIdsRequisicao(){
  147 + $scope.idsSelecionados = [];
  148 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  149 + $scope.idsSelecionados.push(requisicaoSelecionado.id);
  150 + });
  151 + }
  152 +
  153 + $scope.finalizarRequisicao = function(){
  154 +
  155 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  156 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  157 + return;
  158 + }
  159 +
  160 + var permiteFinalizar = true;
  161 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  162 + if(requisicaoSelecionado['tipoStatusRequisicao.codigo'] != 1){
  163 + permiteFinalizar = false;
  164 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.FINALIZAR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL'));
  165 + return;
  166 + }
  167 + });
  168 +
  169 + if(permiteFinalizar){
  170 +
  171 + getIdsRequisicao();
  172 + var atendimentoVH = {idsRequisicao : $scope.idsSelecionados, idOrganizacao : $scope.usuarioLogado.organizacao.id};
  173 +
  174 + AtendimentoRequisicaoConsumoRepository.validarFinalizacaoRequisicoes(atendimentoVH).then(function(result) {
  175 + if(result){
  176 + $scope.$openModalConfirm({
  177 + message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICAO'),
  178 + callback: function () {
  179 +
  180 + var atendimentoVH = {idsRequisicao : $scope.idsSelecionados, idOrganizacao : $scope.usuarioLogado.organizacao.id};
  181 + AtendimentoRequisicaoConsumoRepository.finalizarRequisicoes(atendimentoVH).then(function(result) {
  182 + $scope.$modalConfirmInstance.dismiss('cancel');
  183 + $scope.showAlert('success', $translate.instant('MSG.MG001'), " ", false);
  184 + $scope.recarregar();
  185 + angular.element("#searchAtendimentoRequisicaoConsumo").scope().fetchResult();
  186 + });
  187 + }
  188 + });
  189 + }else{
  190 + $scope.$openModalConfirm({
  191 + message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICAO_NAO_ATENDIDA_COMPLETAMENTE'),
  192 + callback: function () {
  193 +
  194 + var atendimentoVH = {idsRequisicao : $scope.idsSelecionados, idOrganizacao : $scope.usuarioLogado.organizacao.id};
  195 + AtendimentoRequisicaoConsumoRepository.finalizarRequisicoes(atendimentoVH).then(function(result) {
  196 + $scope.$modalConfirmInstance.dismiss('cancel');
  197 + $scope.showAlert('success', $translate.instant('MSG.MG001'), " ", false);
  198 + $scope.recarregar();
  199 + angular.element("#searchAtendimentoRequisicaoConsumo").scope().fetchResult();
  200 + });
  201 + }
  202 + });
  203 + }
  204 + });
  205 +
  206 + }
  207 +
  208 + };
  209 +
  210 + $scope.excluirAtendimento = function(){
  211 +
  212 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  213 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  214 + return;
  215 + }
  216 +
  217 + var permiteExcluir = true;
  218 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  219 + if(requisicaoSelecionado['tipoStatusRequisicao.codigo'] != 1 && requisicaoSelecionado['tipoStatusRequisicao.codigo'] != 5){
  220 + permiteExcluir = false;
  221 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.EXCLUIR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL_FINALIZADA'));
  222 + return;
  223 + }
  224 + });
  225 +
  226 + if(permiteExcluir){
  227 + $scope.$openModalConfirm({
  228 + message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_ALERTA_EXCLUSAO_ATENDIMENTO_REQUISICAO'),
  229 + callback: function () {
  230 +
  231 + getIdsRequisicao();
  232 + var atendimentoVH = {idsRequisicao : $scope.idsSelecionados, idOrganizacao : $scope.usuarioLogado.organizacao.id};
  233 + $scope.$modalConfirmInstance.dismiss('cancel');
  234 + AtendimentoRequisicaoConsumoRepository.excluirAtendimentos(atendimentoVH).then(function(result) {
  235 + $scope.showAlert('success', $translate.instant('MSG.MG001'), " ", false);
  236 + $scope.recarregar();
  237 + angular.element("#searchAtendimentoRequisicaoConsumo").scope().fetchResult();
  238 + });
  239 + }
  240 + });
  241 + }
  242 +
  243 + };
  244 +
  245 + $scope.findEstruturaOrganizacionalUR = function(value){
  246 + return EstruturaOrganizacionalAlmoxarifadoRepository.findEstruturaOrganizacionalUR(value,
  247 + $scope.usuarioLogado.organizacao.id).then(function(result) {
  248 + return $filter('idNotEqual')(result, $scope.listaUnidadesRequisitantesSelecionadas, 'id');
  249 + });
  250 + };
  251 +
  252 + $scope.findMateriaisConsumoByOrganizacao = function(value){
  253 + return MaterialConsumoRepository.findMateriaisConsumoByOrganizacao(value, $scope.usuarioLogado.organizacao.id).then(function(result) {
  254 + return $filter('idNotEqual')(result, $scope.listaMateriaisConsumoSelecionados, "id");
  255 + });
  256 + };
  257 +
  258 + $scope.setUnidadeRequisitante = function(item){
  259 + $scope.listaUnidadesRequisitantesSelecionadas.push(item);
  260 + $timeout(function(){
  261 + $scope.filtroAtendimento.unidadeRequisitanteSelecao = null;
  262 + });
  263 + };
  264 +
  265 + $scope.selectAllUnidadesRequisitantes = function(check){
  266 + angular.forEach($scope.listaUnidadesRequisitantesSelecionadas, function (item) {
  267 + item.$checkedChBox = $scope.filtroAtendimento.unidadeRequisitanteSelectedAll;
  268 + });
  269 + };
  270 +
  271 + $scope.selectAllMaterialConsumo = function(check){
  272 + angular.forEach($scope.listaMateriaisConsumoSelecionados, function (item) {
  273 + item.$checkedChBox = $scope.filtroAtendimento.materialConsumoSelectedAll;
  274 + });
  275 + };
  276 +
  277 + $scope.setMaterialConsumoItens = function(item){
  278 + $scope.listaMateriaisConsumoSelecionados.push(item);
  279 + $timeout(function(){
  280 + $scope.filtroAtendimento.materialConsumoItem = null;
  281 + });
  282 + };
  283 +
  284 + $scope.removerUnidadeRequisitanteSelecionada = function(){
  285 +
  286 + if($scope.filtroAtendimento.unidadeRequisitanteSelectedAll){
  287 + $scope.listaUnidadesRequisitantesSelecionadas = [];
  288 + $scope.filtroAtendimento.unidadeRequisitanteSelectedAll = false;
  289 + }else{
  290 + $scope.listaUnidadesRequisitantesSelecionadas.forEach(function(item, key) {
  291 + if (item.$checkedChBox) {
  292 + $scope.listaUnidadesRequisitantesSelecionadas.splice($scope.listaUnidadesRequisitantesSelecionadas.indexOf(item), 1);
  293 + }
  294 + });
  295 + }
  296 +
  297 + };
  298 +
  299 + $scope.removerMaterialConsumoSelecionado = function(){
  300 +
  301 + if($scope.filtroAtendimento.materialConsumoSelectedAll){
  302 + $scope.listaMateriaisConsumoSelecionados = [];
  303 + $scope.filtroAtendimento.materialConsumoSelectedAll = false;
  304 + }else{
  305 + angular.forEach($scope.listaMateriaisConsumoSelecionados, function (value) {
  306 + if(value.$checkedChBox){
  307 + $scope.listaMateriaisConsumoSelecionados.splice($scope.listaMateriaisConsumoSelecionados.indexOf(value), 1);
  308 + }
  309 + });
  310 + }
  311 + };
  312 +
  313 +
  314 + $scope.atendimentoAvancado = function(){
  315 + $scope.filtroAtendimento = {unidadeRequisitanteSelectedAll : false , materialConsumoSelectedAll : false};
  316 + if(!$scope.listaUnidadesRequisitantesSelecionadas){
  317 + $scope.listaUnidadesRequisitantesSelecionadas = [];
  318 + }
  319 + if(!$scope.listaMateriaisConsumoSelecionados){
  320 + $scope.listaMateriaisConsumoSelecionados = [];
  321 + }
  322 + $scope.$openModal('modal-busca-avancada-requisicao.html', 'md');
  323 + };
  324 +
  325 + $scope.filtrarRequisicoes = function(){
  326 + $scope.setLoading(true);
  327 + $scope.atendimentoVH = {searchParams : $scope.filterCriteria};
  328 + var idsUnidadeRequisitante = [];
  329 +
  330 + if($scope.listaUnidadesRequisitantesSelecionadas && $scope.listaUnidadesRequisitantesSelecionadas.length > 0){
  331 + angular.forEach($scope.listaUnidadesRequisitantesSelecionadas, function (value) {
  332 + idsUnidadeRequisitante.push(value.id);
  333 + });
  334 + $scope.atendimentoVH.idsUnidadesRequisitantes = idsUnidadeRequisitante;
  335 + }
  336 +
  337 + var idsMateriaisConsumo = [];
  338 +
  339 + if($scope.listaMateriaisConsumoSelecionados && $scope.listaMateriaisConsumoSelecionados.length > 0){
  340 + angular.forEach($scope.listaMateriaisConsumoSelecionados, function (value) {
  341 + idsMateriaisConsumo.push(value.id);
  342 + });
  343 + $scope.atendimentoVH.idsMaterais = idsMateriaisConsumo;
  344 + }
  345 +
  346 + return RequisicaoConsumoRepository.filtrarRequisicoesAtendimento($scope.atendimentoVH).then(function(result){
  347 + if(result){
  348 + $scope.listaSelecionados = [];
  349 + $scope.atendimentoRequisicaoConsumoList = result.originalElement.objects;
  350 +
  351 +
  352 +
  353 + $scope.setTotalPages = result.originalElement.totalPages;
  354 + $scope.setTotalItens = result.originalElement.totalItens;
  355 +
  356 + if(!$scope.filtersCopy){
  357 + $scope.filtersCopy = angular.copy($scope.filterCriteria.filters);
  358 + }
  359 + $scope.filtrarCustomizado = true;
  360 + if($scope.setTotalItens == 0){
  361 + $scope.showAlert('warning', $translate.instant('MSG.NENHUM_REGISTRO_ENCONTRADO'), " ", false);
  362 + }
  363 +
  364 + } else {
  365 + $scope.showAlert('warning', $translate.instant('MSG.NENHUM_REGISTRO_ENCONTRADO'), " ", false);
  366 + }
  367 + $scope.$modalInstance.dismiss('cancel');
  368 + $scope.setLoading(false);
  369 + });
  370 +
  371 + };
  372 +
  373 + $scope.interromperAtendimentoIniciado = function(){
  374 +
  375 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  376 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  377 + return;
  378 + }
  379 +
  380 + var permiteInterromperAtendimentoIniciado = true;
  381 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  382 + if(!requisicaoSelecionado.emAtendimento){
  383 + permiteInterromperAtendimentoIniciado = false;
  384 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.INTERROMPER_ATENDIMENTO_NAO_INICIADO'));
  385 + }
  386 + if(requisicaoSelecionado.emAtendimento && requisicaoSelecionado['atendente.id'] != $scope.usuarioLogado.id){
  387 + permiteInterromperAtendimentoIniciado = false;
  388 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.INTERROMPER_ATENDIMENTO_INICIADO_OUTRO_ATENDENTE'));
  389 + return;
  390 + }
  391 + });
  392 +
  393 + if(permiteInterromperAtendimentoIniciado){
  394 + $scope.setLoading(true);
  395 +
  396 + var idsRequisicoesSelecionados = [];
  397 + $scope.listaSelecionados.forEach(function(requisicao){
  398 + idsRequisicoesSelecionados.push(requisicao.id);
  399 + });
  400 +
  401 + var requisicaoVH = { idsRequisicoes : idsRequisicoesSelecionados, statusAtendimentoRequsicao : false};
  402 +
  403 + RequisicaoConsumoRepository.atualizarSituacaoAtendimentoRequisicoes(requisicaoVH).then(function(result) {
  404 + $scope.setLoading(false);
  405 + $scope.recarregar();
  406 + angular.element("#searchAtendimentoRequisicaoConsumo").scope().fetchResult();
  407 + });
  408 + }
89 409 };
90 410  
91 411 //METODO REFERENTE AO RELATORIO
92 412 $scope.gerar = function() {
93   -
94   - if($scope.listaSelecionados.length == 0 || $scope.listaSelecionados.length > 1)
  413 + if($scope.listaSelecionados.length == 0 || $scope.listaSelecionados.length > 1)
95 414 $scope.showAlert("warning", $translate.instant("MSG.SELECIONE_UM_ITEM_PARA_RELATORIO") + " ", false );
96 415 else{
97 416 var ids = '';
... ... @@ -109,5 +428,4 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
109 428 $scope.visualizarRelatorio($scope.url, $translate.instant("ALMOXARIFADO.LABEL.RELATORIO_GUIA_REMESSA"));
110 429 }
111 430 };
112   -
113 431 }]);
114 432 \ No newline at end of file
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/RequisicaoConsumoController.js
1 1 'use strict';
2 2  
3   -citApp.controller('RequisicaoConsumoController', ['$scope', '$filter', 'RequisicaoConsumoRepository', '$translate', '$timeout', 'DominioRepository', 'EstruturaOrganizacionalAlmoxarifadoRepository', 'CatalogoMaterialRepository', 'CatalogoMaterialItemRepository', 'CatalogoMaterialUnidadeConsumidoraRequisitanteItemRepository', 'MaterialConsumoRepository', 'AtendimentoRequisicaoConsumoRepository',
4   - function RequisicaoConsumoController($scope, $filter, RequisicaoConsumoRepository, $translate, $timeout, DominioRepository, EstruturaOrganizacionalAlmoxarifadoRepository, CatalogoMaterialRepository, CatalogoMaterialItemRepository, CatalogoMaterialUnidadeConsumidoraRequisitanteItemRepository, MaterialConsumoRepository, AtendimentoRequisicaoConsumoRepository) {
  3 +citApp.controller('RequisicaoConsumoController', ['$scope', '$filter', 'RequisicaoConsumoRepository', '$translate', '$timeout', 'DominioRepository', 'EstruturaOrganizacionalAlmoxarifadoRepository', 'CatalogoMaterialRepository', 'CatalogoMaterialItemRepository',
  4 + 'CatalogoMaterialUnidadeConsumidoraRequisitanteItemRepository', 'MaterialConsumoRepository', 'AtendimentoRequisicaoConsumoRepository','RequisicaoConsumoItemRepository',
  5 + function RequisicaoConsumoController($scope, $filter, RequisicaoConsumoRepository, $translate, $timeout, DominioRepository, EstruturaOrganizacionalAlmoxarifadoRepository, CatalogoMaterialRepository, CatalogoMaterialItemRepository,
  6 + CatalogoMaterialUnidadeConsumidoraRequisitanteItemRepository, MaterialConsumoRepository, AtendimentoRequisicaoConsumoRepository, RequisicaoConsumoItemRepository) {
5 7  
6 8 // CONSTANTES DOMINIO
7 9 var TIPO_STATUS_REQUISICAO = 'tipoStatusRequisicao';
8   - var NAO_CONCLUIDA = 1;
  10 + var NAO_CONCLUIDA = 3;
9 11 var PRONTA_PARA_ATENDIMENTO = 2;
10 12  
11 13 $scope.requisicaoConsumo = {};
... ... @@ -485,7 +487,13 @@ citApp.controller(&#39;RequisicaoConsumoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;Requisic
485 487  
486 488 // REMOVE ITEM DA REQUISICAO
487 489 $scope.removerRequisicaoConsumoItem = function(){
  490 +
  491 + if($scope.requisicaoConsumo.requisicaoConsumoItens.length == 1 && $scope.requisicaoConsumo.id){
  492 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.VALIDACAO.REMOVER_TODOS_ITENS_REQUISICAO_CONSUMO'));
488 493  
  494 + return;
  495 + }
  496 +
489 497 if(!$scope.requisicaoConsumoItemChecked) {
490 498  
491 499 $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_UM_ITEM_PARA_SER_REMOVIDO'));
... ... @@ -499,12 +507,22 @@ citApp.controller(&#39;RequisicaoConsumoController&#39;, [&#39;$scope&#39;, &#39;$filter&#39;, &#39;Requisic
499 507 message: $translate.instant('MSG.DESEJA_EXCLUIR_ITENS'),
500 508 callback: function () {
501 509  
502   - $scope.$modalConfirmInstance.dismiss('cancel');
503   -
504   - $scope.requisicaoConsumo.requisicaoConsumoItens.splice($scope.requisicaoConsumoItemChecked.$index, 1);
505   -
506   - $scope.showAlert("success", $translate.instant('MSG.REGISTRO_EXCLUIDO'));
507   -
  510 + if($scope.requisicaoConsumoItemChecked.id){
  511 + RequisicaoConsumoItemRepository.remove($scope.requisicaoConsumoItemChecked).then(function(result) {
  512 + $scope.requisicaoConsumo.requisicaoConsumoItens.splice($scope.requisicaoConsumoItemChecked.$index, 1);
  513 + $scope.changeListRequisicaoConsumoItem();
  514 + $scope.$modalConfirmInstance.dismiss('cancel');
  515 +
  516 + $scope.showAlert("success", $translate.instant('MSG.REGISTRO_EXCLUIDO'));
  517 + });
  518 + }else{
  519 + $scope.requisicaoConsumo.requisicaoConsumoItens.splice($scope.requisicaoConsumoItemChecked.$index, 1);
  520 + $scope.changeListRequisicaoConsumoItem();
  521 + $scope.$modalConfirmInstance.dismiss('cancel');
  522 +
  523 + $scope.showAlert("success", $translate.instant('MSG.REGISTRO_EXCLUIDO'));
  524 + }
  525 +
508 526 }
509 527  
510 528 });
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/RequisicaoConsumoListController.js
... ... @@ -58,7 +58,7 @@ citApp.controller(&#39;RequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;RequisicaoConsu
58 58  
59 59 } else {
60 60  
61   - if(requisicaoConsumo !== null && requisicaoConsumo['tipoStatusRequisicao.codigo'] !== 1 && requisicaoConsumo !== null && requisicaoConsumo['tipoStatusRequisicao.codigo'] !== 2){
  61 + if(requisicaoConsumo !== null && requisicaoConsumo['tipoStatusRequisicao.codigo'] !== 3 && requisicaoConsumo !== null && requisicaoConsumo['tipoStatusRequisicao.codigo'] !== 2){
62 62  
63 63 $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.REQUISICAO_DIFERENTE_NAO_CONCLUIDA_PRONTA_ATENDIMENTO'));
64 64 return;
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/repository/AtendimentoRequisicaoConsumoRepository.js
... ... @@ -21,7 +21,23 @@ citApp.factory(&#39;AtendimentoRequisicaoConsumoRepository&#39;, [&#39;RestangularAlmoxarifa
21 21 this.removerAtendimentoRequisicao = function (idsRequisicaoConsumo, idOrganizacao) {
22 22 return this.restangular.one(this.route +'/removerAtendimentoRequisicao').get({idsRequisicaoConsumo : idsRequisicaoConsumo, idOrganizacao : idOrganizacao}).then();
23 23 };
24   -
  24 +
  25 + this.finalizarRequisicoes = function(atendimentoVH){
  26 + return restangularAlmoxarifado.all(this.route + '/finalizarRequisicoes').post(atendimentoVH).then();
  27 + };
  28 +
  29 + this.excluirAtendimentos = function(atendimentoVH){
  30 + return restangularAlmoxarifado.all(this.route + '/excluirAtendimentos').post(atendimentoVH).then();
  31 + };
  32 +
  33 + this.validaQuantidadesAtendidas = function(atendimentoRequisicaoConsumo){
  34 + return restangularAlmoxarifado.all(this.route + "/validaQuantidadesAtendidas").post(atendimentoRequisicaoConsumo).then();
  35 + };
  36 +
  37 + this.validarFinalizacaoRequisicoes = function(atendimentoVH){
  38 + return restangularAlmoxarifado.all(this.route + '/validarFinalizacaoRequisicoes').post(atendimentoVH).then();
  39 + };
  40 +
25 41 }
26 42  
27 43 AbstractRepository.extend(AtendimentoRequisicaoConsumoRepository);
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/repository/RequisicaoConsumoRepository.js
... ... @@ -19,8 +19,20 @@ citApp.factory(&#39;RequisicaoConsumoRepository&#39;, [&#39;RestangularAlmoxarifado&#39;, &#39;Abstr
19 19 return restangularAlmoxarifado.all(this.route + "/finalizarRequisicoes").post(requisicaoVH).then();
20 20 };
21 21  
22   - this.atenderRequisicoes = function(idsRequisicaoConsumo){
23   - return restangularAlmoxarifado.all(this.route + "/atenderRequisicoes").post(idsRequisicaoConsumo).then();
  22 + this.atenderRequisicoes = function(atendimentoVH){
  23 + return restangularAlmoxarifado.all(this.route + "/atenderRequisicoes").post(atendimentoVH).then();
  24 + };
  25 +
  26 + this.filtrarRequisicoesAtendimento = function(atendimentoVH) {
  27 + return this.restangular.all(this.route+ "/filtrarRequisicoesAtendimento").post(atendimentoVH);
  28 + };
  29 +
  30 + this.atualizarSituacaoAtendimento = function(idRequisicao, situacaoAtendimento){
  31 + return this.restangular.one(this.route + "/atualizarSituacaoAtendimento").get({'idRequisicao': idRequisicao, 'situacaoAtendimento': situacaoAtendimento}).then();
  32 + };
  33 +
  34 + this.atualizarSituacaoAtendimentoRequisicoes = function(requisicaoVH) {
  35 + return restangularAlmoxarifado.all(this.route + "/atualizarSituacaoAtendimentoRequisicoes").post(requisicaoVH).then();
24 36 };
25 37 }
26 38  
... ...
cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoEdit.html
... ... @@ -9,25 +9,22 @@
9 9 </button>
10 10 <ul class="dropdown-menu-center dropdown-menu dropdown-caret" role="menu">
11 11 <li>
12   - <a href="#void" ng-click="saveEdit(false)" ><i class="fa fa-file-text-o red"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_APENAS</translate></a>
  12 + <a href="#void" ng-click="saveOrUpdate(false, atendimentoRequisicaoConsumoForm)" ><i class="fa fa-file-text-o red"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_APENAS</translate></a>
13 13 </li>
14 14 <li>
15   - <a href="#void" ng-click="saveEdit(true)" ><i class="fa fa-file-text green"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_E_FINALIZAR_REQUISICOES</translate></a>
  15 + <a href="#void" ng-click="saveOrUpdate(true, atendimentoRequisicaoConsumoForm)" ><i class="fa fa-file-text green"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_E_FINALIZAR_REQUISICOES</translate></a>
16 16 </li>
17 17 </ul>
18 18 </div>
19   - <button class="btn btn-clear" ng-show="!edit" ng-click="edit = true">
20   - <i class="fa fa-pencil blue"></i>
21   - <translate>LABEL.EDITAR</translate>
  19 + <button ng-show="edit" class="btn btn-clear" ng-click="$showPageSearchWorkspace(workspace); atualizaPaginaPesquisa();">
  20 + <i class="fa fa-reply"></i>
  21 + <translate>ALMOXARIFADO.LABEL.CANCELAR_ATENDIMENTO_INICIADO</translate>
22 22 </button>
23   -<!-- <button class="btn btn-clear" ng-click="removerAtendimentoRequisicao();" ng-show="edit"> -->
24   -<!-- <i class="fa fa-times red"></i> -->
25   -<!-- <translate>LABEL.REMOVER</translate> -->
26   -<!-- </button> -->
27   - <button class="btn btn-clear" ng-click="$showPageSearchWorkspace(workspace); atualizaPaginaPesquisa();">
  23 + <button ng-show="!edit" class="btn btn-clear" ng-click="$showPageSearchWorkspace(workspace); atualizaPaginaPesquisa();">
28 24 <i class="fa fa-search"></i>
29 25 <translate>LABEL.PESQUISAR</translate>
30 26 </button>
  27 +
31 28 </div><!-- .col -->
32 29 <div class="col-sm-4 text-right">
33 30 <favorito />
... ... @@ -43,120 +40,229 @@
43 40 </p>
44 41 <div class="modal-body">
45 42  
46   - <fieldset>
47   - <legend><translate>ALMOXARIFADO.LABEL.DADOS_REQUISICAO_CONSUMO</translate></legend>
48   - <div class="row">
49   - <div class="col-md-4">
50   - <label-input-number ng-id="requisicaoConsumo.numeroRequisicao" ng-label="ALMOXARIFADO.LABEL.NUMERO_REQUISICAO"
51   - ng-model="requisicaoConsumo.numeroRequisicao"
52   - ng-obrigatorio="false" ng-disabled="true" />
53   - </div>
54   - <div class="col-md-4">
55   - <label-input ng-id="requisicaoConsumo.tipoStatusRequisicao.descricao" ng-label="LABEL.SITUACAO"
56   - ng-model="requisicaoConsumo.tipoStatusRequisicao.descricao" ng-disabled="true" />
57   - </div>
58   - <div class="col-md-4">
59   - <label-input-data ng-id="requisicaoConsumo.dataRequisicao" ng-label="ALMOXARIFADO.LABEL.DATA_REQUISICAO"
60   - ng-model="requisicaoConsumo.dataRequisicao" ng-disabled="true"
61   - ng-mode="day" ng-format="dd/MM/yyyy" />
62   - </div>
63   - </div>
64   - <div class="col-sm-12" style="margin-top: 20px">
65   - <div class="row margin-top">
66   - <div class="col-sm-12">
67   - <div class="panel panel-default">
68   - <!-- .panel-heading -->
69   - <table class="table table-striped table-bordered table-hover">
70   - <thead>
71   - <tr>
72   - <th width="45%" class="text-center"><translate>LABEL.DESCRICAO</translate></th>
73   - <th width="25%" class="text-center"><translate>LABEL.UNIDADE_MEDIDA</translate></th>
74   - <th width="25%" class="text-center"><translate>ALMOXARIFADO.LABEL.QUANTIDADE_REQUERIDA</translate></th>
75   -
76   - </tr>
77   - </thead>
78   - <tbody>
79   - <tr ng-repeat="requisicaoConsumoItem in requisicaoConsumo.requisicaoConsumoItens">
80   - <td class="text-center">{{requisicaoConsumoItem.materialConsumo.descricao}}</td>
81   - <td class="text-center">{{requisicaoConsumoItem.materialConsumo.unidadeArmazenamento.descricao}}</td>
82   - <td>
83   - <div class="col-md-12">
84   - <label-input-decimal ng-id="requisicaoConsumoItem.quantidade$index"
85   - ng-model="requisicaoConsumoItem.quantidade" form="requisicaoConsumoForm" ng-disabled="true" ng-custom-maxlength="14"
86   - ng-precisao="requisicaoConsumoItem.materialConsumo.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 0 : 2"/>
87   - </div>
88   - </td>
89   - </tr>
90   - <tr ng-hide="requisicaoConsumo.requisicaoConsumoItens.length > 0">
91   - <td colspan="4" class="text-center"><translate>LABEL.TABELA_VAZIA</translate></td>
92   - </tr>
93   - </tbody>
94   - </table>
95   - <div class="row">
96   - <div class="col-sm-4 text-left">
97   - <a ng-href="#top"></a>
  43 + <fieldset id="tableAtendimentos" ng-show="atendimentos.length > 0">
  44 + <legend id="top">
  45 + <label ng-class="{'has-error' : atendimentoRequisicaoConsumoForm.$submitted && atendimentos && atendimentos.length < 1}">
  46 + <translate>ALMOXARIFADO.LABEL.DADOS_ATENDIMENTO_REQUISICAO_CONSUMO</translate>
  47 + <span class='red'>*</span> <i ng-show="atendimentoRequisicaoConsumoForm.$submitted && atendimentos && atendimentos.length < 1"
  48 + class='fa fa-warning red'
  49 + tooltip="{{$translate.instant('DADOS_ATENDIMENTO_REQUISICAO_CONSUMO') + ' ' +$translate.instant('LABEL.CAMPO_OBRIGATORIO')}}"
  50 + tooltip-placement='top'></i>
  51 + </label>
  52 + </legend>
  53 + <!-- <div class="row"> -->
  54 + <!-- <div class="col-sm-12"> -->
  55 + <!-- <auto-complete ng-id="almoxarifado" ng-label="ALMOXARIFADO.LABEL.ALMOXARIFADO" ng-model="estruturaAlmoxarifadoPadrao" ng-obrigatorio="true" ng-find="findAutoCompleteAlmoxarifado(value)" ng-item="item.nome + ' - ' + item.classificacao" /> -->
  56 + <!-- </div> -->
  57 + <!-- </div> -->
  58 + <div class="row">
  59 + <div class="col-md-6">
  60 + <label-input-data ng-id="atendimentoRequisicaoConsumo.dataAtendimento" ng-label="ALMOXARIFADO.LABEL.DATA_ATENDIMENTO"
  61 + ng-model="atendimentoRequisicaoConsumo.dataAtendimento" form="atendimentoRequisicaoConsumoForm" ng-obrigatorio="true"
  62 + ng-show="edit" ng-mode="day" ng-format="dd/MM/yyyy" />
  63 + </div>
  64 + <div class="col-md-6" ng-if="atendimentos.length == 1">
  65 + <p>
  66 + <small><span class="red" ><translate>ALMOXARIFADO.MSG.INFO_ATENDIMENTO_INICIADO</translate></span></small>
  67 + </p>
  68 + </div>
  69 + <div class="col-md-6" ng-if="atendimentos.length > 1">
  70 + <p>
  71 + <small><span class="red"><translate>ALMOXARIFADO.MSG.INFO_ATENDIMENTOS_INICIADOS</translate></span></small>
  72 + </p>
  73 + </div>
  74 + </div>
  75 + <div style="margin-top: 20px;" ng-repeat="atendimento in atendimentos">
  76 + <div class="widget-box margin-bottom">
  77 + <div class="widget-header">
  78 + <h2 class="widget-title" style="font-size: 16px !important">
  79 + <label><translate>ALMOXARIFADO.LABEL.REQUISICAO</translate>: {{atendimento.requisicaoConsumo.numeroRequisicao}}</label>
  80 + </h2>
  81 + <div class="widget-toolbar">
  82 + <a href="#void" ng-click="widgetAtendimentoCollapsed = !widgetAtendimentoCollapsed">
  83 + <i class="fa" ng-class="{'fa-chevron-up': widgetAtendimentoCollapsed, 'fa-chevron-down': !widgetAtendimentoCollapsed}"></i>
  84 + </a>
  85 + <a href="#void" style="margin-left: 3px" ng-click="removerRequisicaoDoAtendimento($index)" ng-show="edit">
  86 + <i class="fa fa-trash-o bigger-130 red" tooltip="{{$translate.instant('ALMOXARIFADO.MSG.REMOVER_REQUISICAO_ATENDIMENTO')}}"></i>
  87 + </a>
  88 + </div>
  89 + </div>
  90 + <div collapse="!widgetAtendimentoCollapsed" class="widget-body">
  91 + <div class="widget-main clearfix">
  92 + <div class="row">
  93 + <div class="col-md-3">
  94 + <label-input-number ng-id="atendimento.requisicaoConsumo.numeroRequisicao$index" ng-label="ALMOXARIFADO.LABEL.NUMERO_ATENDIMENTO"
  95 + ng-model="atendimento.requisicaoConsumo.numeroRequisicao" ng-disabled="true" />
  96 + </div>
  97 + <div class="col-md-3">
  98 + <label-input ng-type="text" ng-id="atendimento.requisicaoConsumo.tipoStatusRequisicao.descricao$index" ng-label="ALMOXARIFADO.LABEL.STATUS_ATUAL"
  99 + ng-model="atendimento.requisicaoConsumo.tipoStatusRequisicao.descricao" ng-disabled="true" />
  100 + </div>
  101 + <div class="col-md-3">
  102 + <label-input ng-type="text" ng-id="atendimento.requisicaoConsumo.dataRequisicao$index" ng-label="ALMOXARIFADO.LABEL.DATA_REQUISICAO"
  103 + ng-model="atendimento.requisicaoConsumo.dataRequisicao" ng-disabled="true" />
  104 + </div>
  105 + </div>
  106 + <div class="row">
  107 + <div class="col-md-6">
  108 + <label-input ng-type="text" ng-id="atendimento.requisicaoConsumo.almoxarifado.codigoENome$index" ng-label="ALMOXARIFADO.LABEL.ALMOXARIFADO"
  109 + ng-model="atendimento.requisicaoConsumo.almoxarifado.codigoENome" ng-disabled="true" />
  110 + </div>
  111 + <div class="col-md-6">
  112 + <label-input ng-type="text" ng-id="atendimento.requisicaoConsumo.unidadeRequisitante.codigoENome$index" ng-label="ALMOXARIFADO.LABEL.UNIDADE_REQUISITANTE"
  113 + ng-model="atendimento.requisicaoConsumo.unidadeRequisitante.codigoENome" ng-disabled="true" />
  114 + </div>
  115 + </div>
  116 + <div class="row" ng-show="edit">
  117 + <div class="col-md-12">
  118 + <input type="checkbox" ng-model="exibirCompletos">
  119 + <label><translate>ALMOXARIFADO.LABEL.MOSTRAR_ATENDIMENTOS_CONCLUIDOS</translate>
  120 + </div>
  121 + </div>
  122 + <div class="row margin-top">
  123 + <div class="col-sm-12">
  124 + <div class="panel panel-default">
  125 + <!-- .panel-heading -->
  126 + <table class="table table-striped table-bordered table-hover">
  127 + <thead>
  128 + <tr>
  129 + <th class="text-center" ng-show="edit"><translate>ALMOXARIFADO.LABEL.INFO</translate></th>
  130 + <th class="text-center" width="20%"><translate>LABEL.MATERIAL</translate></th>
  131 + <th class="text-center"><translate>LABEL.UNIDADE_MEDIDA</translate></th>
  132 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.QTD_EM_ESTOQUE</translate></th>
  133 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.QTD_FORNECIDA_REQUISICAO</translate></th>
  134 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.QUANTIDADE_PEDIDA</translate></th>
  135 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.QUANTIDADE_ATENDIDA</translate></th>
  136 + <th class="text-center" width="20%"><translate>ALMOXARIFADO.LABEL.ENDERECO_ESTOQUE</translate></th>
  137 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.ATENDER</translate><span class="red"> *</span></th>
  138 + </tr>
  139 + </thead>
  140 + <tbody>
  141 + <tr ng-repeat-start="atendimentoRequisicaoConsumoItem in atendimento.atendimentoRequisicaoConsumoItems"
  142 + ng-class="atendimentoRequisicaoConsumoItem.$hasError ? 'danger' : ''" ng-hide="atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidade == atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidadeAtendida && !exibirCompletos && edit"
  143 + tooltip="{{atendimentoRequisicaoConsumoItem.$hasError ? $translate.instant('ALMOXARIFADO.VALIDACAO.SOMA_ITENS_ATENDER_MAIOR_ESTOQUE_TOOLTIP') : ''}}">
  144 +
  145 + <td class="text-center" ng-show="edit">
  146 + <button type="button" ng-click="atendimentoRequisicaoConsumoItem.$verInfo = !atendimentoRequisicaoConsumoItem.$verInfo">
  147 + <i class="ace-icon fa {{atendimentoRequisicaoConsumoItem.$verInfo ? 'fa-minus' : 'fa-plus'}} bigger-125"></i>
  148 + </button>
  149 + </td>
  150 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.material.descricao}}</td>
  151 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.material.unidadeArmazenamento.sigla}}</td>
  152 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.qtdEstoque}}</td>
  153 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.qtdFornecidaUltimaRequisicao ? atendimentoRequisicaoConsumoItem.$info.qtdFornecidaUltimaRequisicao : "-"}}</td>
  154 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidade}}</td>
  155 + <td class="text-center" ng-show="novoAtendimento">{{atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidadeAtendida
  156 + ? atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidadeAtendida : 0}}</td>
  157 + <td class="text-center" ng-hide="novoAtendimento">{{atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidadeAtendida
  158 + - atendimentoRequisicaoConsumoItem.$quantidade}}</td>
  159 +
  160 + <td class="text-center">
  161 + <table style="width: 100%">
  162 + <tr>
  163 + <td ng-show="atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos.length <= 1">
  164 + <label-select ng-id="atendimentoRequisicaoConsumoItem.materialLocalEstoque$index" ng-obrigatorio="true" ng-disabled="!edit"
  165 + ng-model="atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos[0]" ng-list="atendimentoRequisicaoConsumoItem.$locaisEstoque"
  166 + form="atendimentoRequisicaoConsumoForm" track-by="track by atendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.id"
  167 + ng-custom-options="atendimentoRequisicaoConsumoItemEndereco as atendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.endereco.descricao for atendimentoRequisicaoConsumoItemEndereco"></label-select>
  168 + </td>
  169 + <td ng-show="atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos.length > 1">
  170 + <translate>ALMOXARIFADO.LABEL.MULTIPLOS_ENDERECOS</translate>
  171 + </td>
  172 + <td style="padding-left: 8px; text-align: right;">
  173 + <i class="fa fa-plus green" style="cursor: pointer;"
  174 + ng-click="openModalEnderecosMaterial(atendimentoRequisicaoConsumoItem.$locaisEstoque, atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos, atendimento, atendimentoRequisicaoConsumoItem)"
  175 + tooltip="{{$translate.instant('ALMOXARIFADO.MSG.ATENDER_MAIS_DE_UM_ENDERECO')}}"/>
  176 + </td>
  177 + </tr>
  178 + </table>
  179 + </td>
  180 +
  181 + <td ng-if="atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos.length <= 1" class="text-center">
  182 + <label-input-decimal ng-id="atendimentoRequisicaoConsumoItem.quantidade$index" ng-evento-blur="aplicarValidacaoDecimal" ng-evento-keyup="validarQuantidades(atendimentoRequisicaoConsumoItem)"
  183 + ng-model="atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos[0].quantidade" form="atendimentoRequisicaoConsumoForm" ng-disabled="!edit" ng-custom-maxlength="{{atendimentoRequisicaoConsumoItem.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 4 : 11}}"
  184 + ng-precisao="{{atendimentoRequisicaoConsumoItem.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 0 : 'decimal'}}" />
  185 + </td>
  186 + <td ng-if="atendimentoRequisicaoConsumoItem.atendimentoRequisicaoConsumoItemEnderecos.length > 1">
  187 + <label-input ng-type="text" ng-model="atendimentoRequisicaoConsumoItem.$somaQtdAtendida" ng-disabled="true"></label-input>
  188 + </td>
  189 +
  190 + </tr>
  191 + <tr ng-show="atendimentoRequisicaoConsumoItem.$verInfo == true" class="table-subgrid" ng-repeat-end>
  192 + <td colspan="9">
  193 + <table class="table table-bordered table-striped">
  194 + <thead>
  195 + <tr>
  196 + <th class="text-center" colspan="1"><translate>LABEL.GERAL</translate></th>
  197 + <th class="text-center" colspan="8"><translate>ALMOXARIFADO.LABEL.UNIDADE_REQUISITANTE</translate></th>
  198 + </tr>
  199 + <tr>
  200 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.CONSUMO_MEDIO_MENSAL</translate></th>
  201 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.CONSUMO_EXERCICIO_ANTERIOR</translate></th>
  202 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.CONSUMO_EXERCICIO_ATUAL</translate></th>
  203 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.CONSUMO_12_MESES</translate></th>
  204 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.CONSUMO_MEDIO_MENSAL</translate></th>
  205 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.NUMERO_ULTIMA_REQUISICAO</translate></th>
  206 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.DATA_ULTIMA_REQUISICAO</translate></th>
  207 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.QTD_REQUERIDA_REQUISICAO</translate></th>
  208 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.QTD_FORNECIDA_REQUISICAO</translate></th>
  209 + </tr>
  210 + </thead>
  211 + <tbody>
  212 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.consumoMedioMensalMaterial}}</td>
  213 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.consumoExercicioAnterior}}</td>
  214 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.consumoExercicioAtual}}</td>
  215 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.consumo12meses}}</td>
  216 + <td class="text-center">{{atendimentoRequisicaoConsumoItem.$info.consumoMedioMensalUR}}</td>
  217 + <td class="text-center">
  218 + {{atendimentoRequisicaoConsumoItem.$info.numeroUltimaRequisicao ? atendimentoRequisicaoConsumoItem.$info.numeroUltimaRequisicao : "-"}}
  219 + </td>
  220 + <td class="text-center">
  221 + {{atendimentoRequisicaoConsumoItem.$info.dataUltimaRequisicao ? (atendimentoRequisicaoConsumoItem.$info.dataUltimaRequisicao | dateBR) : "-"}}
  222 + </td>
  223 + <td class="text-center">
  224 + {{atendimentoRequisicaoConsumoItem.$info.qtdRequeridaUltimaRequisicao ? atendimentoRequisicaoConsumoItem.$info.qtdRequeridaUltimaRequisicao : "-"}}
  225 + </td>
  226 + <td class="text-center">
  227 + {{atendimentoRequisicaoConsumoItem.$info.qtdFornecidaUltimaRequisicao ? atendimentoRequisicaoConsumoItem.$info.qtdFornecidaUltimaRequisicao : "-"}}
  228 + </td>
  229 + </tbody>
  230 + </table>
  231 + <table class="table table-bordered table-striped">
  232 + <thead>
  233 + <tr>
  234 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.ENDERECO_ESTOQUE</translate></th>
  235 + <th class="text-center"><translate>ALMOXARIFADO.LABEL.SALDO_ENDERECO</translate></th>
  236 + <th class="text-center"><translate>LABEL.CAPACIDADE</translate></th>
  237 + </tr>
  238 + </thead>
  239 + <tbody ng-repeat="enderecoEstoque in atendimentoRequisicaoConsumoItem.$locaisEstoque">
  240 + <td class="text-center">{{enderecoEstoque.materialLocalEstoque.endereco.descricao}}</td>
  241 + <td class="text-center">{{enderecoEstoque.materialLocalEstoque.quantidade}}</td>
  242 + <td class="text-center">{{enderecoEstoque.materialLocalEstoque.capacidade}}</td>
  243 + </tbody>
  244 + </table>
  245 + </td>
  246 + </tr>
  247 + </tbody>
  248 + </table>
  249 + <div class="row">
  250 + <div class="col-sm-4 text-left">
  251 + <a ng-href="#top"></a>
  252 + </div>
  253 + </div>
  254 + </div>
  255 + </div>
98 256 </div>
99 257 </div>
100 258 </div>
101 259 </div>
102 260 </div>
103   - </div>
104   - </fieldset>
105   -
106   - <fieldset>
107   -
108   - <legend id="top">
109   - <label ng-class="{'has-error' : formDialogAtendimento.$submitted && atendimentos && atendimentos.length < 1}">
110   - <translate>ALMOXARIFADO.LABEL.DADOS_ATENDIMENTO</translate>
111   - <span class='red'>*</span> <i ng-show="formDialogAtendimento.$submitted && atendimentos && atendimentos.length < 1"
112   - class='fa fa-warning red'
113   - tooltip="{{$translate.instant('DADOS_ATENDIMENTO_REQUISICAO_CONSUMO') + ' ' +$translate.instant('LABEL.CAMPO_OBRIGATORIO')}}"
114   - tooltip-placement='top'></i>
115   - </label>
116   - </legend>
117   - <div class="row">
118   - <table class="table table-striped table-bordered table-hover">
119   - <thead>
120   - <tr>
121   - <th width="5%" class="text-center"> </th>
122   - <th class="text-center"><translate>ALMOXARIFADO.LABEL.NUMERO_ATENDIMENTO</translate></th>
123   - <th class="text-center"><translate>ALMOXARIFADO.LABEL.DATA_ATENDIMENTO</translate></th>
124   - </tr>
125   - </thead>
126   - <tbody>
127   - <tr ng-repeat-start="atendimento in atendimentos">
128   - <td class="text-center">
129   - <button type="button" ng-click="apresentarInfoAtendimentoItem(atendimento)">
130   - <i class="ace-icon fa {{atendimento.$verInfo ? 'fa-minus' : 'fa-plus'}} bigger-125"></i>
131   - </button>
132   - </td>
133   - <td class="text-center">{{atendimento.numeroAtendimento}}</td>
134   - <td class="text-center">{{atendimento.dataAtendimento}}</td>
135   - </tr>
136   - <tr ng-show="atendimento.$verInfo == true" class="table-subgrid" ng-repeat-end>
137   - <td colspan="6">
138   - <table class="table table-bordered table-striped">
139   - <thead>
140   - <tr>
141   - <th class="text-center"><translate>LABEL.MATERIAL</translate></th>
142   - <th class="text-center"><translate>ALMOXARIFADO.LABEL.QUANTIDADE_ATENDIDA</translate></th>
143   - </tr>
144   - </thead>
145   - <tbody>
146   - <tr ng-repeat="atendimentoItem in atendimento.atendimentoRequisicaoConsumoItems">
147   - <td style="width: 56%" class="text-center">{{atendimentoItem.material.descricao}}</td>
148   - <td class="text-center"><label-input-decimal ng-id="atendimentoItem.quantidade$index" ng-obrigatorio="true"
149   - ng-model="atendimentoItem.quantidade" ng-custom-maxlength="14" ng-disabled="!edit"
150   - ng-precisao="atendimentoItem.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 0 : 2" /></td>
151   - </tr>
152   - </tbody>
153   - </table>
154   - </td>
155   - </tr>
156   - </tbody>
157   - </table>
158   - </div>
159   - </fieldset>
160   - </div>
  261 + </fieldset>
  262 + </div>
  263 + <script type="text/ng-template" id="modal-atendimento-item-enderecos.html">
  264 + <div ng-include src="'/cit-almoxarifado-web/html/atendimentoRequisicaoConsumo/dialog_atendimento_item_enderecos.html'" />
  265 + </script>
161 266 </form>
162 267 </div>
  268 +
... ...
cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoEditModal.html
... ... @@ -13,10 +13,9 @@
13 13 </li>
14 14 </ul>
15 15 </div>
16   - <button ng-click="$dismiss('cancel');" class="btn btn-clear">
17   - <i class="fa fa-times red"></i>
18   - <translate>LABEL.FECHAR</translate>
19   - </button>
  16 + <button class="btn btn-clear" ng-click="$showPageSearchWorkspace(workspace); atualizaPaginaPesquisa();">
  17 + <i class="fa fa-search"></i> <translate>LABEL.PESQUISAR</translate>
  18 + </button>
20 19 </div><!-- .modal-header -->
21 20  
22 21 <div class="modal-body">
... ... @@ -56,7 +55,7 @@
56 55 <thead>
57 56 <tr>
58 57 <th class="text-center" ng-show="edit"><translate>ALMOXARIFADO.LABEL.INFO</translate></th>
59   - <th class="text-center" width="30%"><translate>LABEL.MATERIAL</translate></th>
  58 + <th class="text-center" width="20%"><translate>LABEL.MATERIAL</translate></th>
60 59 <th class="text-center"><translate>LABEL.UNIDADE_MEDIDA</translate></th>
61 60 <th class="text-center"><translate>ALMOXARIFADO.LABEL.QUANTIDADE_PEDIDA</translate></th>
62 61 <th class="text-center"><translate>ALMOXARIFADO.LABEL.QUANTIDADE_ATENDIDA</translate></th>
... ...
cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoList.html
... ... @@ -5,32 +5,29 @@
5 5  
6 6 <button class="btn btn-clear" ng-click="iniciarAtendimento();">
7 7 <i class="fa fa-plus-circle yellow-dark"></i>
8   - <translate>ALMOXARIFADO.LABEL.INICIAR_ATENDIMENTO</translate>
  8 + <translate>ALMOXARIFADO.LABEL.ATENDER</translate>
9 9 </button>
10 10  
11   - <button title="{{$translate.instant('ALMOXARIFADO.LABEL.RELATORIO_GUIA_REMESSA')}}"
12   - alt="{{$translate.instant('ALMOXARIFADO.LABEL.RELATORIO_GUIA_REMESSA')}}"
13   - class="btn btn-clear" type="button" ng-disabled="false"
14   - ng-click="gerar();">
15   - <i class="fa fa-print"></i>
16   - <translate>ALMOXARIFADO.LABEL.RELATORIO_GUIA_REMESSA</translate>
17   - </button>
  11 + <button class="btn btn-clear" ng-click="finalizarRequisicao();">
  12 + <i class="fa fa-file-text-o green"></i>
  13 + <translate>ALMOXARIFADO.LABEL.FINALIZAR_REQUISICAO</translate>
  14 + </button>
  15 +
  16 + <button class="btn btn-clear" ng-click="excluirAtendimento()">
  17 + <i class="fa fa-times red"></i>
  18 + <translate>ALMOXARIFADO.LABEL.EXCLUIR_ATENDIMENTO</translate>
  19 + </button>
18 20  
19   - <button ng-show="listaSelecionados.length == 1" class="btn btn-clear" ng-click="abrirVisualizar(false);">
  21 + <button class="btn btn-clear" ng-click="abrirVisualizar();">
20 22 <i class="fa fa-search blue"></i>
21 23 <translate>LABEL.VISUALIZAR</translate>
22 24 </button>
23 25  
24   - <button ng-show="listaSelecionados.length == 1" class="btn btn-clear" ng-click="abrirVisualizar(true);">
25   - <i class="fa fa-pencil blue"></i>
26   - <translate>LABEL.EDITAR</translate>
  26 + <button class="btn btn-clear" ng-click="interromperAtendimentoIniciado()">
  27 + <i class="fa fa-times-circle-o orange"></i>
  28 + <translate>ALMOXARIFADO.LABEL.INTERROMPER_ATENDIMENTO_INICIADO</translate>
27 29 </button>
28 30  
29   -<!-- <button class="btn btn-clear" ng-click="removerAtendimentoRequisicao();"> -->
30   -<!-- <i class="fa fa-times red"></i> -->
31   -<!-- <translate>LABEL.REMOVER</translate> -->
32   -<!-- </button> -->
33   -
34 31 <span class="divider-vertical"></span>
35 32  
36 33 <filtros ng-filter="filterCriteria" ng-workspace="workspace"></filtros>
... ... @@ -48,9 +45,134 @@
48 45 </div><!-- .bar-buttons-action -->
49 46  
50 47 <breadcrumb ng-workspace="workspace"></breadcrumb>
  48 +
  49 + <div class="row" style="margin-bottom: 10px">
  50 + <div class="col-sm-2 text-left">
  51 + <button class="btn btn-sm btn-primary" type="button" ng-click="atendimentoAvancado();" style="margin-top: 26px;">
  52 + <translate>LABEL.BUSCA_AVANCADA</translate>
  53 + </button>
  54 + </div>
  55 + </div>
  56 +
  57 + <div class="alert alert-warning" title="{{$translate.instant('ALMOXARIFADO.LABEL.LIMPAR_BUSCA_AVANCADA')}}" alt="{{$translate.instant('ALMOXARIFADO.LABEL.LIMPAR_BUSCA_AVANCADA')}}"
  58 + role="alert" ng-show="atendimentoVH.idsMaterais && atendimentoVH.idsMaterais.length > 0">
  59 + <a class="close" data-dismiss="alert" ng-click="limparBuscaAvancada()" aria-label="close">&times;</a>
  60 + <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
  61 + <translate>ALMOXARIFADO.MSG.INFO_FILTRO_MATERIAL_REQUISICAO</span></translate>
  62 + </div>
51 63  
52 64 <list-view ng-lista="atendimentoRequisicaoConsumoList" ng-repository="RequisicaoConsumoRepository" ng-use-custom-remove="false"
53 65 ng-headers="headers" ng-filter-criteria="filterCriteria" ng-item-selecionado="atendimentoRequisicaoConsumoChecked"
54   - ng-lista-itens-selecionados="listaSelecionados" ng-check-on="true"></list-view>
  66 + ng-lista-itens-selecionados="listaSelecionados" ng-check-on="true" ng-exibir-boolean-sim-nao="true"
  67 + set-total-pages="setTotalPages" set-total-itens="setTotalItens" ng-marcar-linha-grid-atributo="emAtendimento"
  68 + use-custom-filter-temp="filtrarCustomizado" ng-custom-filter="filtrarRequisicoes()"></list-view>
55 69  
56 70 </div><!-- .page-content -->
  71 +
  72 +
  73 +<script type="text/ng-template" id="modal-busca-avancada-requisicao.html">
  74 + <form name="formDialogBuscaAvancadaRequisicao" novalidate >
  75 + <div class="modal-header">
  76 + <button class="btn btn-clear" type="button" title="{{$translate.instant('ALMOXARIFADO.LABEL.FILTRAR')}}" alt="{{$translate.instant('ALMOXARIFADO.LABEL.FILTRAR')}}" ng-click="filtrarRequisicoes();">
  77 + <i class="fa fa-plus-circle yellow-dark"></i>
  78 + <translate>ALMOXARIFADO.LABEL.FILTRAR</translate>
  79 + </button>
  80 +
  81 + <button title="{{$translate.instant('LABEL.LIMPAR')}}" alt="{{$translate.instant('LABEL.LIMPAR')}}" ng-click="limparBuscaAvancada()" class="btn btn-clear" type="button">
  82 + <i class="fa fa-eraser"></i>
  83 + <translate>LABEL.LIMPAR</translate>
  84 + </button>
  85 +
  86 + <button title="{{$translate.instant('LABEL.CANCELAR')}}" alt="{{$translate.instant('LABEL.CANCELAR')}}" ng-click="$dismiss('cancel');" class="btn btn-clear" type="button">
  87 + <i class="fa fa-times red"></i>
  88 + <translate>LABEL.CANCELAR</translate>
  89 + </button>
  90 + </div>
  91 +
  92 + <div class="modal-body">
  93 +
  94 + <div class="row">
  95 + <div class="col-md-12">
  96 + <auto-complete ng-id="materialConsumoItem" ng-label="ALMOXARIFADO.LABEL.MATERIAL_CONSUMO" ng-model="filtroAtendimento.materialConsumoItem"
  97 + ng-find="findMateriaisConsumoByOrganizacao(value)" ng-item="item.codigoEDescricao" ng-set-result="setMaterialConsumoItens(item)" />
  98 + </div>
  99 + </div>
  100 + <div class="row" ng-show="listaMateriaisConsumoSelecionados.length > 0">
  101 + <div class="col-sm-12">
  102 + <div class="panel panel-default">
  103 + <div class="panel-heading clearfix">
  104 + <button class="btn btn-clear" type="button" ng-click="removerMaterialConsumoSelecionado(materialConsumoSelectedAll)">
  105 + <i class="fa fa-times red"></i>
  106 + <translate>LABEL.REMOVER</translate>
  107 + </button>
  108 + </div>
  109 + <table class="table table-bordered table-striped">
  110 + <thead>
  111 + <tr>
  112 + <th style="width: 3%;" class="text-center">
  113 + <input type="checkbox" ng-model="filtroAtendimento.materialConsumoSelectedAll" ng-click="selectAllMaterialConsumo(materialConsumoSelectedAll)"/>
  114 + </th>
  115 + <th style="text-align: center">
  116 + <translate>ALMOXARIFADO.LABEL.MATERIAL_CONSUMO</translate>
  117 + </th>
  118 + </tr>
  119 + </thead>
  120 + <tbody ng-repeat="materialConsumoSelecionado in listaMateriaisConsumoSelecionados">
  121 + <tr>
  122 + <td class="text-center">
  123 + <input type="checkbox" ng-checked="materialConsumoSelecionado.$checkedChBox" ng-model="materialConsumoSelecionado.$checkedChBox"/>
  124 + </td>
  125 + <td>
  126 + {{materialConsumoSelecionado.codigoEDescricao}}
  127 + </td>
  128 + </tr>
  129 + </tbody>
  130 + </table>
  131 + </div>
  132 + </div>
  133 + </div>
  134 + <div class="row">
  135 + <div class="col-md-12">
  136 + <auto-complete ng-id="filtroAtendimento.unidadeRequisitanteSelecao" ng-label="ALMOXARIFADO.LABEL.UNIDADE_REQUISITANTE"
  137 + ng-model="filtroAtendimento.unidadeRequisitanteSelecao" form="formDialogBuscaAvancadaRequisicao"
  138 + ng-find="findEstruturaOrganizacionalUR(value)" ng-set-result="setUnidadeRequisitante(item);"
  139 + ng-item="item.nome + ' - ' + item.classificacao" />
  140 + </div>
  141 + </div>
  142 + <div class="row" ng-show="listaUnidadesRequisitantesSelecionadas.length > 0">
  143 + <div class="col-sm-12">
  144 + <div class="panel panel-default">
  145 + <div class="panel-heading clearfix">
  146 + <button class="btn btn-clear" type="button" ng-click="removerUnidadeRequisitanteSelecionada()">
  147 + <i class="fa fa-times red"></i>
  148 + <translate>LABEL.REMOVER</translate>
  149 + </button>
  150 + </div>
  151 + <table class="table table-bordered table-striped">
  152 + <thead>
  153 + <tr>
  154 + <th style="width: 3%;" class="text-center">
  155 + <input type="checkbox" ng-model="filtroAtendimento.unidadeRequisitanteSelectedAll" ng-click="selectAllUnidadesRequisitantes(unidadeRequisitanteSelectedAll)"/>
  156 + </th>
  157 + <th style="text-align: center">
  158 + <translate>ALMOXARIFADO.LABEL.UNIDADE_REQUISITANTE</translate>
  159 + </th>
  160 + </tr>
  161 + </thead>
  162 + <tbody ng-repeat="unidadeRequisitanteSelecionada in listaUnidadesRequisitantesSelecionadas">
  163 + <tr>
  164 + <td class="text-center">
  165 + <input type="checkbox" ng-checked="unidadeRequisitanteSelecionada.$checkedChBox" ng-model="unidadeRequisitanteSelecionada.$checkedChBox"/>
  166 + </td>
  167 + <td>
  168 + {{unidadeRequisitanteSelecionada.nome}}
  169 + </td>
  170 + </tr>
  171 + </tbody>
  172 + </table>
  173 + </div>
  174 + </div>
  175 + </div>
  176 + </div>
  177 + </form>
  178 +</script>
... ...
cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/dialog_atendimento_item_enderecos.html 0 → 100644
... ... @@ -0,0 +1,68 @@
  1 +<div class="modal-header">
  2 + <button class="btn btn-clear" type="button" ng-click="saveListaEnderecos()"
  3 + title="{{$translate.instant('LABEL.SALVAR')}}" ng-show="edit"
  4 + alt="{{$translate.instant('LABEL.SALVAR')}}">
  5 + <i class="fa fa-save green"></i>
  6 + <translate>LABEL.SALVAR</translate>
  7 + </button>
  8 +
  9 + <button title="{{$translate.instant('LABEL.CANCELAR')}}"
  10 + alt="{{$translate.instant('LABEL.CANCELAR')}}"
  11 + ng-click="$dismiss('cancel');" class="btn btn-clear" type="button">
  12 + <i class="fa fa-times red"></i>
  13 + <translate>LABEL.CANCELAR</translate>
  14 + </button>
  15 +</div>
  16 +
  17 +<div class="modal-body">
  18 + <legend style="font-size: 20px">
  19 + <translate>ALMOXARIFADO.LABEL.ENDERECOS_ESTOQUE</translate>
  20 + </legend>
  21 +
  22 + <div class="row">
  23 + <div class="col-md-12">
  24 + <label-select ng-model="itemAtendimentoRequisicaoConsumoItemEndereco" ng-list="listaEnderecosSelect" ng-show="edit"
  25 + ng-custom-options="itemAtendimentoRequisicaoConsumoItemEndereco as itemAtendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.endereco.descricao for itemAtendimentoRequisicaoConsumoItemEndereco"></label-select>
  26 + </div>
  27 + </div>
  28 + <div class="row">
  29 + <div class="col-sm-12">
  30 + <div class="panel panel-default">
  31 + <div class="panel-heading clearfix">
  32 + <button class="btn btn-clear" type="button" ng-disabled="listaEnderecosSelect.length == 0 || !itemAtendimentoRequisicaoConsumoItemEndereco || !edit"
  33 + ng-click="addEnderecoToList(itemAtendimentoRequisicaoConsumoItemEndereco)">
  34 + <i class="fa fa-plus-circle yellow-dark"></i>
  35 + <translate>LABEL.ADICIONAR</translate>
  36 + </button>
  37 + <button class="btn btn-clear" type="button" ng-click="removeEnderecoFromList()" ng-disabled="!edit">
  38 + <i class="fa fa-times red"></i>
  39 + <translate>LABEL.REMOVER</translate>
  40 + </button>
  41 + </div>
  42 + <table class="table table-bordered table-striped">
  43 + <thead>
  44 + <tr>
  45 + <th style="width: 3%;" class="text-center"><input type="checkbox" ng-model="atendimentoRequisicaoConsumoItemEnderecoSelectedAll" ng-click="selectAllEnderecos(atendimentoRequisicaoConsumoItemEnderecoSelectedAll)" /></th>
  46 + <th style="text-align: center"><translate>ALMOXARIFADO.LABEL.ENDERECO_ESTOQUE</translate></th>
  47 + <th style="text-align: center"><translate>ALMOXARIFADO.LABEL.SALDO_ENDERECO</translate></th>
  48 + <th style="text-align: center"><translate>ALMOXARIFADO.LABEL.ATENDER</translate></th>
  49 + </tr>
  50 + </thead>
  51 + <tbody ng-repeat="atendimentoRequisicaoConsumoItemEndereco in listaEnderecosAdicionados">
  52 + <tr ng-class="atendimentoRequisicaoConsumoItemEndereco.$hasError ? 'danger' : ''">
  53 + <td class="text-center"><input type="checkbox" ng-checked="atendimentoRequisicaoConsumoItemEndereco.$checkedChBox" ng-model="atendimentoRequisicaoConsumoItemEndereco.$checkedChBox" /></td>
  54 + <td class="text-center">{{atendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.endereco.descricao}}</td>
  55 + <td class="text-center">{{atendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.quantidade}}</td>
  56 + <td class="text-center">
  57 + <label-input-decimal ng-id="atendimentoRequisicaoConsumoItemEndereco.quantidade" ng-obrigatorio="true" ng-evento-blur="aplicarValidacaoDecimal" ng-disabled="!edit"
  58 + ng-model="atendimentoRequisicaoConsumoItemEndereco.quantidade" form="atendimentoRequisicaoConsumoForm" ng-evento-keyup="validarQuantidades(atendimentoItemEmEdicao)"
  59 + ng-custom-maxlength="{{atendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.materialEstoque.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 4 : 11}}"
  60 + ng-precisao="{{atendimentoRequisicaoConsumoItemEndereco.materialLocalEstoque.materialEstoque.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 0 : 'decimal'}}" />
  61 + </td>
  62 + </tr>
  63 + </tbody>
  64 + </table>
  65 + </div>
  66 + </div>
  67 + </div>
  68 +</div>
0 69 \ No newline at end of file
... ...