Ponto de Entrada MT103PN – Inclusão de Documento de Entrada (MATA103)

Tempo de leitura: 8 minutos

Se você trabalha com customização no Protheus na área de Compras/Fiscal, o Ponto de Entrada MT103PN é um dos mais importantes para a rotina de Documento de Entrada (MATA103). Ele permite a você controlar se a inclusão do documento deve prosseguir ou ser abortada.


 

💡 O que é o MT103PN?

O MT103PN é um Ponto de Entrada de controle lógico (booleano) que é executado no momento da inclusão de um Documento de Entrada (Nota Fiscal de Entrada), dentro da rotina MATA103 (ou em algumas funções chamadas por ela, como a A103NFISCAL).

  • Rotina: MATA103 – Documento de Entrada

  • Módulo: Compras (SIGACOM) / Fiscal (SIGAFIS)

  • Momento de Execução: Logo no início do processo de inclusão do documento de entrada.

 

🎯 Qual é a sua principal finalidade?

A principal função do MT103PN é decidir se a rotina de inclusão deve prosseguir ou ser abortada antes mesmo da abertura da tela principal da nota fiscal.

Ele retorna um valor lógico que determina o fluxo do programa:

  • Retorno .T. (True/Verdadeiro): A inclusão do Documento de Entrada continua.

  • Retorno .F. (False/Falso): A inclusão do Documento de Entrada é cancelada/bloqueada.


 

💻 Sintaxe do Ponto de Entrada

A estrutura básica do Ponto de Entrada é simples, retornando um valor lógico (lRet):

Código ADVPL:

#INCLUDE "PROTHEUS.CH"

/*/{Protheus.doc} MT103PN
Inclusão de documento de entrada. Continua ou não.
@type function
@version 1.0
@author Adilio Costa
@since 03/11/2025

@Inscreva-se no Blog ProtheusAdvpl:
https://www.protheusadvpl.com.br
@Inscreva-se no Canal ProtheusAdvpl:
https://www.youtube.com/protheusadvpl
@Siga-nos no Instagram:
https://www.instagram.com/protheusadvpl
@Conheça os Cursos do ProtheusAdvpl:
https://cursos-e-formacoes-protheusadvpl.gr-site.com/
@Participe de nossas comunidades no WhatsApp:
-Comunidade Protheus Backoffice:https://chat.whatsapp.com/KMUIAjwZ6EZ6eAHsLkPTyb
-Comunidade Protheus-RH:https://chat.whatsapp.com/L5dUyAna6xU4ylG5DUgfOW
-Comunidade Protheus-Programação:https://chat.whatsapp.com/LsD6z0apdqKHlOz67bcaEn
-Comunidade Protheus-Framework:https://chat.whatsapp.com/BzUFpjaSnTC3vtsfa77jmG

|Se esse conteúdo foi útil pra você nos ajude divulgando 
ele e nossas redes sociais!!|
*/
User Function MT103PN()
    Local lRet := .T. // Valor padrão: continuar a inclusão

    // ----------------------------------------------------------------------
    // SEU CÓDIGO DE VALIDAÇÃO AQUI
    // Exemplo: Bloquear a entrada se o usuário for o "ADM"
    If AllTrim(cUsuario) == "ADM"
        lRet := .F. // Bloqueia a inclusão
        // FWAlertInfo("Usuário ADM não pode incluir Documentos de Entrada!")
    EndIf
    // ----------------------------------------------------------------------

Return(lRet)

 

🛠️ Casos de Uso Comuns

Este Ponto de Entrada é ideal para implementar regras de negócio que bloqueiam a entrada de documentos com base em condições de alto nível, como:

  1. Bloqueio por Usuário/Grupo de Usuários: Impedir que determinados usuários ou grupos incluam notas fiscais.
  2. Validação de Parâmetros/Configurações: Checar se parâmetros obrigatórios para a entrada de documentos estão configurados (Ex: Módulo Fiscal ativo, ambiente configurado, etc.).
  3. Restrição por Filial: Bloquear a entrada para filiais específicas.
  4. Integração com Ferramentas Externas: Algumas ferramentas externas de recebimento (como Centrais XML ou Portais de Fornecedores) podem utilizá-lo para realizar checagens iniciais.
  5. Perguntar ao Usuário: Pode ser usado para exibir uma mensagem de confirmação inicial antes de carregar toda a tela (embora não seja o uso mais comum, é tecnicamente possível).

 

