CARONTE v1.0 - Plataforma de Gestão Social

This commit is contained in:
2026-02-08 23:10:32 -03:00
commit c98c806865
60 changed files with 9450 additions and 0 deletions

View File

View File

@@ -0,0 +1,64 @@
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.beneficio import Beneficio
from app.models.falecido import Falecido
BENEFICIOS_MAP = [
{
"condicao": "tinha_fgts",
"tipo": "fgts",
"nome": "Saque FGTS",
"descricao": "Saldo do FGTS disponível para saque pelos dependentes habilitados.",
"valor_mult": 3.5,
},
{
"condicao": "tinha_carteira_assinada",
"tipo": "pis",
"nome": "Saque PIS/PASEP",
"descricao": "Saldo de cotas do PIS/PASEP para saque pelos herdeiros.",
"valor_mult": 0.8,
},
{
"condicao": None,
"tipo": "pensao_morte",
"nome": "Pensão por Morte (INSS)",
"descricao": "Benefício mensal pago pelo INSS aos dependentes do segurado falecido.",
"valor_mult": 12,
},
{
"condicao": "tinha_seguro_vida",
"tipo": "seguro_vida",
"nome": "Seguro de Vida",
"descricao": "Indenização do seguro de vida contratado pelo falecido.",
"valor_mult": 24,
},
{
"condicao": "tinha_carteira_assinada",
"tipo": "rescisao",
"nome": "Verbas Rescisórias",
"descricao": "Saldo de salário, férias proporcionais, 13º proporcional.",
"valor_mult": 2,
},
]
async def escanear_beneficios(db: AsyncSession, familia_id: int, falecido: Falecido) -> list[Beneficio]:
salario = falecido.salario_estimado or 2500.0
beneficios = []
for b in BENEFICIOS_MAP:
cond = b.get("condicao")
if cond:
val = getattr(falecido, cond, 0)
if not val:
continue
ben = Beneficio(
familia_id=familia_id,
falecido_id=falecido.id,
tipo=b["tipo"],
nome=b["nome"],
descricao=b["descricao"],
status="identificado",
valor_estimado=round(salario * b["valor_mult"], 2),
)
db.add(ben)
beneficios.append(ben)
await db.commit()
return beneficios

View File

@@ -0,0 +1,43 @@
import json
import os
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.checklist import ChecklistItem
from app.models.falecido import Falecido
TEMPLATES_PATH = os.path.join(os.path.dirname(__file__), "..", "data", "checklist_templates.json")
def load_templates():
with open(TEMPLATES_PATH, "r", encoding="utf-8") as f:
return json.load(f)
async def gerar_checklist(db: AsyncSession, familia_id: int, falecido: Falecido) -> list[ChecklistItem]:
templates = load_templates()
items = []
for t in templates:
cond = t.get("condicao")
if cond:
val = getattr(falecido, cond, 0)
if not val:
continue
item = ChecklistItem(
familia_id=familia_id,
falecido_id=falecido.id,
titulo=t["titulo"],
descricao=t.get("descricao"),
fase=t["fase"],
categoria=t["categoria"],
status="pendente",
prazo_dias=t.get("prazo_dias"),
ordem=t.get("ordem", 0),
)
db.add(item)
items.append(item)
await db.commit()
return items
def get_proximo_passo(items: list[dict]) -> dict | None:
pendentes = [i for i in items if i.get("status") == "pendente"]
if not pendentes:
return None
pendentes.sort(key=lambda x: x.get("ordem", 999))
return pendentes[0]

View File

