CREATE TABLE ZONA (
    Nome            VARCHAR(50)     NOT NULL,
    AreaCitta       VARCHAR(100)    NOT NULL,
    TariffaOraria   DECIMAL(5,2)    NOT NULL,
    
    PRIMARY KEY (Nome)
);


CREATE TABLE PARCHEGGIO (
    IndirizzoGeografico VARCHAR(150)    NOT NULL,
    CapacitaMoto        INT             NOT NULL,
    CapacitaAutomobile  INT             NOT NULL,
    CapacitaCamion      INT             NOT NULL,
    Categoria           VARCHAR(10)     NOT NULL,
    H_apertura          TIME,
    H_chiusura          TIME,
    Zona                VARCHAR(50),
    
    PRIMARY KEY (IndirizzoGeografico),

    FOREIGN KEY (Zona) REFERENCES ZONA(Nome),
    
    CONSTRAINT CHK_Categoria_Parcheggio
        CHECK (Categoria IN ('garage', 'aperto')),

    CONSTRAINT CHK_Verifica_Orario
        CHECK (
            (Categoria = "garage" AND (H_apertura IS NOT NULL AND H_chiusura IS NOT NULL))
            OR
            (Categoria = "aperto" AND (H_apertura IS NULL AND H_chiusura IS NULL))
        )
);


CREATE TABLE UTENTE (
    CodiceFiscale   CHAR(16)        NOT NULL,
    Nome            VARCHAR(50)     NOT NULL,
    Cognome         VARCHAR(50)     NOT NULL,
    NumTelefono     VARCHAR(15),
    Mail            VARCHAR(100)    NOT NULL,
    Password        VARCHAR(255)    NOT NULL,
    
    PRIMARY KEY (CodiceFiscale)
);


CREATE TABLE DIPENDENTE (
    CodiceFiscale       CHAR(16)        NOT NULL,
    Nome                VARCHAR(50)     NOT NULL,
    Cognome             VARCHAR(50)     NOT NULL,
    Ruolo               VARCHAR(30)     NOT NULL,
    ParcheggioAssegnato VARCHAR(150),
    
    PRIMARY KEY (CodiceFiscale),

    FOREIGN KEY (ParcheggioAssegnato) REFERENCES PARCHEGGIO(IndirizzoGeografico),
    
    CONSTRAINT CHK_Ruolo_Dipendente
        CHECK (Ruolo IN ('operatore', 'controllore', 'addetto_amministrativo', 'responsabile')),
    CONSTRAINT CHK_ParcheggioAssegnato
        CHECK (
            (Ruolo IN ('operatore', 'responsabile') AND ParcheggioAssegnato IS NOT NULL)
            OR
            (Ruolo IN ('controllore', 'addetto_amministrativo') AND ParcheggioAssegnato IS NULL)
        )
);


CREATE TABLE VEICOLO (
    Targa       VARCHAR(10)     NOT NULL,
    Categoria   VARCHAR(15)     NOT NULL,
    Utente      CHAR(16)        NOT NULL,
    
    PRIMARY KEY (Targa),

    FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
    
    CONSTRAINT CHK_Categoria_Veicolo
        CHECK (Categoria IN ('moto', 'automobile', 'camion'))
);


CREATE TABLE ABBONAMENTO (
    Utente          CHAR(16)        NOT NULL,
    DataValidazione DATE            NOT NULL,
    DataScadenza    DATE            NOT NULL,
    Tariffa         DECIMAL(7,2)    NOT NULL,
    
    PRIMARY KEY (Utente, DataValidazione),
    
    FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale)
);


CREATE TABLE BIGLIETTO (
    Utente          CHAR(16)        NOT NULL,
    OraValidazione  DATETIME        NOT NULL,
    OraScadenza     DATETIME        NOT NULL,
    Tariffa         DECIMAL(5,2)    NOT NULL,
    Zona            VARCHAR(50)     NOT NULL,
    
    PRIMARY KEY (Utente, OraValidazione),
    
    FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
    FOREIGN KEY (Zona) REFERENCES ZONA(Nome)
);


