Pular para o conteúdo principal

MFI015 — Movimentação MFI015

Fonte​

  • Source: source/MFI015/
  • Form: UMFI015.pas / UMFI015.dfm
  • DataModule: UdmMFI015.pas / UdmMFI015.dfm
  • Package: MFI015.dpk

Objetivo​

Tela de apuracao e aproveitamento de creditos de PIS e COFINS por empresa e tipo de credito (codigos 101-399 da Receita Federal). Permite:

  1. Consultar saldos mensais de creditos/debitos por competencia (tabela SALDOIMPOSTO).
  2. Reprocessar saldos a partir dos movimentos fiscais (procedure GERA_SALDOIMPOSTO).
  3. Registrar destinos de utilizacao de credito (tabela SALDOUTILIZADO) ou consumir creditos disponiveis automaticamente (procedure GERA_APROVEITAMENTOCRED).
  4. Visualizar apuracao consolidada entre matriz e filiais (RETORNA_MATRIZEFILIAL).

Funcionalidades​

  • Consulta filtrada por empresa, imposto (PIS/COFINS) e tipo de credito (CD_TIPOCREDITO).
  • Opcao "Apenas ultimos 12 meses" para restringir competencia.
  • Opcao "Aproveitar credito entre matriz e filiais" (consolida SALDOIMPOSTO via RETORNA_MATRIZEFILIAL).
  • Opcao "Visualizar apuracao consolidada" (agrega saldos multi-empresa com SUM).
  • Botao "Reprocessar Saldo" recalcula SALDOIMPOSTO a partir de NOTACTB/MOVTOFISCAL/CUPOMFISCAL.
  • Botao "Utilizar Credito Disponivel" chama GERA_APROVEITAMENTOCRED que distribui creditos contra debitos.
  • Grids de Destino (SALDOUTILIZADO) e Origem (SALDOUTILIZADO com CD_EMPRDEST) de credito.
  • Exibicao condicional de grupos conforme VL_SALDO (positivo = Destino, negativo = Origem + Aproveitamento).

Estrutura da Tela​

Aba "Consulta" (pagConsulta)​

Grupo: Filtros para Consulta (grpFiltros)

CampoCaptionComponenteBinding
EmpresaEmpresaTDBEdit + TDBEdit (ReadOnly)cdsFILTRO.CD_EMPRESA / NM_EMPRESA
ImpostoImpostoTwwDBComboBoxcdsFILTRO.TP_IMPOSTO (Items: PIS=S, COFINS=F)
Apenas ultimos 12 mesesApenas ultimos 12 mesesTDBCheckBoxcdsFILTRO.ST_12MESES (S/N)
Aproveitar credito entre matriz e filiaisAproveitar credito entre matriz e filiaisTDBCheckBoxcdsFILTRO.ST_CONSOLIDA (S/N)
Visualizar apuracao consolidadaVisualizar apuracao consolidadaTDBCheckBox (oculto por padrao)cdsFILTRO.ST_VISUALIZACONSOLIDADA (S/N)
ConsultarConsultarTBitBtnOnClick = btnConsultarClick
Reprocessar SaldoReprocessar SaldoTBitBtnOnClick = btnReprocessarClick
(status)Consultando saldos de Impostos. Aguarde...TPanelpnlStatusProc (visivel durante reprocessamento)

Aba "Saldos" (pagSaldo) — visivel apos consulta com resultado​

Cabecalho (topo)

CampoCaptionComponenteBinding
Tipo de CreditoTipo de CreditoTLabel + TDBEdit + TDBEditcdsFILTRO.CD_TIPOCREDITO / DS_TIPOCREDITO

Grupo: Registro de Saldo (grpRegistroSaldos)

Grid gridSALDOIMPOSTO (DataSource = dsSALDOIMPOSTO) com colunas:

ColunaCaptionCampo
CompetenciaCompetenciaDT_COMPETENCIA (mm/yyyy)
ImpostoImpostoDS_IMPOSTO (calculado: ICMS/PIS/COFINS)
Vl. CreditoVl. CreditoVL_CREDITO
Vl. DebitoVl. DebitoVL_DEBITO
Saldo MesSaldo MesVL_SALDO
Credito DisponivelCredito DisponivelVL_CREDITODISPONIVEL

Grupo: Destino de Credito (grpDestinoCred) — visivel quando VL_SALDO >= 0

Grid gridSALDOUTILIZADO (DataSource = dsSALDOUTILIZADO):

