@startuml
    package Modelo <<Folder>>{

        abstract Modelo{
            + static Modelo fabricarModelo(String nombreClaseModelo)
        }

        class Compania {
            - fabricaDao: final FabricaDAO
            - companiaDao: final CompaniaDAO
            + Compania()
            + List<CompaniaDTO> listarCompanias()
            + boolean insertarCompania(String razonSocial, String cuit, String direccion, String telefono)
            + @Override void finalize() 
        }

        class Agenda {
            - fabricaDao: final FabricaDAO
            - agendaDao: final AgendaDAO
            + Agenda()
            + List<AgendaDTO> listarAgenda(String mecanicoNombre, String estadoTurno)
            + @Override void finalize()
        }

        class Especialidad {
            - fabricaDao: final FabricaDAO
            - especialidadDao: final EspecialidadDAO
            + Especialidad()
            + List<EspecialidadDTO> listarEspecialidades()
            + @Override void finalize()
        }

        class Mecanico {
            - fabricaDao: final FabricaDAO
            - mecanicoDao: final MecanicoDAO
            + Mecanico()
            + List<MecanicoDTO> listarMecanicosConCriterios(String especialidad)
            + boolean insertarMecanico(String apellido, String nombre, String tipoDNI, String nroDNI, String telefono, String legajo, String area, String especialidad)
            + @Override void finalize()
        }

        class Titular {
            - fabricaDao: final FabricaDAO
            - titularDao: final TitularDAO
            + Titular()
            + boolean insertarTitular(String nombre, String apellido, String tipoDNI, String nroDNI, String telefono, String compania)
            + TitularDTO buscarTitular(String apellidoTitular, String nombreTitular)
            + @Override void finalize()
        }

        class Turno {
            - fabricaDao: final FabricaDAO
            - titularDao: final TurnoDAO
            + Turno()
            + List<TurnoDTO> listarTurno()
            + boolean insertarTurno(String dia, String hora, String mecanico,String vehiculo, String titular, String companiaSeguro)
            + boolean modificarTurno(String nro, String dia, String hora, String mecanico)
        }

        class Vehiculo {
            - fabricaDao: final FabricaDAO
            - titularDao: final vehiculoDao
            + Vehiculo()
            + boolean insertarVehiculo(int nroPoliza, String modelo, String marca, String nroDNITitular)
            + @Override void finalize()
        }

        interface Estado{
            + procesar()
        }

        class Asignado{
            + procesar()
        }

        class NoAsignado{
            + procesar()
        }

        class Cancelado{
            + procesar()
        }

        class Finalizado{
            + procesar()
        }

        class EnCurso{
            + procesar()
        }
    }

    package Controlador <<Folder>>{

        abstract Controlador{
            VISTA: InterfazTurno
            MODELO: Modelo
        }

        class EncRecepcionControlador extends Controlador {
            + EncRecepcionControlador(InterfazTurno vista, Modelo modelo)
            + keyTyped(KeyEvent ke)
            + void keyPressed(KeyEvent ke)
            + void actionPerformed(ActionEvent e)
            + void keyReleased(KeyEvent ke)
            - void iniciarFrmNuevoTurno()
        }

        class EncTallerControlador extends Controlador {

        }

        class EnsAdministracionControlador extends Controlador {

        }
    }

    package Vista <<Folder>>{

        class FrmNuevoCliente extends javax.swing.JFrame{
            + FrmNuevoCliente()
        }

        class FrmNuevoTurno extends javax.swing.JFrame implements InterfazTurno{
            + FrmNuevoTurno()
            + void setControlador(Controlador c)
            + void iniciaVista()
            + void cerrarVista()
            + void llenarVista()
        }

        class FrmNuevoEmpleado extends javax.swing.JFrame{
            + FrmNuevoEmpleado()
        }

        interface InterfazTurno{
            + static enum Operacion {
            + setControlador(Controlador c)
            + iniciaVista()
            + cerrarVista()
        }

        class vistaFichaMecanica extends javax.swing.JFrame{
            + vistaFichaMecanica()
        }
            
        class vistaHome extends javax.swing.JFrame implements InterfazTurno{
            + vistaHome()
            + void setControlador(Controlador c)
            + void iniciaVista()
            + void cerrarVista()
        }

    }

     package DAO <<Folder>>{

        abstract FabricaDAO{
            + abstract AlumnoDAO getAlumnoDao()
            + abstract TurnoDAO getTurnoDao()
            + abstract VehiculoDAO getVehiculoDao()
            + abstract TitularDAO getTitularDao()
            + abstract MecanicoDAO getMecanicoDao()
            + abstract CompaniaDAO getCompaniaDao()
            + abstract EspecialidadDAO getEspecialidadDAO()
            + abstract AgendaDAO getAgendaDao()
            + static FabricaDAO getFactory(String nombreClase)
        }

        class SqlFabricaDAO extends FabricaDAO{
            + TurnoDAO getTurnoDao()
            + VehiculoDAO getVehiculoDao()
            + TitularDAO getTitularDao()
            + MecanicoDAO getMecanicoDao()
            + MecanicoDAO getMecanicoDao()
            + CompaniaDAO getCompaniaDao()
            + EspecialidadDAO getEspecialidadDAO()
            + AgendaDAO getAgendaDao()
        }

        interface AgendaDAO{
            + List<AgendaDTO> listarAgenda(String mecanicoNombre, String estadoTurno)
            + cerrarConexion()
        }

        class AgendaDAOImplSql {
            - conexion: ConexionSql
            + AgendaDAOImplSql()
            + List<AgendaDTO> listarAgenda(String mecanicoNombre, String estadoTurno)
            + errarConexion()
        }

        interface CompaniaDAO{
            + List<CompaniaDTO> listarCompanias()
            + boolean insertarCompania(String razonSocial, String cuit, String direccion, 
                                 String telefono)
            + void cerrarConexion()
        }

        class CompaniaDAOImplSql {
            - conexion: ConexionSql
            + CompaniaDAOImplSql()
            + List<CompaniaDTO> listarCompanias()
            + boolean insertarCompania(String razonSocial, String cuit, 
                                        String direccion, String telefono)
            + void cerrarConexion()
        }

        interface EspecialidadDAO{
            + List<EspecialidadDTO> listarEspecialidades()
            + void cerrarConexion()
        }

        class EspecialidadDAOImpSql {
            - conexion: ConexionSql
            + EspecialidadDAOImpSql()
            + List<EspecialidadDTO> listarEspecialidades()
            + void cerrarConexion()
        }

        interface MecanicoDAO{
            + List<MecanicoDTO> listarMecanicosConCriterios(String especialidad)
            + boolean insertarMecanico(String apellido, String nombre, String tipoDNI, 
                                 String nroDNI, String telefono, String legajo, String area,
                                 String especialidad)
            + void cerrarConexion()
        }

        class MecanicoDAOImplSql {
            - conexion: ConexionSql
            + MecanicoDAOImplSql()
            + List<MecanicoDTO> listarMecanicosConCriterios(String especialidad)
            + boolean insertarMecanico(String apellido, String nombre, String tipoDNI, 
                                        String nroDNI, String telefono, String legajo, 
                                        String area,String especialidad)
            + void cerrarConexion()
        }

        interface TitularDAO{
            + TitularDTO buscarTitular(String apellido, String nombre)
            + boolean insertarTitular(String nombre, String apellido, String tipoDNI, String nroDNI, String telefono,String compania)
            + void cerrarConexion()
        }

        class TitularDAOImplSql {
            - conexion: ConexionSql
            + TitularDAOImplSql()
            + TitularDTO buscarTitular(String apellidoTitular, String nombreTitular)
            + boolean insertarTitular(String nombre, String apellido, String tipoDNI, String nroDNI, String telefono, String compania)
            + void cerrarConexion()
        }

        interface TurnoDAO{
            + TurnoDTO consultarTurno(String nro)
            + List<TurnoDTO> listarTurnos()
            + List<TurnoDTO> listarTurnosPorCriterio(String titular)
            + boolean insertarTurno(String nro, String dia, String hora, String mecanico,
                                    String vehiculo, String titular, 
                                    String companiaSeguro)
            + boolean modificarTurno(String nro, String dia, String hora, String mecanico)
            + boolean confirmarTurno(String nro)
            + boolean cancelarTurno(String nro)
            + boolean registrarFichaMecanica(String nro, String fichaMecanica)
            + void cerrarConexion()
        }

        class TurnoDAOImpSQL {
            - conexion: ConexionSql
            + TurnoDAOImplSql()
            + TurnoDTO consultarTurno(String nro)
            + List<TurnoDTO> listarTurnos()
            + boolean insertarTurno(String dia, String hora, 
                                     String mecanico, String vehiculo, 
                                     String titular, String companiaSeguro)
            + boolean modificarTurno(String nro, String dia, String hora, 
                                      String mecanico)
            + void cerrarConexion()
            + List<TurnoDTO> listarTurnosPorCriterio(String titular)
            + boolean confirmarTurno(String nro)
            + boolean cancelarTurno(String nro)
            + boolean registrarFichaMecanica
        }

        interface VehiculoDAO{
            + VehiculoDTO consultarVehiculo(int nroPoliza)
            + boolean insertarVehiculo(int nroPoliza,
                                 String modelo,
                                 String marca,
                                 String nroDNITitular)
            + void cerrarConexion()
        }

        class VehiculoDAOImplSql {
            - conexion: ConexionSql
            + VehiculoDAOImplSql()
            + VehiculoDTO consultarVehiculo(int nroPoliza)
            + boolean insertarVehiculo(int nroPoliza, String modelo, String marca, String nroDNITitular)
            + void cerrarConexion()
        }

        package Singleton <<Folder>>{
            class ConexionSQL{
                - URL: static final String 
                - connection: Connection
                - instancia: static ConexionSql 
                - ConexionSql()
                + static ConexionSql getInstancia()
                + Connection getConnection()
                # void desconectar()
            }
        }
     }

    package  DTO <<Folder>>{

        class AgendaDTO {
            - dia: String;
            - horario: String;
            - mecanico: String;
            - estado: String;
            + AgendaDTO(String dia, String horario, String mecanico, String estado)
            + String getDia()
            + void setDia(String dia)
            + String getHorario()
            + void setHorario(String horario)
            + String getEstado()
            + void setEstado(String estado)
            + String getMecanico()
            + void setMecanico(String estado)
        }

        class CompaniaDTO {
            - razonSocial: String;
            - cuit: String;
            - direccion: String;
            - telefono: String;
            + CompaniaDTO(String razonSocial, String cuit, String direccion, String telefono)
            + String getRazonSocial()
            + String getCuit()
            + String getDireccion()
            + String getTelefono()
            + String getEstado()
            + void setRazonSocial(String razonSocial)
            + void setCuit(String cuit)
            + void setDireccion(String direccion)
            + void setTelefono(String telefono)
        }

        abstract EmpleadoDTO{
            - legajo: int
            - area: String
            + EmpleadoDTO(String apellido, String nombre, String tipoDNI, 
                       String nroDNI, String telefono, int legajo, String area)
            + int getLegajo()
            + String getArea()
            + void setLegajo(int legajo)
            + void setArea(String area)
        }

        class EspecialidadDTO {
            - codigo: String
            - nombre: String
            - descripcion: String
            + EspecialidadDTO(String codigo, String nombre, String descripcion)
            + String getCodigo()
            + String getNombre()
            + String getDescripcion()
            + void setCodigo(String codigo)
            + void setNombre(String nombre)
            + void setDescripcion(String descripcion)
        }

        class MecanicoDTO{
            - especialidad: String
            + MecanicoDTO(String apellido, String nombre, String tipoDNI, String nroDNI, 
                       String telefono, int legajo, String area, String especialidad)
            + String getEspecialidad()
            + void setEspecialidad(String especialidad)
        }
        
        abstract PersonaDTO{
            - apellido: String;
            - nombre: String;
            - tipoDNI: String
            - nroDNI: String
            - telefono: String
            + PersonaDTO(String apellido, String nombre, String tipoDNI, String nroDNI, String telefono)
            + String getApellido()
            + void setApellido(String apellido)
            + String getNombre()
            + void setNombre(String nombre)
            + String getTipoDNI()
            + void setTipoDNI(String tipoDNI)
            + String getNroDNI()
            + void setNroDNI(String nroDNI)
            + tring getTelefono()
            + void setLegajo(String telefono)
        }

        class TitularDTO{
            - compania: String
            + TitularDTO(String nombre, String apellido, String tipoDNI, String nroDNI, String telefono,String compania)
            + String getCompania()
            + void setCompania(String compania)
        }
        
        class TurnoDTO {
            - nro: int;
            - dia: String
            - hora: String
            - mecanico: String
            - vehiculo: String
            - titular: String
            - companiaSeguro: String
            - estado: String
            - fichaMecanica: String
            + TurnoDTO(int nro, String dia, String hora, String mecanico, 
                    String vehiculo, String titular, String companiaSeguro,
                    String estado, String fichaMecanica)
            + void setNro(int nro)
            + void setDia(String dia)
            + void setHora(String hora)
            + void setMecanico(String mecanico)
            + void setVehiculo(String vehiculo)
            + void setTitular(String titular)
            + void setCompaniaSeguro(String companiaSeguro)
            + void setEstado(String estado)
            + void setFichaMecanica(String fichaMecanica)
            + int getNro()
            + String getDia()
            + String getHora()
            + String getMecanico()
            + String getVehiculo()
            + String getTitular()
            + String getCompaniaSeguro()
            + String getEstado()
            + String getFichaMecanica()
        }
        
        class VehiculoDTO {
            - nroDNITitular: String;
            - nroPoliza: int
            - modelo: String
            - marca: String
            + VehiculoDTO(int nroPoliza, String modelo, String marca, String nroDNITitular)
            + String getNroDNITitular()
            + int getNroPoliza()
            + String getModelo()
            + String getMarca()
            + void setNroDNITitular(String nroDNITitular)
            + void setNroPoliza(int nroPoliza)
            + void setModelo(String modelo)
            + void setMarca(String marca)
        }

    }

    package DataBase <<Database>>{

        class DBEjemploDAO{
            
        }
    }

    package Main <<Folder>>{
        class Main{
            modelo: Modelo
            vista: InterfazTurno
            controlador: Controlador
        }
        
    }

    Compania "1" -up-> "1" CompaniaDAO
    Turno "1" -up-> "1" TurnoDAO
    Titular "1" -up-> "1" TitularDAO
    Mecanico "1" -up-> "1" MecanicoDAO
    Especialidad "1" -up-> "1" EspecialidadDAO
    Agenda "1" -up-> "1" AgendaDAO
    Vehiculo "1" -up-> "1" VehiculoDAO
    Turno o--> Estado
    Estado --> Asignado
    Estado --> EnCurso
    Estado --> Cancelado
    Estado --> Finalizado
    Estado --> NoAsignado
    TurnoDAOImpSQL "1" -up-> "1" ConexionSQL
    CompaniaDAOImplSql "1" -up-> "1" ConexionSQL
    TitularDAOImplSql "1" -up-> "1" ConexionSQL
    MecanicoDAOImplSql "1" -up-> "1" ConexionSQL
    EspecialidadDAOImpSql "1" -up-> "1" ConexionSQL
    AgendaDAOImplSql "1" -up-> "1" ConexionSQL
    VehiculoDAOImplSql "1" -up-> "1" ConexionSQL
    TurnoDAOImpSQL "<instancia>" <.. SqlFabricaDAO
    CompaniaDAOImplSql "<instancia>" <.. SqlFabricaDAO
    TitularDAOImplSql "<instancia>" <.. SqlFabricaDAO
    MecanicoDAOImplSql "<instancia>" <.. SqlFabricaDAO
    EspecialidadDAOImpSql "<instancia>" <.. SqlFabricaDAO
    AgendaDAOImplSql "<instancia>" <.. SqlFabricaDAO
    VehiculoDAOImplSql "<instancia>" <.. SqlFabricaDAO
    Titular --down|> Modelo
    Vehiculo --down|> Modelo
    Mecanico --down|> Modelo
    Especialidad --down|> Modelo
    Compania --down|> Modelo
    Agenda --down|> Modelo
    Turno --down|> Modelo
    TurnoDAOImpSQL ..|> TurnoDAO
    CompaniaDAOImplSql ..|> CompaniaDAO
    TitularDAOImplSql ..|> TitularDAO
    MecanicoDAOImplSql ..|> MecanicoDAO
    EspecialidadDAOImpSql ..|> EspecialidadDAO
    AgendaDAOImplSql ..|> AgendaDAO
    VehiculoDAOImplSql ..|> VehiculoDAO
    ConexionSQL -left-> DBEjemploDAO
    TurnoDTO <-up- TurnoDAOImpSQL
    AgendaDTO <-up- AgendaDAOImplSql
    CompaniaDTO <-up- CompaniaDAOImplSql
    EspecialidadDTO <-up- EspecialidadDAOImpSql
    MecanicoDTO <-up- MecanicoDAOImplSql
    TitularDTO <-up- TitularDAOImplSql
    VehiculoDTO <-up- VehiculoDAOImplSql
    TitularDTO ..|> PersonaDTO
    MecanicoDTO ..|> EmpleadoDTO
    EmpleadoDTO ..|> PersonaDTO
    EncRecepcionControlador --> "1" Modelo
    EncRecepcionControlador --> "1" InterfazTurno
    Main --> Modelo 
    Main --> Vista 
    Main --> Controlador 
@enduml
