Files
soleprint/atlas/books/amar-arch/04-data-model-simple.dot
2026-01-02 11:42:19 -03:00

196 lines
6.6 KiB
Plaintext

digraph DataModelSimple {
rankdir=TB
compound=true
splines=ortho
node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=10]
edge [fontname="Helvetica", fontsize=8]
nodesep=0.3
ranksep=1.2
newrank=true
label="AMAR Mascotas - Data Model Overview"
labelloc="t"
fontsize=16
fontname="Helvetica-Bold"
// === ROW 1: AUTH (center) ===
subgraph cluster_auth {
label="Users & Auth"
style="rounded,filled"
fillcolor="#E8F5E9"
color="#2E7D32"
auth_user [label="auth.User", fillcolor="#C8E6C9"]
}
// === ROW 2: LEFT COLUMN - Pet Owners ===
subgraph cluster_mascotas {
label="Pet Owners & Pets"
style="rounded,filled"
fillcolor="#E3F2FD"
color="#1565C0"
petowner [label="PetOwner", fillcolor="#BBDEFB"]
pet [label="Pet", fillcolor="#BBDEFB"]
petvaccine [label="PetVaccine", fillcolor="#90CAF9"]
petstudy [label="PetStudy", fillcolor="#90CAF9"]
}
// === ROW 2: CENTER COLUMN - Veterinarians ===
subgraph cluster_vets {
label="Veterinarians"
style="rounded,filled"
fillcolor="#FFF3E0"
color="#E65100"
veterinarian [label="Veterinarian", fillcolor="#FFE0B2"]
availability [label="Availability", fillcolor="#FFCC80"]
unavailability [label="Unavailability", fillcolor="#FFCC80"]
vet_specialty [label="Vet-Specialty", shape=diamond, fillcolor="#FFB74D"]
vet_neighborhood [label="Vet-Neighborhood", shape=diamond, fillcolor="#FFB74D"]
}
// === ROW 2: RIGHT COLUMN - Services ===
subgraph cluster_productos {
label="Services & Pricing"
style="rounded,filled"
fillcolor="#F3E5F5"
color="#7B1FA2"
grupo [label="Group", fillcolor="#E1BEE7"]
category [label="Category", fillcolor="#E1BEE7"]
service [label="Service", fillcolor="#CE93D8"]
prices [label="Prices", fillcolor="#BA68C8"]
discounts [label="Discounts", fillcolor="#BA68C8"]
}
// === ROW 3: LEFT - Cart ===
subgraph cluster_cart {
label="Cart & Checkout"
style="rounded,filled"
fillcolor="#E0F7FA"
color="#00838F"
cart [label="Cart", fillcolor="#B2EBF2"]
cartitem [label="CartItem", fillcolor="#80DEEA"]
cartresumeitem [label="CartResumeItem", fillcolor="#80DEEA"]
cartpetreason [label="CartPetReason", fillcolor="#80DEEA"]
}
// === ROW 3: CENTER - Requests ===
subgraph cluster_solicitudes {
label="Service Requests"
style="rounded,filled"
fillcolor="#FFEBEE"
color="#C62828"
servicerequest [label="ServiceRequest", fillcolor="#FFCDD2"]
statehistory [label="StateHistory", fillcolor="#EF9A9A"]
vetasked [label="VeterinarianAsked", fillcolor="#EF9A9A"]
vetreminder [label="VetReminder", fillcolor="#E57373"]
payreminder [label="PayReminder", fillcolor="#E57373"]
}
// === ROW 3: RIGHT - Visits ===
subgraph cluster_visits {
label="Veterinary Visits"
style="rounded,filled"
fillcolor="#FFFDE7"
color="#F9A825"
vetvisit [label="VetVisit", fillcolor="#FFF9C4"]
vetvisitreport [label="VetVisitReport", fillcolor="#FFF59D"]
vetvisitfollowup [label="FollowUp", fillcolor="#FFF176"]
vetvisitpetreason [label="VisitPetReason", fillcolor="#FFF176"]
visit_pets [label="Visit-Pets", shape=diamond, fillcolor="#FFEE58"]
receipt [label="Receipt\n(AFIP)", fillcolor="#F8BBD9"]
}
// === ROW 4: REFERENCE DATA (bottom, full width) ===
subgraph cluster_reference {
label="Reference Data"
style="rounded,filled"
fillcolor="#ECEFF1"
color="#455A64"
subgraph {
rank=same
specialty [label="Specialty", fillcolor="#CFD8DC"]
neighborhood [label="Neighborhood", fillcolor="#CFD8DC"]
province [label="Province", fillcolor="#CFD8DC"]
locality [label="Locality", fillcolor="#CFD8DC"]
petbreed [label="PetBreed", fillcolor="#CFD8DC"]
vaccine [label="Vaccine", fillcolor="#CFD8DC"]
}
subgraph {
rank=same
study [label="Study", fillcolor="#CFD8DC"]
campaign [label="Campaign", fillcolor="#CFD8DC"]
tag [label="Tag", fillcolor="#CFD8DC"]
medication [label="Medication", fillcolor="#CFD8DC"]
turnfeegroup [label="TurnFeeGroup", fillcolor="#CFD8DC"]
}
specialty -> study [style=invis]
province -> locality
}
// === FORCE COLUMN ALIGNMENT WITH INVISIBLE EDGES ===
// Column 1: Pets -> Cart
petowner -> cart [style=invis, weight=10]
// Column 2: Vets -> Requests
veterinarian -> servicerequest [style=invis, weight=10]
// Column 3: Services -> Visits
service -> vetvisit [style=invis, weight=10]
// Force Reference Data to bottom
cart -> specialty [style=invis, weight=10]
servicerequest -> campaign [style=invis, weight=10]
vetvisit -> turnfeegroup [style=invis, weight=10]
// === INTERNAL CLUSTER EDGES ===
petowner -> pet [label="1:N"]
pet -> petvaccine [label="1:N"]
pet -> petstudy [label="1:N"]
veterinarian -> availability
veterinarian -> unavailability
veterinarian -> vet_specialty
veterinarian -> vet_neighborhood
grupo -> category [label="1:N"]
category -> service [label="1:N"]
service -> prices [label="1:N"]
service -> discounts [label="1:N"]
cart -> cartitem [label="1:N"]
cart -> cartresumeitem
cart -> cartpetreason
servicerequest -> statehistory [label="1:N"]
servicerequest -> vetasked [label="1:N"]
servicerequest -> payreminder
vetasked -> vetreminder
vetvisit -> visit_pets
vetvisit -> vetvisitreport [label="1:N"]
vetvisit -> vetvisitpetreason
vetvisitreport -> vetvisitfollowup
vetvisit -> receipt [style=dashed]
// === CROSS-CLUSTER RELATIONSHIPS ===
auth_user -> petowner [label="1:1 opt", style=dashed]
auth_user -> veterinarian [label="1:1"]
petowner -> cart [label="1:N"]
petowner -> servicerequest [label="1:N"]
servicerequest -> cart [label="1:1", constraint=false]
vetasked -> veterinarian [constraint=false]
vetvisit -> servicerequest [style=dashed, constraint=false]
// Reference links
petvaccine -> vaccine [constraint=false]
petstudy -> study [constraint=false]
vet_specialty -> specialty [constraint=false]
vet_neighborhood -> neighborhood [constraint=false]
cartitem -> service [constraint=false]
}