ColunaCaptionCampo
CompetenciaCompetenciaDT_UTILIZADO (mm/yyyy, editavel apenas em insert)
Valor UtilizadoValor UtilizadoVL_UTILIZADO
SaldoSaldoVL_SALDO (calculado)
Emp.Emp.CD_EMPRDEST

Grupo: Origem de Credito (grpOrigemCred) — visivel quando VL_SALDO < 0

Grid gridOrigemCredito (DataSource = dsORIGEMCRED):

ColunaCaptionCampo
CompetenciaCompetenciaDT_ORIGEM
Valor UtilizadoValor UtilizadoVL_UTILIZADO
Emp.Emp.CD_EMPRESA

Grupo: Aproveitamento de Credito (grpAprovCred) — visivel quando VL_SALDO < 0

CampoCaptionComponenteBinding
Credito DisponivelCredito DisponivelTDBRichEdittabSALDOIMPOSTO.VL_CREDITODISPONIVEL
Creditos UtilizadosCreditos UtilizadosTDBRichEdittabSALDOIMPOSTO.VL_CREDITOUSADO
Saldo devedorSaldo devedorTDBRichEdittabSALDOIMPOSTO.VL_CALC_RECOLHER
Saldo devedor + CreditosSaldo devedor + CreditosTDBRichEdittabSALDOIMPOSTO.VL_CALC_SALDODEVEDOR
Utilizar Credito DisponivelUtilizar Credito DisponivelTBitBtnOnClick = btnUtilizarCreditoClick

Rodape: TDBRichEdit ligado a tabSALDOIMPOSTO.DS_MENSAGEM (mensagens de validacao do saldo).

Toolbar Lateral (esquerda)​

BotaoCaption/HintTeclaAcao
NovoNovo Registro <F5>F5Append em SALDOUTILIZADO (aba Saldo) ou limpa filtros (aba Consulta)
SalvarSalvar Alteracoes <F6>F6Post SALDOUTILIZADO + CommitRetaining
ExcluirExcluir Registro <F7>F7Delete destino/origem de credito
LimparCancelar Registro <F4>F4Cancel em SALDOUTILIZADO
ProcurarConsultar <F3>F3Dispara btnConsultar
AtualizarAtualizar Registros <F2>(nao ligado a F-key)Rollback + StartTransaction + Novo
ImprimirImprimir <F8>F8(sem OnClick definido)
SairSair <F12>F12Close

Parametros que Influenciam​

TabelaCampoEfeito
PARMFATURCD_EMPRESAVerificado em Busca_Parametros (UdmMFI015.pas:117). Se PARMFATUR nao existir para a empresa da sessao, levanta JException E-0000 com mensagem "Os Parametros de Faturamento para a Empresa X nao estao Cadastrados [MFA001]!" e oculta botoes Novo/Salvar/Excluir.

Regras de Negocio​

Carregamento (iniciar)​

  • Verifica acesso programa.tpAcesso = 2 (somente leitura) — oculta btnNovo/btnSalvar/btnExcluir.
  • Valida existencia de PARMFATUR para sessao.empresa.cd_empresa via Busca_Parametros; ausente = JException.
  • Recupera filtros do usuario via Recupera_FiltroPrograma(...,'MFI015') e grava em FormClose via Grava_FiltroPrograma.
  • Armazena SQL original de tabSALDOIMPOSTO em SqlOriginalSaldoImposto para permitir reinjecao de filtros consolidados.

cdsFILTROCD_EMPRESAValidate (UdmMFI015.pas:314)​

  • ValidaEmpresa preenche NM_EMPRESA.
  • Consulta RETORNA_MATRIZEFILIAL(:CD_EMPRESA) WHERE ST_MATRIZ = 'S': se a empresa for matriz, torna visivel o chkVisualizaConsolidada; caso contrario oculta e desmarca.

btnConsultarClick (UMFI015.pas:381)​

  • Exige empresa informada (JException E-0000).
  • Chama ConsultaTipoCredito (lookup dinamico via Pesquisa) para selecionar CD_TIPOCREDITO entre 101-399 (creditos vinculados a receita tributada/nao-tributada/exportacao, conforme tabelas Receita Federal).
  • Se ST_VISUALIZACONSOLIDADA = 'S', envelopa SQL original com SELECT ... -1 CD_EMPRESA, SUM(...) GROUP BY DT_COMPETENCIA, CD_TIPOCREDITO, TP_IMPOSTO, DS_IMPOSTO, DT_REGISTRO, DS_MENSAGEM.
  • Se ST_12MESES = 'S', adiciona AND S.DT_COMPETENCIA > DATEADD (-12 MONTH TO CURRENT_DATE).
  • Substitui /*FILTROWHERE*/ pelo WHERE calculado via StringReplace.
  • Abre grid e ativa aba Saldos se houver resultados.

