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.


🚀 Quer evoluir no ADVPL de verdade?

Receba conteúdos práticos, códigos prontos e dicas que você 

 não aprende na documentação oficial

✔ Funções essenciais do ADVPL
✔ Exemplos reais usados no Protheus
✔ Dicas de debug e performance

🔐 Seu email está seguro. Sem spam.

💡 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

🚀 Quer evoluir no ADVPL de verdade?

Receba conteúdos práticos, códigos prontos e dicas que você 

 não aprende na documentação oficial

✔ Funções essenciais do ADVPL
✔ Exemplos reais usados no Protheus
✔ Dicas de debug e performance

🔐 Seu email está seguro. Sem spam.

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.

🚀 Quer dominar o Protheus de verdade?
Entre para o ProtheusAdvpl e receba conteúdos exclusivos sobre desenvolvimento, infraestrutura, módulos e carreira no Protheus

✔ Conteúdos organizados por categorias (Programação, Framework, Backoffice e RH)
✔ Dicas práticas usadas no dia a dia do Protheus
✔ Acesso a materiais, post e atualizações do Blog
🔐 Seu email está seguro. Sem spam. Só conteúdo profissional.