Tabela de conteúdos

Guia de Recolhimento da União

A Guia de Recolhimento da União - GRU - é utilizada pelas Unidades Gestoras para efetuarem pagamentos (p.ex. serviços) para outras Unidades Gestoras ou retenções sobre pagamentos a terceiros para recolhimento à União (p.ex. retenção da CPSSS, multas por descumprimento de contrato, inscrição em Processos Seletivos).

A GRU pode ser do modelo Simples ou Cobrança.

GRU Simples

O modelo de GRU Simples pode ser emitida pela internet, por meio do sítio da Secretaria do Tesouro Nacional (STN) ou por meio dos sítios de outros órgãos públicos arrecadadores, no caso, a própria Unidade Gestora.

Permite que a Unidade Gestora tenha controle da arrecadação feita por intermédio do Banco do Brasil por meio do cadastro da extração do arquivo de arrecadação da GRU Simples. O procedimento detalhado para o cadastramento está disponível por meio do seguinte endereço: http://www.tesouro.fazenda.gov.br/siafi/gru/download/Manual_Arquivo_Retorno.pdf.

A GRU Simples Não é compensável, podendo ser paga apenas no Banco do Brasil na “boca do caixa” ou por meio dos diversos serviços disponíveis, como terminais de auto-atendimento e internet banking.

Modelo de GRU Simples

Campos da GRU Simples

A GRU Simples possui os seguintes campos:

Campo Tipo Tamanho Descrição Formato
Nome do Contribuinte/Recolhedor TEXTO 45 Nome do contribuinte ou do recolhedor da arrecadação.
Nome da Unidade Favorecida TEXTO 45 Nome da Unidade Gestora favorecida pela arrecadação.
Código de Recolhimento NUMÉRICO 6 Código que identifica o que está sendo pago. 99999-9
Número de Referência NUMÉRICO 17 Campo que pode ou não ser utilizado pela Unidade Gestora favorecida pela arrecadação para identificar o pagamento.
Competência NUMÉRICO 6 Mês e ano a que se refere o recolhimento. MM/AAAA, onde MM representa o mês e AAAA representa o ano, respectivamente.
Vencimento NUMÉRICO 8 Data a partir da qual o pagamento será considerado como “em atraso”, devendo ser aplicadas as regras legais e normativas cabíveis. DD/MM/AAAA, onde DD, MM e AAAA representam o dia, o mês e o ano, respectivamente.
CNPJ ou CPF do Contribuinte NUMÉRICO 14 (CNPJ)/11 (CPF) CNPJ ou CPF do contribuinte CNPJ: 99.999.999/9999-99 CPF: 999.999.999-99
UG/Gestão NUMÉRICO 11 Identificação, no SIAFI, do Órgão Público favorecido pelo pagamento (Órgão que aparecerá como UNIDADE FAVORECIDA na GRU impressa). Essa identificação é composta pelo código da Unidade Gestora (código numérico de 6 posições) e pelo código da Gestão (código numérico de 5 posições). 999999/99999
Valor Principal NUMÉRICO 11 Valor a ser pago por meio da GRU. 999999999,99
Desconto/Abatimento NUMÉRICO 11 Valor dos descontos e abatimentos concedidos. 999999999,99
Outras Deduções NUMÉRICO 11 Valor das outras deduções. 999999999,99
Mora/Multa NUMÉRICO 11 Valor da multa ou mora. 999999999,99
Juros/Encargos NUMÉRICO 11 Valor dos juros e encargos. 999999999,99
Outros Acréscimos NUMÉRICO 11 Valor dos outros acréscimos. 999999999,99
Valor Total NUMÉRICO 11 Valor a ser efetivamente pago. Consiste na seguinte soma algébrica: (valor do campo Valor Principal) – (valor do campo Descontos/Abatimentos) – (valor do campo Outras Deduções) + (valor do campo Mora/Multa) + (valor do campo Juros/Encargos) + (valor do campo Outros Acréscimos) 999999999,99

GRU Cobrança

Em geral, as GRU Cobrança são emitidas por meio de sistema informatizado próprio da Unidade Gestora, a partir dos dados de controle e acompanhamento de suas cobranças.

O Banco do Brasil envia arquivo retorno para as Unidades Gestoras com a informação do “Nosso Número” do boleto de cobrança liquidado. A partir do “Nosso Número”, a Unidade Gestora poderá controlar sua arrecadação.