@@ -0,0 +1,99 @@
import os
from datetime import datetime
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY
from app.core.config import settings
os.makedirs(settings.UPLOAD_DIR, exist_ok=True)
def _styles():
ss = getSampleStyleSheet()
ss.add(ParagraphStyle(name="TitleCenter", parent=ss["Title"], alignment=TA_CENTER, fontSize=16))
ss.add(ParagraphStyle(name="Body", parent=ss["Normal"], alignment=TA_JUSTIFY, fontSize=11, leading=16))
return ss
def gerar_procuracao(familia_nome: str, falecido_nome: str, membro_nome: str, falecido_cpf: str = "000.000.000-00") -> str:
filename = f"procuracao_{familia_nome.lower().replace(' ','_')}_{datetime.now().strftime('%Y%m%d%H%M%S')}.pdf"
path = os.path.join(settings.UPLOAD_DIR, filename)
doc = SimpleDocTemplate(path, pagesize=A4, topMargin=3*cm)
ss = _styles()
story = [
Paragraph("PROCURAÇÃO", ss["TitleCenter"]),
Spacer(1, 1*cm),
Paragraph(
f"Pelo presente instrumento particular, eu, <b>{membro_nome}</b>, na qualidade de herdeiro(a) "
f"de <b>{falecido_nome}</b> (CPF: {falecido_cpf}), da família <b>{familia_nome}</b>, nomeio e constituo "
f"como meu(minha) bastante procurador(a) ______________________, para em meu nome representar "
f"perante órgãos públicos, bancos e demais instituições, podendo requerer, assinar documentos, "
f"receber valores e praticar todos os atos necessários ao cumprimento deste mandato.",
ss["Body"]
),
Spacer(1, 1.5*cm),
Paragraph(f"Local e data: ________________, {datetime.now().strftime('%d/%m/%Y')}", ss["Body"]),
Spacer(1, 2*cm),
Paragraph("_______________________________<br/>Assinatura do Outorgante", ss["Body"]),
]
doc.build(story)
return path
def gerar_requerimento_fgts(familia_nome: str, falecido_nome: str, membro_nome: str, falecido_cpf: str = "000.000.000-00") -> str:
filename = f"requerimento_fgts_{familia_nome.lower().replace(' ','_')}_{datetime.now().strftime('%Y%m%d%H%M%S')}.pdf"
path = os.path.join(settings.UPLOAD_DIR, filename)
doc = SimpleDocTemplate(path, pagesize=A4, topMargin=3*cm)
ss = _styles()
story = [
Paragraph("REQUERIMENTO DE SAQUE DO FGTS POR FALECIMENTO", ss["TitleCenter"]),
Spacer(1, 1*cm),
Paragraph("À Caixa Econômica Federal", ss["Body"]),
Spacer(1, 0.5*cm),
Paragraph(
f"Eu, <b>{membro_nome}</b>, na qualidade de dependente/herdeiro(a) de <b>{falecido_nome}</b> "
f"(CPF: {falecido_cpf}), venho por meio deste requerer o saque do saldo da(s) conta(s) vinculada(s) "
f"ao FGTS do trabalhador falecido, conforme previsto na Lei nº 8.036/90, art. 20, inciso IV.",
ss["Body"]
),
Spacer(1, 0.5*cm),
Paragraph("Documentos em anexo: Certidão de Óbito, documento de identidade, comprovante de dependência.", ss["Body"]),
Spacer(1, 1.5*cm),
Paragraph(f"Local e data: ________________, {datetime.now().strftime('%d/%m/%Y')}", ss["Body"]),
Spacer(1, 2*cm),
Paragraph("_______________________________<br/>Assinatura do Requerente", ss["Body"]),
]
doc.build(story)
return path
def gerar_peticao_pensao(familia_nome: str, falecido_nome: str, membro_nome: str, falecido_cpf: str = "000.000.000-00") -> str:
filename = f"peticao_pensao_{familia_nome.lower().replace(' ','_')}_{datetime.now().strftime('%Y%m%d%H%M%S')}.pdf"
path = os.path.join(settings.UPLOAD_DIR, filename)
doc = SimpleDocTemplate(path, pagesize=A4, topMargin=3*cm)
ss = _styles()
story = [
Paragraph("REQUERIMENTO DE PENSÃO POR MORTE", ss["TitleCenter"]),
Spacer(1, 1*cm),
Paragraph("Ao Instituto Nacional do Seguro Social - INSS", ss["Body"]),
Spacer(1, 0.5*cm),
Paragraph(
f"Eu, <b>{membro_nome}</b>, na qualidade de dependente de <b>{falecido_nome}</b> "
f"(CPF: {falecido_cpf}), venho requerer a concessão do benefício de Pensão por Morte, "
f"conforme previsto nos arts. 74 a 79 da Lei nº 8.213/91, em razão do falecimento do(a) "
f"segurado(a) acima identificado(a).",
ss["Body"]
),
Spacer(1, 0.5*cm),
Paragraph("Documentos em anexo: Certidão de Óbito, documentos pessoais, comprovante de dependência econômica.", ss["Body"]),
Spacer(1, 1.5*cm),
Paragraph(f"Local e data: ________________, {datetime.now().strftime('%d/%m/%Y')}", ss["Body"]),
Spacer(1, 2*cm),
Paragraph("_______________________________<br/>Assinatura do Requerente", ss["Body"]),
]
doc.build(story)
return path
GENERATORS = {
"procuracao": gerar_procuracao,
"requerimento_fgts": gerar_requerimento_fgts,
"peticao_pensao": gerar_peticao_pensao,
}