Você está na página 1de 8

esquema = [

idUnidade: Esquema.inteiro,
idProduto: Esquema.inteiro,
dtInicial: Esquema.caracter,
dtFinal: Esquema.caracter,
nomeUnidade: Esquema.caracter,
nomeProduto: Esquema.caracter,
apresentacaoProduto: Esquema.caracter,
saldoAnterior: Esquema.numero,
totalEntradaAtiva: Esquema.numero,
totalEntradaCancelada: Esquema.numero,
totalDispensaAtiva: Esquema.numero,
totalDispensaCancelada: Esquema.numero,
totalTransferenciaAtiva: Esquema.numero,
totalTransferenciaCancelada: Esquema.numero,
totalConsumoInterno: Esquema.numero,
totalBaixas: Esquema.numero,
totalAcrescimo: Esquema.numero,
saldoAtual: Esquema.numero,
valorUnitario: Esquema.numero
]

fonte = Dados.dinamico.v2.novo(esquema)

dtSaldoInicial = Datas.removeDias(parametros.dataInicial.valor, 1)
dataInicial = parametros.dataInicial.valor.formatar("yyyy-MM-dd") + "T00:00:00";
dataInicialSaldo = dtSaldoInicial.formatar("yyyy-MM-dd");
dataFinal = parametros.dataFinal.valor.formatar("yyyy-MM-dd") + "T23:59:59";
idUnidade = parametros.unidade?.selecionado?.valor?: null;
idCentroCusto = parametros.centroCusto?.selecionados?.valor?: null;
idGrupo = parametros.grupo?.selecionado?.valor?:null;
idSubGrupo = parametros.subGrupos?.selecionados?.valor?:null;
idProduto = parametros.produtos?.selecionados?.valor?:null;
idLote = parametros.lotes?.selecionados?.valor?:null;
idTipoMovimentacao = parametros.tipoMovimentacao?.selecionados?.valor?:null;

filtroMovimentacao = "dataHoraMovimentacao >= $dataInicial and dataHoraMovimentacao


<= $dataFinal "
if(idUnidade){
filtroMovimentacao += " and unidade.id = $idUnidade"
}

if(idCentroCusto){
idCentroCusto = idCentroCusto.join(",")
filtroMovimentacao += " and centroCusto.id in ($idCentroCusto)"
}

if(idGrupo){
filtroMovimentacao += " and produto.produtoGrupo.id = $idGrupo"
}

if(idSubGrupo){
idSubGrupo = idSubGrupo.join(",")
filtroMovimentacao += " and produto.produtoSubgrupo.id in ($idSubGrupo)"
}

if(idProduto){
idProduto = idProduto.join(",")
filtroMovimentacao += " and produto.id in ($idProduto)"
}

if(idLote){
idLote = idLote.join(",")
filtroMovimentacao += " and produtoLote.id in ($idLote)"
}

if(idTipoMovimentacao){
idTipoMovimentacao = idTipoMovimentacao.join(",")
filtroMovimentacao += " and classificacaoTipoMovimentacao.id in
($idTipoMovimentacao)"
}