⚠️ Observações Importantes

  • Momento: O MT103PN é executado antes da criação do cabeçalho e dos itens da nota fiscal na tela. Se você precisa validar dados já digitados ou inseridos (como TES, Fornecedor, etc.), procure por pontos de entrada que rodem após a digitação ou durante a gravação (Ex: MT103INC, MT103FIM, etc.).

  • Variáveis de Ambiente: No ponto de execução, você ainda não terá acesso aos dados da nota fiscal (campos F1_*). Se precisar de informações de contexto (como Filial, Data Atual, Usuário), utilize variáveis de ambiente ou tabelas do Protheus.

 

📝Exemplo Prático com MT103PN: Bloqueio em Feriados 

 Vamos criar uma customização usando o Ponto de Entrada MT103PN para bloquear a inclusão de um Documento de Entrada se a data atual do sistema for um feriado nacional.

Para isso, usaremos o array de feriados e algumas funções padrão do AdvPL.

#INCLUDE "PROTHEUS.CH"

/*/{Protheus.doc} MT103PN - Bloqueio em Feriados
Bloqueia a inclusão de Documento de Entrada (MATA103)
se a data do sistema for um feriado nacional.
@type function
@version 1.0
@author Adilio Costa
@since 03/11/2025

@Inscreva-se no Blog ProtheusAdvpl:
https://www.protheusadvpl.com.br
@Inscreva-se no Canal ProtheusAdvpl:
https://www.youtube.com/protheusadvpl
@Siga-nos no Instagram:
https://www.instagram.com/protheusadvpl
@Conheça os Cursos do ProtheusAdvpl:
https://cursos-e-formacoes-protheusadvpl.gr-site.com/
@Participe de nossas comunidades no WhatsApp:
-Comunidade Protheus Backoffice:https://chat.whatsapp.com/KMUIAjwZ6EZ6eAHsLkPTyb
-Comunidade Protheus-RH:https://chat.whatsapp.com/L5dUyAna6xU4ylG5DUgfOW
-Comunidade Protheus-Programação:https://chat.whatsapp.com/LsD6z0apdqKHlOz67bcaEn
-Comunidade Protheus-Framework:https://chat.whatsapp.com/BzUFpjaSnTC3vtsfa77jmG

|Se esse conteúdo foi útil pra você nos ajude divulgando 
ele e nossas redes sociais!!|
*/
User Function MT103PN()
    Local lRet := .T.                                 // Valor Padrão: .T. (Continua a inclusão)
    Local dDataAtual := dDataBase                     // Pega a data atual do sistema (Base de Dados)
    Local aFeriados := {}                             // Array para armazenar as datas dos feriados (Formato: AAAA/MM/DD)
    Local cFeriadoNome := ""                          // Variável para armazenar o nome do feriado, se encontrado

    // ----------------------------------------------------------------------
    // 1. Definição dos Feriados Nacionais (Exemplo para 2025)
    // NOTE: Em um ambiente real, você deve buscar essa lista em uma tabela
    // própria (por exemplo, SXG, que é a tabela de dias não úteis)
    // ou em um parâmetro customizado.

    Aadd(aFeriados, {'20250101', 'Confraternização Universal'})   // 01/Jan
    // O Carnaval (Março) e Corpus Christi (Junho) são pontos facultativos na maioria
    // das vezes, mas incluímos como exemplo:
    Aadd(aFeriados, {'20250303', 'Carnaval'})                     // 03/Mar
    Aadd(aFeriados, {'20250304', 'Carnaval'})                     // 04/Mar
    Aadd(aFeriados, {'20250418', 'Paixão de Cristo'})             // 18/Abr
    Aadd(aFeriados, {'20250421', 'Tiradentes'})                   // 21/Abr
    Aadd(aFeriados, {'20250501', 'Dia do Trabalho'})              // 01/Mai
    Aadd(aFeriados, {'20250619', 'Corpus Christi'})               // 19/Jun
    Aadd(aFeriados, {'20250907', 'Independência do Brasil'})      // 07/Set
    Aadd(aFeriados, {'20251012', 'Nossa Sra. Aparecida'})         // 12/Out
    Aadd(aFeriados, {'20251102', 'Finados'})                      // 02/Nov
    Aadd(aFeriados, {'20251115', 'Proclamação da República'})     // 15/Nov
    Aadd(aFeriados, {'20251120', 'Consciência Negra'})            // 20/Nov (Feriado Nacional a partir de 2024)
    Aadd(aFeriados, {'20251225', 'Natal'})                        // 25/Dez

    // ----------------------------------------------------------------------
    // 2. Lógica de Validação: Verifica se a data atual é um feriado
    
    // Converte a data atual para o formato de string (AAAAMMDD) para comparação
    Local cDataAtual := DToS(dDataAtual)
    
    // Procura a data na lista de feriados
    cFeriadoNome := AScan(aFeriados, {|aElement| aElement[1] == cDataAtual})

    If cFeriadoNome > 0
        // Se cFeriadoNome for maior que 0, significa que a data foi encontrada no array.
        lRet := .F. // BLOQUEIA a inclusão!
        cFeriadoNome := aFeriados[cFeriadoNome][2] // Pega o nome do feriado.
        
        // Mensagem de alerta para o usuário
        MsgStop("Bloqueio de Inclusão! " +;
                "Não é permitida a inclusão de Documento de Entrada " +;
                "na data de hoje (" + DToC(dDataAtual) + "), pois é **" + cFeriadoNome + "**.", ;
                "Documento de Entrada Bloqueado")
    EndIf