btnReprocessarClick (UMFI015.pas:559)​

  • Confirma via msgCodigo('C-0000',['Deseja reprocessar saldo de impostos (PIS/COFINS)?']).
  • DELETE FROM SALDOIMPOSTO WHERE CD_EMPRESA = <empresa>.
  • Executa SELECT O_DS_MENSAGEM FROM GERA_SALDOIMPOSTO(<empresa>).
  • Se procedure retornar mensagem nao vazia, levanta JException E-0000 e faz RollbackRetaining; caso contrario, CommitRetaining.
  • Exibe pnlStatusProc com caption "Consultando Saldos de Impostos. Aguarde..." durante o processo.

btnUtilizarCreditoClick (UMFI015.pas:677)​

  • Chama GERA_APROVEITAMENTOCRED(CD_EMPRESA, DT_COMPETENCIA, TP_IMPOSTO, CD_TIPOCREDITO, ST_CONSOLIDA) que insere registros em SALDOUTILIZADO automaticamente.
  • Apos execucao, faz Salvar(True) (CommitRetaining + msgCodigo('I-0047')), atualiza credito disponivel e reabre grid Origem.
  • ST_CONSOLIDA = 'S' aproveita credito entre matriz e filiais; 'N' apenas da propria empresa.

btnExcluirClick (UMFI015.pas:216)​

  • Somente na aba Saldo.
  • Se VL_SALDO >= 0: exclui destino (SALDOUTILIZADO). Confirmacao "Deseja realmente excluir este destino de Credito?".
  • Se VL_SALDO < 0: exclui origem (ORIGEMCRED). Confirmacao "Deseja realmente excluir este origem de Credito?".
  • Se houver registro excluido, Salvar(False) + I-0046.

tabSALDOUTILIZADOBeforePost (UdmMFI015.pas:365)​

  • DT_UTILIZADO obrigatorio (JException E-0000).
  • VL_UTILIZADO obrigatorio e nao pode ser negativo.
  • Em INSERT, nao pode haver registro duplicado (mesma CD_EMPRESA + DT_COMPETENCIA + TP_IMPOSTO + CD_TIPOCREDITO + DT_UTILIZADO).
  • DT_UTILIZADO >= DT_COMPETENCIA (data de utilizacao posterior a apuracao).
  • Valida saldo disponivel: VL_UTILIZADO <= VL_SALDO - SUM(VL_UTILIZADO anterior), com mensagem "Valor utilizado (X) nao pode ser maior que o credito disponivel (Y)".
  • Preenche FK para SALDOIMPOSTO (CD_EMPRESA, DT_COMPETENCIA, TP_IMPOSTO, CD_TIPOCREDITO).

tabSALDOIMPOSTOCalcFields (UdmMFI015.pas:155)​

  • VL_CALC_DISPONIVEL = VL_SALDO - VL_SALDOUSADO (minimo 0).
  • VL_CALC_RECOLHER = VL_DEBITO - VL_CREDITO (minimo 0).
  • VL_CALC_SALDODEVEDOR = VL_CALC_RECOLHER - VL_CREDITOUSADO (minimo 0).
  • Chama ValidaSaldo: se VL_SALDOUSADO > VL_SALDO, seta DS_MENSAGEM com "Saldo utilizado e maior que o credito disponivel.".
  • Desabilita btnUtilizarCredito quando VL_CALC_SALDODEVEDOR = 0.

tabSALDOIMPOSTOAfterScroll (UdmMFI015.pas:507)​

  • Quando chkVisualizaConsolidada marcado: oculta Destino/Origem/Aproveitamento e desabilita botao.
  • Quando chkConsolida marcado: consulta SUM(VL_SALDODISPONIVEL) via JOIN RETORNA_MATRIZEFILIAL(8) para habilitar botao Utilizar Credito entre empresas (literal 8 parece hardcoded — suspeito, verificar).
  • Alterna visibilidade de grpDestinoCred (VL_SALDO >= 0) e grpOrigemCred + grpAprovCred (VL_SALDO < 0).

