/*============================================================================*/
/* DDL SCRIPT                                                                 */
/*============================================================================*/
/* Title:      																  */
/* Filename:   eBay.hf                                                        */
/* Platform:   Oracle 10g                                                     */
/* Version:    Concept                                                        */
/* Generated:  jeudi 22 novembre 2007                                         */
/*============================================================================*/
DROP TABLE Paypal CASCADE CONSTRAINTS;

DROP TABLE VirementBancaire CASCADE CONSTRAINTS;

DROP TABLE MoyensPaiement CASCADE CONSTRAINTS;

DROP TABLE Pays CASCADE CONSTRAINTS;

DROP TABLE Personne CASCADE CONSTRAINTS;

DROP TABLE Acheteur CASCADE CONSTRAINTS;

DROP TABLE Vendeur CASCADE CONSTRAINTS;

DROP TABLE Avis CASCADE CONSTRAINTS;

DROP TABLE CarteBancaire CASCADE CONSTRAINTS;

DROP TABLE Categorie CASCADE CONSTRAINTS;

DROP TABLE Produits CASCADE CONSTRAINTS;

DROP TABLE Categorie_Produits CASCADE CONSTRAINTS;

DROP TABLE Encherir CASCADE CONSTRAINTS;

DROP TABLE ReponseCommentaire CASCADE CONSTRAINTS;

DROP TABLE Restriction CASCADE CONSTRAINTS;

/*============================================================================*/
/* Tables                                                                     */
/*============================================================================*/
CREATE TABLE Paypal (
    NPay NUMBER NOT NULL,
    Compte VARCHAR2(40) NOT NULL,
    CONSTRAINT Verif_Compte_PayPal CHECK (Compte LIKE '%@%.%' ),
    CONSTRAINT PK_Paypal PRIMARY KEY (NPay)
);

CREATE TABLE VirementBancaire (
    NVB NUMBER NOT NULL,
    RIB VARCHAR2(23),
    IBAN VARCHAR2(27),
    CONSTRAINT Verif_RIB CHECK ( REGEXP_LIKE(RIB,'^[0-9]{23}$') ),
    CONSTRAINT Verif_IBAN CHECK ( REGEXP_LIKE(IBAN,'^[[:alnum:]]{27}$') ),
    CONSTRAINT PK_VirementBancaire PRIMARY KEY (NVB)
);

CREATE TABLE MoyensPaiement (
    NMP NUMBER NOT NULL,
	NPe NUMBER NOT NULL,
    NCB NUMBER,
    NPay NUMBER,
    NVB NUMBER,
    CONSTRAINT PK_MoyensPaiement PRIMARY KEY (NMP)
);

CREATE TABLE Pays (
    Npa NUMBER NOT NULL,
    Nom VARCHAR2(40) NOT NULL,
    CONSTRAINT Verif_NomPays CHECK ( REGEXP_LIKE(Nom,'^[-[:alpha:]]+$') ),
    CONSTRAINT PK_Pays PRIMARY KEY (Npa)
);

CREATE TABLE Personne (
    NPe NUMBER NOT NULL,
    Nom VARCHAR2(40) NOT NULL,
    Prenom VARCHAR2(40) NOT NULL,
    DateInscription DATE DEFAULT SYSDATE NOT NULL,
    DateDeNaissance DATE NOT NULL,
    Adresse VARCHAR2(40) NOT NULL,
    Telephone VARCHAR2(40),
    Email VARCHAR2(40) NOT NULL,
    Login VARCHAR2(40) NOT NULL,
    Password VARCHAR2(40) NOT NULL,
    Npa NUMBER NOT NULL,
);

CREATE TABLE Acheteur (
    NAch NUMBER NOT NULL,
    VerifEmail CHAR(1) DEFAULT 'N' NOT NULL,
    NPe NUMBER NOT NULL,
    CONSTRAINT VerifEmail CHECK (VerifEmail IN ('O', 'N')),
    CONSTRAINT PK_Acheteur PRIMARY KEY (NAch)
);

