Definição da Regra de Negócio
A rotina de envio de carta de cobrança vai permitir que os títulos que estejam em atraso ou a vencer possam ser devidamente cobrados através do envio de cartas de cobrança eletrônica (e-mail) e/ou física.
Para que as cartas possam ser geradas e envidas, antes, deve-se permitir a seleção dos tipos de situação cobrança que serão considerados, o período no qual as cobranças se encontram (referente ao tempo de atraso e/ou período a vencer), além de permitir definir o teor do texto de cobrança que será enviado.
As cartas enviadas vão conter os juros e multas calculados até uma data definida em parâmetro, possibilitando aos destinatários saber o valor atualizado de cobrança.
Haverá a possibilidade de envio de diferentes tipos de texto e haverá a possibilidade de complementar as validações, de forma customizada, dos clientes que receberão as cartas de cobrança.
Um relatório de cobranças já efetuadas será implementado para facilitar o acompanhamento das cartas de cobrança enviadas e os seus respectivos destinatários e títulos cobrados.
Rotina | Tipo de Operação | Opção de Menu | Regras de Negócio |
[FINA810 – Layouts de Cartas de Cobrança] | [Criação] | [Atualizações -> Cadastros-> Layouts de Cartas de Cobrança] | - |
[FINA811 – Envio de Cartas de Cobrança] | [Criação] | [Atualizações -> Contas a Receber-> Envio de Cartas de Cobrança] | - |
[FINR811 – Cartas de Cobrança Enviadas] | [Criação] | [Relatórios -> Contas a Receber-> Cartas de Cobrança Enviadas] | - |
Parâmetros Iniciais
Os parâmetros iniciais vão permitir efetuar os filtros de quais clientes, o range de vencimento, valor, situação de cobrança, filiais, títulos ainda a vencer e determinar a data de apuração de juros e multa que serão considerados para envio de cartas de cobrança. Será possível complementar os filtros de forma customizada. Para isso, deverá ser implementado um ponto de entrada que permita complementar a query que considerará os parâmetros padrões.
Seleção de layout
Será apresentada uma relação dos layouts de carta de cobrança cadastrados para que seja possível selecionar qual o layout que será utilizado para envio. Só poderá ser selecionado um único layout de carta de cobrança por envio.
Seleção de clientes
Será apresentada uma relação dos clientes que atendem os critérios do filtro, para que possam ser selecionados para envio de carta de cobrança. Todos serão trazidos como marcados.
Seleção de títulos
O processo de seleção dos títulos que irão compor a carta de cobrança seguirá os critérios definidos e sugeridos no envio das cartas.
Haverá a possibilidade de enviar títulos que estão ainda a vencer, de forma adicional. Ou seja, incluí-los como um lembrete e não como uma cobrança. Estes serão sugeridos, mas liberados para exclusão da carta, caso desejado.
É importante ressaltar que, com a implementação do Bloqueio por Situação de Cobrança (vide MIT específica), os títulos em situação de cobrança com bloqueio configurado para as cartas de cobrança não estarão disponíveis neste processo de envio de e-mail. Sendo assim, estes não serão listados na seleção.
Para efetuar este bloqueio, será adicionado um novo processo padrão aos já existentes e o mesmo será validado a cada envio.
Além disso, um título será elegível para o envio de cartas enquanto ainda não foram quitados, ou seja, que atendem à regra de envio da cobrança.
Por exemplo:
1 - No dia 01/03/2015, foi enviado um e-mail com os títulos abaixo para cobrança, considerando vencimentos com mais de 10 dias de atraso:
Título | Vencimento | Dias em atraso |
---|
DUP | 22513 | 01 | 01/02/2015 | 28 |
DUP | 22221 | 02 | 01/01/2015 | 59 |
DUP | 25512 | 01 | 15/12/2014 | 76 |
2 - Em 15/03/2015, o cliente efetuou o pagamento das duas parcelas com maior atraso, mas não quitou a parcela de 01/02/2015. A cobrança enviada continha:
Título | Vencimento | Dias em atraso |
---|
DUP | 22513 | 01 | 01/02/2015 | 48 |
Sendo assim, enquanto este não for recebida, o título será enviado em novas cobranças. Ressaltamos que este exemplo considera somente o vencimento, mas que o título deve respeitar todas as regras do filtro.
Envio das cartas
Cada carta enviada será definida conforme o teor de cobrança, ou seja, será possível incluir um texto de um determinado teor para diferentes tipos de cobrança.
Para tanto, serão disponibilizadas formas de configurar os textos das cartas e associá-las a determinadas regras via cadastro. Estarão disponíveis somente características do cliente para validação combinada com o filtro de/até. Não sendo necessário, o mesmo poderá ser mantido em branco, para que as cartas sejam enviados para qualquer cliente.
As cartas seguirão os filtros informados na rotina de envio, validando os dados do cliente associados ao teor da carta. Esta configuração poderá utilizar campos customizados para sua composição.
Já na listagem de títulos, as colunas consideradas como padrão estão abaixo:
- Chave do título – Prefixo, número e parcela
- Data de vencimento
- Dias de atraso
- Valor Original
- Saldo do Título
- Multa
- Juros
Haverá a possibilidade de adição/retirada de novas colunas, desde que as mesmas façam parte do título a receber, considerando que, por se tratar de um envio de e-mail e/ou carta física, poderá haver algum tipo de restrição quanto a quantidade de informação contida na carta/folha.
Quando o método de envio selecionado for físico ou ambos, a carta deverá conter, no topo, os dados de envio, contendo nome e endereço do cliente. O endereço utilizado será o endereço de cobrança contido no cadastro do cliente. Caso esse endereço esteja em branco, o envio será feito para o endereço do cliente. No layout da carta, será possível definir o alinhamento do endereço do cliente no topo da carta.
Geração de relatório
A geração de relatórios vai permitir a conferência da carta enviada aos clientes e os respectivos títulos que foram enviados para cobrança, sendo este um espelho impresso do envio do e-mail.
O relatório poderá ser emitido logo na sequência do processamento, se desejado.
Para que seja possível a consulta posterior destas cartas, o processo enviado será gravado.
O relatório considerará os filtros de cliente, data (de/até) e seleção de filiais e se o mesmo será emitido de forma analítica (carta completa) ou sintética (somente títulos enviados ao cliente)
Detalhamento Técnico
Para este requisito será desenvolvida a rotina FINA810 - Layouts de Carta de Cobrança, utilizando o conceito de MVC. Esta deve seguir a interface sugerida nos protótipos 01 a 03.
Será possível informar:
- Saudação. Ex.: Prezado Cliente, Caro(a) etc.
- Texto da Carta
- Status - ativo ou não
- Regras de envio da carta de cobrança, sendo esta uma expressão como as de filtros de browse do Protheus. Estará posicionada a tabelas de Clientes (SA1). Ex.: Clientes do estado de São Paulo e que o sejam pessoa jurídica.
- Colunas dos títulos que serão enviadas no corpo do e-mail - podendo haver limitação por conta do envio da mensagem.
- Texto de Conclusão
- Método de envio, sendo possível selecionar: envio eletrônico (e-mail), envio físico ou ambos
É sugerido o uso do componente FWWizardControl para montagem do Wizard de envio das cartas de cobrança, conforme os protótipos 03 ao 09.
As pastas deste Wizard devem conter:
- Definição de parâmetros - onde serão informados os parâmetros para seleção dos clientes e títulos, conforme a relação abaixo (protótipo 04):
- Cliente e loja de (range inicial de cliente e loja);
- Cliente e loja até (range final de cliente e loja);
- Vencimento de (range de vencimento inicial dos títulos);
- Vencimento até (range de vencimento final dos títulos);
- Valor de (range de valor inicial dos títulos);
- Valor até (range de valor final dos títulos);
- Seleciona filiais (caso seja definido com "Sim", a tela padrão de seleção de filiais deverá ser exibida para que as filiais possam ser selecionadas);
- Situação de cobrança (deverá apresentar a mesma consulta F3 utilizada no requisito "Processos SERASA", permitindo que uma ou mais situações de cobrança sejam selecionadas. Este campo deverá ser validado para não ser deixado em branco ao avançar no processo);
- Títulos a vencer (caso esteja como sim, o filtro vai considerar os títulos que ainda estão por vencer);
- Data de referência para cálculo de juros e multa dos títulos;
- Considera valor (caso seja definido com "1-Valor Total", sistema irá filtrar os registros com conteúdo no campo E1_VALOR entre os valores informados nos itens 5 e 6 dessa janela. Caso seja definido com "2-Saldo", o sistema irá filtrar os registros com conteúdo no campo E1_SALDO entre os valores informados nos itens 5 e 6 dessa janela ).
- Seleção da carta - grid contendo os modelos de carta para que o usuário informe o layout que será enviada. Todos os layouts ativos serão exibidos (protótipo 05);
- Seleção de clientes - grid contendo a lista de clientes que atendem a regra de envio, para que o usuário informe quais receberão a carta (protótipo 06). Todos devem ser exibidos como marcados.
- Seleção de títulos - grid contendo a lista de títulos vencidos e a vencer, se for o caso, para envio no conteúdo da carta. Os títulos serão carregados todos como selecionado (protótipo 07);
É importante ressaltar que a seleção de títulos deve considerar o bloqueio de situação de cobrança configurado. Para detalhes e exemplos das funções padrões, consulte a especificação PCREQ-3782 - Bloqueio por situação de cobrança. - Confirmação do envio de e-mails para os clientes (protótipo 08). O modelo do e-mail seguirá a estrutura da imagem abaixo:
Para envio do e-mail, serão utilizados os seguintes parâmetros:- MV_RELSERV - Nome do servidor de envio de e-mail;
- MV_RELACNT - Conta a ser utilizada no envio de e-mail;
- MV_RELPSW - Senha da conta de e-mail;
- MV_RELFROM - E-mail utilizado no campo FROM no envio do e-mail;
- MV_RELBODY - Determina o assunto padrão no envio do e-mail.
- Finalização da operação - nesta pasta será possível também verificar o log dos envios efetuados (protótipo 09).
Todas as grids possuirão a opção de marcar ou desmarcar todos os registros (com exceção da grid de layouts de cartas de cobrança, onde somente um layout poderá ser selecionado).
IMPORTANTE: É uma premissa que o e-mail no cadastro de clientes esteja preenchido para que a cobrança seja enviada e que o serviço de envio de e-mail do Protheus esteja configurado.
Ao final do envio, será gravado um registro de log da carta enviada para emissão de relatório. Para tanto, serão armazenadas as seguintes informações de cada título enviado:
- Número de processo - para identificação da carta enviada. Deverá ser gravado utilizando a função FWUUIDV4().
- Chave do título - utilizar o Id único armazenado na FK7
- Data de Envio
- Código do layout
IMPORTANTE: Um título pode ter N ocorrências nesta tabela, mas em processos diferentes. Pode ocorrer de uma carta ser enviada mais de uma vez para um cliente em uma mesma data, e não haverá restrição quanto a isso, pois durante o dia poderão ocorrer baixas e inclusão de novos documentos no Protheus.
Somente estes dados são suficientes para reproduzir o e-mail com a cobrança enviada. Sendo assim, o relatório será uma cópia semelhante à enviada por e-mail, contendo:
- Texto da carta (opcional)
- Listagem de títulos vencidos
- Listagem de título a vencer
É imprescindível que o relatório seja o produto da concatenação da tabela FWT - Cartas Enviadas com a SE1 - Títulos a Receber para exibição dos dados de forma completa.
Haverá um salto de página a cada impressão de carta (quando completa) e as colunas dos títulos não seguirão o configurado no layout, uma vez que o relatório exige uma estrutura fixa. As colunas padrões da SE1 - Títulos a Receber a serem impressas serão:
- Prefixo
- Número
- Parcela
- Dias de atraso
- Valor Original
- Saldo do Título
Outros campos da tabela SE1 estarão disponíveis para adição no relatório em modelo TReport, considerando a limitação da área de impressão versus tamanho da página.
Os filtros padrões do relatório serão:
- Layout de/até
- Data de Envio de/até
- Cliente de/até
- Imprime - 1 Analítico/ 2 Sintético
Lembrando que o modelo do relatório deve ser o mesmo do e-mail enviado, remontado em tempo de impressão com os dados armazenados.
Tabelas Utilizadas
FWP - Cartas de Cobrança
FWQ - Regras de Envio
FWS - Dados dos Títulos
FWT - Cartas Enviadas
Exemplos de codificação
Abaixo segue exemplo de codificação para uso da classe FWWizardControl.
#include "protheus.ch"
//----------------------------------------
//Teste de FWWizardControl
//----------------------------------------
//-------------------------------------------------------------------
/*/{Protheus.doc} tstwiz
Exemplo básico de uso das classes FWWizardControl e FWWizardStep
Este exemplo foi desenvolvido utilizando como base
no exemplo disponível no TDN (links comentados no início do código)
@author Pedro Lima
@since 29/07/2015
@version 12.1.7
/*/
//-------------------------------------------------------------------
User Function tstwiz()
Local oPanel
Local oSize := Nil
Local oStepWiz := Nil
Local oNewPag := Nil
//Link da classe FWWizardControl no TDN
// http://tdn.totvs.com/display/framework/FWWizardControl
//Link da classe FWWizardStep no TDN
// http://tdn.totvs.com/display/framework/FWWizardStep
//Informações adicionais sobre métodos e parâmetros podem ser obtidas através dos links acima
oStepWiz := FWWizardControl():New(,{600,800})//Instancia a classe FWWizard (
oStepWiz:ActiveUISteps()
//----------------------
// Pagina 1
//----------------------
oNewPag := oStepWiz:AddStep("1") //Altera a descrição do step
oNewPag:SetStepDescription("Início") //Define o título do "step"
oNewPag:SetConstruction({|Panel|cria_pg1(Panel)}) //Define o bloco de construção
oNewPag:SetNextTitle("Próximo") //Define o texto do botão de avanço
oNewPag:SetNextAction({||.T.}) //Define o bloco ao clicar no botão Próximo
oNewPag:SetCancelAction({||.T.}) //Define o bloco ao clicar no botão Cancelar
//----------------------
// Pagina 2
//----------------------
oNewPag := oStepWiz:AddStep("2", {|Panel|cria_pg2(Panel)})
oNewPag:SetStepDescription("Seleção de layouts")
oNewPag:SetNextTitle("Próximo")
oNewPag:SetNextAction({||.T.})
oNewPag:SetCancelAction({||.T.})
oNewPag:SetPrevAction({||.T.}) //Define o bloco ao clicar no botão Voltar
oNewPag:SetPrevTitle("Voltar")
//----------------------
// Pagina 3
//----------------------
oNewPag := oStepWiz:AddStep("3", {|Panel|cria_pn3(Panel)})
oNewPag:SetStepDescription("Seleção de clientes")
oNewPag:SetNextTitle("Próximo")
oNewPag:SetNextAction({||.T.})
oNewPag:SetPrevAction({||.T.})
oNewPag:SetPrevTitle("Voltar")
oNewPag:SetCancelAction({||.T.})
//----------------------
// Pagina 4
//----------------------
oNewPag := oStepWiz:AddStep("4", {|Panel|cria_pn4(Panel)})
oNewPag:SetStepDescription("Seleção de títulos")
oNewPag:SetNextTitle("Próximo")
oNewPag:SetNextAction({||.T.})
oNewPag:SetPrevAction({||.T.})
oNewPag:SetPrevTitle("Voltar")
oNewPag:SetCancelAction({||.T.})
//----------------------
// Pagina 5
//----------------------
oNewPag := oStepWiz:AddStep("5", {|Panel|cria_pn5(Panel)})
oNewPag:SetStepDescription("Envio das Cartas")
oNewPag:SetNextTitle("Próximo")
oNewPag:SetNextAction({||.T.})
oNewPag:SetPrevAction({||.T.})
oNewPag:SetPrevTitle("Voltar")
oNewPag:SetCancelAction({||.T.})
//----------------------
// Pagina 6
//----------------------
oNewPag := oStepWiz:AddStep("6", {|Panel|cria_pn6(Panel)})
oNewPag:SetStepDescription("Fim")
oNewPag:SetNextTitle("Concluir")
oNewPag:SetNextAction({||.T.})
oNewPag:SetPrevAction({||.T.})
oNewPag:SetPrevTitle("Voltar")
oNewPag:SetCancelAction({||.T.})
oNewPag:SetCancelWhen({||.F.})
oStepWiz:Activate()
oStepWiz:Destroy()
Return
//--------------------------------------------------------------------
// Início dos blocos de construçãos das páginas de cada step
//--------------------------------------------------------------------
//--------------------------
// Construção da página 1
//--------------------------
Static Function cria_pg1(oPanel)
Local oNo := LoadBitmap( GetResources(), "LBNO" )
Local oOk := LoadBitmap( GetResources(), "LBTIK" )
Local oLbxWiz
Local cLstBx
Local oChkTWiz
Local lChkTWiz := .F.
Local oChkIWiz
Local lChkIWiz := .F.
Local aWiz := {{.F.,"010203","MATRIX TOLDOS","UNI","000000255","01","NF","15/04/2015","153,10"},;
{.F.,"010203","MATRIX TOLDOS","UNI","000000310","05","NF","16/05/2015","215,33"},;
{.F.,"010203","MATRIX TOLDOS","UNI","000000316","","DP","20/05/2015","3.000,00"},;
{.F.,"010005","CONFECÇÔES LINHA FINA","SFG","000000441","01","NF","14/01/2015","233,00"},;
{.F.,"010005","CONFECÇÔES LINHA FINA","SFG","000000393","01","NF","17/02/2015","149,85"},;
{.F.,"010005","CONFECÇÔES LINHA FINA","SFG","000000394","02","NF","17/03/2015","149,85"},;
{.F.,"010005","CONFECÇÔES LINHA FINA","SFG","000000395","03","NF","17/04/2015","149,85"},;
{.F.,"032210","SHANGTSUNG ELETRONICS","ASP","000001025","01","DP","14/04/2015","445,00"},;
{.F.,"032210","SHANGTSUNG ELETRONICS","ASP","000001073","","DP","25/04/2015","1.025,66"},;
{.F.,"001233","ACME DEMOLIÇÕES","BUM","000000123","06","NF","30/03/2015","2.780,50"},;
{.F.,"045322","TABAJARA EMPREENDIMENTOS","CCD","000000112","01","NF","16/01/2015","115,00"},;
{.F.,"045322","TABAJARA EMPREENDIMENTOS","CCD","000000113","01","NF","16/02/2015","160,00"},;
{.F.,"003104","BEBIDAS CLONINHO LTDA","ARG","000000171","01","NF","16/01/2015","15,65"},;
{.F.,"003104","BEBIDAS CLONINHO LTDA","ARG","000000171","02","NF","16/02/2015","15,65"},;
{.F.,"003104","BEBIDAS CLONINHO LTDA","ARG","000000171","03","NF","16/03/2015","15,65"},;
{.F.,"003104","BEBIDAS CLONINHO LTDA","ARG","000000171","04","NF","16/04/2015","15,65"},;
{.F.,"003104","BEBIDAS CLONINHO LTDA","ARG","000000171","05","NF","16/05/2015","15,65"}}
@ 001,001 LISTBOX oLbxWiz FIELDS HEADER "","Cód. Cliente","Nome Cliente","Prefixo","Número","Parcela","Tipo","Vencimento","Valor" SIZE 400,190;
ON DBLCLICK (aWiz[oLbxWiz:nAt,1] := !aWiz[oLbxWiz:nAt,1],If(!aWiz[oLbxWiz:nAt,1],lChkTWiz := .F., ),oLbxWiz:Refresh(.f.),ApSxVerChk(@lChkTWiz,@aWiz,@oLbxWiz,@oChkTWiz));
OF oPanel PIXEL
oLbxWiz:SetArray(aWiz)
oLbxWiz:bLine := {|| {If(aWiz[oLbxWiz:nAt,1],oOK,oNO),aWiz[oLbxWiz:nAt,2],;
aWiz[oLbxWiz:nAt,3],;
aWiz[oLbxWiz:nAt,4],;
aWiz[oLbxWiz:nAt,5],;
aWiz[oLbxWiz:nAt,6],;
aWiz[oLbxWiz:nAt,7],;
aWiz[oLbxWiz:nAt,8],;
aWiz[oLbxWiz:nAt,9]}}
oLbxWiz:bRClicked := { || AEVAL(aWiz,{|x|x[1]:=!x[1]}),oLbxWiz:Refresh(.F.) }
oLbxWiz:bLDblClick := { || aWiz[oLbxWiz:nAt,1] := !aWiz[oLbxWiz:nAt,1],If(!aWiz[oLbxWiz:nAt,1],lChkTWiz := .F., ),oLbxWiz:Refresh(.f.),ApSxVerChk(@lChkTWiz,@aWiz,@oLbxWiz,@oChkTWiz) }
@ 195,020 CHECKBOX oChkTWiz VAR lChkTWiz PROMPT "Marcar Todos" SIZE 62, 10 OF oPanel PIXEL
oChkTWiz:blClicked := {|| AEval( aWiz,{|x,y| x[1] := lChkTWiz , If(lChkTWiz, (lChkIWiz := .F.,oChkIWiz:Refresh()), )})}
@ 195,100 CHECKBOX oChkIWiz VAR lChkIWiz PROMPT "Inverter Marca" SIZE 62, 10 OF oPanel PIXEL
oChkIWiz:blClicked := {|| AEval( aWiz,{|x,y| x[1] := !x[1]}), lChkTWiz := (Ascan(aWiz,{|x|!x[1]}) == 0), oChkTWiz:Refresh()}
Return
//--------------------------
// Construção da página 2
//--------------------------
Static Function cria_pg2(oPanel)
Return
//--------------------------
// Construção da página 3
//--------------------------
Static Function cria_pn3(oPanel)
Return
//--------------------------
// Construção da página 4
//--------------------------
Static Function cria_pn4(oPanel)
Return
//--------------------------
// Construção da página 5
//--------------------------
Static Function cria_pn5(oPanel)
Local oFont
Local oSay
oFont:= TFont():New(,,-25,.T.,.T.,,,,,)
oSayTop := TSay():New(10,15,{|| "Envio de Cartas de Cobrança"},oPanel,,oFont,,,,.T.,CLR_BLUE,)
oSayBottom1 := TSay():New(35,10,{|| "Clique em 'Próximo' para efetivar o envio das cartas, conforme as seleções efetuadas anteriormente"},oPanel,,,,,,.T.,CLR_BLUE,)
Return
//--------------------------
// Construção da página 6
//--------------------------
Static Function cria_pn6(oPanel)
Local oBtnLog
oFont:= TFont():New(,,-25,.T.,.T.,,,,,)
// Apresenta o tSay com a fonte Courier New
oSayTop := TSay():New(10,15,{|| "Envio de Cartas de Cobrança efetuado com sucesso"},oPanel,,oFont,,,,.T.,CLR_BLUE,)
oSayBottom1 := TSay():New(35,10,{|| "Consulte o log de envio para mais detalhes"},oPanel,,,,,,.T.,CLR_BLUE,)
oBtnLog := TButton():New(180,330, "Log de Envio",oPanel,{||Alert("Log de Processo")}, 60,20,,,.F.,.T.,.F.,,.F.,,,.F. )
Return
//Fim do exemplo de uso das classe FWWizardControl e FWWizardStep
- Data de referência para cálculo de juros e multa dos títulos.