検索

Artigo
· 3 hr atrás 5min de leitura

CNPJ Será Alfanumérico a partir de julho de 2026 - Classe Atualizada

Pessoal, segue Classe para validar CNPJ alfanumérico Receita Federal, que entra em vigor a partir de julho de 2026.

link: CNPJ Alfanumérico — Receita Federal

Class Utils.Br.Validador
{ /// <summary>
/// Valida um CPF, CNPJ numérico ou CNPJ alfanumérico.
/// Detecta o tipo (11 ou 14 dígitos) e chama o validador apropriado.
/// Retorna 1 (true) se válido, 0 (false) se inválido.
/// </summary>
/// <param name="documento">O número do CPF ou CNPJ, com ou sem formatação.</param>
ClassMethod Validar(documento As %String) As %Boolean
{
    // 1. Limpa a formatação (pontos, traços, barras) e converte para MAIÚSCULO
    Set docLimpo = ..LimparFormatacao(documento)
    Set len = $LENGTH(docLimpo)
    
    // 2. Direciona para o método correto baseado no tamanho
    If len = 11 {
        Quit ..ValidarCPF(docLimpo)
    }
    
    If len = 14 {
        Quit ..ValidarCNPJ(docLimpo)
    }
    
    // Se não tiver 11 ou 14 dígitos, é inválido
    Quit 0
} /// <summary>
/// Valida um número de CPF (11 dígitos).
/// </summary>
/// <param name="cpf">O CPF (idealmente já sem formatação).</param>
ClassMethod ValidarCPF(cpf As %String) As %Boolean [ Private ]
{
    Set cpf = ..LimparFormatacao(cpf) // Garante limpeza extra
    If $LENGTH(cpf) '= 11 Quit 0 }
    
    // CORREÇÃO: Verifica se todos os dígitos são iguais (ex: "11111111111")
    If $TRANSLATE(cpf, $EXTRACT(cpf, 1), "") = "" Quit 0 }
    
    // Cálculo DV1
    Set soma = 0
    For = 1:1:9 {
        Set soma = soma + ($EXTRACT(cpf, i) * (11 - i))
    }
    Set resto = soma # 11
    Set dv1 = $SELECT(resto < 2: 0, 1: 11 - resto)
    If dv1 '= $EXTRACT(cpf, 10) Quit 0 }
    
    // Cálculo DV2
    Set soma = 0
    For = 1:1:10 {
        Set soma = soma + ($EXTRACT(cpf, i) * (12 - i))
    }
    Set resto = soma # 11
    Set dv2 = $SELECT(resto < 2: 0, 1: 11 - resto)
    If dv2 '= $EXTRACT(cpf, 11) Quit 0 }
    
    Quit 1
} /// <summary>
/// Valida um número de CNPJ (14 posições), numérico ou alfanumérico,
/// conforme o Anexo XV da IN RFB nº 2.119/2022 (adicionado pela IN RFB nº 2229/2024).
/// </summary>
/// <param name="cnpj">O CNPJ (já limpo e em maiúsculas).</param>
ClassMethod ValidarCNPJ(cnpj As %String) As %Boolean [ Private ]
{
    If $LENGTH(cnpj) '= 14
     Quit 0
     }     // CORREÇÃO: Verifica sequências de caracteres idênticos (ex: "AAAA...")
    If $TRANSLATE(cnpj, $EXTRACT(cnpj, 1), "") = "" {
    Quit 0
    }
    
    // 3. Cálculo do 1º Dígito Verificador (DV1)
    Set soma = 0
    Set pesos = "543298765432"
    For = 1:1:12 {
        Set char = $EXTRACT(cnpj, i)
        Set valor = $ASCII(char) - 48
        Set soma = soma + (valor * $EXTRACT(pesos, i))
    }
    
    Set resto = soma # 11
    Set dv1 = $SELECT(resto < 2: 0, 1: 11 - resto)
    
    // 4. Verifica o DV1
    If dv1 '= $EXTRACT(cnpj, 13) Quit 0 }
    
    // 5. Cálculo do 2º Dígito Verificador (DV2)
    Set soma = 0
    Set pesos = "6543298765432"
    For = 1:1:13 {
        Set char = $EXTRACT(cnpj, i)
        Set valor = $ASCII(char) - 48
        Set soma = soma + (valor * $EXTRACT(pesos, i))
    }
    
    Set resto = soma # 11
    Set dv2 = $SELECT(resto < 2: 0, 1: 11 - resto)
    
    // 6. Verifica o DV2
    If dv2 '= $EXTRACT(cnpj, 14) Quit 0 }
    
    // Se passou por tudo, é válido
    Quit 1
} /// <summary>
/// Remove caracteres de formatação (., -, /) e converte para MAIÚSCULAS.
/// </summary>
ClassMethod LimparFormatacao(valor As %String) As %String [ Private ]
{
    Set valorLimpo = $TRANSLATE(valor, ".-/", "")
    Quit $ZCONVERT(valorLimpo, "U")
} }
 

