Pular para o conteúdo principal

MFC010 — Movimentação MFC010

Fonte​

  • Source: source/MFC010/
  • Unit principal: UMFC010.pas
  • DataModule: UdmMFC010.pas
  • Package: MFC010.dpk (requires: rtl, vcl, dbrtl, vclwinx, vclactnband, vclx, vcldb, FireDAC, FireDACCommonDriver, FireDACCommon, FireDACIBDriver, ipstudiowin, jCommon, jPesquisa)

Objetivo​

Permitir o estorno em lote de processos financeiros (pagamentos TP_PROCESSO='G' e recebimentos TP_PROCESSO='P') ja liquidados, reabrindo as duplicatas (tabela CONTAS) que compunham o processo. O usuario seleciona via filtros os processos alvo, marca quais deseja estornar na coluna STATUS dos grids e confirma informando data de estorno e motivo (obrigatoriamente do tipo cancelamento). O estorno propriamente dito e delegado a procedure ESTORNA_PROCESSO, que desfaz contabilizacoes, impostos, conciliacoes e demais efeitos colaterais do processo.

Funcionalidades​

  • Filtro multi-criterio de processos financeiros: empresa, numero do processo, numero do recibo (cruza com MOVTOCAIXA pelo tipo AV), intervalo de datas de emissao/vencimento/execucao.
  • Filtro por lista de documentos (NR_DOCUMENTO/NR_LANCAMENTO), por lista de pessoas (F9 via Busca(PESSOA)) e por lista de tipos de conta (F9 via Pesquisa).
  • Listagem de processos resultantes (aba "Documentos"), exibindo empresa, numero, data, valor, tipo (RECEBIMENTO/PAGAMENTO), total de doctos e coluna STATUS com marcador Wingdings 2.
  • Detalhamento das duplicatas (CONTAS) agrupadas por processo via relacao master-detail (dsPROCESSO -> tabCONTAS).
  • Marcacao por barra de espaco ou clique na coluna STATUS do grid de processos (mantem contador NR_TOTAL).
  • Execucao do estorno via procedure ESTORNA_PROCESSO(CD_EMPRESA, NR_PROCESSO, CD_MOTIVO, DT_ESTORNO) em transacao dedicada (transactionBanco), com rollback automatico se alguma execucao retornar mensagem de erro.
  • Acesso somente leitura quando programa.tpAcesso = 2 (oculta botoes Novo/Excluir, alem de Salvar/Atualizar/Imprimir que ja sao escondidos por padrao).

Estrutura da Tela​

Form MDI (fsMDIChild, BorderStyle=bsSingle) com toolbar vertical a esquerda e TPageControl (Paginas) com 2 abas.

Toolbar (esquerda)​

ComponenteCaption/HintAcao
btnNovoNovo Registro <F5>Reabre filtro, limpa datasets e preenche CD_EMPRESA da sessao
btnSalvarSalvar Alteracoes <F6>(oculto)
btnExcluirExcluir Registro <F7>Dispara rotina de estorno
btnLimparCancelar Registro <F4>Limpa linha corrente conforme Navegacao
btnProcurarConsultar <F3>Monta WHERE dinamico e abre tabPROCESSO
btnAtualizarAtualizar Registros <F2>(oculto)
btnImprimirImprimir <F8>(oculto)
btnSairSair <F12>Fecha o form

Atalhos globais (FormKeyDown): F3=Procurar, F4=Limpar, F5=Novo, F7=Excluir, F12=Sair.

Aba "Filtros para Consulta" (pagCONSULTA)​

Grupo "Documentos" (grpDocumentos)​

CampoLabelDataFieldObservacoes
edtCD_EMPRESAEmpresaCD_EMPRESAF9 abre pesquisa EMPRESA; valida em tabFILTROCD_EMPRESAValidate
edtNM_EMPRESA(read-only)NM_EMPRESAPreenchido pelo validate
edtNR_PROCESSONº ProcessoNR_PROCESSOFiltro exato por P.NR_PROCESSO
edtNR_RECIBONº ReciboNR_RECIBOQuando informado, aplica INNER JOIN em MOVTOCAIXA (TP_DOCUMENTO='AV')
edtDT_INICIAL / edtDT_FINALEmissao / AteDT_INICIAL / DT_FINALIntervalo sobre C.DT_LANCAMENTO
edtDT_INIVENC / edtDT_FINVENCVencimento / AteDT_INIVENC / DT_FINVENCIntervalo sobre C.DT_VENCIMENTO
edtDT_EXECINI / edtDT_EXECFIMExecucao / AteDT_EXECINI / DT_EXECFIMIntervalo sobre P.DT_PROCESSO
gridDocumentos(sem caption, DBGrid)-Entrada multipla de NR_DOCUMENTO e NR_LANCAMENTO (editavel)

