~~ODT~~ echo "
"; echo "Última atualização: "; ver('', false); echo "
";
====== Relatório de Movimentações do Almoxarifado Sintético ====== Este caso de uso é utilizado pelos gestores de almoxarifado com a finalidade de criar um relatório sintético contendo todas as movimentações de bens no almoxarifado num período de tempo definido. ===== Descrição do Caso de Uso ===== Esse caso de uso é acionado quando o usuário acessa a opção: //SIPAC -> Almoxarifado -> Relatórios -> Movimentação -> RMA Sintético//. E se inicia exibindo as opções para a listagem contida no relatório, contendo os seguintes campos: ***Mês***: Tipo TEXTO, são apresentadas as opções tais quais: 'JANEIRO', 'FEVEREIRO' e etc. ***Ano***: Tipo NUMÉRICO. ***Almoxarifado***: Tipo TEXTO. ([[#principais_regras_de_negocio|RN02]]) ***Formato***: Tipo CHECKBOX, Formato: HTML/PDF/Excel Então é exibido um relatório conforme o modelo abaixo: **Relatório de Movimentação do Almoxarifado - RMA Sintético** **Período Atual:** MES de ANO **Almoxarifado:** NOME ALMOXARIFADO ^ ^^^ Entradas ^^^^^ Saidas ^^ ^ ^ Código ^ Denominação ^ Saldo Anterior (R$) ^ Entradas (R$) ^ Ent. Forn. (R$)([[#principais regras de negócios|RN01]]) ^ Ent. Extra (R$) ^ Devolução (R$) ^ C.Imediato (R$) ^ Saídas (R$) ^ C.Imediato (R$) ^ Saldo Atual (R$) ^ | CÓDIGO | DENOMINAÇÃO | UNID. DE MEDIDA | 99,99 | 99,99 | 99,99 | 99,99 | 99,99 | 99,99 | 99,99 | 99,99 | São disponibilizados espaços para preenchimento de local/data e assinatura. Então o caso de uso é finalizado. ===== Principais Regras de Negócio ===== ***RN01** - Caso o almoxarifado seja setorial, são exibidos os campos **Ent. Forn.**. ***RN02** - Caso o usuário não possua os papéis de "AUDITOR", "GESTOR_INSTITUIÇÃO" ou "GESTOR_DIRECAO" o campo **Almoxarifado** não será exibido e o relatório irá considerar o almoxarifado da unidade do usuário. ===== Resoluções/Legislações Associadas ===== Não se aplica. ===== Classes Persistentes e Tabelas Envolvidas ===== ^ Classe ^ Tabela | | br.ufrn.sipac.almoxarifado.entradas.dominio.NotaFiscal | administrativo.liquidacao.nota_fiscal | | br.ufrn.sipac.almoxarifado.entradas.dominio.ItemNotaFiscal | administrativo.liquidacao.item_nota_fiscal | | br.ufrn.sipac.almoxarifado.comuns.dominio.MovimentacaoEstoque | administrativo.almoxarifado.movimentacao_estoque | | br.ufrn.sipac.requisicoes.material.dominio.RequisicaoMaterial | administrativo.requisicoes.requisicao_material | | br.ufrn.sipac.requisicoes.material.dominio.ItemRequisicao | administrativo.requisicoes.item_requisicao | | br.ufrn.sipac.almoxarifado.comuns.dominio.EstoqueAlmoxarifado | administrativo.almoxarifado.estoque_material | | br.ufrn.sipac.almoxarifado.comuns.dominio.AlteracaoMaterialEstoque | administrativo.almoxarifado.alteracao_material_estoque | ====== Plano de Teste ====== Sistema: SIPAC Módulo: Almoxarifado Link(s): Relatórios -> Movimentação -> RMA Sintético. Usuário: san Papel que usuário deve ter: * SipacPapeis.GESTOR_ALMOXARIFADO * SipacPapeis.AUDITOR_ALMOXARIFADO ===== Cenários de Teste ===== Qualquer movimentação de materiais realizada pelo SIPAC deve refletir neste relatório. Entre elas podemos citar: * [[desenvolvimento:especificacoes:sipac:almoxarifado:casos_de_uso:estoque:estoque:entrada_avulsa:registrar_entrada_avulsa|Entrada Avulsa]] * [[desenvolvimento:especificacoes:sipac:almoxarifado:casos_de_uso:estoque:estoque:saida_avulsa:registrar_saida_avulsa|Saída Avulsa]] * [[desenvolvimento:especificacoes:sipac:almoxarifado:casos_de_uso:estoque:estoque:invoice:cadastrar|Invoice]] * [[desenvolvimento:especificacoes:sipac:almoxarifado:casos_de_uso:estoque:estoque:nota_fiscal:cadastrar|Nota Fiscal]] ===== Dados para o Teste ===== O RMA Sintético utiliza as seguintes consultas sql: Inicialmente, consulta as entradas anteriores para compor o saldo anterior: '' select grupo.codigo as codigo, grupo.denominacao as nome, sum(case when nota.tipo = ' 1 ' then (item.quantidade)*(item.valor) else 0 end) as valorEntrada, sum(case when nota.tipo = ' 2 ' then (item.quantidade)*(item.valor) else 0 end) as valorExtra from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from liquidacao.item_nota_fiscal where ajustado= 'false' ) as item on (mat.id_material = item.id_material) left join (select id_nota_fiscal, tipo from liquidacao.nota_fiscal where estornada = 'false' and data_cadastro < dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético ) as nota using (id_nota_fiscal) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 2 - Em seguida, consulta as entradas por nota de fornecimento, que são aquelas que ocorrem entre almoxarifados: ''select grupo.codigo as codigo, grupo.denominacao as nome, coalesce(sum(mov.quantidade*mov.valor),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor from almoxarifado.movimentacao_estoque where id_almoxarifado=? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= 'false' and data_movimento < dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and tipo= 1) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 3 - Entradas avulsas anteriores avulsas: ''select grupo.codigo as codigo, grupo.denominacao as nome, coalesce(sum(case when (mov.id_sub_tipo = 16) then mov.valor else mov.valor*mov.quantidade end),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor, id_sub_tipo from almoxarifado.movimentacao_estoque where id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= false and data_movimento < dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and tipo= 2) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 4 - Devoluções realizadas no meses anteriores através da Requisição de Devolução de Material: ''select grupo.codigo as codigo, grupo.denominacao as nome, sum(item.quantidade*item.valor) as valor from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from almoxarifado.movimentacao_estoque where data_movimento < dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and tipo = 5 and id_sub_tipo = 18 ) as item on (mat.id_material = item.id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 5 - Saídas Anteriores: ''select grupo.codigo as codigo, grupo.denominacao as nome, case when sum((atend.qtd_atendida-atend.qtd_devolvida)*atend.preco_atendimento) > 0 then sum((atend.qtd_atendida-atend.qtd_devolvida)*atend.preco_atendimento) else 0 end as valorSaida from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join requisicoes.item_requisicao item on (mat.id_material = item.id_material) left join (select id_almoxarifado, id_item_req_material, data, qtd_atendida, qtd_devolvida, preco_atendimento from almoxarifado.atendimento_req_material where data < dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético ) as atend on (item.id = atend.id_item_req_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 6 - Saídas avulsas: ''select grupo.codigo as codigo, grupo.denominacao as nome, coalesce(sum(case when (mov.id_sub_tipo = 16) then mov.valor else mov.valor*mov.quantidade end),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor, id_sub_tipo from almoxarifado.movimentacao_estoque where id_almoxarifado= ? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= false and data_movimento < dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and tipo=0 ) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' O saldo anterior é então contabilizado da seguinte forma: Entrada Anterior Total = Entrada Anterior(Passo 1) + Entrada Nota de fornecimento(Passo 2) + Entrada avulsa (Passo 3) + devoluções anteriores (Passo 4) Saída Anterior Total = Saída anterior(Passo 5) + Saída avulsa (Passo 6) Saldo anterior = Entrada anterior total - Saída anterior total; As demais colunas são calculadas a partir dos seguintes scripts: -- 1 - Entradas no mês ''select grupo.codigo as codigo, grupo.denominacao as nome, sum(case when nota.tipo = 1 then (item.quantidade)*(item.valor) else 0 end) as valorEntrada, sum(case when nota.tipo = 2 then (item.quantidade)*(item.valor) else 0 end) as valorExtra from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from liquidacao.item_nota_fiscal where ajustado= false ) as item on (mat.id_material = item.id_material) left join (select id_nota_fiscal, tipo from liquidacao.nota_fiscal where estornada = false and consumo_imediato = false and data_cadastro >= dataInicio --informar a data de início. O sistema pega o primeiro dia do mês informado. and data_cadastro < dataFim --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético ) as nota using (id_nota_fiscal) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 2 - Entradas no mês de consumo Imediato ''select grupo.codigo as codigo, grupo.denominacao as nome, sum(case when nota.tipo = 1 then (item.quantidade)*(item.valor) else 0 end) as valorEntrada, sum(case when nota.tipo = 2 then (item.quantidade)*(item.valor) else 0 end) as valorExtra from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from liquidacao.item_nota_fiscal where ajustado= SQLDialect.FALSE ) as item on (mat.id_material = item.id_material) left join (select id_nota_fiscal, tipo from liquidacao.nota_fiscal where estornada = SQLDialect.FALSE and consumo_imediato = SQLDialect.TRUE and data_cadastro >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and data_cadastro < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and id_almoxarifado = almoxarifado.getId() ) as nota using (id_nota_fiscal) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 3 - Entradas por notas de fornecimento ''String sqlEntForn = select grupo.codigo as codigo, grupo.denominacao as nome, coalesce(sum(mov.quantidade*mov.valor),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor from almoxarifado.movimentacao_estoque where id_almoxarifado= ? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= false and data_movimento >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and tipo=1 ) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 4 - Entradas avulsas ''select grupo.codigo as codigo, grupo.denominacao as nome,coalesce(sum(case when (mov.id_sub_tipo = 16 ) then mov.valor else mov.valor*mov.quantidade end),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor, id_sub_tipo from almoxarifado.movimentacao_estoque where id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= false and data_movimento >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and tipo=2 ) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 5 - Entradas extra-orçamentárias geradas por ajuste de nota fiscal ''select grupo.codigo as codigo, grupo.denominacao as nome, sum(case when nota.tipo = 2 then (nota.quantidade)*(nota.valor) else 0 end) as valorExtra from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from liquidacao.item_nota_fiscal where ajustado = true ) as item on (mat.id_material = item.id_material) left join (select n.id_nota_fiscal, n.tipo, mov.quantidade, mov.valor from liquidacao.nota_fiscal n, almoxarifado.movimentacao_estoque mov where n.estornada = false and n.id_nota_fiscal = mov.id_nota_fiscal and mov.estornado= false and n.consumo_imediato = false and mov.data_movimento >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and mov.data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and mov.id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and n.id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and mov.tipo = 2 and mov.id_sub_tipo = 5 ) as nota using (id_nota_fiscal) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 6 - Entradas extra-orçamentárias geradas por ajuste de nota fiscal de consumo imediato ''select grupo.codigo as codigo, grupo.denominacao as nome, sum(case when nota.tipo = 2 then (nota.quantidade)*(nota.valor) else 0 end) as valorExtra from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from liquidacao.item_nota_fiscal where ajustado = true ) as item on (mat.id_material = item.id_material) left join (select n.id_nota_fiscal, n.tipo, mov.quantidade, mov.valor from liquidacao.nota_fiscal n, almoxarifado.movimentacao_estoque mov where n.estornada = false and n.id_nota_fiscal = mov.id_nota_fiscal and mov.estornado= false and n.consumo_imediato = true and mov.data_movimento >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and mov.data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and mov.id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and n.id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and mov.tipo = 2 and mov.id_sub_tipo = 5 ) as nota using (id_nota_fiscal) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 7 - Saídas no mês ''String sqlSaida = select grupo.codigo as codigo, grupo.denominacao as nome, case when sum((atend.qtd_atendida)*atend.preco_atendimento) > 0 then sum((atend.qtd_atendida)*atend.preco_atendimento) else 0 end as valorSaida, case when sum((atend.qtd_devolvida)*atend.preco_atendimento) > 0 then sum((atend.qtd_devolvida)*atend.preco_atendimento) else 0 end as valorDevolvido from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join requisicoes.item_requisicao item on (mat.id_material = item.id_material) left join (select id_almoxarifado, id_item_req_material, data, qtd_atendida, qtd_devolvida, preco_atendimento from almoxarifado.atendimento_req_material where data >= --informar a data de início. O sistema pega o primeiro dia do mês informado. and data < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético ) as atend on (item.id = atend.id_item_req_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 8 - Saídas avulsas ''select grupo.codigo as codigo, grupo.denominacao as nome, coalesce(sum(mov.quantidade),0) as qtd, coalesce(sum(case when (mov.id_sub_tipo = 16 ) then mov.valor else mov.valor*mov.quantidade end),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor, id_sub_tipo from almoxarifado.movimentacao_estoque where id_almoxarifado=? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= false and data_movimento >= ?--informar a data de início. O sistema pega o primeiro dia do mês informado. and data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and tipo=0 and id_sub_tipo<>12 ) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 9 - Saídas avulsas de consumo Imediato ''select grupo.codigo as codigo, grupo.denominacao as nome, coalesce(sum(mov.quantidade),0) as qtd, coalesce(sum(case when (mov.id_sub_tipo = 16 ) then mov.valor else mov.valor*mov.quantidade end),0) from comum.grupo_material grupo left join comum.material mat on (grupo.id=mat.id_grupo) left join (select id_material, quantidade, valor, id_sub_tipo from almoxarifado.movimentacao_estoque where id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and estornado= false and data_movimento >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and tipo=0 and id_sub_tipo=12 ) as mov using (id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc;'' 10 - Devoluções realizadas através da Requisição de Devolução de Material ''select grupo.codigo as codigo, grupo.denominacao as nome, sum(item.quantidade*item.valor) as valor from comum.grupo_material grupo left join comum.material mat on (grupo.id = mat.id_grupo) left join (select * from almoxarifado.movimentacao_estoque where data_movimento >= ? --informar a data de início. O sistema pega o primeiro dia do mês informado. and data_movimento < ? --informar a data fim. O sistema pega o primeiro dia do mês posterior ao informado. and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and tipo = 5 and id_sub_tipo = 18 ) as item on (mat.id_material = item.id_material) where (select grupo.id, grupo.denominacao, grupo.codigo from almoxarifado.associacao_almoxarifado ass, comum.grupo_material grupo where tipo = 3 and id_almoxarifado = ? --informar id do almoxarifado que se deseja gerar o RMA sintético and ass.id_grupo_material = grupo.id order by grupo.denominacao) group by grupo.codigo, grupo.denominacao order by grupo.codigo asc ;''