Clientes

Como auditar os limites de créditos dos clientes?

CLIENT.FAQ-27920
Para avaliar manualmente, pode-se fazer as seguintes perguntas:

Para executar uma auditoria nos limites de crédito, execute os SQLs abaixo.

Verificar divergências causadas pela quantidade a faturar:
item credito_tomado value;

select *
from (

select pedido
, credito_tomado
, sum(quantidade_financeiro_pendente * valor_total_item / quantidade) as credito_tomado_calculado
from (
select *
, q.quantidade - quantidade_cancelada - coalesce(quantidade_financeiro,0) as quantidade_financeiro_pendente
from (
select iped.pedido_id
, ped.pedido
, ped.credito_tomado
, tped.toma_credito_cliente
, pp.utiliza_limite_credito
, tped.tipo_pedido
, iped.valor_total_item
, iped.quantidade
, iped.quantidade_cancelada
, (select sum(quantidade)
   from itens_doc_entradas_saidas idoc
   join doc_entradas_saidas doc on doc.id = idoc.documento_id
   where idoc.item_pedido_id = iped.id
   and tipo_operacao = 'S'
   and exists (select 1 
               from pedidos_titulos pt
               join titulos t on t.id = pt.titulo_id
               where pt.documento_id = doc.id
               and t.situacao <> 'C')
   ) as quantidade_financeiro
from pedidos ped
join itens_pedidos iped on iped.pedido_id = ped.id
join tipos_pedidos tped on tped.id = ped.tipo_pedido_id
left join planos_pagamentos pp on pp.id = ped.prazo_pagamento_id
where iped.quantidade > 0
and ped.situacao in('P', 'T', 'X', 'O', 'E', 'A', 'M')
and (tped.toma_credito_cliente = 'S' 
     or (tped.toma_credito_cliente = 'P' and pp.utiliza_limite_credito = 'S'))
) q
) q
group by pedido
, toma_credito_cliente
, credito_tomado
, utiliza_limite_credito
order by pedido desc
) q
where credito_tomado <> credito_tomado_calculado


Verificar limites de crédito dos clientes:
select *
, credito_tomado_correto - credito_tomado_cadastro as diferenca
from (
select q.id
, q.cliente
, q.nome_completo
, valor_titulos
, valor_pedidos
, valor_documentos
, coalesce(valor_pedidos,0) 
  + coalesce(valor_titulos,0) 
  + coalesce(valor_documentos,0) as credito_tomado_correto
, q.credito_tomado as credito_tomado_cadastro
, q.limite_credito
, q.credito_disponivel
from (
select pes.id
, pes.pessoa as cliente
, pes.nome_completo
, cli.limite_credito
, cli.credito_tomado
, cli.credito_disponivel
, (select sum(credito_tomado) from pedidos where credito_tomado_cliente_id = cli.id) as valor_pedidos
, (select sum(credito_tomado) from titulos where credito_tomado_cliente_id = cli.id) as valor_titulos
, (select sum(credito_tomado) from doc_entradas_saidas where credito_tomado_cliente_id = cli.id) as valor_documentos
from clientes cli
join pessoas pes on pes.id = cli.id
) q
) q 
where credito_tomado_correto <> credito_tomado_cadastro
or credito_disponivel <> limite_credito - credito_tomado_cadastro
order by q.cliente;

Ajustar documentos com credito tomado incorreto:
update doc_entradas_saidas doc
set credito_tomado = 0
where credito_tomado > 0
and (doc.situacao_documento not in ('A', 'E', 'I', 'M', 'P', 'V')
    or exists (select 1 from pedidos_titulos where documento_id = doc.id)
    or doc.tipo_operacao <> 'S'
    or doc.gerar_faturamento <> 'S');

Ajustar títulos cancelados tomando crédito:
update titulos
set credito_tomado = 0
where situacao = 'C' 
and credito_tomado <> 0;

Ajustar títulos liquidados tomando crédito:
update titulos
set credito_tomado = 0
where situacao = 'L' 
and credito_tomado <> 0;

Ajustar títulos a pager tomando crédito:
update titulos
set credito_tomado = 0
where tipo_operacao = 'P' 
and credito_tomado <> 0;

Remover o tomador de credito de valor zero
update titulos
set credito_tomado_cliente_id = null
where credito_tomado = 0
and credito_tomado_cliente_id is not null;

Atualizar o crédito tomado e limite disponível:
update clientes cli
set credito_tomado =
   coalesce((select sum(credito_tomado) from pedidos where credito_tomado_cliente_id = cli.id) , 0)
   + coalesce((select sum(credito_tomado) from titulos where credito_tomado_cliente_id = cli.id) , 0)
   + coalesce((select sum(credito_tomado) from doc_entradas_saidas where credito_tomado_cliente_id = cli.id) , 0);

update clientes cli
set credito_disponivel = limite_credito - coalesce(credito_tomado,0)
where limite_credito is not null;