CREATE TABLE SOSTA (
    Veicolo             VARCHAR(10)     NOT NULL,
    Data                DATE            NOT NULL,
    Hinizio             TIME            NOT NULL,
    Hfine               TIME,
    Parcheggio          VARCHAR(150)    NOT NULL,
    AbbonamentoUtente   CHAR(16),
    AbbonamentoData     DATE,
    BigliettoUtente     CHAR(16),
    BigliettoOra        DATETIME,
    
    PRIMARY KEY (Veicolo, Data, Hinizio),

    FOREIGN KEY (Veicolo) REFERENCES VEICOLO(Targa),
    FOREIGN KEY (Parcheggio) REFERENCES PARCHEGGIO(IndirizzoGeografico),
    FOREIGN KEY (AbbonamentoUtente, AbbonamentoData) REFERENCES ABBONAMENTO(Utente, DataValidazione),
    FOREIGN KEY (BigliettoUtente, BigliettoOra) REFERENCES BIGLIETTO(Utente, OraValidazione),
    
    CONSTRAINT CHK_Sosta_Abbonamento
        CHECK (
            (AbbonamentoUtente IS NULL AND AbbonamentoData IS NULL)
            OR
            (AbbonamentoUtente IS NOT NULL AND AbbonamentoData IS NOT NULL)
        ),
    CONSTRAINT CHK_Sosta_Biglietto
        CHECK (
            (BigliettoUtente IS NULL AND BigliettoOra IS NULL)
            OR
            (BigliettoUtente IS NOT NULL AND BigliettoOra IS NOT NULL)
        ),
    CONSTRAINT CHK_Sosta_TitoloEsclusivo
        CHECK (
            (AbbonamentoUtente IS NOT NULL AND BigliettoUtente IS NULL)
            OR
            (AbbonamentoUtente IS NULL AND BigliettoUtente IS NOT NULL)
        )
);


CREATE TABLE SANZIONE (
    Veicolo         VARCHAR(10)     NOT NULL,
    Data            DATE            NOT NULL,
    Hinizio         TIME            NOT NULL,
    Motivo          VARCHAR(255)    NOT NULL,
    ImportoEuro     DECIMAL(7,2)    NOT NULL,
    Dipendente      CHAR(16)        NOT NULL,
    
    PRIMARY KEY (Veicolo, Data, Hinizio),
    
    FOREIGN KEY (Veicolo, Data, Hinizio) REFERENCES SOSTA(Veicolo, Data, Hinizio),
    FOREIGN KEY (Dipendente) REFERENCES DIPENDENTE(CodiceFiscale)
);


CREATE TABLE VALUTAZIONE (
    Utente          CHAR(16)        NOT NULL,
    DataValutazione DATE            NOT NULL,
    VotoPulizia     INT             NOT NULL,
    VotoSicurezza   INT             NOT NULL,
    Commento        TEXT,
    Parcheggio      VARCHAR(150)    NOT NULL,

    PRIMARY KEY (Utente, DataValutazione),

    FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
    FOREIGN KEY (Parcheggio) REFERENCES PARCHEGGIO(IndirizzoGeografico),
    
    CONSTRAINT CHK_VotoPulizia
        CHECK (VotoPulizia BETWEEN 1 AND 5),
    CONSTRAINT CHK_VotoSicurezza
        CHECK (VotoSicurezza BETWEEN 1 AND 5)
);

CREATE TABLE TURNO (
    Dipendente  CHAR(16)        NOT NULL,
    Data        DATE            NOT NULL,
    Hinizio     TIME            NOT NULL,
    Hfine       TIME            NOT NULL,
    Parcheggio  VARCHAR(150)    NOT NULL,
    
    PRIMARY KEY (Dipendente, Data, Hinizio),
    
    FOREIGN KEY (Dipendente) REFERENCES DIPENDENTE(CodiceFiscale),
    FOREIGN KEY (Parcheggio) REFERENCES PARCHEGGIO(IndirizzoGeografico)
);


CREATE TABLE SCONTO (
    Tipo        VARCHAR(20)     NOT NULL,
    DataInizio  DATE            NOT NULL,
    DataFine    DATE            NOT NULL,
    Percentuale DECIMAL(5,2)    NOT NULL,
    TitoloSosta VARCHAR(15)     NOT NULL,
    Utente      CHAR(16),
    Zona        VARCHAR(50),
    
    PRIMARY KEY (Tipo, DataInizio, DataFine, Percentuale, TitoloSosta),

    FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
    FOREIGN KEY (Zona) REFERENCES ZONA(Nome),
    
    CONSTRAINT CHK_Tipo_Sconto
        CHECK (Tipo IN ('generico', 'legato a una zona')),
    CONSTRAINT CHK_TitoloSosta
        CHECK (TitoloSosta IN ('biglietto', 'abbonamento')),
    CONSTRAINT CHK_Sconto_Zona
        CHECK (
            (Tipo = 'legato a una zona' AND Zona IS NOT NULL)
            OR
            (Tipo = 'generico' AND Zona IS NULL)
        )
);


/* ============================================================================================================ */

INSERT INTO ZONA VALUES
('Centro', 'Centro Storico', 2.50),

('Crocetta', 'Crocetta', 2.00),

('San Salvario', 'San Salvario', 2.20),

('Lingotto', 'Lingotto', 1.80),

('Aurora', 'Aurora', 1.50);