Grupo "Pessoas" (grpPESSOA)​

Grid editavel gridPESSOA (dsPESSOA) com colunas CD_PESSOA (Código) e NM_PESSOA (Nome). F9 chama Busca(PESSOA) via jPesquisa; CD_PESSOA validado contra PESSOA.CD_PESSOA.

Grupo "Tipos de Conta" (grpTIPOCONTA)​

Grid editavel gridTIPOCONTA (dsTIPOCONTA) com colunas CD_TIPOCONTA (Código) e DS_TIPOCONTA (Descricao). F9 chama Pesquisa sobre TIPOCONTA; CD_TIPOCONTA validado contra TIPOCONTA.CD_TIPOCONTA.

Botao​

  • btnOK — Caption: &Consultar &lt;F&gt; — aciona btnProcurar.Click.

Aba "Documentos" (PagCONTAS)​

Aba ocultada ao entrar (TabVisible := True somente apos consultar).

Grupo "Processos de Contas" (grpProcesso)​

Grid gridProcesso (dsPROCESSO) com colunas:

ColunaCampoObservacao
STATUS (Å)STATUSMarcacao por barra-de-espaco ou clique (Wingdings 2 'Å')
CD_EMPRESACD_EMPRESA-
NR_PROCESSONR_PROCESSO-
DT_PROCESSODT_PROCESSOData de execucao do processo
VL_PROCESSOVL_PROCESSOValor total do processo
TIPOTIPODerivado de TP_PROCESSO (P=RECEBIMENTO, senao PAGAMENTO)
NR_DOCTOSNR_DOCTOSCOUNT(M.NR_LANCAMENTO)

Campo auxiliar read-only DBEdit1 exibe NR_TOTAL (contador de marcados, atualizado em tabPROCESSOSTATUSValidate).

Grupo "Documentos" (grpCONTAS)​

Grid gridCONTAS (dsCONTAS, master-detail com PROCESSO) com colunas STATUS, CD_EMPRESA, NR_DOCUMENTO, NR_PARCELA, DT_LANCAMENTO, NM_PESSOA, DS_TIPOCONTA, VL_DOCUMENTO, VL_JURO, VL_DESCONTO.

Campos de Estorno​

CampoLabelDataFieldObservacoes
edtDT_ESTORNOData de EstornoDT_ESTORNOObrigatorio antes do estorno
edtCD_MOTIVOMotivoCD_MOTIVOF9 abre pesquisa em MOTIVO onde TP_MOTIVO='C'; validate exige tipo 'C' (cancelamento)
edtDS_MOTIVO(read-only)DS_MOTIVOPreenchido pelo validate
btnEstornarEstornar (F7)-Atalho para btnExcluir.Click

Parametros que Influenciam​

A tela MFC010 nao le diretamente nenhuma tabela PARM* no codigo Delphi. O comportamento parametrizavel esta todo dentro da procedure ESTORNA_PROCESSO, que acessa (conforme mapa):

TabelaLida porEfeito indireto no estorno
PARMFATURESTORNA_PROCESSORegras de faturamento aplicadas ao reverter itens
PARMFINANCESTORNA_PROCESSORegras financeiras (provisoes, conciliacao) no estorno
PARMFISCALESTORNA_PROCESSOAjustes fiscais revertidos em AJUSTEFISCALITEMNOTA
PARMCONTABILESTORNA_PROCESSOControla reversao em CONTASCTB / ITEMNOTACTB / MOVTOCONTABIL
PARMCOMPLEMENTOESTORNA_PROCESSOComplemento (leite) em COMPLEMENTOLEITE
PARMSISTEMAESTORNA_PROCESSOParametros gerais do sistema

Para regras efetivas de cada parametro, consulte o corpo de ESTORNA_PROCESSO em Scripts/ESTORNA_PROCESSO.sql.

Regras de Negocio​

Acesso e inicializacao​

  • iniciar(): cria DM + Form, compartilha CliHandle, traduz, registra o form. Se programa.tpAcesso = 2, oculta btnNovo/btnSalvar/btnExcluir/Separador1. Sempre oculta btnSalvar/btnAtualizar/btnImprimir/Separador3. Inicia e imediatamente faz rollback (reset da transacao) e clica btnNovo para abrir o filtro.
  • FormClose: rollback da transacao principal, libera DM, descarregarPrograma.

