@startuml SolicitudVacaciones_ER

' ═══════════════════════════════════════════════════════════════
' CONFIGURACIÓN DE ESTILOS
' ═══════════════════════════════════════════════════════════════

skinparam entity {
    BackgroundColor #E8F4FD
    BorderColor #2E86AB
    FontSize 12
}

skinparam relationship {
    BackgroundColor #FFF3E0
    BorderColor #E65100
    FontSize 11
}

skinparam identifier {
    BackgroundColor #E8F5E9
    BorderColor #388E3C
}

title Modelo Entidad-Relación — Sistema de Solicitud de Vacaciones\n

' ═══════════════════════════════════════════════════════════════
' ENTIDADES DE CATÁLOGO (LADO SUPERIOR)
' ═══════════════════════════════════════════════════════════════

entity "TIPO_VACACION" as tipo <<catalogo>> {
    * id_tipo_vacacion : INT <<PK>>
    --
    * descripcion : VARCHAR(100)
    * dias_maximos : INT
    * requiere_aprobacion : BOOLEAN
    * activo : BOOLEAN
}

entity "ESTADO_SOLICITUD" as estado <<catalogo>> {
    * id_estado : INT <<PK>>
    --
    * nombre : VARCHAR(50)
    * descripcion : VARCHAR(200)
    * es_terminal : BOOLEAN
}

' ═══════════════════════════════════════════════════════════════
' ENTIDADES PRINCIPALES (CENTRO)
' ═══════════════════════════════════════════════════════════════

entity "EMPLEADO" as emp {
    * id_empleado : INT <<PK>>
    --
    * numero_empleado : VARCHAR(20) <<UNIQUE>>
    * nombre : VARCHAR(100)
    * apellido_paterno : VARCHAR(80)
    * apellido_materno : VARCHAR(80)
    * correo_electronico : VARCHAR(150) <<UNIQUE>>
    * telefono : VARCHAR(20)
    * fecha_ingreso : DATE
    * departamento : VARCHAR(100)
    * puesto : VARCHAR(100)
    * dias_vacaciones_disponibles : INT
    * password_hash : VARCHAR(255)
    * fecha_creacion : TIMESTAMP
    * activo : BOOLEAN
}

entity "GERENTE" as ger {
    * id_gerente : INT <<PK>>
    --
    * numero_empleado : VARCHAR(20) <<UNIQUE>>
    * nombre : VARCHAR(100)
    * apellido_paterno : VARCHAR(80)
    * correo_electronico : VARCHAR(150) <<UNIQUE>>
    * departamento_responsable : VARCHAR(100)
    * password_hash : VARCHAR(255)
    * fecha_creacion : TIMESTAMP
    * activo : BOOLEAN
}

entity "SOLICITUD_VACACIONES" as sol {
    * id_solicitud : INT <<PK>>
    --
    * numero_solicitud : VARCHAR(20) <<UNIQUE>>
    * fecha_solicitud : TIMESTAMP
    * fecha_inicio : DATE
    * fecha_fin : DATE
    * dias_solicitados : INT
    * motivo : TEXT
    * observaciones_gerente : TEXT
    * motivo_rechazo : TEXT
    * fecha_respuesta : TIMESTAMP
    * fecha_modificacion : TIMESTAMP
    * version : INT <<DEFAULT 1>>
}

entity "NOTIFICACION" as notif {
    * id_notificacion : INT <<PK>>
    --
    * tipo_notificacion : VARCHAR(50)
    * destinatario : VARCHAR(150)
    * asunto : VARCHAR(200)
    * mensaje : TEXT
    * fecha_envio : TIMESTAMP
    * leida : BOOLEAN
    * fecha_lectura : TIMESTAMP
    * canal : VARCHAR(20)
}

entity "REGISTRO_VACACIONES" as reg {
    * id_registro : INT <<PK>>
    --
    * numero_registro : VARCHAR(20) <<UNIQUE>>
    * fecha_inicio : DATE
    * fecha_fin : DATE
    * dias_disfrutados : INT
    * anno_vacacional : INT
    * periodo_correspondiente : VARCHAR(50)
    * observaciones : TEXT
    * fecha_registro : TIMESTAMP
}

