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] }