Return(lRet)

 

📋 Detalhamento da Implementação

Variáveis Locais:

  • lRet: Define o retorno lógico do P.E. (inicia como .T. para permitir).
    • dDataAtual: Captura a data atual do sistema (dDataBase).

    • aFeriados: Um array de arrays onde cada elemento é {‘AAAAMMDD’, ‘Nome do Feriado’}.

    • cFeriadoNome: Usado para armazenar o nome do feriado, se a data for encontrada.

  • Lista de Feriados: A lista de datas é definida no array aFeriados.

    • Melhor Prática: Em um projeto real, evite “hard-codar” (escrever diretamente no código) datas fixas. É muito mais robusto e fácil de manter buscar essa informação em uma tabela de configuração no Protheus (como a SXG – Dias Não Úteis) ou em um Parâmetro Customizado (SX1).

  • Validação (AScan):

    • A função DToS(dDataAtual) converte a data atual para o formato AAAAMMDD (ex: 20251103).

    • A função AScan() percorre o array aFeriados, verificando se o primeiro elemento (aElement[1]) de cada sub-array é igual à data atual formatada (cDataAtual).

    • Se AScan retornar um número maior que 0, a data foi encontrada.

  • Bloqueio:

    • Se a data for encontrada (If cFeriadoNome > 0), a variável de retorno é alterada para lRet := .F., o que imediatamente aborta a inclusão do Documento de Entrada antes que o usuário possa interagir com a tela.

    • Uma mensagem (MsgStop) é exibida para informar claramente o motivo do bloqueio.

Com isso, você garante que nenhum documento será incluído em dias não úteis definidos, forçando o processo para o próximo dia útil.


Link(s) de referência(s):https://tdn.totvs.com/pages/releaseview.action?pageId=6784333

 

Bem, finalizamos mais um post aqui do Blog ProtheusAdvpl.

Se esse conteúdo lhe foi útil nos ajude compartilhando ele em suas redes sociais do TOTVS Protheus.

Grande abraço e fica com Deus.

Receba as últimas atualizações do ProtheusAdvpl
Deixe seu melhor email
Nós respeitamos sua privacidade.