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 viaPesquisa). - 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)
| Componente | Caption/Hint | Acao |
|---|---|---|
| btnNovo | Novo Registro <F5> | Reabre filtro, limpa datasets e preenche CD_EMPRESA da sessao |
| btnSalvar | Salvar Alteracoes <F6> | (oculto) |
| btnExcluir | Excluir Registro <F7> | Dispara rotina de estorno |
| btnLimpar | Cancelar Registro <F4> | Limpa linha corrente conforme Navegacao |
| btnProcurar | Consultar <F3> | Monta WHERE dinamico e abre tabPROCESSO |
| btnAtualizar | Atualizar Registros <F2> | (oculto) |
| btnImprimir | Imprimir <F8> | (oculto) |
| btnSair | Sair <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)
| Campo | Label | DataField | Observacoes |
|---|---|---|---|
| edtCD_EMPRESA | Empresa | CD_EMPRESA | F9 abre pesquisa EMPRESA; valida em tabFILTROCD_EMPRESAValidate |
| edtNM_EMPRESA | (read-only) | NM_EMPRESA | Preenchido pelo validate |
| edtNR_PROCESSO | Nº Processo | NR_PROCESSO | Filtro exato por P.NR_PROCESSO |
| edtNR_RECIBO | Nº Recibo | NR_RECIBO | Quando informado, aplica INNER JOIN em MOVTOCAIXA (TP_DOCUMENTO='AV') |
| edtDT_INICIAL / edtDT_FINAL | Emissao / Ate | DT_INICIAL / DT_FINAL | Intervalo sobre C.DT_LANCAMENTO |
| edtDT_INIVENC / edtDT_FINVENC | Vencimento / Ate | DT_INIVENC / DT_FINVENC | Intervalo sobre C.DT_VENCIMENTO |
| edtDT_EXECINI / edtDT_EXECFIM | Execucao / Ate | DT_EXECINI / DT_EXECFIM | Intervalo 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 <F>— acionabtnProcurar.Click.
Aba "Documentos" (PagCONTAS)
Aba ocultada ao entrar (TabVisible := True somente apos consultar).
Grupo "Processos de Contas" (grpProcesso)
Grid gridProcesso (dsPROCESSO) com colunas:
| Coluna | Campo | Observacao |
|---|---|---|
| STATUS (Å) | STATUS | Marcacao por barra-de-espaco ou clique (Wingdings 2 'Å') |
| CD_EMPRESA | CD_EMPRESA | - |
| NR_PROCESSO | NR_PROCESSO | - |
| DT_PROCESSO | DT_PROCESSO | Data de execucao do processo |
| VL_PROCESSO | VL_PROCESSO | Valor total do processo |
| TIPO | TIPO | Derivado de TP_PROCESSO (P=RECEBIMENTO, senao PAGAMENTO) |
| NR_DOCTOS | NR_DOCTOS | COUNT(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
| Campo | Label | DataField | Observacoes |
|---|---|---|---|
| edtDT_ESTORNO | Data de Estorno | DT_ESTORNO | Obrigatorio antes do estorno |
| edtCD_MOTIVO | Motivo | CD_MOTIVO | F9 abre pesquisa em MOTIVO onde TP_MOTIVO='C'; validate exige tipo 'C' (cancelamento) |
| edtDS_MOTIVO | (read-only) | DS_MOTIVO | Preenchido pelo validate |
| btnEstornar | Estornar (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):
| Tabela | Lida por | Efeito indireto no estorno |
|---|---|---|
| PARMFATUR | ESTORNA_PROCESSO | Regras de faturamento aplicadas ao reverter itens |
| PARMFINANC | ESTORNA_PROCESSO | Regras financeiras (provisoes, conciliacao) no estorno |
| PARMFISCAL | ESTORNA_PROCESSO | Ajustes fiscais revertidos em AJUSTEFISCALITEMNOTA |
| PARMCONTABIL | ESTORNA_PROCESSO | Controla reversao em CONTASCTB / ITEMNOTACTB / MOVTOCONTABIL |
| PARMCOMPLEMENTO | ESTORNA_PROCESSO | Complemento (leite) em COMPLEMENTOLEITE |
| PARMSISTEMA | ESTORNA_PROCESSO | Parametros gerais do sistema |
Para regras efetivas de cada parametro, consulte o corpo de
ESTORNA_PROCESSOemScripts/ESTORNA_PROCESSO.sql.
Regras de Negocio
Acesso e inicializacao
iniciar(): cria DM + Form, compartilhaCliHandle, traduz, registra o form. Seprograma.tpAcesso = 2, oculta btnNovo/btnSalvar/btnExcluir/Separador1. Sempre oculta btnSalvar/btnAtualizar/btnImprimir/Separador3. Inicia e imediatamente faz rollback (reset da transacao) e clicabtnNovopara 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: buscaNM_EMPRESAem EMPRESA. Se nao encontra:'A Empresa nao esta Cadastrada! [ADM002]'.CD_MOTIVO: busca em MOTIVO. ExigeTP_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) egridProcessoMouseUp(clique na area 12 < X < 25): alternamtabPROCESSOSTATUSentre'Å'(Wingdings 2) e vazio.tabPROCESSOSTATUSValidate: atualiza contadortabFILTRONR_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 (...)eC.NR_LANCAMENTO IN (...)a partir detabDOCUMENTOS.C.CD_PESSOA IN (...)a partir detabPESSOA.C.CD_TIPOCONTA IN (...)a partir detabTIPOCONTA.
Se tabPROCESSO.Eof apos abrir: raise JException.Create('E-0000', ['A Consulta nao Retornou Registros!']).
Estorno (btnExcluirClick)
- Confirmacao via
MessageBox'Confirma Estorno dos Processos?'(IDYES). - Valida
DT_ESTORNOobrigatoria eCD_MOTIVOobrigatorio (JException + SetFocus respectivo). - Inicia
transactionBanco. - Se
NR_TOTAL > 0: iteratabPROCESSOe, para cada linha comSTATUS <> '', executa:Se a procedure retorna mensagem nao vazia:SELECT O_DS_MENSAGEM FROM ESTORNA_PROCESSO(CD_EMPRESA, NR_PROCESSO, CD_MOTIVO, DT_ESTORNO)transactionBanco.Rollback+JException E-0000com a mensagem. - Se nao marcou nenhum processo mas ha CONTAS marcadas: apenas incrementa
vNR_PROCESSO(bloco incompleto — estorno por documento individual nao esta implementado). - Se
vNR_PROCESSO <= 0:raise JException.Create('E-0000', ['Nao foi Selecionado nenhum Processo / Documento para o Estorno. Verifique!']). transactionBanco.Commit+ MessageBox'Processos Estornados com Sucesso.'+btnNovo.Click.
Datasets e SQL
| Dataset | Descricao / 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 |
tabDOCUMENTOS | Lista de documentos/lancamentos digitados pelo usuario (SELECT ... FROM PESSOA WHERE 1=0, campos NR_DOCUMENTO, NR_LANCAMENTO) |
tabPESSOA | Lista de pessoas digitadas/selecionadas (SELECT CD_PESSOA, NM_PESSOA FROM PESSOA WHERE 1=0) |
tabTIPOCONTA | Lista de tipos de conta (SELECT CD_TIPOCONTA, DS_TIPOCONTA FROM TIPOCONTA WHERE 1=0) |
tabPROCESSO | Resultado 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)
| Tabela | Operacoes |
|---|---|
| CONTAS | DELETE, INSERT, SELECT, UPDATE |
| PESSOA | DELETE, INSERT, SELECT, UPDATE |
| PROCESSO | DELETE, INSERT, SELECT, UPDATE |
| TIPOCONTA | DELETE, INSERT, SELECT, UPDATE |
Observacao: INSERT/UPDATE/DELETE diretos sao declarados nos
TFDUpdateSQLmas a tela efetivamente usa apenas SELECT — a escrita real sobre PROCESSO/CONTAS ocorre dentro da procedureESTORNA_PROCESSO. Os datasets tabPESSOA/tabTIPOCONTA/tabDOCUMENTOS sao locais (buffer em memoria comWHERE 1=0), nunca persistem.
Tabelas de Leitura (SELECT)
| Tabela | Operacoes |
|---|---|
| AGENCIA | SELECT |
| BANCO | SELECT |
| EMPRESA | SELECT |
| FORMAPAGTO | SELECT |
| HISTORICO | SELECT |
| JURO | SELECT |
| MOTIVO | SELECT |
| MOVTOCAIXA | SELECT |
| MOVTOPROCESSO | SELECT |
Procedures Chamadas
| Procedure | Tabelas Acessadas |
|---|---|
| ESTORNA_PROCESSO | AJUSTEFISCALITEMNOTA (DELETE/INSERT/SELECT), ALIQUOTA (SELECT), BOLETOIMPRESSO (INSERT), CHEQUE (SELECT), CODRECEITA (SELECT), COMPLEMENTOLEITE (UPDATE) +70 |
Tabelas via Procedures (acesso indireto)
| Tabela | Operacoes |
|---|---|
| AJUSTEFISCALITEMNOTA | DELETE, INSERT, SELECT |
| ALIQUOTA | SELECT |
| BOLETOIMPRESSO | INSERT |
| CHEQUE | SELECT |
| CODRECEITA | SELECT |
| COMPLEMENTOLEITE | UPDATE |
| CONCILIACAO | SELECT |
| CONDPAGTO | SELECT |
| CONTAS | SELECT, UPDATE |
| CONTASCTB | DELETE, INSERT, SELECT |
| CONTASHISTORICO | SELECT |
| CONTASHISTORICOCC | SELECT |
| CONTASHISTORICOCTB | DELETE, INSERT, SELECT |
| CONTASJUNCAO | DELETE, SELECT |
| CONTASPESSOA | INSERT, SELECT |
| CONTASPROVISAO | DELETE, SELECT |
| CONTASVENDOR | SELECT |
| CONTAS_MOVTOCONTABIL | SELECT |
| CUPOMFISCAL | SELECT, UPDATE |
| DESTINOREPARCELAMENTO | SELECT |
| ... | +56 tabelas |
Dependencias Aferentes (quem alimenta esta tela)
Telas que escrevem em tabelas lidas por esta tela.
| Tela | Título | Tabelas em Comum |
|---|---|---|
jCaixa | CONTAS | |
| MFC028 | CONTAS | |
| CFC006 | Consulta Fatura (Agrupamento de Notas) | CONTAS |
| MFC033 | Gerenciamento Boleto Rápido Junsoft | CONTAS |
| TRC037 | CONTAS | |
JunsoftAPIBoletos | CONTAS | |
| MPD094 | CONTAS | |
| MNF019 | Gerenciamento de Notas Geral/Mestra | CONTAS |
| MFC021 | CONTAS | |
| MFC003 | Lançamento de Caixa Avulso / Cheque | CONTAS |
JunsoftServiceFatApp | CONTAS | |
| MNF032 | Importação de XML Transmitido | CONTAS |
| CFC008 | Controle de Cobrança | CONTAS |
| MFC019 | Reparcelamento de Contas | CONTAS |
| MNF027 | Cancelamento de Notas Fiscais | CONTAS |
| MRC030 | CONTAS | |
| MCA007 | Condenação de Leite | CONTAS |
| MFC016 | Fatura ( Agrupamento de Notas Fiscais ) | CONTAS |
| MRC021 | Cancelamento de Ordem de carregamento Recapadora | CONTAS |
| CFC009 | Consulta/Cancelamento de Reparcelamento | CONTAS |
| MNF029 | CONTAS | |
| TFA067 | Contratos e Licenças de Software | CONTAS |
| MFC009 | Alteração de Duplicatas | CONTAS |
| MFC036 | Liberação de Contas a Pagar | CONTAS |
| CPD008 | CONTAS | |
| MNF005 | Cancelamento de Notas Fiscais | CONTAS |
| MFC023 | Duplicata / Adiantamento por Obra | CONTAS |
| CFC012 | CONTAS | |
| MFC030 | CONTAS | |
| MFC012 | Agrupamento de Contas | CONTAS |
| ... | +74 telas |
Dependencias Eferentes (quem consome dados desta tela)
Telas que leem tabelas escritas por esta tela.
| Tela | Título | Tabelas em Comum |
|---|---|---|
| RNF021 | Resumo Diário | CONTAS |
| MPD094 | CONTAS | |
| RFC021 | Movimentação por Histórico | CONTAS |
| RTR008 | Relatório de Viagens | CONTAS |
| MFC020 | Transferência de Caixa / Banco | CONTAS |
| MFC021 | CONTAS | |
| LNF500 | CONTAS | |
| LCX032 | CONTAS | |
| MNF027 | Cancelamento de Notas Fiscais | CONTAS |
| LCX026 | CONTAS | |
MCA007 | Condenação de Leite | CONTAS |
LDP006 | CONTAS | |
| MRC021 | Cancelamento de Ordem de carregamento Recapadora | CONTAS |
| TFA067 | Contratos e Licenças de Software | CONTAS |
TRD016 | CONTAS | |
LDP015 | CONTAS | |
| MFC009 | Alteração de Duplicatas | CONTAS |
| LCX021 | CONTAS | |
| MFC036 | Liberação de Contas a Pagar | CONTAS |
| MNF005 | Cancelamento de Notas Fiscais | CONTAS |
| RFC046 | CONTAS | |
| MFC030 | CONTAS | |
| LNF015 | CONTAS | |
LDP011 | CONTAS | |
| MFC024 | CONTAS | |
| MFC027 | Gerenciamento Conciliação Bancária | CONTAS |
| LCX022 | CONTAS | |
| CNF008 | Demonstrativo de Margens sobre Vendas | CONTAS |
| LNF168 | CONTAS | |
jCaptacao | CONTAS | |
| ... | +323 telas |
Fonte (fim)
source/MFC010/UMFC010.pas— form e handlerssource/MFC010/UdmMFC010.pas— DataModule com queries e validatessource/MFC010/UMFC010.dfm— layout visualsource/MFC010/UdmMFC010.dfm— bindings de dadossource/MFC010/MFC010.dpk— packageScripts/ESTORNA_PROCESSO.sql— procedure de estorno (logica principal)