CREATE DOMAIN TIPO_ID AS INTEGER;
CREATE DOMAIN TIPO_PERFIL AS VARCHAR(15);
CREATE DOMAIN TIPO_USUARIO AS VARCHAR(20);
CREATE DOMAIN TIPO_PASSWORD AS VARCHAR(10);
CREATE DOMAIN TIPO_NOTAS AS BLOB SUB_TYPE TEXT;
CREATE DOMAIN TIPO_BINARIO AS BLOB SUB_TYPE 0 SEGMENT SIZE 80;
CREATE DOMAIN TIPO_IMPORTE AS NUMERIC(11, 2);
CREATE DOMAIN TIPO_PORCENTAJE AS FLOAT;
CREATE DOMAIN TIPO_CONCEPTO AS VARCHAR(2000);
CREATE DOMAIN TIPO_BOOLEANO AS SMALLINT;

CREATE TABLE EMPRESAS (
  ID                 TIPO_ID NOT NULL,
  NIF_CIF            VARCHAR(15),
  NOMBRE             VARCHAR(255),
  RAZON_SOCIAL       VARCHAR(255),
  CALLE              VARCHAR(255),
  POBLACION          VARCHAR(255),
  PROVINCIA          VARCHAR(255),
  CODIGO_POSTAL      VARCHAR(10),
  TELEFONO_1         VARCHAR(25),
  TELEFONO_2         VARCHAR(25),
  MOVIL_1            VARCHAR(25),
  MOVIL_2            VARCHAR(25),
  FAX                VARCHAR(25),
  EMAIL_1            VARCHAR(255),
  EMAIL_2            VARCHAR(255),
  PAGINA_WEB         VARCHAR(255),
  NOTAS              TIPO_NOTAS,
  FECHA_ALTA         TIMESTAMP,
  FECHA_MODIFICACION TIMESTAMP,
  USUARIO            TIPO_USUARIO,
  LOGOTIPO           TIPO_BINARIO,
  REGISTRO_MERCANTIL VARCHAR(255),
  IVA                TIPO_PORCENTAJE
);

ALTER TABLE EMPRESAS ADD CONSTRAINT
PK_EMPRESAS
PRIMARY KEY (ID);

CREATE GENERATOR GEN_EMPRESAS_ID;
SET GENERATOR GEN_EMPRESAS_ID TO 0;


CREATE TABLE PERFILES (
  ID TIPO_ID NOT NULL,
  PERFIL TIPO_PERFIL NOT NULL
);

ALTER TABLE PERFILES
ADD CONSTRAINT PK_PERFILES PRIMARY KEY (ID);

CREATE GENERATOR GEN_PERFILES_ID;
SET GENERATOR GEN_PERFILES_ID TO 0;


CREATE TABLE USUARIOS (
  ID TIPO_ID NOT NULL,
  USUARIO TIPO_USUARIO NOT NULL,
  PASS TIPO_PASSWORD,
  ACTIVO TIPO_BOOLEANO,
  LAST_LOGIN TIMESTAMP
);

ALTER TABLE USUARIOS
ADD CONSTRAINT PK_USUARIOS PRIMARY KEY (ID);

CREATE GENERATOR GEN_USUARIOS_ID;
SET GENERATOR GEN_USUARIOS_ID TO 0;


CREATE TABLE PERFILES_USUARIOS (
  ID_PERFIL  TIPO_ID NOT NULL,
  ID_USUARIO TIPO_ID NOT NULL
);

ALTER TABLE PERFILES_USUARIOS
ADD CONSTRAINT PK_PERFILES_USUARIOS PRIMARY KEY (ID_PERFIL, ID_USUARIO);


CREATE TABLE CATEGORIAS (
  ID TIPO_ID NOT NULL,
  CATEGORIA VARCHAR(255) NOT NULL
);

ALTER TABLE CATEGORIAS
ADD CONSTRAINT PK_CATEGORIAS PRIMARY KEY (ID);

CREATE GENERATOR GEN_CATEGORIAS_ID;
SET GENERATOR GEN_CATEGORIAS_ID TO 0;