Validacoes de filtro (tabFILTRO*Validate)​

  • DT_INICIAL/DT_FINAL: se ambas preenchidas, DT_INICIAL nao pode ser maior que DT_FINAL — raise JException.Create('E-0000', ['A Data Inicial nao pode ser Maior que a Data Final!']).
  • DT_INIVENC/DT_FINVENC: mesma regra sobre vencimento.
  • CD_EMPRESA: busca NM_EMPRESA em EMPRESA. Se nao encontra: 'A Empresa nao esta Cadastrada! [ADM002]'.
  • CD_MOTIVO: busca em MOTIVO. Exige TP_MOTIVO='C' senao 'O Motivo deve ser de cancelamento! [TFA009]'. Se nao existe: 'Motivo nao cadastrado! [TFA009]'.

Validacoes de lista (campos OnValidate)​

  • tabTIPOCONTACD_TIPOCONTAValidate: busca DS_TIPOCONTA; se nao encontra: 'O Tipo de Conta nao esta Cadastrado! [TFC005]'.
  • tabPESSOACD_PESSOAValidate: busca NM_PESSOA; se nao encontra: 'Pessoa nao Cadastrada!'.

Datasets de movimento — somente leitura​

  • tabPROCESSONewRecord: tabPROCESSO.Cancel (impede append direto no grid).
  • tabCONTASNewRecord: tabCONTAS.Cancel.

Marcacao para estorno​

  • gridProcessoKeyDown (tecla espaco) e gridProcessoMouseUp (clique na area 12 < X < 25): alternam tabPROCESSOSTATUS entre 'Å' (Wingdings 2) e vazio.
  • tabPROCESSOSTATUSValidate: atualiza contador tabFILTRONR_TOTAL (+1 ao marcar, -1 ao desmarcar).

Montagem do WHERE em btnProcurarClick​

WHERE base fixo: C.TP_DOCUMENTO NOT IN ('RS') AND T.TP_TIPOCONTA NOT IN ('PP','PR') AND P.ST_PROCESSO = 'L' (somente processos liquidados, excluindo provisoes PP/PR e recebimento de serviço RS).

Clausulas dinamicas (concatenadas via Nulo()):

  • Empresa, processo, datas de emissao/vencimento/execucao.
  • NR_RECIBO — ativa INNER JOIN em MOVTOCAIXA (TP_DOCUMENTO='AV') com chaves (CD_EMPRPROC, NR_PROCESSO).
  • C.NR_DOCUMENTO IN (...) e C.NR_LANCAMENTO IN (...) a partir de tabDOCUMENTOS.
  • C.CD_PESSOA IN (...) a partir de tabPESSOA.
  • C.CD_TIPOCONTA IN (...) a partir de tabTIPOCONTA.

Se tabPROCESSO.Eof apos abrir: raise JException.Create('E-0000', ['A Consulta nao Retornou Registros!']).

Estorno (btnExcluirClick)​

  1. Confirmacao via MessageBox 'Confirma Estorno dos Processos?' (IDYES).
  2. Valida DT_ESTORNO obrigatoria e CD_MOTIVO obrigatorio (JException + SetFocus respectivo).
  3. Inicia transactionBanco.
  4. Se NR_TOTAL > 0: itera tabPROCESSO e, para cada linha com STATUS <> '', executa:
    SELECT O_DS_MENSAGEM FROM ESTORNA_PROCESSO(CD_EMPRESA, NR_PROCESSO, CD_MOTIVO, DT_ESTORNO)
    Se a procedure retorna mensagem nao vazia: transactionBanco.Rollback + JException E-0000 com a mensagem.
  5. Se nao marcou nenhum processo mas ha CONTAS marcadas: apenas incrementa vNR_PROCESSO (bloco incompleto — estorno por documento individual nao esta implementado).
  6. Se vNR_PROCESSO <= 0: raise JException.Create('E-0000', ['Nao foi Selecionado nenhum Processo / Documento para o Estorno. Verifique!']).
  7. transactionBanco.Commit + MessageBox 'Processos Estornados com Sucesso.' + btnNovo.Click.

Datasets e SQL​