INSERT INTO PARCHEGGIO VALUES
('Corso Vittorio Emanuele II 15', 80, 250, 20, 'garage', '07:00:00', '23:00:00', NULL),

('Via Nizza 230', 60, 180, 15, 'garage', '06:30:00', '22:30:00', NULL),

('Piazza Castello', 40, 150, 5, 'aperto', NULL, NULL, 'Centro'),

('Via Roma 45', 25, 100, 5, 'aperto', NULL, NULL, 'Centro'),

('Corso Regina Margherita 120', 35, 120, 10, 'aperto', NULL, NULL, 'Aurora'),

('Via Madama Cristina 85', 30, 90, 5, 'aperto', NULL, NULL, 'San Salvario'),

('Via Nizza 350', 20, 110, 10, 'aperto', NULL, NULL, 'Lingotto');

INSERT INTO UTENTE VALUES
('RSSMRC90A01L219X','Marco','Rossi','3331111111', 'marco.rossi@email.it','marco123'),

('BNCLCU88B12L219Y','Luca','Bianchi','3332222222', 'luca.bianchi@email.it','luca123'),

('FRRGIU95C41L219Z','Giulia','Ferrero',NULL, 'giulia.ferrero@email.it','giulia123'),

('GLLSRA97D52L219W','Sara','Gallo','3334444444', 'sara.gallo@email.it','sara123'),

('CNTNDR91E63L219V','Andrea','Conti','3335555555', 'andrea.conti@email.it','andrea123');

INSERT INTO DIPENDENTE VALUES
('RMNDVD80A01L219A','Davide','Romano', 'responsabile','Corso Vittorio Emanuele II 15'),

('SRAPLO82B11L219B','Paolo','Serra', 'operatore','Corso Vittorio Emanuele II 15'),

('VRDLGI83C21L219C','Luigi','Verdi', 'responsabile','Via Nizza 230'),

('FRRMRA86D31L219D','Maria','Ferri', 'operatore','Via Nizza 230'),

('GRCLNA89E41L219E','Elena','Greco', 'controllore',NULL),

('RVAMTA90F51L219F','Marta','Riva', 'controllore',NULL),

('VLLSTF84G61L219G','Stefano','Villa', 'addetto_amministrativo',NULL);

INSERT INTO VEICOLO VALUES
('AB123CD','automobile','RSSMRC90A01L219X'),

('EF456GH','moto','RSSMRC90A01L219X'),

('IJ789KL','automobile','BNCLCU88B12L219Y'),

('MN012OP','camion','FRRGIU95C41L219Z'),

('QR345ST','automobile','GLLSRA97D52L219W'),

('UV678WX','moto','CNTNDR91E63L219V'),

('YZ901AA','automobile','CNTNDR91E63L219V');

INSERT INTO ABBONAMENTO VALUES
('RSSMRC90A01L219X','2026-01-01','2026-12-31',420.00),

('BNCLCU88B12L219Y','2026-03-01','2027-02-28',380.00),

('CNTNDR91E63L219V','2026-02-15','2027-02-14',390.00);

INSERT INTO BIGLIETTO VALUES
('FRRGIU95C41L219Z', '2026-07-01 08:00:00', '2026-07-01 12:00:00', 8.00, 'Centro'),

('GLLSRA97D52L219W', '2026-07-01 09:30:00', '2026-07-01 13:30:00', 8.80, 'Centro'),

('FRRGIU95C41L219Z', '2026-07-02 10:00:00', '2026-07-02 15:00:00', 7.50, 'Aurora'),

('CNTNDR91E63L219V', '2026-07-03 08:30:00', '2026-07-03 11:30:00', 5.40, 'Lingotto');

INSERT INTO SCONTO VALUES
('generico', '2026-01-01', '2026-12-31', 10.00, 'biglietto', NULL, NULL),

('legato a una zona', '2026-06-01', '2026-08-31', 20.00, 'biglietto', NULL, 'Centro'),

('generico', '2026-01-01', '2026-12-31', 15.00, 'abbonamento', NULL, NULL);

INSERT INTO TURNO VALUES
('GRCLNA89E41L219E', '2026-07-01', '08:00:00', '16:00:00', 'Piazza Castello'),

('RVAMTA90F51L219F', '2026-07-01', '09:00:00', '17:00:00', 'Via Roma 45'),

('GRCLNA89E41L219E', '2026-07-02', '08:00:00', '16:00:00', 'Corso Regina Margherita 120'),

('RVAMTA90F51L219F', '2026-07-03', '08:00:00', '16:00:00', 'Via Nizza 350');

INSERT INTO SOSTA VALUES
('AB123CD', '2026-07-01', '08:30:00', '11:00:00',
'Corso Vittorio Emanuele II 15', 'RSSMRC90A01L219X', '2026-01-01', NULL, NULL),