dadosProdutoMovimento = Dados.saude.v1.produtoMovimento.busca(criterio:
filtroMovimentacao, campos: "quantidade, unidade(id, nome), centroCusto(id),
produto(id, codigo, apresentacao(abreviatura, descricao), descricao,
produtoGrupo(id), produtoSubgrupo(id)), produtoLote(id),
classificacaoTipoMovimentacao(tipoClassificacao, nome, atributo1),
produtoEntradaItem(valorTotalProduto), produtoTransferenciaItem(quantidade),
produtoConsumoInternoItem(quantidadeTotalConsumoInterno),
produtoBaixaItem(quantidadeTotal), produtoDispensaItem(quantidadeDispensa,
quantidadeTotalDispensa, quantidadeTotalPrescrita)")

def listProdutos = []
def produtos = [:]
def saldoInicial = 0
def valorTotalUnitario = 0

percorrer (dadosProdutoMovimento) { produtoMovimento ->


listProdutos << produtoMovimento

// SALDO INICIAL DO PRODUTO


produtoSaldo = Dados.saude.v1.produtoSaldo.listSaldoDetalhe(campos:
"idProdutoSaldo, idProduto, idUnidade, idCentroCusto, centroCustoPaiId,
idProdutoLote, idFabricante, idProdutoLoteEquivalencia, idApresentacao, idTarja,
unidadeDescricao, centroCustoDescricao, FabricanteDescricao,
centroCustoPaiDescricao, lote, apresentacaoAbreviatura, apresentacaoDescricao,
produtoDescricao, corTarja, saldo, produtoCodigo, valor, valorUnitario,
valorUnitarioProdutoLote, saldoIncluindoVencidos, dataValidade,
valorIncluindoVencidos", parametros: ["idsUnidade":produtoMovimento.unidade.id,
"idsCentroDeCusto":produtoMovimento.centroCusto.id,
"idsProduto":produtoMovimento.produto.id,
"idsProdutoLote":produtoMovimento.produtoLote.id,
"idsProdutoGrupo":produtoMovimento.produto.produtoGrupo.id,
"idsProdutoSubgrupo":produtoMovimento.produto.produtoSubgrupo.id,
"dataSaldo":dataInicialSaldo, "isSaldoPositivo":true, "exibeVencidos":true],
primeiro: true)

chaveMapa = [idUnidade: produtoMovimento.unidade.id, idProduto:


produtoMovimento.produto.id]

if (produtos.containsKey(chaveMapa)) {
def produtoExistente = produtos[chaveMapa]

switch (produtoMovimento.classificacaoTipoMovimentacao.atributo1) {
case 'ENTRADA':
produtoExistente.totalEntradaAtiva +=
produtoMovimento.produtoEntradaItem.valorTotalProduto
break
case 'ENTRADA_CANCELADA':
produtoExistente.totalEntradaCancelada +=
produtoMovimento.produtoEntradaItem.valorTotalProduto
break

case 'DISPENSA':
produtoExistente.totalDispensaAtiva +=
produtoMovimento.produtoDispensaItem.quantidadeTotalDispensa
break

case 'DISPENSA_CANCELADA':
produtoExistente.totalDispensaCancelada +=
produtoMovimento.produtoDispensaItem.quantidadeTotalDispensa
break

case 'CONSUMO_INTERNO':
produtoExistente.totalConsumoInterno +=
produtoMovimento.produtoConsumoInternoItem.quantidadeTotalConsumoInterno
break

case 'BAIXA':
produtoExistente.totalBaixas +=
produtoMovimento.produtoBaixaItem.quantidadeTotal
break

case 'INVENTARIO':
totalInventario = produtoMovimento.produtoBaixaItem.quantidadeTotal

ProdutoInventarioItem = Dados.saude.v1.produtoInventarioItem.busca(criterio:
"produtoInventario.unidade.id = $produtoMovimento.unidade.id and centroCusto.id =
$produtoMovimento.centroCusto.id and produto.produtoGrupo.id =
$produtoMovimento.produto.produtoGrupo.id and produto.produtoSubgrupo.id =
$produtoMovimento.produto.produtoSubgrupo.id and produtoLote.id =
$produtoMovimento.produtoLote.id", campos: "id, estoqueLevantado,
quantidadeMovimentacao, observacao, entrada, excluido")
totalAcrescimo =
ProdutoInventarioItem.collect{it.quantidadeMovimentacao}.sum()
produtoExistente.totalAcrescimo += totalAcrescimo

break
}

produtos[chaveMapa] = produtoExistente
} else {

saldoInicial = 0

produtoSaldo = Dados.saude.v1.produtoSaldo.listSaldoDetalhe(campos: "idProduto,


idUnidade, idCentroCusto, centroCustoPaiId, idProdutoLote, idFabricante,
idProdutoLoteEquivalencia, idApresentacao, idTarja, unidadeDescricao,
centroCustoDescricao, FabricanteDescricao, centroCustoPaiDescricao, lote,
apresentacaoAbreviatura, apresentacaoDescricao, produtoDescricao, corTarja, saldo,
produtoCodigo, valor, valorUnitario, valorUnitarioProdutoLote,
saldoIncluindoVencidos, dataValidade, valorIncluindoVencidos", parametros:
["idsUnidade":produtoMovimento.unidade.id,
"idsCentroDeCusto":produtoMovimento.centroCusto.id,
"idsProduto":produtoMovimento.produto.id,
"idsProdutoGrupo":produtoMovimento.produto.produtoGrupo.id,
"idsProdutoSubgrupo":produtoMovimento.produto.produtoSubgrupo.id,
"dataSaldo":dataInicialSaldo, "isSaldoPositivo":true, "exibeVencidos":true])
percorrer (produtoSaldo){item ->
saldoInicial += item.saldo
valorUnitario = item.valorUnitario
}

if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 == 'ENTRADA'){
totalEntradaAtiva = produtoMovimento.produtoEntradaItem.valorTotalProduto

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: totalEntradaAtiva,
totalEntradaCancelada: 0,
totalDispensaAtiva: 0,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: 0,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 ==
'ENTRADA_CANCELADA'){
totalEntradaCancelada = produtoMovimento.produtoEntradaItem.valorTotalProduto

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: totalEntradaCancelada,
totalDispensaAtiva: 0,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: 0,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 ==
'DISPENSA'){
totalDispensaAtiva =
produtoMovimento.produtoDispensaItem.quantidadeTotalDispensa

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: 0,
totalDispensaAtiva: totalDispensaAtiva,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: 0,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 ==
'DISPENSA_CANCELADA'){
totalDispensaCancelada =
produtoMovimento.produtoDispensaItem.quantidadeTotalDispensa

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: 0,
totalDispensaAtiva: 0,
totalDispensaCancelada: totalDispensaCancelada,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: 0,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 ==
'TRANFERENCIA'){
totalTransferenciaAtiva =
produtoMovimento.produtoTransferenciaItem.quantidade

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: 0,
totalDispensaAtiva: 0,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: totalTransferenciaAtiva,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: 0,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 ==
'CONSUMO_INTERNO'){
totalConsumoInterno =
produtoMovimento.produtoConsumoInternoItem.quantidadeTotalConsumoInterno

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: 0,
totalDispensaAtiva: 0,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: totalConsumoInterno,
totalBaixas: 0,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 == 'BAIXA'){


totalBaixas = produtoMovimento.produtoBaixaItem.quantidadeTotal

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: 0,
totalDispensaAtiva: 0,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: totalBaixas,
totalAcrescimo: 0,
valorUnitario: valorUnitario,
]

} else if(produtoMovimento.classificacaoTipoMovimentacao.atributo1 ==
'INVENTARIO'){
totalInventario = produtoMovimento.produtoBaixaItem.quantidadeTotal

ProdutoInventarioItem = Dados.saude.v1.produtoInventarioItem.busca(criterio:
"produtoInventario.unidade.id = $produtoMovimento.unidade.id and centroCusto.id =
$produtoMovimento.centroCusto.id and produto.produtoGrupo.id =
$produtoMovimento.produto.produtoGrupo.id and produto.produtoSubgrupo.id =
$produtoMovimento.produto.produtoSubgrupo.id and produtoLote.id =
$produtoMovimento.produtoLote.id", campos: "id, estoqueLevantado,
quantidadeMovimentacao, observacao, entrada, excluido")

totalAcrescimo =
ProdutoInventarioItem.collect{it.quantidadeMovimentacao}.sum()

produtos[chaveMapa] = [
idUnidade: produtoMovimento.unidade.id,
idProduto: produtoMovimento.produto.id,
dtInicial: parametros.dataInicial.valor.formatar("dd/MM/yyyy"),
dtFinal: parametros.dataFinal.valor.formatar("dd/MM/yyyy"),
nomeUnidade: produtoMovimento.unidade.nome,
nomeProduto: produtoMovimento.produto.codigo + " - " +
produtoMovimento.produto.descricao,
apresentacaoProduto: produtoMovimento.produto.apresentacao.descricao,
saldoAnterior: saldoInicial,
totalEntradaAtiva: 0,
totalEntradaCancelada: 0,
totalDispensaAtiva: 0,
totalDispensaCancelada: 0,
totalTransferenciaAtiva: 0,
totalTransferenciaCancelada: 0,
totalConsumoInterno: 0,
totalBaixas: 0,
totalAcrescimo: totalAcrescimo,
valorUnitario: valorUnitario,
]
}
}
}