// Testando um CNPJ numérico antigo (ainda válido)

USER> WRITE ##class(Utils.BR.Validador).Validar("33.000.167/0001-01")

USER>1

// Testando um CPF (não mudou)

USER> WRITE ##class(Utils.BR.Validador).Validar("123.456.789-00")

USER>1

// NOVO TESTE: O CNPJ Alfanumérico do Exemplo 2 da RFB [cite: 44]

USER> WRITE ##class(Utils.BR.Validador).Validar("12.ABC.345/01DE-35")

USER>1

// NOVO TESTE: O mesmo CNPJ com dígito verificador errado

USER> WRITE ##class(Utils.BR.Validador).Validar("12.ABC.345/01DE-30")

USER>0

// NOVO TESTE: Com letras minúsculas (será tratado)

USER> WRITE ##class(Utils.BR.Validador).Validar("12.abc.345/01de-35")

USER>1

 

Se houver necessidade de ajuste, fiquem a vontade para informar.

Obrigado.

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· 4 hr atrás 3min de leitura

[DOCKER] Framework de développement conteneurisé

Bonjour à tous,

Je m’adresse à vous, la communauté technique francophone pour vous présenter une réflexion et une proposition de réponse que j’ai apporté pour utiliser docker dans un environnement de développement avec plusieurs développeurs.

Ma réponse se compose en 2 parties, une architecture du repository GIT d’un namespace et un repository lié à DOCKER. La première partie, je pense, peut être utile au-delà d’un contexte docker.

La complexité de ce projet réside dans le fait d’avoir une solution permettant de conteneuriser un nombre “infini” de namespace et éviter d’avoir un conteneur par namespace.

Présentation du framework

Dans chacun de mes projets, je crée un dossier à la racine nommé Config. 

Dans ce dossier va se trouver toute la configuration du namespace avec les fichiers suivants 

  • Les WebApps
  • Les default Settings
  • Le deployer
  • L’installer
  • Les packages (ce fichier sert à dire au plugin docker GIT quels packages il doit exporter dans le repository. L’intérêt est de ne pas polluer le repo avec toutes les classes du namespaces, mais bien seulement celles que je crée.)

Attention, il est extrêmement important de respecter le nommage de chaque fichier avec le nom du namespace et le reste du nom du fichier. Je me sert de cette convention pour détecter automatiquement les namespaces.

Les intérêts sont les suivants

1- Dans mon dossier DOCKER, je n’ai AUCUN fichier de config (à part celui permettant l’affichage dans VSCODE que je vous montrerai à la fin)

Pour chaque namespace présent dans mon workspace respectant le framework, il sera automatiquement déployé lors des commandes docker

2- Chaque namespace peut posséder son propre GIT qui est totalement omnipotent puisqu’il possède également la configuration. Cela permet de résoudre les soucis de gestion des différentes configurations. Dans un contexte multi-développeur sur un même namespace, cela permet d’ajouter automatiquement les nouveaux default settings présent dans la version déployée par exemple.