CREATE TABLE Vendeur (
    NVe NUMBER NOT NULL,
    Verif CHAR(1) DEFAULT 'N' NOT NULL,
    NPe NUMBER NOT NULL,
    CONSTRAINT VerifVendeur CHECK (Verif IN ('O', 'N')),
    CONSTRAINT PK_Vendeur PRIMARY KEY (NVe)
);

CREATE TABLE Avis (
    Nav NUMBER NOT NULL,
    Note CHAR(1) DEFAULT 'N' NOT NULL,
    Commentaire VARCHAR2(40),
    NVe NUMBER,
    NAch NUMBER,
    CONSTRAINT Verif_Note CHECK (Note IN ('-', 'N', '+')), 
    CONSTRAINT PK_Avis PRIMARY KEY (Nav)
);

CREATE TABLE CarteBancaire (
    NCB NUMBER NOT NULL,
    Numero NUMBER NOT NULL,
	Expire DATE NOT NULL,
    Type VARCHAR2(10) NOT NULL,
    Cryptogramme NUMBER NOT NULL,
    CONSTRAINT Verif_Numero_CB CHECK (REGEXP_LIKE(Numero,'^[0-9]+$')),
    CONSTRAINT Verif_Type_CB CHECK (Type IN ('VISA', 'MasterCard', 'Autre')),
    CONSTRAINT Verif_Crypto_CB CHECK (REGEXP_LIKE(Cryptogramme,'^[0-9]{3}$')),
    CONSTRAINT PK_CarteBancaire PRIMARY KEY (NCB)
);

CREATE TABLE Categorie (
    NCat NUMBER NOT NULL,
    Nom VARCHAR2(40) NOT NULL,
    Description VARCHAR2(40),
    CONSTRAINT PK_Categorie PRIMARY KEY (NCat)
);

CREATE TABLE Produits (
    NPr NUMBER NOT NULL,
    Nom VARCHAR2(40) NOT NULL,
    Photo VARCHAR2(50),
    Description VARCHAR2(100),
    PrixDepart NUMBER(10,2) DEFAULT 1.00 NOT NULL,
    PrixReserve NUMBER(10,2),
    PrixAchatImmediat NUMBER(10,2),
    PrixActuel NUMBER(10,2) DEFAULT 1.00 NOT NULL,
    Etat CHAR(1) NOT NULL,
    DateDebut DATE DEFAULT SYSDATE NOT NULL,
    DateFin DATE NOT NULL,
    NVe NUMBER NOT NULL,
    NAch NUMBER,
    CONSTRAINT Etat_Produit CHECK (Etat IN ('E', 'B', 'V', 'F')),
    CONSTRAINT Verif_Prix CHECK (PrixDepart >= 1.00 AND PrixReserve >= 1.00 AND PrixAchatImmediat >= 1.00 AND PrixActuel >= 1.00),
    CONSTRAINT Verif_DateDebut_Inf_DateFin CHECK (DateDebut<DateFin),
    CONSTRAINT PK_Produits PRIMARY KEY (NPr)
);

CREATE TABLE Categorie_Produits (
    NCat NUMBER NOT NULL,
    NPr NUMBER NOT NULL,
    Principale CHAR(1) DEFAULT 'N' NOT NULL,
    CONSTRAINT Verif_Principale CHECK (Principale IN ('O', 'N'))
);

CREATE TABLE Encherir (
    NEn NUMBER NOT NULL,
	DateEnchere DATE DEFAULT SYSDATE NOT NULL,
    Montant NUMBER NOT NULL,
    MontantMax NUMBER,
    NAch NUMBER NOT NULL,
    NPr NUMBER NOT NULL,
    CONSTRAINT Verif_Montant CHECK ( Montant >= 1.00 ), 
    CONSTRAINT Verif_MontantMax CHECK ( MontantMax >= 1.00),
    CONSTRAINT PK_Encherir PRIMARY KEY (NEn)
);