É sempre compensável, podendo ser paga, até seu vencimento, em qualquer banco na “boca do caixa” ou por meio dos diversos serviços disponíveis, como terminais de auto-atendimento, internet, etc.

Só pode ser utilizada para valores maiores do que R$ 50,00 (cinquenta reais).

A Unidade Gestora interessada em utilizar a GRU Cobrança para arrecadar suas receitas deverá encaminhar ofício à sua agência de relacionamento do Banco do Brasil solicitando a abertura de convênio de cobrança. A Unidade Gestora deverá solicitar expressamente a abertura de tantos convênios de cobrança quantos forem os códigos de recolhimento a serem cadastrados.

Modelo de GRU Cobrança

Campos da GRU Cobraça

A GRU Cobrança possui os seguintes campos:

Campo Tipo Tamanho Descrição Formato
Sacado TEXTO Até 3 linhas Nome do contribuinte ou do recolhedor da arrecadação. Recomendável incluir o CPF/CNPJ e o endereço do sacado.
Cedente TEXTO 45 Nome da Unidade Gestora favorecida pela arrecadação.
Número do Documento NUMÉRICO 6
Vencimento NUMÉRICO 8 Data a partir da qual o pagamento será considerado como “em atras””, devendo ser aplicadas as regras legais e normativas cabíveis. DD/MM/AAAA, onde DD, MM e AAAA representam o dia, o mês e o ano, respectivamente.
Agência / Código do Cedente NUMÉRICO 11 Número da agência e código dado pelo convênio bancário onde será recolhido o pagamento 999999/99999
Valor do Documento NUMÉRICO 11 Valor a ser pago por meio da GRU. 999999999,99
Desconto/Abatimento NUMÉRICO 11 Valor dos descontos e abatimentos concedidos. 999999999,99
Outras Deduções NUMÉRICO 11 Valor das outras deduções. 999999999,99
Mora/Multa NUMÉRICO 11 Valor da multa ou mora. 999999999,99
Outros Acréscimos NUMÉRICO 11 Valor dos outros acréscimos. 999999999,99
Valor Cobrado NUMÉRICO 11 Valor a ser efetivamente pago. Consiste na seguinte soma algébrica: (valor do campo Valor Principal) – (valor do campo Descontos/Abatimentos) – (valor do campo Outras Deduções) + (valor do campo Mora/Multa) + (valor do campo Outros Acréscimos) 999999999,99

Descrição dos Códigos de Recolhimento

Os códigos de recolhimento indicam, dentre outros, parâmetros para classificação e/ou destinação dos recursos arrecadados. Assim, quando da criação de um código de receita a STN/COFIN poderá indicar, por exemplo, se aquele código se destina a ingressos de receita, estorno de despesa, depósitos de diversas origens, indicando ainda a fonte de origem do orçamento, a natureza da receita, etc.

Os códigos de recolhimento são codificados conforme tabela a seguir

Espécie de Ingresso Códigos Iniciados Por
RECEITA PRIMÁRIA FONTE TESOURO 1xxxx-x
RECEITA PRIMÁRIA FONTE PRÓPRIA 2xxxx-x
RECEITA FINANCEIRA FONTE TESOURO 3xxxx-x
RECEITA FINANCEIRA FONTE PRÓPRIA 4xxxx-x
OPERAÇÃO INTERNA FONTE TESOURO 5xxxx-x
ESTORNO DE DESPESA 6xxxx-x
OPERAÇÃO INTERNA FONTE PRÓPRIA 7xxxx-x
DEPÓSITOS DIVERSOS 9xxxx-x

Alguns códigos desta tabela poderão ser “replicados” em todas as UG, de forma que essas possam complementá-los com informações específicas necessárias à contabilização. Um bom exemplo são os ingressos originários de receitas próprias (receita de aluguéis) em que o detalhamento da fonte varia de acordo com o órgão.

Os códigos de recolhimento são classificados, quanto à abrangência, em: códigos de abrangência geral e abrangência STN. Os códigos de abrangência geral aqueles que necessitam que a UG informe a fonte de destinação da arrecadação (homologação). A Unidade deve homologar estes códigos antes de sua utilização, alterando os campos preenchidos com a expressão “INFGESTOR”, com o grupo composto por (fonte+vinculação+tipo de recurso) ex. 02500000004007.

Os códigos de abrangência STN são aqueles que não necessitam de homologação, pois já contêm todos os parâmetros para classificação e destinação da receita.

