Gestão de comissões e royalties > Cenários de exemplo

Comissões de representação - Modelo 1

COMISSOES.RQ-018

Descrição

Gestão de comissões no cenário onde uma empresa representa um fornecedor em uma operação de venda para um cliente e que a comissão é gerada a partir do pagamento das parcelas pagas pelos clientes para o fornecedor.

O processo é dividido nas seguintes etapas:

Fluxo normal

Geração dos títulos de terceiros

A emissão de um pedido de representação deve utilizar um tipo de pedido que esteja configurado para gerar automaticamente títulos de terceiros previstos em manutenção. Esse modelo funciona com pedidos criados com planos de pagamentos. Uma vez gerado, o usuário poderá ajustar as datas e valores como convir, tanto pela guia do financeiro como diretamente na interface de títulos de terceiros.

Confirmação dos títulos de terceiros (opcional)

Essa é uma etapa que pode ser ignorada.
Conceitualmente, sempre que um pedido for entregue pelo fornecedor, os títulos seriam automaticamente confirmados. Novamente, as datas e valores poderão ser ajustadas conforme informações recebidas pelo faturamento realizado pelo fornecedor.
Como a rotina de conciliação confirma automaticamente os títulos que tiverem confirmação de pagamento, então isso não precisa ser feito.

Conciliação dos pagamentos de terceiros

Mensalmente (ou na frequência desejada), os títulos efetivamente pagos pelos clientes para os fornecedores (nos vencimentos dos títulos de terceiros) deverão ser liquidados no sistema utilizando a interface (Títulos de terceiros).

O roteiro normal seria filtrar pelo Fornecedor (emitente do título) que está sendo conciliado, situação diferente de "Liquidado", com data de vencimento até a data corrente. Listar com [b:Enter] e pressionar [b:Pagar F12] para abrir a lista de registros com os campos de valor de data de pagamento em aberto.

O usuário deverá então confirmar o pagamento dos títulos, informando valor e data, salvando no final.

Durante a essa conciliação, também é possível monitorar as parcelas de clientes que estão em atraso (consultando os títulos por data de vencimento até o dia anterior e que ainda estejam abertos).

Opcionalmente, é possível consultar títulos em manutenção que teoricamente já deveriam estar abertos devido a entrega de pedidos que ainda não foram entregues.

Geração dos títulos de comissão a receber

Após conciliado os pagamentos dos clientes para os fornecedores, deve-se gerar as comissões a receber, disparando a rotina pelo menu "Financeiro > Gerar comissões a receber". Esse processo gera títulos a receber agrupando por fornecedor/data de vencimento.
Caso já existam títulos em manutenção para o fornecedor para a data de vencimento, estes títulos são alterados para incluir os respectivos valores.

Ao consultar os títulos de terceiros liquidados que já geraram comissão a receber, um link é apresentado para indicar o respectivo título a receber.

Ao consultar os títulos de comissão a receber, é apresentada a informação dos títulos de terceiros que originaram a respectiva comissão.

Gestão do recebimento das comissões

Segue o fluxo normal dos processos de contas a receber.

Implantação

Tipo de pedido (de representação):

Criar um tipo de título chamado de "COMISSAO"

Criar um histórico de movimentação "VINCULO (R)"

Criar rotina custom
set tipo_titulo_comissao_id id from tipos_titulos where tipo_titulo = 'COMISSAO';
set historico_vinculo_id id from historicos_contas_receber where historico = 'VINCULO (R)';
set historico_lancamento_id id from historicos_contas_receber where historico = 'LANCAMENTO (R)';

for rec in 
   select parcela.numero_titulo
   , pag.estabelecimento_id
   , pag.id as movimento_pagamento_id
   , parcela.emitente_id as destinatario_id
   , e.estabelecimento_id as emitente_id
   , pag.valor
   , pag.data_contabil
   , (date_trunc('month', current_date)
       + interval '1 month'
       + interval '14 day')::date as data_vencimento
   , (select ped.percentual_comissao
       from pedidos_titulos pt
       join pedidos ped on ped.id = pt.pedido_id
       where pt.titulo_id = parcela.id) * pag.valor / 100 as valor_comissao
   from movimentos_financeiros pag
   join titulos parcela on parcela.id = pag.titulo_id
   join historicos_contas_receber hist_pag on hist_pag.id = pag.historico_id
   join estabelecimentos e on e.id = parcela.estabelecimento_id
   left join tipos_titulos tipo_comissao on tipo_titulo = 'COMISSAO'
   where hist_pag.historico = 'PAGAMENTO (R)'
   and parcela.tipo_operacao = 'T'
   and not exists (select 1
                   from movimentos_financeiros
                   where MOVIMENTO_FINANCEIRO_GERADOR_ID = pag.id)