3- Le repo GIt de chaque namespace n’est pas “pollué” avec de la config docker, il peut très bien être utilisé dans un monde non conteneurisé, toute la complexité de la conteneurisation est portée par le repo DOCKER

Je ne rentre pas pour le moment dans le détail de la solution. Elle n’est pas spécialement complexe mais elle est très fournie. Je peux vous donner les différentes choses à regarder si cela vous intéresse 

  • La classe File.CLS qui me permet de faire toutes les actions requises
  • Les deux scripts (Install et Deploy) qui orchestrent les appels à la classe File pour l’installation.
  • Le Readme qui explique techniquement comment démarrer le projet.
  • A noter que j’utilise un fork personnel du projet MW-de/git-for-iris qui ne gère la les arborescences et le contexte multi namespace (En tout cas à l’époque où j’ai mené ce projet). Toute la complexité de GIt est porté part ce projet. La façon donc les fichiers locaux sont compilés dans la BDD IRIS où comment une modification dans la BDD IRIS (Ajout d’un composant en production) est automatiquement exporté dans un fichier local pour être “commitable”.

Si ce projet vous intéresse, je pourrai aller plus dans le détail de l’explication et/ou faire une vidéo où je présente l’exhaustivité des étapes de conception.

Je vous invite à “jouer” avec mon repo Git prévu à cet effet. Dans ce contexte, j’ai tout réuni au sein d’un même repo pour simplifier le test, mais dans le monde réel, j’ai bien un répo par namespace + un DOCKER. Il n’y a plus qu’à suivre le readme 🙂

https://github.com/ArchiMatt/Framework-docker

 

C’est un projet que j’ai mené il y a très longtemps pour résoudre nos problématiques projets. Je n’ai plus la chance de travailler sur les technologies InterSystems régulièrement mais je tenais à vous partager ce bout de réflexion. N’hésitez pas à réagir, c’est un projet qui n’est pas terminé, il y a encore plein de choses à améliorer / nettoyer. Peut être que les dernières version d’IRIS sont venues faire évoluer cette vision 🙂


 

Discussão (0)1
Entre ou crie uma conta para continuar
Pergunta
· 10 hr atrás

How can I code "IF Studio"?

Studio's Output window is interactive, and code can ask questions there if it is a Studio environment. How do I check for that?

2 novos comentários
Discussão (2)2
Entre ou crie uma conta para continuar
Anúncio
· 10 hr atrás

[Video] Foreign Tables In 2025.2

Hey Community!

We're happy to share a new video from our InterSystems Developers YouTube:

⏯  Foreign Tables In 2025.2 @ Ready 2025

<--break->

This presentation explains new foreign table enhancements in the 2025.2 release, focusing on improved query pushdown. The update lets entire queries, aggregates, grouping, and limits be processed by the external database instead of locally, greatly reducing data transfer and improving performance for cross-database queries.

🗣 Presenter: @Michael Golden, Principal Systems Developer, InterSystems

Enjoy watching, and subscribe for more videos! 👍

Discussão (0)1
Entre ou crie uma conta para continuar
Anúncio
· 10 hr atrás

[Webinar in Dutch] Data exchange in healthcare according to the FHIR standard with Python

Hey Community,

We're happy to invite you to a LinkedIn Live session in Dutch

🎤 Data exchange in healthcare according to the FHIR standard with Python 🎤

Event details:
📅 Date: Thursday, November 27th
🕓 Time: 1:30-2:15 PM EST

Curious how to translate data to commonly used standards like FHIR? Then join this webinar, where @Wietze Drost will demonstrate what's possible. Effective data exchange has become much easier with Python, instead of an obscure programming language invented by the software vendor. In this webinar, we'll share some examples that could work for your organization.

You'll gain insight into:

  • How to translate data to FHIR and other standards using Python.
  • How Python makes working with data for standards translation easier and more accessible.
  • How a data platform can be used for data standardization without complicated technical barriers.

👨‍🏫 Speaker@Wietze Drost, Sales Engineer at InterSystems Netherlands

>> JOIN HERE <<

Discussão (0)1
Entre ou crie uma conta para continuar