CÓDIGO GRU TIPO FONTE INF. GESTOR
188XX STN - USO GERAL TESOURO
288XX/289XX ABRANGÊNCIA GERAL PRÓPRIA HOMOLOGAR
388XX STN - USO GERAL TESOURO
488XX ABRANGÊNCIA GERAL PRÓPRIA HOMOLOGAR
588XX STN - USO GERAL TESOURO(OP.INTERNAS)
788XX ABRANGÊNCIA GERAL PRÓPRIA(OP.INTERNAS) HOMOLOGAR

Homologação de Códigos de Recolhimento

Códigos de abrangência geral (288XX-X, 289XX-X, 488XX-X, 489XX-X, 788XX-X e 789XX-X) requerem informações diferenciadas para cada Unidade Gestora (UG). Sendo assim, a UG que selecionar um código desse tipo terá que homologá-lo, ou seja, indicar, na maioria das vezes, a fonte, a vinculação e o tipo de arrecadação em um dos campos de INSCRIÇÃO ou CLASSIFICAÇÃO do código, onde houver a expressão INFGESTOR, conforme solicitado pelo evento.

Somente é possível homologar código de recolhimento que tenha sido previamente parametrizado para a UG. O procedimento para parametrização está disponível no site do Tesouro Nacional: http://www.tesouro.fazenda.gov.br/siafi/GRU_orientacoes_unidades_gestoras.asp

Após a homologação, o código de recolhimento estará disponível para uso no sítio do Tesouro Nacional ou no Aplicativo Local somente no dia seguinte. Para utilização intra-Siafi, o uso é imediato. É importante lembrar que, para a utilização no Aplicativo Local, será necessário atualizar o pacote de dados para que as atualizações sejam realizadas.

Diagrama de Classes

O seguinte modelo de implementação da GRU é utilizado nos sistemas SIG:

Diagrama de Classes - GRU