CREATE TABLE CONTACTOS (
  ID TIPO_ID NOT NULL,
  NIF_CIF VARCHAR(15),
  NOMBRE VARCHAR(255) NOT NULL,
  CALLE VARCHAR(255),
  POBLACION VARCHAR(255),
  PROVINCIA VARCHAR(255),
  CODIGO_POSTAL VARCHAR(10),
  TELEFONO_1 VARCHAR(25),
  TELEFONO_2 VARCHAR(25),
  MOVIL_1 VARCHAR(25),
  MOVIL_2 VARCHAR(25),
  FAX VARCHAR(25),
  EMAIL_1 VARCHAR(255),
  EMAIL_2 VARCHAR(255),
  PAGINA_WEB VARCHAR(255),
  NOTAS TIPO_NOTAS,
  FECHA_ALTA TIMESTAMP,
  FECHA_MODIFICACION TIMESTAMP,
  USUARIO TIPO_USUARIO
);

ALTER TABLE CONTACTOS
ADD CONSTRAINT PK_CONTACTOS PRIMARY KEY (ID);

CREATE GENERATOR GEN_CONTACTOS_ID;
SET GENERATOR GEN_CONTACTOS_ID TO 0;


CREATE TABLE CONTACTOS_CATEGORIAS (
  ID_CONTACTO TIPO_ID NOT NULL,
  ID_CATEGORIA TIPO_ID NOT NULL
);

ALTER TABLE CONTACTOS_CATEGORIAS
ADD CONSTRAINT PK_CONTACTOS_CATEGORIAS PRIMARY KEY (ID_CONTACTO, ID_CATEGORIA);

CREATE TABLE CONTACTOS_DATOS_BANCO (
  ID TIPO_ID NOT NULL,
  ID_CONTACTO TIPO_ID NOT NULL,
  TITULAR VARCHAR(255),
  ENTIDAD VARCHAR(15),
  SUCURSAL VARCHAR(15),
  DC VARCHAR(15),
  CUENTA VARCHAR(15)
);

ALTER TABLE CONTACTOS_DATOS_BANCO
ADD CONSTRAINT PK_CONTACTOS_DATOS_BANCO PRIMARY KEY (ID);

CREATE INDEX IDX_CONTACTOS_DATOS_BANCO
ON CONTACTOS_DATOS_BANCO (ID_CONTACTO);

CREATE GENERATOR GEN_CONTACTOS_DATOS_BANCO_ID;
SET GENERATOR GEN_CONTACTOS_DATOS_BANCO_ID TO 0;

CREATE TABLE CLIENTES_DATOS (
  ID_CLIENTE TIPO_ID NOT NULL,
  ID_VENDEDOR TIPO_ID, 
  PROCEDENCIA VARCHAR(2000)
);

ALTER TABLE CLIENTES_DATOS
ADD CONSTRAINT PK_CLIENTES_DATOS PRIMARY KEY (ID_CLIENTE);

CREATE TABLE VENDEDORES_DATOS (
  ID_VENDEDOR TIPO_ID NOT NULL,
  PORCENTAJE_COMISION TIPO_PORCENTAJE DEFAULT 0
);

ALTER TABLE VENDEDORES_DATOS
ADD CONSTRAINT PK_VENDEDORES_DATOS PRIMARY KEY (ID_VENDEDOR);

CREATE TABLE PROVEEDORES_DATOS (
  ID_PROVEEDOR TIPO_ID NOT NULL,
  DISTRIBUYE VARCHAR(2000),
  DESCUENTO TIPO_PORCENTAJE
);

ALTER TABLE PROVEEDORES_DATOS
ADD CONSTRAINT PK_PROVEEDORES_DATOS PRIMARY KEY (ID_PROVEEDOR);

CREATE TABLE EMPRESAS_CONTACTOS (
  ID_EMPRESA  TIPO_ID NOT NULL,
  ID_CONTACTO TIPO_ID NOT NULL
);

ALTER TABLE EMPRESAS_CONTACTOS ADD CONSTRAINT
PK_EMPRESAS_CONTACTOS
PRIMARY KEY (ID_EMPRESA, ID_CONTACTO);


CREATE TABLE EMPRESAS_USUARIOS (
  ID_EMPRESA  TIPO_ID NOT NULL,
  ID_USUARIO TIPO_ID NOT NULL
);

