~~ODT~~
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. (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$)(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:
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 ;