loop

   set titulo_id id
   from titulos t
   where t.tipo_operacao = 'R'
   and t.destinatario_id = ${rec.destinatario_id}
   and t.situacao = 'M'
   and t.tipo_titulo_id = ${tipo_titulo_comissao_id}
   limit 1;

   if '' = '$!{titulo_id}' then
       ins titulos
       set estabelecimento_id = ${rec.estabelecimento_id}
       , tipo_titulo_id = ${tipo_titulo_comissao_id}
       , tipo_operacao = 'R'
       , emitente_id = ${rec.emitente_id}
       , destinatario_id = ${rec.destinatario_id}
       , data_vencimento = '${rec.data_vencimento}'
       , valor = ${rec.valor_comissao}
       , sequencia = 0;
       
       set titulo_id ${last.id};
   else
       upd titulos
       set valor = valor + ${rec.valor_comissao}
       where id = ${titulo_id};
   end-if;
    
   ins movimentos_financeiros
   set historico_id = ${historico_vinculo_id}
   , MOVIMENTO_FINANCEIRO_GERADOR_ID = ${rec.movimento_pagamento_id}
   , valor = ${rec.valor_comissao}
   , titulo_id = ${titulo_id}
   from movimentos_financeiros mf
   where titulo_id = ${titulo_id}
   and historico_id = ${historico_lancamento_id}
   limit 1;

end-loop;

Incluir um item de menu que chame a rotina acima.

Incluir direitos de acesso para quem pode executá-la.

Configurar scripted_field na CAD_TITULOS_TERCEIROS (block config)
{
 "items": [
     {
         "name": "VINCULOS",
         "domain": "ADSRT.SCRIPTED_FIELD",                                  
         "label": "Origens",  
         "hint": "Vínculo entre os títulos de terceiros e títulos de comissões a receber.",
         "expr": "''",
         "usages": [                                                 
             {
                 "operation": "VIEW",                                
                 "usage": "view"                                     
               
             }
         ]
     }
 ]
}

Configurar preferencia CONREC.CAD_TITULOS_RECEBER.VINCULOS.SCRIPT:
item titulo text_html;

select mf.valor as valor_comissao
, '<a href="ConTitulos?Z_ACTION=CONSULTA&A_ID=' || t2.id || '">' || t2.titulo || '</a>' as titulo
, t2.data_vencimento
, m2.data_contabil as data_pagamento
, m2.valor as valor_pagamento
from movimentos_financeiros mf
join historicos_contas_receber h on h.id = mf.historico_id
join movimentos_financeiros m2 on m2.id = mf.MOVIMENTO_FINANCEIRO_GERADOR_ID
join titulos t2 on t2.id = m2.titulo_id
where mf.titulo_id = ${id}
and h.historico = 'VINCULO (R)';



Configurar scripted_field na CAD_TITULOS_TERCEIROS (block config)
{
 "items": [
     {
         "name": "COMISSOES",
         "domain": "ADSRT.SCRIPTED_FIELD",                                  
         "label": "Comissões",  
         "hint": "Comissão a receber gerada a partir deste título.",
         "expr": "''",
         "usages": [                                                 
             {
                 "operation": "VIEW",                                
                 "usage": "view"                                     
               
             }
         ]
     }
 ]
}

Configurar preferencia CONREC.CAD_TITULOS_TERCEIROS.VINCULOS.SCRIPT:
item titulo text_html;

select mf.valor as valor_comissao
, t1.data_vencimento
, '<a href="ConTitulos?Z_ACTION=CONSULTA&A_ID=' || t1.id || '">' || t1.titulo || '</a>' as titulo
from movimentos_financeiros mf
join titulos t1 on t1.id = mf.titulo_id
join historicos_contas_receber h on h.id = mf.historico_id
join movimentos_financeiros m2 on m2.id = mf.MOVIMENTO_FINANCEIRO_GERADOR_ID
join titulos t2 on t2.id = m2.titulo_id
where m2.titulo_id = ${id}
and h.historico = 'VINCULO (R)';

Criar operação custom para informar preencher o percentual de comissão
Implementação:
def pedido = ctx.getEvent().getObject();

if (pedido.getPercentualComissao().isNull()) {
    tipo = pedido.findTipoPedido().valueOfTipoPedido();
    if (tipo.contains("INTERNACIONAL")) {
        pedido.setPercentualComissao(10);
    } else if (tipo.contains("NACIONAL")) {
        pedido.setPercentualComissao(7);
    }
}

E listener para o mesmo:


Modelo

                                                       MOVIMENTO_FINANCEIRO (VINCULO)
                   MOVIMENTO_FINANCEIRO (PAGAMENTO) -< movimento_financeiro_gerador_id 
TITULO_TERCEIRO -< titulo_id                                                 titulo_id >- TITULO_RECEBER
                                              
Resumo