ALTER TABLE EMPRESAS_USUARIOS ADD CONSTRAINT
PK_EMPRESAS_USUARIOS
PRIMARY KEY (ID_EMPRESA, ID_USUARIO);


CREATE TABLE PRESUPUESTOS (
  ID                 TIPO_ID NOT NULL,
  ID_EMPRESA         TIPO_ID,
  ID_CLIENTE         TIPO_ID,
  ID_VENDEDOR        TIPO_ID,
  TIPO               VARCHAR(10),  
  REFERENCIA         VARCHAR(255),
  FECHA_PRESUPUESTO  DATE,
  VIGENCIA           INTEGER,
  SITUACION          VARCHAR(255),
  FECHA_DECISION     DATE,
  BASE_IMPONIBLE     TIPO_IMPORTE,
  DESCUENTO          TIPO_PORCENTAJE,
  IMPORTE_DESCUENTO  TIPO_IMPORTE,
  IVA                TIPO_PORCENTAJE,
  IMPORTE_IVA        TIPO_IMPORTE,
  IMPORTE_TOTAL      TIPO_IMPORTE,
  OBSERVACIONES      TIPO_NOTAS,
  PLAZO_ENTREGA      TIPO_NOTAS,
  FORMA_PAGO         TIPO_NOTAS,
  FECHA_ALTA         TIMESTAMP,
  FECHA_MODIFICACION TIMESTAMP,
  USUARIO            TIPO_USUARIO
);

ALTER TABLE PRESUPUESTOS
ADD CONSTRAINT PK_PRESUPUESTOS PRIMARY KEY (ID);

CREATE GENERATOR GEN_PRESUPUESTOS_ID;
SET GENERATOR GEN_PRESUPUESTOS_ID TO 0;



CREATE TABLE PRESUPUESTOS_DETALLES (
  ID TIPO_ID NOT NULL,
  ID_PRESUPUESTO TIPO_ID NOT NULL,
  POSICION INTEGER,
  TIPO_DETALLE VARCHAR(10),
  CONCEPTO TIPO_CONCEPTO,
  CANTIDAD INTEGER,
  PUNTOS INTEGER,
  IMPORTE_PUNTOS TIPO_IMPORTE,
  IMPORTE_UNIDAD TIPO_IMPORTE,
  IMPORTE_TOTAL TIPO_IMPORTE,
  VISIBLE TIPO_BOOLEANO
);

ALTER TABLE PRESUPUESTOS_DETALLES
ADD CONSTRAINT PK_PRESUPUESTOS_DETALLES PRIMARY KEY (ID);

CREATE GENERATOR GEN_PRESUPUESTOS_DETALLES_ID;
SET GENERATOR GEN_PRESUPUESTOS_DETALLES_ID TO 0;



CREATE TABLE FACTURAS_CLIENTE (
    ID		      TIPO_ID NOT NULL,
    ID_EMPRESA        TIPO_ID,
    ID_CONTRATO       TIPO_ID,
    REFERENCIA        VARCHAR(255),
    FECHA_FACTURA     DATE,
    VENCIMIENTO       INTEGER,
    SITUACION         VARCHAR(255),
    FECHA_PAGADO			DATE,
    BASE_IMPONIBLE    TIPO_IMPORTE,
    DESCUENTO         TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO TIPO_IMPORTE,
    IVA               TIPO_PORCENTAJE,
    IMPORTE_IVA       TIPO_IMPORTE,
    IMPORTE_TOTAL     TIPO_IMPORTE,
    OBSERVACIONES     TIPO_NOTAS,
    FORMA_PAGO        TIPO_NOTAS,
    ID_CLIENTE        TIPO_ID,
    NIF_CIF           VARCHAR(15),
    NOMBRE            VARCHAR(255),
    CALLE             VARCHAR(255),
    POBLACION         VARCHAR(255),
    PROVINCIA         VARCHAR(255),
    CODIGO_POSTAL     VARCHAR(10),
    FECHA_ALTA         TIMESTAMP,
    FECHA_MODIFICACION TIMESTAMP,
    USUARIO            TIPO_USUARIO
);
ALTER TABLE FACTURAS_CLIENTE ADD CONSTRAINT PK_FACTURAS_CLIENTE PRIMARY KEY (ID);