DatasetDescricao / SQL
tabFILTRO (CachedUpdates)Dataset efemero com SELECT ... FROM RDB$DATABASE WHERE 0=1. Campos: DT_INICIAL, DT_FINAL, DT_INIVENC, DT_FINVENC, DT_EXECINI, DT_EXECFIM, NR_PROCESSO, NR_RECIBO, CD_EMPRESA, NM_EMPRESA, DT_ESTORNO, CD_MOTIVO, DS_MOTIVO, NR_TOTAL
tabDOCUMENTOSLista de documentos/lancamentos digitados pelo usuario (SELECT ... FROM PESSOA WHERE 1=0, campos NR_DOCUMENTO, NR_LANCAMENTO)
tabPESSOALista de pessoas digitadas/selecionadas (SELECT CD_PESSOA, NM_PESSOA FROM PESSOA WHERE 1=0)
tabTIPOCONTALista de tipos de conta (SELECT CD_TIPOCONTA, DS_TIPOCONTA FROM TIPOCONTA WHERE 1=0)
tabPROCESSOResultado da consulta: SELECT P.CD_EMPRESA, P.NR_PROCESSO, P.DT_PROCESSO, P.VL_PROCESSO, P.ST_PROCESSO, P.TP_PROCESSO, COUNT(M.NR_LANCAMENTO) NR_DOCTOS, CASE P.TP_PROCESSO WHEN 'P' THEN 'RECEBIMENTO' ELSE 'PAGAMENTO' END TIPO, CAST(NULL AS VARCHAR(1)) STATUS FROM PROCESSO P INNER JOIN MOVTOPROCESSO M ON (P.CD_EMPRESA = M.CD_EMPRESA AND P.NR_PROCESSO = M.NR_PROCESSO) INNER JOIN CONTAS C ON (M.CD_EMPRCONTAS = C.CD_EMPRESA AND M.NR_LANCAMENTO = C.NR_LANCAMENTO AND M.CD_PESSOA = C.CD_PESSOA AND M.CD_TIPOCONTA = C.CD_TIPOCONTA AND M.NR_PARCELA = C.NR_PARCELA) INNER JOIN TIPOCONTA T ON (T.CD_TIPOCONTA = C.CD_TIPOCONTA) [WHERE dinamico] GROUP BY P.CD_EMPRESA, P.NR_PROCESSO, P.DT_PROCESSO, P.VL_PROCESSO, P.ST_PROCESSO, P.TP_PROCESSO ORDER BY P.CD_EMPRESA, P.DT_PROCESSO, P.NR_PROCESSO
tabCONTAS (master-detail de dsPROCESSO)SELECT C.CD_EMPRESA, C.NR_LANCAMENTO, C.NR_PARCELA, C.CD_PESSOA, P.NM_PESSOA, C.NR_DOCUMENTO, C.CD_TIPOCONTA, T.DS_TIPOCONTA, C.DT_LANCAMENTO, M.CD_HISTORICO, H.DS_HISTORICO, M.VL_DOCUMENTO, M.VL_JURO, M.VL_DESCONTO, CAST(NULL AS VARCHAR(1)) STATUS FROM CONTAS C INNER JOIN MOVTOPROCESSO M ON (...) INNER JOIN PESSOA P ON (...) INNER JOIN TIPOCONTA T ON (...) INNER JOIN HISTORICO H ON (...) WHERE M.CD_EMPRESA=:CD_EMPRESA AND M.NR_PROCESSO=:NR_PROCESSO

Transacoes: transaction (principal, para validacoes e consultas) e transactionBanco (dedicada a execucao de ESTORNA_PROCESSO).

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
CONTASDELETE, INSERT, SELECT, UPDATE
PESSOADELETE, INSERT, SELECT, UPDATE
PROCESSODELETE, INSERT, SELECT, UPDATE
TIPOCONTADELETE, INSERT, SELECT, UPDATE

Observacao: INSERT/UPDATE/DELETE diretos sao declarados nos TFDUpdateSQL mas a tela efetivamente usa apenas SELECT — a escrita real sobre PROCESSO/CONTAS ocorre dentro da procedure ESTORNA_PROCESSO. Os datasets tabPESSOA/tabTIPOCONTA/tabDOCUMENTOS sao locais (buffer em memoria com WHERE 1=0), nunca persistem.

Tabelas de Leitura (SELECT)​

