-- Esquema de la base de datos

CREATE TABLE curso
(
    id              INTEGER PRIMARY KEY,
    -- clave
    anio            INTEGER(4) NOT NULL,
    cuatrimestre    INTEGER(1) NOT NULL,
    curso           INTEGER NOT NULL,
    -- campos
    descripcion     VARCHAR(150),
    UNIQUE          (anio, cuatrimestre, curso)
);

CREATE TABLE inscripto
(
    id              INTEGER PRIMARY KEY,
    -- clave
    padron          INTEGER NOT NULL,
    curso_id        INTEGER NOT NULL,
    -- campos
    mail            VARCHAR(150) NOT NULL,
    activo          BOOLEAN NOT NULL DEFAULT 1,
    UNIQUE          (padron, curso_id)
);

CREATE TABLE docente
(
    id              INTEGER PRIMARY KEY,
    -- clave
    nombre          VARCHAR(150) NOT NULL,
    -- campos
    mail            VARCHAR(150) NOT NULL,
    corrige         BOOLEAN NOT NULL DEFAULT 1,
    UNIQUE          (nombre)
);

CREATE TABLE curso_docente
(
    -- clave
    curso_id        INTEGER NOT NULL,
    docente_id      INTEGER NOT NULL,
    PRIMARY KEY     (docente_id, curso_id)
);

CREATE TABLE ejercicio
(
    id              INTEGER PRIMARY KEY,
    -- clave
    nombre          VARCHAR(150) NOT NULL,
    -- campos
    numero          INTEGER NOT NULL,
    docente_id      INTEGER NOT NULL, -- Autor
    UNIQUE          (nombre)
);

CREATE TABLE entrega
(
    id              INTEGER PRIMARY KEY,
    -- clave
    curso_id        INTEGER NOT NULL,
    nro_ejercicio   INTEGER NOT NULL,
    entrega         INTEGER NOT NULL,
    -- campos
    ejercicio_id    INTEGER NOT NULL,
    desde           DATE NOT NULL,
    hasta           DATE NOT NULL,
    UNIQUE          (curso_id, nro_ejercicio, entrega)
);

CREATE TABLE caso_de_prueba
(
    id              INTEGER PRIMARY KEY,
    -- clave
    ejercicio_id    INTEGER NOT NULL,
    nombre          VARCHAR(255) NOT NULL,
    -- campos
    privado         BOOLEAN NOT NULL,
    activo          BOOLEAN NOT NULL DEFAULT 1,
    parametros      VARCHAR(255),
    codigo_retorno  INTEGER DEFAULT 0,
    tiempo_cpu      INTEGER DEFAULT NULL,
    UNIQUE          (ejercicio_id, nombre)
);

CREATE TABLE intento
(
    id              INTEGER PRIMARY KEY,
    -- clave
    inscripto_id    INTEGER NOT NULL,
    entrega_id      INTEGER NOT NULL,
    numero          INTEGER NOT NULL,
    -- campos
    llegada         DATE NOT NULL,
    inicio_compila  DATE,
    fin_compila     DATE,
    inicio_pruebas  DATE,
    fin_pruebas     DATE,
    compila         BOOLEAN,
    notificado      BOOLEAN NOT NULL DEFAULT 0,
    mail_respuesta  VARCHAR(150) NOT NULL,
    observaciones   VARCHAR(255),
    UNIQUE          (entrega_id, inscripto_id, llegada)
);

CREATE TABLE correccion
(
    id              INTEGER PRIMARY KEY,
    -- clave
    entrega_id      INTEGER NOT NULL,
    inscripto_id    INTEGER NOT NULL,
    -- campos
    intento_id      INTEGER NOT NULL, -- Último intento exitoso
    docente_id      INTEGER NOT NULL, -- Corrector
    nota            INTEGER(2),
    observaciones   VARCHAR(255),
    UNIQUE          (inscripto_id, entrega_id)
);

CREATE TABLE prueba
(
    id                  INTEGER PRIMARY KEY,
    -- clave
    intento_id          INTEGER NOT NULL,
    caso_de_prueba_id   INTEGER NOT NULL,
    -- campos
    inicio              DATE NOT NULL,
    fin                 DATE,
    pasada              BOOLEAN,
    observaciones       VARCHAR(255),
    UNIQUE              (intento_id, caso_de_prueba_id)
);

-- vim: set et sw=4 ts=4 sts=4 :