ALTER TABLE FACTURAS_CLIENTE ADD CONSTRAINT FK_FACTURAS_CLIENTE_CONTACTOS FOREIGN KEY (ID_CLIENTE) REFERENCES CONTACTOS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE FACTURAS_CLIENTE ADD CONSTRAINT FK_FACTURAS_CLIENTE_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;


CREATE TABLE FACTURAS_CLIENTE_DETALLES (
    ID              TIPO_ID NOT NULL,
    ID_FACTURA      TIPO_ID NOT NULL,
    POSICION        INTEGER,
    TIPO_DETALLE    VARCHAR(10),
    CONCEPTO        TIPO_CONCEPTO,
    CANTIDAD        INTEGER,
    IMPORTE_UNIDAD  TIPO_IMPORTE,
    IMPORTE_TOTAL   TIPO_IMPORTE,
    VISIBLE         TIPO_BOOLEANO
);
ALTER TABLE FACTURAS_CLIENTE_DETALLES ADD CONSTRAINT PK_FACTURAS_CLIENTE_DETALLES PRIMARY KEY (ID);



CREATE TABLE PEDIDOS_PROVEEDOR (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID,
    ID_PROVEEDOR        TIPO_ID,
    ID_MONTAJE          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    FECHA_PEDIDO        DATE,
    FECHA_CONFIRMACION  DATE,
    FECHA_ENTREGA       DATE,
    SITUACION           VARCHAR(255),
    DIRECCION_ENTREGA   TIPO_NOTAS,
    OBSERVACIONES       TIPO_NOTAS,
    IMPORTE_TOTAL        TIPO_IMPORTE,
    INCIDENCIAS         TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS  SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP,
    USUARIO             TIPO_USUARIO
);
ALTER TABLE PEDIDOS_PROVEEDOR ADD CONSTRAINT PK_PEDIDOS_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE PEDIDOS_PROVEEDOR ADD CONSTRAINT FK_PEDIDOS_PROVEEDOR FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID);
ALTER TABLE PEDIDOS_PROVEEDOR ADD CONSTRAINT FK_PEDIDOS_PROVEEDOR2 FOREIGN KEY (ID_PROVEEDOR) REFERENCES CONTACTOS (ID);

CREATE GENERATOR GEN_PEDIDOS_PROV_ID;
SET GENERATOR GEN_PEDIDOS_PROV_ID TO 0;

CREATE TABLE PEDIDOS_PROVEEDOR_DETALLES (
    ID              TIPO_ID NOT NULL,
    ID_PEDIDO       TIPO_ID NOT NULL,
    POSICION        INTEGER,
    TIPO_DETALLE    VARCHAR(10),
    CONCEPTO        TIPO_CONCEPTO,
    CANTIDAD        INTEGER,
    IMPORTE_UNIDAD  TIPO_IMPORTE,
    IMPORTE_TOTAL   TIPO_IMPORTE,
    VISIBLE         TIPO_BOOLEANO
);
ALTER TABLE PEDIDOS_PROVEEDOR_DETALLES ADD CONSTRAINT PK_PEDIDOS_PROVEEDOR_DETALLES PRIMARY KEY (ID);

CREATE GENERATOR GEN_PEDIDOS_PROV_DETALLES_ID;
SET GENERATOR GEN_PEDIDOS_PROV_DETALLES_ID TO 0;


CREATE TABLE CONFIGURACION (
    CODIGO  VARCHAR(50) NOT NULL,
    VALOR   VARCHAR(255) NOT NULL
);

CREATE TABLE REFERENCIAS (
    CODIGO  VARCHAR(50) NOT NULL,
    VALOR   VARCHAR(255) NOT NULL
);

CREATE TABLE COBROS (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID,
    ID_CLIENTE          TIPO_ID,
    ID_MONTAJE          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    FECHA_COBRO         TIMESTAMP,
    DESCRIPCION         TIPO_CONCEPTO,
    IMPORTE             TIPO_IMPORTE,
    FORMA_PAGO          VARCHAR(255),
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP,
    USUARIO             TIPO_USUARIO
);

