1+ # Install Erdantic if you haven't already
2+ # pip install erdantic
3+
4+ from erdantic import Diagram
5+ from pydantic import BaseModel
6+ from typing import Optional , List
7+
8+ # -----------------------------
9+ # Define Pydantic models
10+ # -----------------------------
11+
12+ class UserProfile (BaseModel ):
13+ id : str
14+ email : str
15+ nome_completo : str
16+ perfil : str
17+ telefone : Optional [str ] = None
18+ criado_em : Optional [str ] = None
19+ atualizado_em : Optional [str ] = None
20+
21+ class CandidateProfile (BaseModel ):
22+ id : str
23+ id_utilizador : str # FK → UserProfile.id
24+ curriculo_url : Optional [str ] = None
25+ competencias : Optional [str ] = None
26+ anos_experiencia : Optional [str ] = None
27+ formacao : Optional [str ] = None
28+ salario_minimo_desejado : Optional [str ] = None
29+ salario_maximo_desejado : Optional [str ] = None
30+ localizacoes_preferidas : Optional [str ] = None
31+ linkedin_url : Optional [str ] = None
32+ github_url : Optional [str ] = None
33+ portfolio_url : Optional [str ] = None
34+
35+ class CompanyProfile (BaseModel ):
36+ id : str
37+ id_utilizador : str # FK → UserProfile.id
38+ nome_empresa : str
39+ descricao_empresa : Optional [str ] = None
40+ sector_atividade : Optional [str ] = None
41+ dimensao_empresa : Optional [str ] = None
42+ numero_contribuinte : Optional [str ] = None
43+ morada_faturacao : Optional [str ] = None
44+ cidade_faturacao : Optional [str ] = None
45+ pais_faturacao : Optional [str ] = None
46+ stripe_customer_id : Optional [str ] = None
47+
48+ class Job (BaseModel ):
49+ id : str
50+ id_empresa : str # FK → CompanyProfile.id
51+ titulo : str
52+ descricao : Optional [str ] = None
53+ salario_minimo : Optional [str ] = None
54+ salario_maximo : Optional [str ] = None
55+ localizacao : Optional [str ] = None
56+ tipo_contrato : Optional [str ] = None
57+ estado : Optional [str ] = None
58+ experiencia_requerida : Optional [str ] = None
59+ categoria : Optional [str ] = None
60+
61+ class JobApplication (BaseModel ):
62+ id : str
63+ id_oferta : str # FK → Job.id
64+ id_candidato : str # FK → CandidateProfile.id
65+ carta_apresentacao_url : Optional [str ] = None
66+ curriculo_url : Optional [str ] = None
67+ estado : Optional [str ] = None
68+
69+ class PaymentHistory (BaseModel ):
70+ id : str
71+ id_empresa : str # FK → CompanyProfile.id
72+ stripe_payment_intent_id : Optional [str ] = None
73+ valor : Optional [str ] = None
74+ moeda : Optional [str ] = None
75+ estado : Optional [str ] = None
76+ metodo_pagamento : Optional [str ] = None
77+ iva_percentual : Optional [str ] = None
78+ valor_com_iva : Optional [str ] = None
79+
80+ # -----------------------------
81+ # Generate ERD diagram
82+ # -----------------------------
83+ diagram = Diagram (
84+ [UserProfile , CandidateProfile , CompanyProfile , Job , JobApplication , PaymentHistory ],
85+ show_relationships = True # Shows FK connections
86+ )
87+
88+ # Save output in your repo (docs folder)
89+ diagram .to_png ("./docs/ERD_PortalEmprego.png" )
90+ print ("ERD saved to ./docs/ERD_PortalEmprego.png" )
0 commit comments