CREATE TABLE ReponseCommentaire (
    NRC NUMBER NOT NULL,
    Reponse VARCHAR2(40) NOT NULL,
    Nav NUMBER NOT NULL,
    CONSTRAINT PK_ReponseCommentaire PRIMARY KEY (NRC)
);

CREATE TABLE Restriction (
    Nre NUMBER NOT NULL,
    Npa NUMBER NOT NULL,
    NCat NUMBER NOT NULL,
    CONSTRAINT PK_Restriction PRIMARY KEY (Nre)
);

/*============================================================================*/
/* Foreign keys                                                               */
/*============================================================================*/
ALTER TABLE MoyensPaiement
ADD CONSTRAINT FK_CB_MoyPaiement
FOREIGN KEY (NCB) REFERENCES CarteBancaire (NCB);

ALTER TABLE MoyensPaiement
ADD CONSTRAINT FK_PPal_MPaiement
FOREIGN KEY (NPay) REFERENCES Paypal (NPay);

ALTER TABLE MoyensPaiement
ADD CONSTRAINT FK_VB_MPaiement
FOREIGN KEY (NVB) REFERENCES VirementBancaire (NVB);

ALTER TABLE MoyensPaiement
ADD CONSTRAINT FK_Personne_MoyensPaiement
FOREIGN KEY (NPe) REFERENCES Personne (NPe);

ALTER TABLE Personne
ADD CONSTRAINT FK_Pays_Personne
FOREIGN KEY (Npa) REFERENCES Pays (Npa);

ALTER TABLE Acheteur
ADD CONSTRAINT FK_Personne_Acheteur
FOREIGN KEY (NPe) REFERENCES Personne (NPe);

ALTER TABLE Vendeur
ADD CONSTRAINT FK_Personne_Vendeur
FOREIGN KEY (NPe) REFERENCES Personne (NPe);

ALTER TABLE Avis
ADD CONSTRAINT FK_Acheteur_Avis
FOREIGN KEY (NAch) REFERENCES Acheteur (NAch);

ALTER TABLE Avis
ADD CONSTRAINT FK_Vendeur_Avis
FOREIGN KEY (NVe) REFERENCES Vendeur (NVe);

ALTER TABLE Produits
ADD CONSTRAINT FK_Vendeur_Produits
FOREIGN KEY (NVe) REFERENCES Vendeur (NVe);

ALTER TABLE Produits
ADD CONSTRAINT FK_Acheteur_Produits
FOREIGN KEY (NAch) REFERENCES Acheteur (NAch);

ALTER TABLE Categorie_Produits
ADD CONSTRAINT FK_Pro_Cat_Pro
FOREIGN KEY (NPr) REFERENCES Produits (NPr);

ALTER TABLE Categorie_Produits
ADD CONSTRAINT FK_Cat_Cat_Pro
FOREIGN KEY (NCat) REFERENCES Categorie (NCat);

ALTER TABLE Encherir
ADD CONSTRAINT FK_Pro_Encherir
FOREIGN KEY (NPr) REFERENCES Produits (NPr);

ALTER TABLE Encherir
ADD CONSTRAINT FK_Ach_Encherir
FOREIGN KEY (NAch) REFERENCES Acheteur (NAch);

ALTER TABLE ReponseCommentaire
ADD CONSTRAINT FK_Avis_RCom
FOREIGN KEY (Nav) REFERENCES Avis (Nav);

ALTER TABLE Restriction
ADD CONSTRAINT FK_Cat_Rest
FOREIGN KEY (NCat) REFERENCES Categorie (NCat);

ALTER TABLE Restriction
ADD CONSTRAINT FK_Pays_Rest
FOREIGN KEY (Npa) REFERENCES Pays (Npa);