ALTER TABLE COBROS ADD CONSTRAINT PK_COBROS PRIMARY KEY (ID);
ALTER TABLE COBROS ADD CONSTRAINT FK_COBROS FOREIGN KEY (ID_CLIENTE) REFERENCES CONTACTOS (ID);

CREATE GENERATOR GEN_COBROS_CLIENTE_ID;
SET GENERATOR GEN_COBROS_CLIENTE_ID TO 1;

ALTER TABLE PRESUPUESTOS_DETALLES
ADD DESCUENTO TIPO_PORCENTAJE;

ALTER TABLE REFERENCIAS
ADD ID_EMPRESA TIPO_ID;

alter table REFERENCIAS
add constraint FK_REFERENCIAS
foreign key (ID_EMPRESA)
references EMPRESAS(ID);


ALTER TABLE FACTURAS_CLIENTE_DETALLES
ADD FECHA_ALTA TIMESTAMP;

ALTER TABLE FACTURAS_CLIENTE_DETALLES
ADD FECHA_MODIFICACION TIMESTAMP;

ALTER TABLE PEDIDOS_PROVEEDOR_DETALLES
ADD FECHA_ALTA TIMESTAMP;

ALTER TABLE PEDIDOS_PROVEEDOR_DETALLES
ADD FECHA_MODIFICACION TIMESTAMP;

ALTER TABLE PRESUPUESTOS_DETALLES
ADD FECHA_ALTA TIMESTAMP;

ALTER TABLE PRESUPUESTOS_DETALLES
ADD FECHA_MODIFICACION TIMESTAMP;


CREATE TRIGGER TRI_INSERT_FACTURAS_CLIENTE FOR FACTURAS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

CREATE TRIGGER TRI_INSERT_PEDIDOS_PROVEEDOR FOR PEDIDOS_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

CREATE TRIGGER TRI_INSERT_PRESUPUESTOS FOR PRESUPUESTOS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

CREATE TRIGGER TRI_INSERT_FACTURAS_CLIENTE_DET FOR FACTURAS_CLIENTE_DETALLES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

CREATE TRIGGER TRI_INSERT_PEDIDOS_PROV_DET FOR PEDIDOS_PROVEEDOR_DETALLES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

CREATE TRIGGER TRI_INSERT_PRESUPUESTOS_DET FOR PRESUPUESTOS_DETALLES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;


CREATE TRIGGER TRI_UPDATE_FACTURAS_CLIENTE FOR FACTURAS_CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE TRIGGER TRI_UPDATE_PEDIDOS_PROVEEDOR FOR PEDIDOS_PROVEEDOR
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE TRIGGER TRI_UPDATE_PRESUPUESTOS FOR PRESUPUESTOS
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;


CREATE TRIGGER TRI_UPDATE_FACTURAS_CLIENTE_DET FOR FACTURAS_CLIENTE_DETALLES
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE TRIGGER TRI_UPDATE_PEDIDOS_PROV_DET FOR PEDIDOS_PROVEEDOR_DETALLES
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE TRIGGER TRI_UPDATE_PRESUPUESTOS_DET FOR PRESUPUESTOS_DETALLES
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

ALTER TABLE PEDIDOS_PROVEEDOR_DETALLES
ADD REFERENCIA VARCHAR(255);

ALTER TABLE COBROS ADD CONSTRAINT FK_COBROS_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
alter table PRESUPUESTOS add constraint FK_PRESUPUESTOS2 foreign key (ID_CLIENTE) references CONTACTOS(ID) ON DELETE NO ACTION ON UPDATE NO ACTION;

/****************************************************************************/
/* INSERTAR DATOS */

INSERT INTO CATEGORIAS (CATEGORIA) VALUES ('CLIENTE');
INSERT INTO CATEGORIAS (CATEGORIA) VALUES ('PROVEEDOR');
INSERT INTO CATEGORIAS (CATEGORIA) VALUES ('VENDEDOR');
INSERT INTO CATEGORIAS (CATEGORIA) VALUES ('INSTALADOR');

INSERT INTO REFERENCIAS (CODIGO, VALOR) VALUES ('REF_PRESUPUESTOS', '0');

COMMIT;