As GRUs (classe GuiaRecolhementoUniao) possuem uma configuração padrão (classe ConfiguracaoGRU), que por sua vez são agrupadas (classe GrupoEmissaoGRU. Dependendo do caso de uso, as informações da configuração deverão ser previamente cadastradas no banco, ou serem cadastradas via próprio caso de uso. Detalharemos isso mais adiante.

As GRUs são apenas de dois tipo: Simples ou Cobrança. GRUs Simples são utilizadas de formas mais abrangentes. Não tem restrição rígida de vencimento, ou seja, o banco pode aceitar o seu pagamento fora da data especificada, podendo ser utilizadas para pagamento de multas de biblioteca, por exemplo. As GRUs Cobrança necessitam de um número do convênio com o Banco do Brasil, podem ter resitrções de vencimento mais rígidas e são mais indicadas para utilização de pagamento de taxas de inscrição, por exemplo.

Os tipos de arrecadação já estão cadastrados no banco de dados com o código de recolhimento correspondente.

A geração da GRU é feita utilizando-se um Helper, o que será explicado mais adiante.

Exemplo Caso de Uso com Configuração Fixa

Como primeiro exemplo de implementação temos o Vestibular com uma configuração fixa de GRU que é utilizada para o pagamento da taxa de inscrição. Geralmente, utiliza-se uma GRU Cobrança e um convênio único.

Neste caso, temos o grupo de emissão de GRU e a configuração previamente cadastrada no banco:

id_grupo_emissao_gru codigo_gestao agencia codigo_cedente ativo codigo_unidade_gestora convenio
1 “” “3795-8” “333014-1” TRUE “” 2314238
id_configuracao_gru gru_simples ativo data_cadastro id_tipo_arrecadacao id_unidade competencia descricao id_grupo_emissao_gru
1 FALSE TRUE “2011-12-12 12:03:02.051” 1 605 “GRU Cobraça para o Vestibular” 1

No formulário cadastro do processo seletivo, o usuário deverá escolher o tipo de Arrecadação (Vestibular, Reingresso, Reopção, etc.). O desenvolvedor deverá implementar um método para buscar a configuração da GRU correspondente e associá-la a classe:

form.jsp
<tr>
	<th class="obrigatorio">
		Tipo de Arrecadação:
	</th>
	<td>
		<a4j:region>
			<h:selectOneMenu value="#{processoSeletivoVestibular.idTipoArrecadacao}" 
				id="tipoArrecadacao">
				<f:selectItem itemValue="0" itemLabel="-- SELECIONE --"/>
				<f:selectItems value="#{processoSeletivo.tiposArrecadacaoCombo}"/>
				<a4j:support action="#{ processoSeletivoVestibular.atualizaConfiguracaoGRU }" event="onchange"
				 reRender="codRecolhimento, tipoGRU"/>
			</h:selectOneMenu>
			<a4j:status id="statusGRU">
				<f:facet name="start">
					<h:graphicImage value="/img/indicator.gif" />
				</f:facet>
			</a4j:status>
		</a4j:region>
	</td>
</tr>
ProcessoSeletivoVestibularMBean.java
public void atualizaConfiguracaoGRU() throws DAOException {
	configuracaoGRU = GuiaRecolhimentoUniaoHelper.getConfiguracaoGRUByTipoArrecadacao(idTipoArrecadacao, null);
	obj.setConfiguracaoGRU(configuracaoGRU);
}

O atributo configuracaoGRU na classe ProcessoSeletivoVestibular é transiente, uma vez que os dados são armazenados no banco comum, e não no banco sigaa. No momento que o ProcessoSeletivoVestibular é persistido, somente o ID da configuração é associada. Isso é feito no método setConfiguracaoGRU():

ProcessoSeletivoVestibular.java
public void setConfiguracaoGRU(ConfiguracaoGRU configuracaoGRU) {
	if (configuracaoGRU != null)
		this.idConfiguracaoGRU = configuracaoGRU.getId();
	this.configuracaoGRU = configuracaoGRU;
}

Uma vez cadastrado o Vestibular, os candidatos poderão se inscrever nele acessando a parte pública do SIGAA. Ao final do caso de uso de inscrição do Vestibular, o desenvolvedor deverá recuperar a configuração da GRU, juntamente com os dados da inscrição do candidato, e criar uma GRU. Esta GRU é então associada à inscrição através do ID, pois a GRU é persistida no banco comum, e não no SIGAA:

ProcessadorInscricaoVestibular
String instrucoes = "Edital: " + ps.getNome()
		+ "\nNº de Inscrição: "
		+ inscricao.getNumeroInscricao() + "\nPrimeira Opção: "
		+ inscricao.getOpcoesCurso()[0].getDescricao()
		+ "\nLíngua Estrangeira: "
		+ inscricao.getLinguaEstrangeira().getDenominacao();
// Configuração da GRU
GuiaRecolhimentoUniao gru ;
SimpleDateFormat formato = new SimpleDateFormat("MM/yyyy");
String competencia = formato.format(ps.getDataVencimentoBoleto());
gru = GuiaRecolhimentoUniaoHelper.createGRU(
		ps.getIdConfiguracaoGRU(),
		inscricao.getPessoa().getCpf_cnpj(),
		inscricao.getPessoa().getNome(),
		inscricao.getPessoa().getEnderecoContato().getDescricao(),
		instrucoes, 
		competencia,
		ps.getDataVencimentoBoleto(), 
		ps.getValorInscricao());
inscricao.setIdGRU(gru.getId());

Uma vez persistida a inscrição, o desenvolvedor poderá disponibilizar o PDF para o candidato baixar e pagar. Isto é feito utilizando-se o helper passando o outputStream e o ID da GRU a ser gerado:

InscricaoVestibularMBean.java
public  String imprimirGRU(int idInscricao, int numeroInscricao) throws ArqException, NegocioException {
	try {
		obj = getGenericDAO().findByPrimaryKey(idInscricao, InscricaoVestibular.class);
		if (idInscricao == 0 || numeroInscricao == 0 || obj != null && obj.getNumeroInscricao() != numeroInscricao) {
			addMensagemErro("Erro na identificação da inscrição.");
			return null;
		}
		if (hasErrors()) 
			return null;
		getCurrentResponse().setContentType("application/pdf");
		getCurrentResponse().addHeader("Content-Disposition", "attachment;filename=GRU.pdf");
		GuiaRecolhimentoUniaoHelper.gerarPDF(getCurrentResponse().getOutputStream(), obj.getIdGRU());
		FacesContext.getCurrentInstance().responseComplete();
	} catch (IOException e) {
		tratamentoErroPadrao(e);
	}
	return null;
}

Exemplo Caso de Uso com Configuração Dinâmica

Em outros casos de uso, a configuração da GRU poderá ser informada em um formulário de cadastro. Temos como exemplo o caso de uso de cursos Lato Sensu. No módulo, o gestor da PPPg pode alterar a proposta de um curso de lato sensu e incluir a configuração da GRU a ser utilizada na inscrição de processos seletivos e no pagamento de mensalidades. No caso, a classe CursoLato tem dois atributos transientes, configuracaoGRUInscricao e configuracaoGRUMensalidade, e dois persistentes, idConfiguracaoGRUInscricao e idConfiguracaoGRUMensalidade, correspondentes. Os atributos transientes são utilizados para visualização no formulário e no processador para persistir as configurações. Como não se pode fazer o relacionamento entre objetos em bases distintas, persistimos apenas o ID das configurações.

Uma vez informado os dados da configuração, no processador utilizado para persistir o curso lato sensu, cadastramos a configuração da GRU:

ProcessadorCursoLato.java
GenericDAO comumDao = DAOFactory.getGeneric(Sistema.COMUM);
try {
	ConfiguracaoGRU configInscricao = curso.getConfiguracaoGRUInscricao();
	ConfiguracaoGRU configMensalidade = curso.getConfiguracaoGRUMensalidade();
	if (configInscricao != null) {
		if (configInscricao.getGrupoEmissaoGRU().getId() == 0) comumDao.create(configInscricao.getGrupoEmissaoGRU());
		if (configInscricao.getId() == 0) comumDao.create(configInscricao);
		curso.setIdConfiguracaoGRUInscricao(configInscricao.getId());
	} else
		curso.setIdConfiguracaoGRUInscricao(null);
	if (configMensalidade != null) {
		if (configMensalidade.getGrupoEmissaoGRU().getId() == 0) comumDao.create(configMensalidade.getGrupoEmissaoGRU());
		if (configMensalidade.getId() == 0) comumDao.create(configMensalidade);
		curso.setIdConfiguracaoGRUMensalidade(configMensalidade.getId());
	}
} catch (HibernateException e) {
	throw new DAOException(e);
} finally {
	comumDao.close();
}
daoLato.update(curso);

Neste exemplo, quando o aluno lista suas GRUs para pagamento de mensalidade (linhas 6 a 15), o desenvolvedor busca pelas mesmas. Não existindo, ele deverá criar em banco as GRUs para o pagamento da mensalidade (linhas 17 a 33):

MensalidadeCursoLatoMBean.java
public String listarDiscente() throws ArqException {
	if (!getDiscenteUsuario().getCurso().isLato()) {
		addMensagemErro("A lista de mensalidades está disponível apenas para discentes de lato sensu");
		return null;
	}
	MensalidadeCursoLatoDao dao = getDAO(MensalidadeCursoLatoDao.class);
	CursoLato cursoLato = dao.findByPrimaryKey(getDiscenteUsuario().getCurso().getId(), CursoLato.class);
	if (cursoLato.getValor() <= 0 || cursoLato.getQtdMensalidades() <= 0) {
		addMensagemErro("O seu curso não possui mensalidades");
		return null;
	} else if (cursoLato.getIdConfiguracaoGRUMensalidade() == null) {
		addMensagemErro("As mensalidades não podem ser geradas automaticamente. Entre em contato com a secretaria do seu curso para o pagamento das mensalidades.");
		return null;
	}
	resultadosBusca = dao.findAllByDiscente(getDiscenteUsuario().getId());
	// se não há mensalidade cadastrada, chamar o processador para criar em banco.
	if (isEmpty(resultadosBusca)) {
		MovimentoCadastro mov = new MovimentoCadastro();
		mov.setObjMovimentado(getDiscenteUsuario());
		mov.setCodMovimento(SigaaListaComando.CRIAR_MENSALIDADES_CURSO_LATO);
		prepareMovimento(SigaaListaComando.CRIAR_MENSALIDADES_CURSO_LATO);
		try {
			execute(mov);
		} catch (Exception e) {
			if (e instanceof NegocioException)
				addMensagemErro(e.getMessage());
			else
				addMensagemErroPadrao();
			notifyError(e);
			return null;
		}
		resultadosBusca = dao.findAllByDiscente(getDiscenteUsuario().getId());
	}
	// carrega os objetos GRU transientes
	Collection<Integer> ids = new ArrayList<Integer>();
	for (MensalidadeCursoLato mensalidade : resultadosBusca)
		ids.add(mensalidade.getIdGRU());
	for (GuiaRecolhimentoUniao gru : GuiaRecolhimentoUniaoHelper.getGRUByID(ids)) {
		for (MensalidadeCursoLato mensalidade : resultadosBusca) {
			if (mensalidade.getIdGRU() == gru.getId())
				mensalidade.setGru(gru);
		}
	}
	return forward("/lato/mensalidade/lista_discente.jsp");
}

O PDF da GRU é gerado passando apenas o ID da GRU:

MensalidadeCursoLatoMBean.java
public String imprimirGRU() throws ArqException, NegocioException, IOException {
	populateObj(true);
	if (obj == null) {
		addMensagem(MensagensArquitetura.OBJETO_NAO_FOI_SELECIONADO);
		obj = new MensalidadeCursoLato();
		return null;
	}
	getCurrentResponse().setContentType("application/pdf");
	getCurrentResponse().addHeader("Content-Disposition", "attachment;filename=mensalidade_"+obj.getOrdem()+".pdf");
	GuiaRecolhimentoUniaoHelper.gerarPDF(getCurrentResponse().getOutputStream(), obj.getIdGRU());
	FacesContext.getCurrentInstance().responseComplete();
	return null;
}

Exemplo de Validação do Pagamento da GRU

No caso de uso do exemplo que tomamos anteriormente do Vestibular, a validação da inscrição não depende somente do pagamento da GRU, mas em outros casos é suficiente validar o pagamento desta.

Como a consulta do pagamento da GRU é feita no banco comum, é indicado realizar a consulta uma vez e registrar no seu caso de uso o pagamento. Assim, temos na classe InscricaoVestibular o atributo gruQuitada que funcionará com um “cache”, ou seja, dispensaria novas consultas ao banco comum.

No código abaixo, realizamos uma busca pelas inscrições que ainda não tem indicação de GRU paga (linhas 2 a 15):

InscricaoVestibularDao.java
public Collection<InscricaoVestibular> verificaInscricaoGRUPaga(int idProcessoSeletivo) throws HibernateException, DAOException {
	String projecao = "inscricao.id," +
			" inscricao.numeroInscricao," +
			" inscricao.pessoa.id," +
			" inscricao.pessoa.nome," +
			" inscricao.pessoa.cpf_cnpj," +
			" inscricao.idGRU";
	String hql = "select " + projecao +
			" from InscricaoVestibular inscricao" +
			" where inscricao.processoSeletivo.id = :idProcessoSeletivo" +
			" and (inscricao.gruQuitada is null or inscricao.gruQuitada = false)";
	Query q = getSession().createQuery(hql);
	q.setInteger("idProcessoSeletivo", idProcessoSeletivo);
	@SuppressWarnings("unchecked")
	Collection<InscricaoVestibular> lista = HibernateUtils.parseTo(q.list(), projecao, InscricaoVestibular.class, "inscricao");
	if (!isEmpty(lista)) {
		Collection<Integer> idsGRUsPagas = new ArrayList<Integer>();
		for (InscricaoVestibular inscricao : lista)
			if (inscricao.getIdGRU() != null)
				idsGRUsPagas.add(inscricao.getIdGRU());
		idsGRUsPagas = GuiaRecolhimentoUniaoHelper.isGRUQuitada(idsGRUsPagas);
		if (!isEmpty(idsGRUsPagas)) {
			Iterator<InscricaoVestibular> iterator = lista.iterator();
			while (iterator.hasNext()) {
				if (!idsGRUsPagas.contains(iterator.next().getIdGRU()))
					iterator.remove();
			}
			return lista;
		}
	}
	return null;
}

Em seguida, consultamos no banco comum e verificamos quais GRUs foram pagas, passando uma lista de IDs (linhas 17 a 21). Marcamos as inscrições que tem GRU pagas utilizando o retorno da consulta (linhas 22 a 29).

Retornamos ao usuário a lista de inscrições que terão a GRU validada. O usuário confirma a operação e atualizamos a inscrição como tendo a GRU quitada:

ProcessadorMarcarGRUsQuitadas.java
public Object execute(Movimento mov) throws NegocioException, ArqException, RemoteException {
	MovimentoCadastro movimento = ((MovimentoCadastro) mov);
	@SuppressWarnings("unchecked")
	Collection<InscricaoVestibular> inscricoes = (Collection<InscricaoVestibular>) movimento.getColObjMovimentado();
	GenericDAO dao = getGenericDAO(movimento);
	try {
		for (InscricaoVestibular inscricao : inscricoes) {
			dao.updateField(InscricaoVestibular.class, inscricao.getId(), "gruQuitada", true);
		}
	} finally {
		dao.close();
	}
	return null;
}

Esta forma de trabalhar pode ser utilizada em outros casos de uso tais como Multa de Biblioteca ou Mensalidade de Curso Lato Sensu.