' ═══════════════════════════════════════════════════════════════
' RELACIONES
' ═══════════════════════════════════════════════════════════════

' ── Relación EMPLEADO → SOLICITUD (1:N) ──
emp ||--o{ sol : "solicita"

' ── Relación GERENTE → SOLICITUD (1:N) ──
ger ||--o{ sol : "evalúa_y_\nresuelve"

' ── Relación ESTADO → SOLICITUD (1:N) ──
estado ||--o{ sol : "define_estado"

' ── Relación TIPO_VACACION → SOLICITUD (1:N) ──
tipo ||--o{ sol : "especifica_tipo"

' ── Relación SOLICITUD → NOTIFICACION (1:N) ──
sol ||--o{ notif : "genera"

' ── Relación SOLICITUD → REGISTRO_VACACIONES (1:0..1) ──
sol ..o|| reg : "origina"

' ═══════════════════════════════════════════════════════════════
' RELACIONES ADICIONALES (DETALLE)
' ═══════════════════════════════════════════════════════════════

' ── Relación GERENTE → EMPLEADO (Jerarquía organizacional) ──
ger ||--o{ emp : "supervisa"

' ═══════════════════════════════════════════════════════════════
' ATRIBUTOS COMPUESTOS (NOTAS ACLARATORIAS)
' ═══════════════════════════════════════════════════════════════

note top of emp
  **EMPLEADO**
  Entidad principal que representa a los trabajadores
  que pueden solicitar vacaciones.
  
  Atributos derivados:
  • dias_vacaciones_disponibles: Calculados según
    antigüedad y política de la empresa.
end note

note top of ger
  **GERENTE**
  Representa al evaluador y tomador de decisiones
  sobre las solicitudes de vacaciones.
  
  Un gerente puede ser también empleado del sistema.
end note

note top of sol
  **SOLICITUD_VACACIONES**
  Representa cada solicitud individual con su ciclo
  de vida completo.
  
  Estados posibles:
  • 1 = Pendiente
  • 2 = Aprobada
  • 3 = Rechazada
  • 4 = Cancelada por empleado
  • 5 = Modificada
end note

note bottom of reg
  **REGISTRO_VACACIONES**
  Almacena las vacaciones efectivas una vez aprobadas
  y disfrutadas. Relación 1:1 con SOLICITUD.
  
  Campos importantes:
  • anno_vacacional: Año fiscal de las vacaciones
  • periodo_correspondiente: Ej: "2024-Q1"
end note

' ═══════════════════════════════════════════════════════════════
' LEYENDA COMPLETA
' ═══════════════════════════════════════════════════════════════

legend right
  **Convenciones del Modelo ER**
  
  ╔══════════════════════════════╗
  ║ Convenciones de Atributos:   ║
  ╠══════════════════════════════╣
  ║ * nombre : TIPO              ║  → Atributo obligatorio (PK/FK)
  ║   nombre : TIPO              ║  → Atributo opcional
  ║ ─────────────────────        ║  → Separador
  ╠══════════════════════════════╣
  ║ PK = Llave Primaria          ║
  ║ FK = Llave Foránea           ║
  ║ UK = Único (sin duplicados)  ║
  ║ catalogo = Tabla de dominio  ║
  ╠══════════════════════════════╣
  ║Símbolos de Cardinalidad:     ║
  ║ │──o  Uno a muchos (1:N)     ║
  ║ │──│ Uno a uno (1:1)         ║
  ║ o──o Uno a cero-uno (1:0..1) ║
  ║ │..o Uno a cero-muchos (1:N) ║
  ╠══════════════════════════════╣
  ║Color Coding:                 ║
  ║ 🟦 Azul: Entidades principales║
  ║ 🟨 Amarillo: Catálogos      ║
  ║ 🟩 Verde: Identificadores    ║
  ║ 🟧 Naranja: Relaciones      ║
  ╚══════════════════════════════╝
endlegend

@enduml