Skill: notificacao-extrajudicial
Gera notificações extrajudiciais bancárias preenchidas a partir de templates DOCX com placeholders. O fluxo padrão é: carregar _estado_cliente.json → selecionar tese → substituir placeholders → salvar DOCX final.
Teses suportadas (7)
| Slug |
Subtítulo |
Versões |
Hipótese de uso |
consignado-nao-contratado |
"Empréstimo Não Contratado" |
COM (Tiago AL) + SEM (Patrick AM) |
Cliente descobriu desconto no INSS de empréstimo que jamais contratou |
rmc |
"Cartão de Crédito RMC" |
COM (Tiago AL) + SEM (Patrick AM) |
Cliente foi induzido a aderir a Reserva de Margem Consignável em vez de empréstimo |
rcc |
"Cartão de Crédito RCC" |
COM (Tiago AL) + SEM (Patrick AM) |
Cliente foi induzido a aderir a Reserva de Cartão Consignado |
bradesco-encargos |
"Descontos indevidos de encargos" |
SEM apenas (Patrick AM) |
Encargos "MORA CRED PESS" / "ENC LIM CRED" sem contrato — protocolada só no AM |
bradesco-tarifas |
"Descontos indevidos de tarifas" |
SEM apenas (Patrick AM) |
Tarifas bancárias sem contrato (IRDR 0005053-71 TJAM) — protocolada só no AM |
bradesco-capitalizacao |
"Descontos indevidos de título de capitalização" |
SEM apenas (Patrick AM) |
Título de capitalização não contratado — protocolada só no AM |
bradesco-pe |
"Descontos a título de Pagamento Eletrônico" |
SEM apenas (Patrick AM) |
"PAGTO ELETRON COBRANÇA *" — terceiros (EAGLE, ASPECIR, etc.) — protocolada só no AM |
Nota: As 4 teses Bradesco (encargos, tarifas, capitalização, PE) só têm versão SEM-escritório porque essas pretensões são protocoladas exclusivamente pelo Patrick no AM. Não há demanda de versão COM-logo Tiago/Eduardo para essas teses.
Dossiê de notificação (gravado 13/05/2026)
Toda notificação gerada pela _run_notificacoes.py agora sai dentro de uma subpasta dedicada por banco já com todos os documentos de instrução prontos para envio extrajudicial:
<pasta_acao>/notificacao/
└── BRADESCO/
├── Notificação Extrajudicial - BRADESCO - CONSIGNADO-NAO-CONTRATADO.docx
├── OAB TIAGO.pdf ← assinatura do procurador
├── 2- Procuração - Contrato 0123471622742.pdf ← procurações dos contratos do banco
├── 2- Procuração - Contrato 0123471622766.pdf
├── 2- Procuração - Contrato 016178952.pdf
├── 3- RG e CPF.pdf ← identidade do cliente
├── 6- Histórico de empréstimo (grifado).pdf ← HISCON
└── 7- Histórico de pagamento.pdf ← HISCRE
REGRA OPERACIONAL (gravada 13/05/2026, Gabriel): o dossiê extrajudicial NÃO inclui declaração de hipossuficiência nem comprovante de residência — esses ficam reservados para a inicial. A notificação extrajudicial só precisa demonstrar (a) identidade do notificante (RG/CPF), (b) outorga de poderes (procurações), (c) existência dos descontos (HISCON + HISCRE) e (d) qualificação do procurador (OAB).
Cadastro de OAB em assets/oabs/ (PDFs das carteiras):
OAB TIAGO.pdf — usado quando advogado.chave == 'tiago' (AL Federal/Estadual)
OAB PATRICK.pdf — chave 'patrick' (AM Estadual)
OAB GABRIEL.pdf — chave 'gabriel' (BA Federal)
OAB ALEXANDRE.pdf — chave 'alexandre' (MG Estadual, SE)
OAB EDUARDO.pdf — chave 'eduardo' (outras situações)
Função montar_dossie_notificacao em _run_notificacoes.py:
- Copia a OAB do procurador (mapeada por
advogado.chave → OAB_PDF_POR_PROCURADOR)
- Filtra as procurações da pasta_acao pelos números dos contratos do banco (regex no nome do arquivo). Para litisconsórcio Bradesco + Mercantil, cada subpasta só leva as procurações relevantes ao seu banco.
- Copia documentos pessoais e financeiros (RG, hipossuficiência, comp. residência, HISCON grifado, HISCRE) que estão na pasta_acao.
Validado em 13/05/2026: CICERO (Bradesco 9 docs anexos + Mercantil 7 docs anexos), bath completo de 14 clientes.
Estrutura de arquivos
notificacao-extrajudicial/
├── SKILL.md ← este arquivo
├── assets/
│ ├── __BASE_com-escritorio__*.docx ← bases originais Tiago/Eduardo (com logo)
│ ├── __BASE_sem-escritorio__*.docx ← bases originais Patrick/Gabriel (timbrado neutro)
│ ├── template_<slug>__com-escritorio.docx ← templates placeholderizados COM
│ └── template_<slug>__sem-escritorio.docx ← templates placeholderizados SEM
├── scripts/
│ └── docx_replace.py ← substituir_em_docx, aplicar_timbrado_neutro
├── _test_consignado.py ← gera testes consignado-nao-contratado
├── _test_rmc.py ← gera testes RMC
├── _test_rcc.py ← gera testes RCC
└── _test_bradesco.py ← gera testes Bradesco (4 teses)
Como adicionar conteúdo de cliente
Os templates esperam placeholders {{VARIAVEL}} em MAIÚSCULAS. Vocabulário canônico documentado em
Modelos/Notificacoes/placeholders-canonicos.md no vault. Resumo dos principais grupos:
Cabeçalho: CIDADE_ASSINATURA, UF_ASSINATURA, DATA_EXTENSO
Cliente: CLIENTE_NOME, CLIENTE_NACIONALIDADE_GENERO, CLIENTE_ESTADO_CIVIL, CLIENTE_PROFISSAO, CLIENTE_CPF, CLIENTE_RG, CLIENTE_RG_ORGAO, CLIENTE_LOGRADOURO, CLIENTE_BAIRRO, CLIENTE_MUNICIPIO, CLIENTE_UF, CLIENTE_CEP, INSCRITO_A, DOMICILIADO_A
Banco: BANCO_NOME_QUALIFICADO, BANCO_CNPJ, BANCO_LOGRADOURO, BANCO_BAIRRO, BANCO_MUNICIPIO, BANCO_UF, BANCO_CEP, NOME_BANCO_CONTRATO
Advogado: ADVOGADO_NOME, ADVOGADO_NOME_MAIUSCULO, ADVOGADO_OAB_UF, SEU_SUA_ADVOGADO_A, ESCRITORIO_ENDERECO_COMPOSTO (resolvido por UF de atuação via skills/_common/escritorios_cadastro.py → matriz Joaçaba/SC + unidade de apoio: AM→Maués, AL/SE→Arapiraca, BA/ES→Salvador, MG→Uberlândia; sem hardcoded em produção)
Específicos por tese:
- Consignado/RMC/RCC:
CONTRATO_NUMEROS, CONTRATO_VALOR_EMPRESTIMO, CONTRATO_QTD_PARCELAS, CONTRATO_VALOR_PARCELA, CONTRATO_DATA_INCLUSAO, CONTRATO_DATA_PRIMEIRO_DESCONTO
- Bradesco-Encargos/Tarifas/Capitalização/PE:
RUBRICAS (os placeholders DATA_INICIAL, DATA_FINAL, NUMERO_DESCONTOS, VALOR_TOTAL foram REMOVIDOS dos templates em 13/05/2026 — o parágrafo "Tais descontos vêm ocorrendo, em síntese, no período aproximado de..." foi excluído porque o procurador prefere demonstrar os descontos diretamente via tabela anexa, sem repetir período/total em texto corrido)
- Bradesco-PE (terceiros):
TERCEIRO_NOME, TERCEIRO_CNPJ, TERCEIRO_LOGRADOURO, TERCEIRO_BAIRRO, TERCEIRO_MUNICIPIO, TERCEIRO_UF, TERCEIRO_CEP
API programática
from scripts.docx_replace import substituir_em_docx, aplicar_timbrado_neutro
# Gerar notificação para um cliente
substituir_em_docx(
'assets/template_rmc__com-escritorio.docx',
{
'{{CLIENTE_NOME}}': 'JOSÉ DA SILVA',
'{{CLIENTE_CPF}}': '000.111.222-33',
# ... resto dos placeholders
},
'output/notificacao_jose.docx'
)
Helpers em scripts/docx_replace.py
| Função |
Uso |
substituir_em_docx(input, mapa, output) |
Substitui todas as ocorrências de cada chave do mapa (dict) no DOCX. Faz LOOP — múltiplas ocorrências do mesmo placeholder no mesmo parágrafo são todas substituídas. Limpa parágrafos vazios excessivos. |
aplicar_timbrado_neutro(corpo, timbrado, output) |
Pega o corpo de um template e aplica headers/footers/imagens de outro. Usado para gerar SEM a partir de COM (e vice-versa). |
inserir_paragrafo_antes(doc, ancora, texto, herdar_estilo_de) |
Insere parágrafo antes de uma âncora textual, herdando estilo do parágrafo anterior. |
padronizar_fontes(doc, corpo='Cambria', destaque='Segoe UI') |
Heurística para normalizar fontes (use só quando o BASE não vier com fontes corretas). |
normalizar_tema_corpo(docx_path) |
Conserta documentos cujo corpo aponta para majorFont (Calibri) em vez de minorFont (Cambria). Substitui asciiTheme="majorHAnsi" → "minorHAnsi". |
Geração programática vs templates manuais
A skill distingue dois momentos:
- Bases originais (
__BASE_*) — modelos reais do escritório com cliente preenchido. Servem de molde visual mas nunca são editados.
- Templates placeholderizados (
template_*) — geração automática a partir das bases via _test_*.py, substituindo dados específicos por {{PLACEHOLDERS}}. Não editar diretamente — regenerar via script se mudar a base.
Os scripts _test_*.py rodam o pipeline completo:
- Lê o BASE
- Aplica placeholderização (substitui dados reais por placeholders)
- Gera template SEM via
aplicar_timbrado_neutro() (se BASE for COM) ou template COM (se BASE for SEM)
- Gera teste com cliente fictício para validação visual
- Reporta placeholders pendentes (= bug se houver)
Pipeline integrado — _run_notificacoes.py
Implementado em 2026-05-08. Processa em batch uma pasta de clientes. Para cada cliente:
- Carrega
_estado_cliente.json (gerado pela skill kit-juridico)
- Localiza pasta KIT (variantes:
KIT, 0. Kit, Kit)
- Localiza procuração (heurística em ordem de prioridade):
- PDF "Procuração*" no KIT
- PDF original referenciado em
_proc_crops/manifesto.json
- PNG já recortado em
_proc_crops/crop_pag_01.png (último recurso)
- Extrai qualificação via
extrair_qualificacao.py:
- Tenta text-layer; se vazio, OCR com easyOCR + rotação automática (procurações vêm escaneadas em landscape)
- Aplica regex restrito ao bloco OUTORGANTE (antes de OUTORGAD[OA]S) para evitar pegar dados dos advogados
- Tolera erros de OCR ("vlúva" → "viúva", "RG/CPF" → distingue do CPF)
- Para cada
pastas_acao do JSON, agrupa contratos por (banco_chave, tese) aplicando filtros:
- Banco extraído do path (
APOSENTADORIA\BANCO BMG - RMC-RCC → BMG); suporta litisconsórcio (BANCO X + BANCO Y)
- Benefício: contratos com
beneficio_pasta igual ao prefixo do path (APOSENTADORIA/PENSAO)
- Tipo:
- Path contém "RMC-RCC" → só
tipo em (RMC, RCC); tese = rmc ou rcc (decidida por contrato). Mantém Ativos + Excluídos (mesmo a margem encerrada pode ter cobranças residuais).
- Senão → só
tipo == CONSIGNADO; tese = consignado-nao-contratado.
- Autoridade da procuração (regra crítica do escritório): se a
pasta_acao contém PDFs de procuração com número de contrato no nome do arquivo (padrão Procuração - Banco X - Contrato N.pdf), só esses contratos entram na notificação. Procurações são outorgadas individualmente por contrato — listar contratos não referidos é ultra vires.
- Estratégia primária: regex no nome do arquivo (
Contrato\s+(?:nº)?\s*(\d{6,}))
- Fallback: procurar
ESTUDO DE CADEIA.docx na pasta_acao e extrair os números do texto
- Se nenhum número encontrado, NÃO infla com "todos do banco" — gera notificação com todos os contratos do JSON apenas se não há procurações com número.
- Filtro de situação aplicado SOMENTE quando NÃO há procurações específicas: para CONSIGNADO, só Ativos. Quando há procurações, todas as situações entram (a procuração já decidiu impugnar).
- De-duplicação: por número de contrato; preferindo
Ativo sobre Excluído
- Para cada
(banco, tese) resolvido, busca cadastro de banco via bancos.py:
- UF da ação determina filial usada (AL → filial Maceió, AM → filial Manaus, demais → matriz)
- Monta
mapa completo de placeholders e chama substituir_em_docx()
- Salva em
<pasta_acao>/notificacao/Notificação Extrajudicial - <banco> - <tese>.docx
Filtros importantes (lições aprendidas):
- Sem filtro de benefício → cliente com APOSENTADORIA + PENSAO ganhava notificações com contratos misturados (errado)
- Sem filtro de tipo → pasta "BANCO BMG - RMC-RCC" ganhava contratos consignados normais (errado)
- Sem de-duplicação → JSON da
kit-juridico pode ter o mesmo contrato listado 2 vezes (ex: vindo de páginas diferentes do HISCON), inflando a lista de contratos na notificação
Modo piloto (testar 1 cliente):
$env:NOTIF_FILTRO_CLIENTE = "ANAIZA"
python _run_notificacoes.py
Cadastros usados:
scripts/bancos.py — 21 bancos com matriz + filiais AL/AM/MG quando relevantes
- Advogado por UF: AL → Tiago (template COM-escritório); AM → Patrick (template SEM-escritório)
Limitação atual: RG/órgão expedidor frequentemente não vêm da procuração (que tem só CPF). Os campos faltantes são substituídos por marcadores [INDICAR XXX] (ex: [INDICAR RG]) para revisão manual no DOCX final.
Bugs conhecidos da kit-juridico (a corrigir lá)
Encontrados rodando o pipeline em 14 clientes (2026-05-08):
- Duplicação de contratos no JSON — o mesmo contrato (mesmo número, banco, benefício) aparece 2 vezes em
contratos[]. O orchestrator do _run_notificacoes.py faz de-duplicação por número (preferindo Ativo sobre Excluído), mas a fonte deveria ser limpa.
- Pastas com whitespace ruim —
pastas_acao[].path_relativo ocasionalmente vem com espaços dentro de palavras: BANCO BRADESCO FINANC IAMENT OS, AGIBAN K, BANCO MERCA NTIL DO BRASIL. O orchestrator trata via fuzzy matching (normaliza whitespace), mas a fonte deveria gerar nomes corretos.
cliente.* falta CPF, RG, endereço, profissão, estado civil, gênero — daí precisamos do OCR de procuração no _run_notificacoes.py. A kit-juridico deveria já popular esses campos no JSON quando processa procurações.
Cadastros do vault
A skill consulta o vault Obsidian em Modelos/Notificacoes/:
| Arquivo |
Conteúdo |
_MOC.md |
Map of Content da pasta de notificações |
placeholders-canonicos.md |
Vocabulário fechado de placeholders |
teses/<slug>.md |
Texto-fonte da tese + metadados (template_docx, placeholders obrigatórios) |
bancos/<slug>.md |
Cadastro de cada banco (CNPJ, endereços, filiais) — em construção |
terceiros-pagamento-eletronico/<slug>.md |
Cadastro de terceiros recebedores (EAGLE, ASPECIR, etc.) — em construção |
Histórico
- 2026-05-11 — Endereço do escritório deixou de ser hardcoded (
Joaçaba/SC + Arapiraca/AL cravado para qualquer UF). Agora é resolvido em runtime via skills/_common/escritorios_cadastro.py:montar_endereco_escritorio_completo(uf_acao). AM passa a usar a unidade de Maués; BA/ES Salvador; MG Uberlândia; SE compartilha Arapiraca. Aplicado em batch de 5 clientes do captador Elizio (todos AM Patrick).
- 2026-05-08 — Skill remasterizada. 7 teses suportadas (consignado-nao-contratado + rmc + rcc + 4 Bradesco). Templates COM/SEM gerados automaticamente. Bug de substituição múltipla corrigido (
substituir_em_paragrafo agora itera enquanto encontrar match).
1---2name: notificacao-extrajudicial3description: Gera notificações extrajudiciais bancárias (RMC, RCC, consignado-não-contratado, Bradesco-encargos/tarifas/capitalização/pagamento-eletrônico) a partir de templates DOCX com placeholders canônicos. Suporta versão COM-escritório (logo Tiago/Eduardo) e SEM-escritório (Patrick/Gabriel/Alexandre, timbrado neutro).4license: Proprietary — De Azevedo Lima & Rebonatto5---67# Skill: notificacao-extrajudicial89Gera notificações extrajudiciais bancárias preenchidas a partir de templates DOCX com placeholders. O fluxo padrão é: **carregar `_estado_cliente.json`** → **selecionar tese** → **substituir placeholders** → **salvar DOCX final**.1011## Teses suportadas (7)1213| Slug | Subtítulo | Versões | Hipótese de uso |14|---|---|---|---|15| `consignado-nao-contratado` | "Empréstimo Não Contratado" | COM (Tiago AL) + SEM (Patrick AM) | Cliente descobriu desconto no INSS de empréstimo que jamais contratou |16| `rmc` | "Cartão de Crédito RMC" | COM (Tiago AL) + SEM (Patrick AM) | Cliente foi induzido a aderir a Reserva de Margem Consignável em vez de empréstimo |17| `rcc` | "Cartão de Crédito RCC" | COM (Tiago AL) + SEM (Patrick AM) | Cliente foi induzido a aderir a Reserva de Cartão Consignado |18| `bradesco-encargos` | "Descontos indevidos de encargos" | **SEM apenas** (Patrick AM) | Encargos "MORA CRED PESS" / "ENC LIM CRED" sem contrato — protocolada só no AM |19| `bradesco-tarifas` | "Descontos indevidos de tarifas" | **SEM apenas** (Patrick AM) | Tarifas bancárias sem contrato (IRDR 0005053-71 TJAM) — protocolada só no AM |20| `bradesco-capitalizacao` | "Descontos indevidos de título de capitalização" | **SEM apenas** (Patrick AM) | Título de capitalização não contratado — protocolada só no AM |21| `bradesco-pe` | "Descontos a título de Pagamento Eletrônico" | **SEM apenas** (Patrick AM) | "PAGTO ELETRON COBRANÇA *" — terceiros (EAGLE, ASPECIR, etc.) — protocolada só no AM |2223> **Nota:** As 4 teses Bradesco (encargos, tarifas, capitalização, PE) só têm versão SEM-escritório porque essas pretensões são protocoladas exclusivamente pelo Patrick no AM. Não há demanda de versão COM-logo Tiago/Eduardo para essas teses.2425## Dossiê de notificação (gravado 13/05/2026)2627Toda notificação gerada pela `_run_notificacoes.py` agora sai dentro de uma **subpasta dedicada por banco** já com todos os documentos de instrução prontos para envio extrajudicial:2829```30<pasta_acao>/notificacao/31└── BRADESCO/32 ├── Notificação Extrajudicial - BRADESCO - CONSIGNADO-NAO-CONTRATADO.docx33 ├── OAB TIAGO.pdf ← assinatura do procurador34 ├── 2- Procuração - Contrato 0123471622742.pdf ← procurações dos contratos do banco35 ├── 2- Procuração - Contrato 0123471622766.pdf36 ├── 2- Procuração - Contrato 016178952.pdf37 ├── 3- RG e CPF.pdf ← identidade do cliente38 ├── 6- Histórico de empréstimo (grifado).pdf ← HISCON39 └── 7- Histórico de pagamento.pdf ← HISCRE40```4142> **REGRA OPERACIONAL (gravada 13/05/2026, Gabriel):** o dossiê extrajudicial NÃO inclui declaração de hipossuficiência nem comprovante de residência — esses ficam reservados para a inicial. A notificação extrajudicial só precisa demonstrar (a) identidade do notificante (RG/CPF), (b) outorga de poderes (procurações), (c) existência dos descontos (HISCON + HISCRE) e (d) qualificação do procurador (OAB).4344**Cadastro de OAB** em `assets/oabs/` (PDFs das carteiras):45- `OAB TIAGO.pdf` — usado quando advogado.chave == 'tiago' (AL Federal/Estadual)46- `OAB PATRICK.pdf` — chave 'patrick' (AM Estadual)47- `OAB GABRIEL.pdf` — chave 'gabriel' (BA Federal)48- `OAB ALEXANDRE.pdf` — chave 'alexandre' (MG Estadual, SE)49- `OAB EDUARDO.pdf` — chave 'eduardo' (outras situações)5051**Função `montar_dossie_notificacao`** em `_run_notificacoes.py`:521. Copia a OAB do procurador (mapeada por `advogado.chave` → `OAB_PDF_POR_PROCURADOR`)532. Filtra as procurações da pasta_acao pelos números dos contratos do banco (regex no nome do arquivo). Para litisconsórcio Bradesco + Mercantil, cada subpasta só leva as procurações relevantes ao seu banco.543. Copia documentos pessoais e financeiros (RG, hipossuficiência, comp. residência, HISCON grifado, HISCRE) que estão na pasta_acao.5556Validado em 13/05/2026: CICERO (Bradesco 9 docs anexos + Mercantil 7 docs anexos), bath completo de 14 clientes.5758## Estrutura de arquivos5960```61notificacao-extrajudicial/62├── SKILL.md ← este arquivo63├── assets/64│ ├── __BASE_com-escritorio__*.docx ← bases originais Tiago/Eduardo (com logo)65│ ├── __BASE_sem-escritorio__*.docx ← bases originais Patrick/Gabriel (timbrado neutro)66│ ├── template_<slug>__com-escritorio.docx ← templates placeholderizados COM67│ └── template_<slug>__sem-escritorio.docx ← templates placeholderizados SEM68├── scripts/69│ └── docx_replace.py ← substituir_em_docx, aplicar_timbrado_neutro70├── _test_consignado.py ← gera testes consignado-nao-contratado71├── _test_rmc.py ← gera testes RMC72├── _test_rcc.py ← gera testes RCC73└── _test_bradesco.py ← gera testes Bradesco (4 teses)74```7576## Como adicionar conteúdo de cliente7778Os templates esperam placeholders `{{VARIAVEL}}` em MAIÚSCULAS. Vocabulário canônico documentado em79`Modelos/Notificacoes/placeholders-canonicos.md` no vault. Resumo dos principais grupos:8081**Cabeçalho:** `CIDADE_ASSINATURA`, `UF_ASSINATURA`, `DATA_EXTENSO`8283**Cliente:** `CLIENTE_NOME`, `CLIENTE_NACIONALIDADE_GENERO`, `CLIENTE_ESTADO_CIVIL`, `CLIENTE_PROFISSAO`, `CLIENTE_CPF`, `CLIENTE_RG`, `CLIENTE_RG_ORGAO`, `CLIENTE_LOGRADOURO`, `CLIENTE_BAIRRO`, `CLIENTE_MUNICIPIO`, `CLIENTE_UF`, `CLIENTE_CEP`, `INSCRITO_A`, `DOMICILIADO_A`8485**Banco:** `BANCO_NOME_QUALIFICADO`, `BANCO_CNPJ`, `BANCO_LOGRADOURO`, `BANCO_BAIRRO`, `BANCO_MUNICIPIO`, `BANCO_UF`, `BANCO_CEP`, `NOME_BANCO_CONTRATO`8687**Advogado:** `ADVOGADO_NOME`, `ADVOGADO_NOME_MAIUSCULO`, `ADVOGADO_OAB_UF`, `SEU_SUA_ADVOGADO_A`, `ESCRITORIO_ENDERECO_COMPOSTO` (resolvido por UF de atuação via `skills/_common/escritorios_cadastro.py` → matriz Joaçaba/SC + unidade de apoio: AM→Maués, AL/SE→Arapiraca, BA/ES→Salvador, MG→Uberlândia; sem hardcoded em produção)8889**Específicos por tese:**901. **Consignado/RMC/RCC:** `CONTRATO_NUMEROS`, `CONTRATO_VALOR_EMPRESTIMO`, `CONTRATO_QTD_PARCELAS`, `CONTRATO_VALOR_PARCELA`, `CONTRATO_DATA_INCLUSAO`, `CONTRATO_DATA_PRIMEIRO_DESCONTO`912. **Bradesco-Encargos/Tarifas/Capitalização/PE:** `RUBRICAS` (os placeholders `DATA_INICIAL`, `DATA_FINAL`, `NUMERO_DESCONTOS`, `VALOR_TOTAL` foram REMOVIDOS dos templates em 13/05/2026 — o parágrafo "Tais descontos vêm ocorrendo, em síntese, no período aproximado de..." foi excluído porque o procurador prefere demonstrar os descontos diretamente via tabela anexa, sem repetir período/total em texto corrido)923. **Bradesco-PE (terceiros):** `TERCEIRO_NOME`, `TERCEIRO_CNPJ`, `TERCEIRO_LOGRADOURO`, `TERCEIRO_BAIRRO`, `TERCEIRO_MUNICIPIO`, `TERCEIRO_UF`, `TERCEIRO_CEP`9394## API programática9596```python97from scripts.docx_replace import substituir_em_docx, aplicar_timbrado_neutro9899# Gerar notificação para um cliente100substituir_em_docx(101 'assets/template_rmc__com-escritorio.docx',102 {103 '{{CLIENTE_NOME}}': 'JOSÉ DA SILVA',104 '{{CLIENTE_CPF}}': '000.111.222-33',105 # ... resto dos placeholders106 },107 'output/notificacao_jose.docx'108)109```110111## Helpers em `scripts/docx_replace.py`112113| Função | Uso |114|---|---|115| `substituir_em_docx(input, mapa, output)` | Substitui todas as ocorrências de cada chave do `mapa` (dict) no DOCX. Faz LOOP — múltiplas ocorrências do mesmo placeholder no mesmo parágrafo são todas substituídas. Limpa parágrafos vazios excessivos. |116| `aplicar_timbrado_neutro(corpo, timbrado, output)` | Pega o corpo de um template e aplica headers/footers/imagens de outro. Usado para gerar SEM a partir de COM (e vice-versa). |117| `inserir_paragrafo_antes(doc, ancora, texto, herdar_estilo_de)` | Insere parágrafo antes de uma âncora textual, herdando estilo do parágrafo anterior. |118| `padronizar_fontes(doc, corpo='Cambria', destaque='Segoe UI')` | Heurística para normalizar fontes (use só quando o BASE não vier com fontes corretas). |119| `normalizar_tema_corpo(docx_path)` | Conserta documentos cujo corpo aponta para majorFont (Calibri) em vez de minorFont (Cambria). Substitui `asciiTheme="majorHAnsi"` → `"minorHAnsi"`. |120121## Geração programática vs templates manuais122123A skill distingue dois momentos:1241251. **Bases originais** (`__BASE_*`) — modelos reais do escritório com cliente preenchido. Servem de molde visual mas nunca são editados.1262. **Templates placeholderizados** (`template_*`) — geração automática a partir das bases via `_test_*.py`, substituindo dados específicos por `{{PLACEHOLDERS}}`. **Não editar diretamente** — regenerar via script se mudar a base.127128Os scripts `_test_*.py` rodam o pipeline completo:129- Lê o BASE130- Aplica placeholderização (substitui dados reais por placeholders)131- Gera template SEM via `aplicar_timbrado_neutro()` (se BASE for COM) ou template COM (se BASE for SEM)132- Gera teste com cliente fictício para validação visual133- Reporta placeholders pendentes (= bug se houver)134135## Pipeline integrado — `_run_notificacoes.py`136137Implementado em 2026-05-08. Processa em batch uma pasta de clientes. Para cada cliente:1381391. Carrega `_estado_cliente.json` (gerado pela skill `kit-juridico`)1402. Localiza pasta KIT (variantes: `KIT`, `0. Kit`, `Kit`)1413. Localiza procuração (heurística em ordem de prioridade):142 1. PDF "Procuração*" no KIT143 2. PDF original referenciado em `_proc_crops/manifesto.json`144 3. PNG já recortado em `_proc_crops/crop_pag_01.png` (último recurso)1454. Extrai qualificação via `extrair_qualificacao.py`:146 - Tenta text-layer; se vazio, OCR com easyOCR + rotação automática (procurações vêm escaneadas em landscape)147 - Aplica regex restrito ao **bloco OUTORGANTE** (antes de OUTORGAD[OA]S) para evitar pegar dados dos advogados148 - Tolera erros de OCR ("vlúva" → "viúva", "RG/CPF" → distingue do CPF)1495. Para cada `pastas_acao` do JSON, agrupa contratos por `(banco_chave, tese)` aplicando filtros:150 - **Banco** extraído do path (`APOSENTADORIA\BANCO BMG - RMC-RCC` → BMG); suporta litisconsórcio (`BANCO X + BANCO Y`)151 - **Benefício**: contratos com `beneficio_pasta` igual ao prefixo do path (APOSENTADORIA/PENSAO)152 - **Tipo**:153 - Path contém "RMC-RCC" → só `tipo` em `(RMC, RCC)`; tese = `rmc` ou `rcc` (decidida por contrato). Mantém Ativos + Excluídos (mesmo a margem encerrada pode ter cobranças residuais).154 - Senão → só `tipo == CONSIGNADO`; tese = `consignado-nao-contratado`.155 - **Autoridade da procuração** (regra crítica do escritório): se a `pasta_acao` contém PDFs de procuração com número de contrato no nome do arquivo (padrão `Procuração - Banco X - Contrato N.pdf`), **só esses contratos entram** na notificação. Procurações são outorgadas individualmente por contrato — listar contratos não referidos é ultra vires.156 - Estratégia primária: regex no nome do arquivo (`Contrato\s+(?:nº)?\s*(\d{6,})`)157 - Fallback: procurar `ESTUDO DE CADEIA.docx` na pasta_acao e extrair os números do texto158 - Se nenhum número encontrado, NÃO infla com "todos do banco" — gera notificação com todos os contratos do JSON apenas se não há procurações com número.159 - **Filtro de situação** aplicado SOMENTE quando NÃO há procurações específicas: para CONSIGNADO, só Ativos. Quando há procurações, todas as situações entram (a procuração já decidiu impugnar).160 - **De-duplicação**: por número de contrato; preferindo `Ativo` sobre `Excluído`1616. Para cada `(banco, tese)` resolvido, busca cadastro de banco via `bancos.py`:162 - UF da ação determina filial usada (AL → filial Maceió, AM → filial Manaus, demais → matriz)1637. Monta `mapa` completo de placeholders e chama `substituir_em_docx()`1648. Salva em `<pasta_acao>/notificacao/Notificação Extrajudicial - <banco> - <tese>.docx`165166**Filtros importantes (lições aprendidas):**167168- **Sem filtro de benefício** → cliente com APOSENTADORIA + PENSAO ganhava notificações com contratos misturados (errado)169- **Sem filtro de tipo** → pasta "BANCO BMG - RMC-RCC" ganhava contratos consignados normais (errado)170- **Sem de-duplicação** → JSON da `kit-juridico` pode ter o mesmo contrato listado 2 vezes (ex: vindo de páginas diferentes do HISCON), inflando a lista de contratos na notificação171172**Modo piloto (testar 1 cliente):**173174```powershell175$env:NOTIF_FILTRO_CLIENTE = "ANAIZA"176python _run_notificacoes.py177```178179**Cadastros usados:**180181- `scripts/bancos.py` — 21 bancos com matriz + filiais AL/AM/MG quando relevantes182- Advogado por UF: AL → Tiago (template COM-escritório); AM → Patrick (template SEM-escritório)183184**Limitação atual:** RG/órgão expedidor frequentemente não vêm da procuração (que tem só CPF). Os campos faltantes são substituídos por marcadores `[INDICAR XXX]` (ex: `[INDICAR RG]`) para revisão manual no DOCX final.185186## Bugs conhecidos da `kit-juridico` (a corrigir lá)187188Encontrados rodando o pipeline em 14 clientes (2026-05-08):1891901. **Duplicação de contratos no JSON** — o mesmo contrato (mesmo número, banco, benefício) aparece 2 vezes em `contratos[]`. O orchestrator do `_run_notificacoes.py` faz de-duplicação por número (preferindo `Ativo` sobre `Excluído`), mas a fonte deveria ser limpa.1912. **Pastas com whitespace ruim** — `pastas_acao[].path_relativo` ocasionalmente vem com espaços dentro de palavras: `BANCO BRADESCO FINANC IAMENT OS`, `AGIBAN K`, `BANCO MERCA NTIL DO BRASIL`. O orchestrator trata via fuzzy matching (normaliza whitespace), mas a fonte deveria gerar nomes corretos.1923. **`cliente.*`** falta CPF, RG, endereço, profissão, estado civil, gênero — daí precisamos do OCR de procuração no `_run_notificacoes.py`. A `kit-juridico` deveria já popular esses campos no JSON quando processa procurações.193194## Cadastros do vault195196A skill consulta o vault Obsidian em `Modelos/Notificacoes/`:197198| Arquivo | Conteúdo |199|---|---|200| `_MOC.md` | Map of Content da pasta de notificações |201| `placeholders-canonicos.md` | Vocabulário fechado de placeholders |202| `teses/<slug>.md` | Texto-fonte da tese + metadados (template_docx, placeholders obrigatórios) |203| `bancos/<slug>.md` | Cadastro de cada banco (CNPJ, endereços, filiais) — *em construção* |204| `terceiros-pagamento-eletronico/<slug>.md` | Cadastro de terceiros recebedores (EAGLE, ASPECIR, etc.) — *em construção* |205206## Histórico207208- 2026-05-11 — Endereço do escritório deixou de ser hardcoded (`Joaçaba/SC + Arapiraca/AL` cravado para qualquer UF). Agora é resolvido em runtime via `skills/_common/escritorios_cadastro.py:montar_endereco_escritorio_completo(uf_acao)`. AM passa a usar a unidade de Maués; BA/ES Salvador; MG Uberlândia; SE compartilha Arapiraca. Aplicado em batch de 5 clientes do captador Elizio (todos AM Patrick).209- 2026-05-08 — Skill remasterizada. 7 teses suportadas (consignado-nao-contratado + rmc + rcc + 4 Bradesco). Templates COM/SEM gerados automaticamente. Bug de substituição múltipla corrigido (`substituir_em_paragrafo` agora itera enquanto encontrar match).