produtos.each{ key,value ->


//imprimir "CHAVE: " + JSON.escrever(key)
//imprimir "VALOR: " + JSON.escrever(value)

linha = [
idUnidade: value.idUnidade,
idProduto: value.idProduto,
dtInicial: value.dtInicial,
dtFinal: value.dtFinal,
nomeUnidade: value.nomeUnidade,
nomeProduto: value.nomeProduto.toUpperCase(),
apresentacaoProduto: value.apresentacaoProduto,
saldoAnterior: value.saldoAnterior,
totalEntradaAtiva: value.totalEntradaAtiva,
totalEntradaCancelada: value.totalEntradaCancelada,
totalDispensaAtiva: value.totalDispensaAtiva,
totalDispensaCancelada: value.totalDispensaCancelada,
totalTransferenciaAtiva: value.totalTransferenciaAtiva,
totalTransferenciaCancelada: value.totalTransferenciaCancelada,
totalConsumoInterno: value.totalConsumoInterno,
totalBaixas: value.totalBaixas,
totalAcrescimo: value.totalAcrescimo,
saldoAtual: value.saldoAnterior + (value.totalEntradaAtiva -
value.totalEntradaCancelada) - (value.totalDispensaAtiva -
value.totalDispensaCancelada) - value.totalConsumoInterno - value.totalBaixas +
value.totalAcrescimo,
valorUnitario: value.valorUnitario,
]

fonte.inserirLinha(linha)
imprimir JSON.escrever(linha)
}

retornar fonte

Você também pode gostar