('IJ789KL', '2026-07-01', '09:15:00', '12:30:00',
'Via Nizza 230', 'BNCLCU88B12L219Y', '2026-03-01', NULL, NULL),

('MN012OP', '2026-07-01', '08:15:00', '11:45:00',
'Piazza Castello', NULL, NULL, 'FRRGIU95C41L219Z', '2026-07-01 08:00:00'),

('QR345ST', '2026-07-01','10:00:00', '12:00:00',
'Via Roma 45', NULL, NULL, 'GLLSRA97D52L219W', '2026-07-01 09:30:00'),

('UV678WX', '2026-07-03', '09:00:00', '11:00:00',
'Via Nizza 350', 'CNTNDR91E63L219V', '2026-02-15', NULL, NULL),

('YZ901AA', '2026-07-03', '08:45:00', '10:30:00',
'Via Nizza 350', NULL, NULL, 'CNTNDR91E63L219V', '2026-07-03 08:30:00');

INSERT INTO VALUTAZIONE VALUES
('RSSMRC90A01L219X', '2026-07-01', 5, 5,
'Garage molto pulito e personale disponibile.', 'Corso Vittorio Emanuele II 15'),

('BNCLCU88B12L219Y', '2026-07-01', 4, 5,
'Garage ordinato e sicuro.', 'Via Nizza 230'),

('FRRGIU95C41L219Z', '2026-07-02', 4, 3,
'Parcheggio comodo ma poco illuminato.', 'Piazza Castello'),

('GLLSRA97D52L219W', '2026-07-02', 5, 4,
'Molto facile trovare posto.', 'Via Roma 45'),

('CNTNDR91E63L219V', '2026-07-03', 4, 4,
'Comodo per raggiungere il Lingotto.', 'Via Nizza 350');


INSERT INTO SANZIONE VALUES
('MN012OP', '2026-07-01', '08:15:00',
'Titolo di sosta scaduto', 42.50, 'GRCLNA89E41L219E'),

('QR345ST', '2026-07-01', '10:00:00',
'Mancata esposizione del titolo di sosta', 29.00, 'RVAMTA90F51L219F');



DELETE FROM UTENTE
WHERE CodiceFiscale = 'RSSMRC90A01L219X';

DELETE FROM VEICOLO
WHERE Targa = 'AB123CD';

DELETE FROM PARCHEGGIO
WHERE IndirizzoGeografico = 'Corso Vittorio Emanuele II 15';

DELETE FROM ZONA
WHERE Nome = 'Centro';



UPDATE UTENTE
SET CodiceFiscale = 'AAAAAAAAAAAAAAAA'
WHERE CodiceFiscale = 'RSSMRC90A01L219X';

UPDATE VEICOLO
SET Targa = 'ZZ999ZZ'
WHERE Targa = 'AB123CD';

UPDATE PARCHEGGIO
SET IndirizzoGeografico = 'Via Nuova 100'
WHERE IndirizzoGeografico = 'Via Nizza 230';



UPDATE VEICOLO
SET Categoria = 'bicicletta'
WHERE Targa = 'AB123CD';

UPDATE PARCHEGGIO
SET Categoria = 'garage'
WHERE IndirizzoGeografico = 'Piazza Castello';

UPDATE DIPENDENTE
SET Ruolo = 'direttore'
WHERE CodiceFiscale = 'SRAPLO82B11L219B';

INSERT INTO SCONTO
VALUES (
'legato a una zona',
'2026-10-01',
'2026-10-31',
20,
'biglietto',
NULL,
NULL
);



/* stesso abbonamento usato in soste sovrapposte */

INSERT INTO SOSTA
VALUES (
'EF456GH',
'2026-07-03',
'09:30:00',
'10:30:00',
'Corso Vittorio Emanuele II 15',
'RSSMRC90A01L219X',
'2026-01-01',
NULL,
NULL
);



/* sia biglietto che abbonamento */

INSERT INTO SOSTA
VALUES (
'AB123CD',
'2026-07-10',
'08:00:00',
'10:00:00',
'Corso Vittorio Emanuele II 15',
'RSSMRC90A01L219X',
'2026-01-01',
'FRRGIU95C41L219Z',
'2026-07-01 08:00:00'
);



/* garage senza orari */

UPDATE PARCHEGGIO
SET
H_apertura = NULL,
H_chiusura = NULL
WHERE IndirizzoGeografico = 'Via Nizza 230';



/* voto fuori intervallo */

UPDATE VALUTAZIONE
SET VotoPulizia = 8
WHERE Utente = 'RSSMRC90A01L219X'
AND DataValutazione = '2026-07-01';

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: