validador-cnpj


Namevalidador-cnpj JSON
Version 0.2.1 PyPI version JSON
download
home_pageNone
SummaryUDFs PySpark para limpeza, reparo, normalização e validação de CNPJ (numérico e alfanumérico).
upload_time2025-09-04 19:30:34
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords brasil cnpj data-quality databricks pyspark spark
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ````markdown
# validador-cnpj

[![PyPI version](https://img.shields.io/pypi/v/validador-cnpj.svg)](https://pypi.org/project/validador-cnpj/)
[![Python](https://img.shields.io/pypi/pyversions/validador-cnpj.svg)](https://pypi.org/project/validador-cnpj/)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

UDFs **PySpark** para **limpeza, reparo, normalização e validação** de CNPJ (numérico e alfanumérico).  
**Distribuição (PyPI):** `validador-cnpj` • **Import (Python):** `validador_cnpj`

---

## Instalação

```bash
pip install validador-cnpj
````

---

## Uso rápido (Spark)

```python
from validador_cnpj import padronizar_cnpj

df = spark.createDataFrame(
    [("12.345.678/0001-95",), ("12.ABC.345/01DE-35",), ("123456780001",)],
    ["cnpj_bruto"]
)

out = padronizar_cnpj(df, "cnpj_bruto", com_mascara=True)
display(out)
```

**Colunas geradas**:

* `cnpj14` — 14 chars (12 base + 2 DV)
* `f_eh_valido` — boolean
* `f_tipo` — `"numerico"` | `"alfanumerico"` | `"desconhecido"`
* `cnpj_mascara` — `AA.AAA.AAA/AAAA-DV` (quando válido e `com_mascara=True`)
* `bruto_limpo` — entrada higienizada (apenas A–Z/0–9, maiúsculo)

---

## Principais recursos

* Aceita entradas **sujas** (máscaras, espaços, símbolos, caixa mista).
* **Repara** casos com **falta**/**excesso** de caracteres (configurável por estratégia).
* **Valida DV** (módulo 11) para CNPJ **numérico e alfanumérico**.
* UDFs prontas para **PySpark** e função pura para uso em Python/driver.

---

## API (Python)

```python
from validador_cnpj import (
    padronizar_cnpj,
    normalizar_cnpj_udf,
    cnpj_eh_valido_udf,
    tipo_cnpj_udf,
    mascarar_cnpj_udf,
)
```

### `padronizar_cnpj(df, coluna, *, coluna_saida="cnpj14", com_mascara=True, estrategia="flex_pad_esquerda") -> DataFrame`

Aplica limpeza/reparo/validação em lote e devolve colunas utilitárias.

Parâmetros:

* `coluna` — nome da coluna de entrada.
* `coluna_saida` — nome da coluna com o CNPJ normalizado (14 chars).
* `com_mascara` — adiciona `cnpj_mascara` quando válido.
* `estrategia` — `"rigorosa" | "flex_pad_esquerda" | "corte_direita"`.

### UDFs

* `normalizar_cnpj_udf(string) -> struct(cnpj14, eh_valido, tipo, mascarado)`
* `cnpj_eh_valido_udf(string) -> boolean`
* `tipo_cnpj_udf(string) -> string`
* `mascarar_cnpj_udf(string) -> string | null`

> Dica: use as UDFs quando quiser compor sua própria transformação; use `padronizar_cnpj` para o caminho mais simples.

---

## Estratégias de reparo

* **`rigorosa`** — aceita apenas 12 ou 14 caracteres válidos, senão retorna `None`.
* **`flex_pad_esquerda`** *(padrão)* — cobre truncamentos/legados comuns (completa à esquerda, recalcula DV quando necessário).
* **`corte_direita`** — prioriza cortar à direita (12 primeiros como base, tenta usar os 2 últimos como DV).

---

## Casos de uso práticos

1. Limpeza e validação em lote
2. Apenas checar se é válido
3. Identificar tipo (numérico x alfanumérico)
4. Aplicar máscara oficial somente se válido
5. Usar estratégia **rigorosa**
6. Preferir cortes à direita
7. Compor manualmente com `normalizar_cnpj_udf`
8. **Exemplo em SQL (Databricks)**

```sql
-- Exemplo SQL
SELECT
  normalizar_cnpj(cnpj_bruto).cnpj14       AS cnpj14,
  normalizar_cnpj(cnpj_bruto).eh_valido    AS f_eh_valido,
  normalizar_cnpj(cnpj_bruto).tipo         AS f_tipo,
  normalizar_cnpj(cnpj_bruto).mascarado    AS cnpj_mascara
FROM tabela;
```

---

## Exemplos detalhados de entradas → saídas

| Entrada (`cnpj_bruto`)       | Estratégia          | `cnpj14` (normalizado) |        `f_eh_valido`       | `f_tipo`       | Observação                                   |
| ---------------------------- | ------------------- | ---------------------: | :------------------------: | :------------- | -------------------------------------------- |
| `12.345.678/0001-95`         | qualquer            |       `12345678000195` |    :white\_check\_mark:    | `numerico`     | Formato clássico com máscara                 |
| `12.ABC.345/01DE-35`         | qualquer            |       `12ABC34501DE35` |    :white\_check\_mark:    | `alfanumerico` | Alfanumérico com máscara mista               |
| `123456780001`               | flex\_pad\_esquerda |       `123456780001??` | :white\_check\_mark:/ \:x: | `numerico`     | Faltam DVs → calculados                      |
| `123`                        | flex\_pad\_esquerda |       `000000000123??` | :white\_check\_mark:/ \:x: | `numerico`     | Completa à esquerda até 12 e calcula DV      |
| `00012345678000195`          | flex\_pad\_esquerda |       `12345678000195` |    :white\_check\_mark:    | `numerico`     | Excesso à esquerda → usa 12 anteriores ao DV |
| `12ABC34501DEXX`             | flex\_pad\_esquerda |       `12ABC34501DE??` | :white\_check\_mark:/ \:x: | `alfanumerico` | Lixo no fim, sem DV confiável → recalcula    |
| `12abc345/01de-35`           | qualquer            |       `12ABC34501DE35` |    :white\_check\_mark:    | `alfanumerico` | Caixa/símbolos higienizados                  |
| `foo 12.ABC.345/01DE-35 bar` | flex\_pad\_esquerda |       `12ABC34501DE35` |    :white\_check\_mark:    | `alfanumerico` | Texto ao redor ignorado                      |
| `A2345678000195`             | rigorosa            |                 `None` |             :x:            | `desconhecido` | 14 chars mas DV não numérico → rejeita       |
| `None` / vazio               | qualquer            |                 `None` |             :x:            | `desconhecido` | Valor nulo                                   |

---

## Boas práticas de performance

* Prefira `padronizar_cnpj` (uma passada) e **reutilize** as colunas derivadas.
* Filtre válidos após normalizar.
* Ajuste `estrategia` conforme a qualidade do dado.

---

## Tratamento de erros & decisões de negócio

A biblioteca **não** toma decisões de negócio (ex.: descartar registros inválidos).
Ela fornece sinais (`f_eh_valido`, `f_tipo`, `cnpj14`, `bruto_limpo`) para que **você** defina as regras.

---

## Compatibilidade

* **Python**: 3.8+
* **PySpark**: 3.3 – 3.x
* **Databricks**: testado em clusters 10.x/11.x/12.x (Spark 3.x)

---

## Alterações recentes

Veja o [CHANGELOG.md](CHANGELOG.md).

---

## Licença

MIT

---

## Detalhes técnicos

* Cálculo de DV (módulo 11) aplicável a CNPJ **numérico** e **alfanumérico**.
* Máscara padrão: `AA.AAA.AAA/AAAA-DV`.

```
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "validador-cnpj",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "brasil, cnpj, data-quality, databricks, pyspark, spark",
    "author": null,
    "author_email": "Yuri Arthur Ferreira Santana <yuriarthurf@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/7f/54/67c56386012f5f60292b30f0d86dd1f47b6d283fd7c7ec909a9706c804b2/validador_cnpj-0.2.1.tar.gz",
    "platform": null,
    "description": "````markdown\n# validador-cnpj\n\n[![PyPI version](https://img.shields.io/pypi/v/validador-cnpj.svg)](https://pypi.org/project/validador-cnpj/)\n[![Python](https://img.shields.io/pypi/pyversions/validador-cnpj.svg)](https://pypi.org/project/validador-cnpj/)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nUDFs **PySpark** para **limpeza, reparo, normaliza\u00e7\u00e3o e valida\u00e7\u00e3o** de CNPJ (num\u00e9rico e alfanum\u00e9rico).  \n**Distribui\u00e7\u00e3o (PyPI):** `validador-cnpj` \u2022 **Import (Python):** `validador_cnpj`\n\n---\n\n## Instala\u00e7\u00e3o\n\n```bash\npip install validador-cnpj\n````\n\n---\n\n## Uso r\u00e1pido (Spark)\n\n```python\nfrom validador_cnpj import padronizar_cnpj\n\ndf = spark.createDataFrame(\n    [(\"12.345.678/0001-95\",), (\"12.ABC.345/01DE-35\",), (\"123456780001\",)],\n    [\"cnpj_bruto\"]\n)\n\nout = padronizar_cnpj(df, \"cnpj_bruto\", com_mascara=True)\ndisplay(out)\n```\n\n**Colunas geradas**:\n\n* `cnpj14` \u2014 14 chars (12 base + 2 DV)\n* `f_eh_valido` \u2014 boolean\n* `f_tipo` \u2014 `\"numerico\"` | `\"alfanumerico\"` | `\"desconhecido\"`\n* `cnpj_mascara` \u2014 `AA.AAA.AAA/AAAA-DV` (quando v\u00e1lido e `com_mascara=True`)\n* `bruto_limpo` \u2014 entrada higienizada (apenas A\u2013Z/0\u20139, mai\u00fasculo)\n\n---\n\n## Principais recursos\n\n* Aceita entradas **sujas** (m\u00e1scaras, espa\u00e7os, s\u00edmbolos, caixa mista).\n* **Repara** casos com **falta**/**excesso** de caracteres (configur\u00e1vel por estrat\u00e9gia).\n* **Valida DV** (m\u00f3dulo 11) para CNPJ **num\u00e9rico e alfanum\u00e9rico**.\n* UDFs prontas para **PySpark** e fun\u00e7\u00e3o pura para uso em Python/driver.\n\n---\n\n## API (Python)\n\n```python\nfrom validador_cnpj import (\n    padronizar_cnpj,\n    normalizar_cnpj_udf,\n    cnpj_eh_valido_udf,\n    tipo_cnpj_udf,\n    mascarar_cnpj_udf,\n)\n```\n\n### `padronizar_cnpj(df, coluna, *, coluna_saida=\"cnpj14\", com_mascara=True, estrategia=\"flex_pad_esquerda\") -> DataFrame`\n\nAplica limpeza/reparo/valida\u00e7\u00e3o em lote e devolve colunas utilit\u00e1rias.\n\nPar\u00e2metros:\n\n* `coluna` \u2014 nome da coluna de entrada.\n* `coluna_saida` \u2014 nome da coluna com o CNPJ normalizado (14 chars).\n* `com_mascara` \u2014 adiciona `cnpj_mascara` quando v\u00e1lido.\n* `estrategia` \u2014 `\"rigorosa\" | \"flex_pad_esquerda\" | \"corte_direita\"`.\n\n### UDFs\n\n* `normalizar_cnpj_udf(string) -> struct(cnpj14, eh_valido, tipo, mascarado)`\n* `cnpj_eh_valido_udf(string) -> boolean`\n* `tipo_cnpj_udf(string) -> string`\n* `mascarar_cnpj_udf(string) -> string | null`\n\n> Dica: use as UDFs quando quiser compor sua pr\u00f3pria transforma\u00e7\u00e3o; use `padronizar_cnpj` para o caminho mais simples.\n\n---\n\n## Estrat\u00e9gias de reparo\n\n* **`rigorosa`** \u2014 aceita apenas 12 ou 14 caracteres v\u00e1lidos, sen\u00e3o retorna `None`.\n* **`flex_pad_esquerda`** *(padr\u00e3o)* \u2014 cobre truncamentos/legados comuns (completa \u00e0 esquerda, recalcula DV quando necess\u00e1rio).\n* **`corte_direita`** \u2014 prioriza cortar \u00e0 direita (12 primeiros como base, tenta usar os 2 \u00faltimos como DV).\n\n---\n\n## Casos de uso pr\u00e1ticos\n\n1. Limpeza e valida\u00e7\u00e3o em lote\n2. Apenas checar se \u00e9 v\u00e1lido\n3. Identificar tipo (num\u00e9rico x alfanum\u00e9rico)\n4. Aplicar m\u00e1scara oficial somente se v\u00e1lido\n5. Usar estrat\u00e9gia **rigorosa**\n6. Preferir cortes \u00e0 direita\n7. Compor manualmente com `normalizar_cnpj_udf`\n8. **Exemplo em SQL (Databricks)**\n\n```sql\n-- Exemplo SQL\nSELECT\n  normalizar_cnpj(cnpj_bruto).cnpj14       AS cnpj14,\n  normalizar_cnpj(cnpj_bruto).eh_valido    AS f_eh_valido,\n  normalizar_cnpj(cnpj_bruto).tipo         AS f_tipo,\n  normalizar_cnpj(cnpj_bruto).mascarado    AS cnpj_mascara\nFROM tabela;\n```\n\n---\n\n## Exemplos detalhados de entradas \u2192 sa\u00eddas\n\n| Entrada (`cnpj_bruto`)       | Estrat\u00e9gia          | `cnpj14` (normalizado) |        `f_eh_valido`       | `f_tipo`       | Observa\u00e7\u00e3o                                   |\n| ---------------------------- | ------------------- | ---------------------: | :------------------------: | :------------- | -------------------------------------------- |\n| `12.345.678/0001-95`         | qualquer            |       `12345678000195` |    :white\\_check\\_mark:    | `numerico`     | Formato cl\u00e1ssico com m\u00e1scara                 |\n| `12.ABC.345/01DE-35`         | qualquer            |       `12ABC34501DE35` |    :white\\_check\\_mark:    | `alfanumerico` | Alfanum\u00e9rico com m\u00e1scara mista               |\n| `123456780001`               | flex\\_pad\\_esquerda |       `123456780001??` | :white\\_check\\_mark:/ \\:x: | `numerico`     | Faltam DVs \u2192 calculados                      |\n| `123`                        | flex\\_pad\\_esquerda |       `000000000123??` | :white\\_check\\_mark:/ \\:x: | `numerico`     | Completa \u00e0 esquerda at\u00e9 12 e calcula DV      |\n| `00012345678000195`          | flex\\_pad\\_esquerda |       `12345678000195` |    :white\\_check\\_mark:    | `numerico`     | Excesso \u00e0 esquerda \u2192 usa 12 anteriores ao DV |\n| `12ABC34501DEXX`             | flex\\_pad\\_esquerda |       `12ABC34501DE??` | :white\\_check\\_mark:/ \\:x: | `alfanumerico` | Lixo no fim, sem DV confi\u00e1vel \u2192 recalcula    |\n| `12abc345/01de-35`           | qualquer            |       `12ABC34501DE35` |    :white\\_check\\_mark:    | `alfanumerico` | Caixa/s\u00edmbolos higienizados                  |\n| `foo 12.ABC.345/01DE-35 bar` | flex\\_pad\\_esquerda |       `12ABC34501DE35` |    :white\\_check\\_mark:    | `alfanumerico` | Texto ao redor ignorado                      |\n| `A2345678000195`             | rigorosa            |                 `None` |             :x:            | `desconhecido` | 14 chars mas DV n\u00e3o num\u00e9rico \u2192 rejeita       |\n| `None` / vazio               | qualquer            |                 `None` |             :x:            | `desconhecido` | Valor nulo                                   |\n\n---\n\n## Boas pr\u00e1ticas de performance\n\n* Prefira `padronizar_cnpj` (uma passada) e **reutilize** as colunas derivadas.\n* Filtre v\u00e1lidos ap\u00f3s normalizar.\n* Ajuste `estrategia` conforme a qualidade do dado.\n\n---\n\n## Tratamento de erros & decis\u00f5es de neg\u00f3cio\n\nA biblioteca **n\u00e3o** toma decis\u00f5es de neg\u00f3cio (ex.: descartar registros inv\u00e1lidos).\nEla fornece sinais (`f_eh_valido`, `f_tipo`, `cnpj14`, `bruto_limpo`) para que **voc\u00ea** defina as regras.\n\n---\n\n## Compatibilidade\n\n* **Python**: 3.8+\n* **PySpark**: 3.3 \u2013 3.x\n* **Databricks**: testado em clusters 10.x/11.x/12.x (Spark 3.x)\n\n---\n\n## Altera\u00e7\u00f5es recentes\n\nVeja o [CHANGELOG.md](CHANGELOG.md).\n\n---\n\n## Licen\u00e7a\n\nMIT\n\n---\n\n## Detalhes t\u00e9cnicos\n\n* C\u00e1lculo de DV (m\u00f3dulo 11) aplic\u00e1vel a CNPJ **num\u00e9rico** e **alfanum\u00e9rico**.\n* M\u00e1scara padr\u00e3o: `AA.AAA.AAA/AAAA-DV`.\n\n```",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "UDFs PySpark para limpeza, reparo, normaliza\u00e7\u00e3o e valida\u00e7\u00e3o de CNPJ (num\u00e9rico e alfanum\u00e9rico).",
    "version": "0.2.1",
    "project_urls": {
        "Homepage": "https://github.com/data-engineering-bp/validador-cnpj",
        "Issues": "https://github.com/data-engineering-bp/validador-cnpj/issues"
    },
    "split_keywords": [
        "brasil",
        " cnpj",
        " data-quality",
        " databricks",
        " pyspark",
        " spark"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4e26db8a8922244f79a0a992e91ecb2cfec333048eb826c1cc2cd48eebede38d",
                "md5": "bf8f91c878671f51fab8504d1b041b0a",
                "sha256": "b981105175d0fad21b123855b8117e26dfef58ce49795a7f2e6a7d1139110609"
            },
            "downloads": -1,
            "filename": "validador_cnpj-0.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bf8f91c878671f51fab8504d1b041b0a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 7267,
            "upload_time": "2025-09-04T19:30:31",
            "upload_time_iso_8601": "2025-09-04T19:30:31.402858Z",
            "url": "https://files.pythonhosted.org/packages/4e/26/db8a8922244f79a0a992e91ecb2cfec333048eb826c1cc2cd48eebede38d/validador_cnpj-0.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7f5467c56386012f5f60292b30f0d86dd1f47b6d283fd7c7ec909a9706c804b2",
                "md5": "6b5a0faf3ddc11c61131887f8c50f6c4",
                "sha256": "3e66dc9428068a590cb83f2e399bb59125668ca45fb6cf87059ad59254f03033"
            },
            "downloads": -1,
            "filename": "validador_cnpj-0.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "6b5a0faf3ddc11c61131887f8c50f6c4",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 7029,
            "upload_time": "2025-09-04T19:30:34",
            "upload_time_iso_8601": "2025-09-04T19:30:34.680966Z",
            "url": "https://files.pythonhosted.org/packages/7f/54/67c56386012f5f60292b30f0d86dd1f47b6d283fd7c7ec909a9706c804b2/validador_cnpj-0.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-04 19:30:34",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "data-engineering-bp",
    "github_project": "validador-cnpj",
    "github_not_found": true,
    "lcname": "validador-cnpj"
}
        
Elapsed time: 1.06753s