tabSALDOUTILIZADODT_UTILIZADOSetText (UdmMFI015.pas:493)​

  • Aceita entrada mm/yyyy; prefixa 01/ e valida via TryStrToDate. Formato editavel: !00/0000;1;_.

Fechamento​

  • FormClose: se stDadosAltrados, pergunta msgCodigo('C-0048') para Commit/Rollback. Chama Grava_FiltroPrograma e libera DataModule.

Datasets e SQL​

cdsFILTRO (TClientDataSet — filtros em memoria)​

Campos: CD_EMPRESA, NM_EMPRESA, TP_IMPOSTO, CD_TIPOCREDITO, DS_TIPOCREDITO, DT_INICIAL, DT_FINAL, ST_12MESES, ST_CONSOLIDA, ST_VISUALIZACONSOLIDADA. Tag = 9 (persistencia via jCommon).

tabSALDOIMPOSTO (TFDQuery, CachedUpdates = True)​

SQL base (com marcador /*FILTROWHERE*/ para injecao):

SELECT
S.CD_EMPRESA, S.DT_COMPETENCIA, S.CD_TIPOCREDITO, S.TP_IMPOSTO,
TRIM(CASE S.TP_IMPOSTO
WHEN 'I' THEN 'ICMS'
WHEN 'S' THEN 'PIS'
WHEN 'F' THEN 'COFINS'
ELSE '*' END) DS_IMPOSTO,
S.VL_CREDITO, S.VL_DEBITO, S.VL_SALDO, S.VL_SALDOUSADO,
COALESCE((SELECT SUM(SS.VL_UTILIZADO) FROM SALDOUTILIZADO SS
WHERE COALESCE(SS.CD_EMPRDEST,SS.CD_EMPRESA) = S.CD_EMPRESA
AND SS.DT_UTILIZADO = S.DT_COMPETENCIA
AND SS.TP_IMPOSTO = S.TP_IMPOSTO
AND SS.CD_TIPOCREDITO = S.CD_TIPOCREDITO), 0) VL_CREDITOUSADO,
COALESCE((SELECT SUM(SSI.VL_SALDODISPONIVEL) FROM SALDOIMPOSTO SSI
WHERE SSI.CD_EMPRESA = S.CD_EMPRESA
AND SSI.DT_COMPETENCIA <= S.DT_COMPETENCIA
AND SSI.TP_IMPOSTO = S.TP_IMPOSTO
AND SSI.CD_TIPOCREDITO = S.CD_TIPOCREDITO
AND SSI.VL_SALDO > 0), 0) VL_CREDITODISPONIVEL,
S.DT_REGISTRO
FROM SALDOIMPOSTO S
INNER JOIN RETORNA_MATRIZEFILIAL(:CD_EMPRESA) R ON (R.CD_EMPRESA = S.CD_EMPRESA)
WHERE S.CD_TIPOCREDITO = :CD_TIPOCREDITO
AND S.TP_IMPOSTO = :TP_IMPOSTO
/*FILTROWHERE*/
ORDER BY S.DT_COMPETENCIA

Parametros: CD_EMPRESA, CD_TIPOCREDITO, TP_IMPOSTO.

tabSALDOUTILIZADO (TFDQuery, master-detail com dsSALDOIMPOSTO)​

MasterFields: CD_EMPRESA;DT_COMPETENCIA;TP_IMPOSTO;CD_TIPOCREDITO

SELECT SU.CD_EMPRESA, SU.DT_COMPETENCIA, SU.TP_IMPOSTO, SU.CD_TIPOCREDITO,
SU.DT_UTILIZADO, SU.VL_UTILIZADO,
S.VL_SALDO - (SELECT SUM(SS.VL_UTILIZADO) FROM SALDOUTILIZADO SS
WHERE SS.CD_EMPRESA = SU.CD_EMPRESA
AND SS.DT_COMPETENCIA = SU.DT_COMPETENCIA
AND SS.TP_IMPOSTO = SU.TP_IMPOSTO
AND SS.CD_TIPOCREDITO = SU.CD_TIPOCREDITO
AND SS.DT_UTILIZADO <= SU.DT_UTILIZADO) VL_SALDO,
SU.DT_REGISTRO,
CAST(NULL AS DOM_VARCHAR500) DS_MENSAGEM,
COALESCE(SU.CD_EMPRDEST, SU.CD_EMPRESA) CD_EMPRDEST, SU.NR_SEQUENCIA
FROM SALDOUTILIZADO SU
INNER JOIN SALDOIMPOSTO S ON (S.CD_EMPRESA = SU.CD_EMPRESA
AND S.DT_COMPETENCIA = SU.DT_COMPETENCIA
AND S.TP_IMPOSTO = SU.TP_IMPOSTO
AND S.CD_TIPOCREDITO = SU.CD_TIPOCREDITO)
WHERE SU.CD_EMPRESA = :CD_EMPRESA
AND SU.DT_COMPETENCIA = :DT_COMPETENCIA
AND SU.TP_IMPOSTO = :TP_IMPOSTO
AND SU.CD_TIPOCREDITO = :CD_TIPOCREDITO
ORDER BY SU.DT_UTILIZADO