TabelaOperacoes
AGENCIASELECT
BANCOSELECT
EMPRESASELECT
FORMAPAGTOSELECT
HISTORICOSELECT
JUROSELECT
MOTIVOSELECT
MOVTOCAIXASELECT
MOVTOPROCESSOSELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
ESTORNA_PROCESSOAJUSTEFISCALITEMNOTA (DELETE/INSERT/SELECT), ALIQUOTA (SELECT), BOLETOIMPRESSO (INSERT), CHEQUE (SELECT), CODRECEITA (SELECT), COMPLEMENTOLEITE (UPDATE) +70

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
AJUSTEFISCALITEMNOTADELETE, INSERT, SELECT
ALIQUOTASELECT
BOLETOIMPRESSOINSERT
CHEQUESELECT
CODRECEITASELECT
COMPLEMENTOLEITEUPDATE
CONCILIACAOSELECT
CONDPAGTOSELECT
CONTASSELECT, UPDATE
CONTASCTBDELETE, INSERT, SELECT
CONTASHISTORICOSELECT
CONTASHISTORICOCCSELECT
CONTASHISTORICOCTBDELETE, INSERT, SELECT
CONTASJUNCAODELETE, SELECT
CONTASPESSOAINSERT, SELECT
CONTASPROVISAODELETE, SELECT
CONTASVENDORSELECT
CONTAS_MOVTOCONTABILSELECT
CUPOMFISCALSELECT, UPDATE
DESTINOREPARCELAMENTOSELECT
...+56 tabelas

Dependencias Aferentes (quem alimenta esta tela)​

Telas que escrevem em tabelas lidas por esta tela.

TelaTítuloTabelas em Comum
jCaixaCONTAS
MFC028CONTAS
CFC006Consulta Fatura (Agrupamento de Notas)CONTAS
MFC033Gerenciamento Boleto Rápido JunsoftCONTAS
TRC037CONTAS
JunsoftAPIBoletosCONTAS
MPD094CONTAS
MNF019Gerenciamento de Notas Geral/MestraCONTAS
MFC021CONTAS
MFC003Lançamento de Caixa Avulso / ChequeCONTAS
JunsoftServiceFatAppCONTAS
MNF032Importação de XML TransmitidoCONTAS
CFC008Controle de CobrançaCONTAS
MFC019Reparcelamento de ContasCONTAS
MNF027Cancelamento de Notas FiscaisCONTAS
MRC030CONTAS
MCA007Condenação de LeiteCONTAS
MFC016Fatura ( Agrupamento de Notas Fiscais )CONTAS
MRC021Cancelamento de Ordem de carregamento RecapadoraCONTAS
CFC009Consulta/Cancelamento de ReparcelamentoCONTAS
MNF029CONTAS
TFA067Contratos e Licenças de SoftwareCONTAS
MFC009Alteração de DuplicatasCONTAS
MFC036Liberação de Contas a PagarCONTAS
CPD008CONTAS
MNF005Cancelamento de Notas FiscaisCONTAS
MFC023Duplicata / Adiantamento por ObraCONTAS
CFC012CONTAS
MFC030CONTAS
MFC012Agrupamento de ContasCONTAS
...+74 telas

Dependencias Eferentes (quem consome dados desta tela)​

Telas que leem tabelas escritas por esta tela.

TelaTítuloTabelas em Comum
RNF021Resumo DiárioCONTAS
MPD094CONTAS
RFC021Movimentação por HistóricoCONTAS
RTR008Relatório de ViagensCONTAS
MFC020Transferência de Caixa / BancoCONTAS
MFC021CONTAS
LNF500CONTAS
LCX032CONTAS
MNF027Cancelamento de Notas FiscaisCONTAS
LCX026CONTAS
MCA007Condenação de LeiteCONTAS
LDP006CONTAS
MRC021Cancelamento de Ordem de carregamento RecapadoraCONTAS
TFA067Contratos e Licenças de SoftwareCONTAS
TRD016CONTAS
LDP015CONTAS
MFC009Alteração de DuplicatasCONTAS
LCX021CONTAS
MFC036Liberação de Contas a PagarCONTAS
MNF005Cancelamento de Notas FiscaisCONTAS
RFC046CONTAS
MFC030CONTAS
LNF015CONTAS
LDP011CONTAS
MFC024CONTAS
MFC027Gerenciamento Conciliação BancáriaCONTAS
LCX022CONTAS
CNF008Demonstrativo de Margens sobre VendasCONTAS
LNF168CONTAS
jCaptacaoCONTAS
...+323 telas

Fonte (fim)​

  • source/MFC010/UMFC010.pas — form e handlers
  • source/MFC010/UdmMFC010.pas — DataModule com queries e validates
  • source/MFC010/UMFC010.dfm — layout visual
  • source/MFC010/UdmMFC010.dfm — bindings de dados
  • source/MFC010/MFC010.dpk — package
  • Scripts/ESTORNA_PROCESSO.sql — procedure de estorno (logica principal)