UpdateSQL updSALDOUTILIZADO gera INSERT/UPDATE/DELETE em SALDOUTILIZADO com chave composta (CD_EMPRESA, CD_TIPOCREDITO, DT_COMPETENCIA, DT_UTILIZADO, TP_IMPOSTO, NR_SEQUENCIA). DT_REGISTRO = literal 'NOW'.

tabORIGEMCRED (TFDQuery — destinos que consumiram credito desta apuracao)​

SELECT SU.CD_EMPRESA, SU.DT_COMPETENCIA, SU.TP_IMPOSTO, SU.CD_TIPOCREDITO,
SU.DT_UTILIZADO, SU.DT_COMPETENCIA DT_ORIGEM,
SU.VL_UTILIZADO, SU.CD_EMPRDEST, NR_SEQUENCIA
FROM SALDOUTILIZADO SU
WHERE COALESCE(SU.CD_EMPRDEST, SU.CD_EMPRESA) = :CD_EMPRESA
AND SU.DT_UTILIZADO = :DT_COMPETENCIA
AND SU.TP_IMPOSTO = :TP_IMPOSTO
AND SU.CD_TIPOCREDITO = :CD_TIPOCREDITO
ORDER BY SU.DT_COMPETENCIA

Observacoes tecnicas​

  • FormatOptions.StrsEmpty2Null = True e MaxBcdPrecision = 14 no fdCon (BCD para valores monetarios).
  • Transacao com Isolation = xiReadCommitted, AutoStart manual.
  • dsSALDOIMPOSTO.OnUpdateData seta frmMFI015.stDadosAltrados := True para controle de commit em FormClose.

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
SALDOIMPOSTODELETE, SELECT
SALDOUTILIZADODELETE, INSERT, SELECT, UPDATE

Tabelas de Leitura (SELECT)​

TabelaOperacoes
PARMFATURSELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
GERA_APROVEITAMENTOCREDSALDOIMPOSTO (SELECT), SALDOUTILIZADO (INSERT/SELECT)
GERA_SALDOIMPOSTOCUPOMFISCAL (SELECT), IMPOSTO (SELECT), IMPOSTONOTACTB (SELECT), MOVTOFISCAL (SELECT), NOTACTB (SELECT)
RETORNA_MATRIZEFILIALEMPRESA (SELECT), PARMCONTABIL (SELECT), PESSOA (SELECT)

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
CUPOMFISCALSELECT
EMPRESASELECT
IMPOSTOSELECT
IMPOSTONOTACTBSELECT
MOVTOFISCALSELECT
NOTACTBSELECT
PARMCONTABILSELECT
PESSOASELECT
SALDOIMPOSTOSELECT
SALDOUTILIZADOINSERT, SELECT

Dependencias Aferentes​

Nenhuma dependencia aferente identificada — MFI015 nao e chamado por outros módulos BPL (nao consta em jMenu.pas como item de menu e nao aparece em LoadPackage/carregarPrograma de outros .pas). Invocado provavelmente via menu dinamico ou acesso direto (programa cadastrado via ADM*).

Dependencias Eferentes​

Nenhuma dependencia eferente direta em outros módulos BPL. A tela consome exclusivamente dados proprios (SALDOIMPOSTO, SALDOUTILIZADO) e procedures fiscais (GERA_SALDOIMPOSTO reprocessa a partir de movimentos fiscais gerados por outras telas de faturamento/fiscal, ex: MNF001, MNF004, MFI004, MFI005, MFI011 — acesso indireto via tabelas CUPOMFISCAL/MOVTOFISCAL/NOTACTB).