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 CONFIGURACION (
    CODIGO  		VARCHAR(50) NOT NULL,
    VALOR   		VARCHAR(255) NOT NULL,
		ID_EMPRESA 	TIPO_ID
);

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


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 1;


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 1;


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 1;


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 1;


CREATE TABLE CONTACTOS (
  ID TIPO_ID NOT NULL,
  REFERENCIA VARCHAR(255),
  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 1;

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

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

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 1;


CREATE TABLE CONTACTOS_DIRECCIONES (
	ID TIPO_ID NOT NULL,
  ID_CONTACTO TIPO_ID NOT NULL,
  CALLE VARCHAR(255),
  POBLACION VARCHAR(255),
  PROVINCIA VARCHAR(255),
  CODIGO_POSTAL VARCHAR(10),
  PERSONA_CONTACTO VARCHAR(255)
);

ALTER TABLE CONTACTOS_DIRECCIONES
ADD CONSTRAINT PK_CONTACTOS_DIR PRIMARY KEY (ID);

CREATE GENERATOR GEN_CONTACTOS_DIR_ID;
SET GENERATOR GEN_CONTACTOS_DIR_ID TO 1;


CREATE TABLE CLIENTES_DATOS (
  ID_CLIENTE TIPO_ID NOT NULL,
  ID_AGENTE TIPO_ID,
  BLOQUEADO TIPO_BOOLEANO DEFAULT 0 NOT NULL,
  GRUPO_CLIENTE VARCHAR(255),
  PORTE TIPO_IMPORTE,
  NOMBRE_COMERCIAL VARCHAR(255),  
  VENCIMIENTO_FACTURAS INTEGER,
	RECARGO_EQUIVALENCIA TIPO_PORCENTAJE,
	REGIMEN_IVA TIPO_PORCENTAJE
);

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

CREATE TABLE CLIENTES_GRUPOS (
	DESCRIPCION VARCHAR(255)
);

CREATE TABLE PROVEEDORES_DATOS (
  ID_PROVEEDOR TIPO_ID NOT NULL,
  DESCUENTO TIPO_PORCENTAJE,
  REGIMEN_IVA 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 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 GENERATOR GEN_FACTURAS_CLIENTE_ID;
SET GENERATOR GEN_FACTURAS_CLIENTE_ID TO 1;

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_UPDATE_FACTURAS_CLIENTE FOR FACTURAS_CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;


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,
  	FECHA_ALTA         TIMESTAMP,
  	FECHA_MODIFICACION TIMESTAMP
);
ALTER TABLE FACTURAS_CLIENTE_DETALLES ADD CONSTRAINT PK_FACTURAS_CLIENTE_DETALLES PRIMARY KEY (ID);

CREATE GENERATOR GEN_FACTURA_CLIENTE_DETALLES_ID;
SET GENERATOR GEN_FACTURA_CLIENTE_DETALLES_ID TO 1;

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_UPDATE_FACTURAS_CLIENTE_DET FOR FACTURAS_CLIENTE_DETALLES
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;




CREATE TABLE ALMACENES (
    ID                 TIPO_ID NOT NULL,
    ID_EMPRESA         TIPO_ID NOT NULL,
    NOMBRE             VARCHAR(255),
    CALLE              VARCHAR(255),
    PROVINCIA          VARCHAR(255),
    POBLACION          VARCHAR(255),
    CODIGO_POSTAL      VARCHAR(10),
    TELEFONO           VARCHAR(25),
    MOVIL              VARCHAR(25),
    FAX                VARCHAR(25),
    PERSONA_CONTACTO    VARCHAR(255),
    OBSERVACIONES      TIPO_NOTAS,
    FECHA_ALTA         TIMESTAMP,
    FECHA_MODIFICACION TIMESTAMP,
    USUARIO            TIPO_USUARIO
);

ALTER TABLE ALMACENES ADD CONSTRAINT PK_ALMACENES PRIMARY KEY (ID);

ALTER TABLE ALMACENES ADD CONSTRAINT FK_ALMACENES_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;

CREATE GENERATOR GEN_ALMACENES_ID;
SET GENERATOR GEN_ALMACENES_ID TO 1;

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


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

CREATE TABLE FAMILIAS (
    DESCRIPCION  VARCHAR(255)
);

CREATE TABLE ARTICULOS (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    DESCRIPCION         VARCHAR(255),
    FAMILIA             VARCHAR(255),
    IMAGEN              TIPO_BINARIO,
    COMISIONABLE        TIPO_BOOLEANO,
    ID_PROVEEDOR  	TIPO_ID,
    REFERENCIA_PROV	VARCHAR(255),
    PRECIO_COSTE  	TIPO_IMPORTE,
    DESCUENTO     	TIPO_PORCENTAJE,
    PRECIO_NETO   	TIPO_IMPORTE,
    PRECIO_PORTE  	TIPO_IMPORTE,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP,
    USUARIO             TIPO_USUARIO
);    
    
   
ALTER TABLE ARTICULOS ADD CONSTRAINT PK_ARTICULOS PRIMARY KEY (ID);
ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS_EMPRESA FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;

CREATE GENERATOR GEN_ARTICULOS_ID;
SET GENERATOR GEN_ARTICULOS_ID TO 1;


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

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


CREATE TABLE PEDIDOS_PROVEEDOR (
    ID                   TIPO_ID NOT NULL,
    ID_EMPRESA           TIPO_ID,
    ID_PROVEEDOR         TIPO_ID,
    REFERENCIA           VARCHAR(255),
    FECHA_PEDIDO         DATE,
    FECHA_CONFIRMACION   DATE,
    FECHA_ENTREGA        DATE,
    SITUACION            VARCHAR(255),
    ID_ALMACEN           TIPO_ID,
    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 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_UPDATE_PEDIDOS_PROVEEDOR FOR PEDIDOS_PROVEEDOR
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;


CREATE TABLE PEDIDOS_PROVEEDOR_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_PEDIDO           TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(10),
    REFERENCIA          VARCHAR(255),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            INTEGER,
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

ALTER TABLE PEDIDOS_PROVEEDOR_DETALLES ADD CONSTRAINT PK_PEDIDOS_PROVEEDOR_DETALLES PRIMARY KEY (ID);


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_UPDATE_PEDIDOS_PROV_DET FOR PEDIDOS_PROVEEDOR_DETALLES
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;


CREATE TABLE PEDIDOS_CLIENTE (
    ID                   TIPO_ID NOT NULL,
    ID_EMPRESA           TIPO_ID,
    ID_CLIENTE           TIPO_ID,
    REFERENCIA           VARCHAR(255),
    FECHA_PEDIDO         DATE,
    FECHA_CONFIRMACION   DATE,
    FECHA_ENTREGA        DATE,
    CALLE    		 	 VARCHAR(255),
    CODIGO_POSTAL        VARCHAR(10),
    POBLACION		 	 VARCHAR(255),
    PROVINCIA		 	 VARCHAR(255),
    PERSONA_CONTACTO     VARCHAR(255),
    TELEFONO             VARCHAR(25),
    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_CLIENTE ADD CONSTRAINT PK_PEDIDOS_CLIENTE PRIMARY KEY (ID);


CREATE GENERATOR GEN_PEDIDOS_PROV_ID;
SET GENERATOR GEN_PEDIDOS_PROV_ID TO 1;

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

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


CREATE TABLE PEDIDOS_CLIENTE_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_PEDIDO           TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(10),
    REFERENCIA          VARCHAR(255),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            INTEGER,
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

ALTER TABLE PEDIDOS_CLIENTE_DETALLES ADD CONSTRAINT PK_PEDIDOS_CLIENTE_DETALLES PRIMARY KEY (ID);


CREATE GENERATOR GEN_PEDIDOS_CLI_ID;
SET GENERATOR GEN_PEDIDOS_CLI_ID TO 1;

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

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



CREATE TABLE INVENTARIO (
    ID                   TIPO_ID NOT NULL,
    ID_ARTICULO          TIPO_ID,
    ID_ALMACEN           TIPO_ID,
    ID_PEDIDO_PROVEEDOR  TIPO_ID,
    ID_PEDIDO_CLIENTE    TIPO_ID
);

ALTER TABLE INVENTARIO ADD CONSTRAINT PK_INVENTARIO PRIMARY KEY (ID);
ALTER TABLE INVENTARIO ADD CONSTRAINT FK_INVENTARIO_ALMACENES FOREIGN KEY (ID_ALMACEN) REFERENCES ALMACENES (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE INVENTARIO ADD CONSTRAINT FK_INVENTARIO_ARTICULOS FOREIGN KEY (ID_ARTICULO) REFERENCES ARTICULOS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE INVENTARIO ADD CONSTRAINT FK_INVENTARIO_PEDIDOS_PRO FOREIGN KEY (ID_PEDIDO_PROVEEDOR) REFERENCES PEDIDOS_PROVEEDOR (ID) ON DELETE SET NULL ON UPDATE CASCADE;

CREATE GENERATOR GEN_INVENTARIO_ID;
SET GENERATOR GEN_INVENTARIO_ID TO 1;


CREATE TABLE ALBARANES_CLIENTE (
    ID                   TIPO_ID NOT NULL,
    ID_EMPRESA           TIPO_ID,
    ID_CLIENTE           TIPO_ID,
    FECHA_ALBARAN        DATE,
    ID_PEDIDO            TIPO_ID,    
    ID_FACTURA           TIPO_ID,
    REFERENCIA           VARCHAR(255),
    CALLE                VARCHAR(255),
    CODIGO_POSTAL        VARCHAR(10),
    POBLACION            VARCHAR(255),
    PROVINCIA            VARCHAR(255),
    PERSONA_CONTACTO     VARCHAR(255),
    TELEFONO             VARCHAR(25),
    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,
    INCIDENCIAS          TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS  SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA           TIMESTAMP,
    FECHA_MODIFICACION   TIMESTAMP,
    USUARIO              TIPO_USUARIO
);

ALTER TABLE ALBARANES_CLIENTE ADD CONSTRAINT PK_ALBARAN_CLIENTE PRIMARY KEY (ID);
ALTER TABLE ALBARANES_CLIENTE ADD CONSTRAINT FK_ALBARAN_CLIENTE1 FOREIGN KEY (ID_CLIENTE) REFERENCES CONTACTOS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALBARANES_CLIENTE ADD CONSTRAINT FK_ALBARAN_CLIENTE2 FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALBARANES_CLIENTE ADD CONSTRAINT FK_ALBARAN_CLIENTE3 FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS_CLIENTE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALBARANES_CLIENTE ADD CONSTRAINT FK_ALBARAN_CLIENTE4 FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_CLIENTE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;

CREATE GENERATOR GEN_ALBARANES_CLI_ID;
SET GENERATOR GEN_ALBARANES_CLI_ID TO 1;

/* Trigger: TRI_INSERT_ALBARANES_CLIENTE */
CREATE TRIGGER TRI_INSERT_ALBARANES_CLIENTE FOR ALBARANES_CLIENTE ACTIVE BEFORE INSERT POSITION 0 AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_ALBARANES_CLIENTE */
CREATE TRIGGER TRI_UPDATE_ALBARANES_CLIENTE FOR ALBARANES_CLIENTE ACTIVE BEFORE UPDATE POSITION 0 AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;


CREATE TABLE ALBARANES_CLIENTE_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_ALBARAN          TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(10),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            INTEGER,
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

ALTER TABLE ALBARANES_CLIENTE_DETALLES ADD CONSTRAINT PK_ALBARANES_CLIENTE_DETALLES PRIMARY KEY (ID);

CREATE GENERATOR GEN_ALBARANES_CLI_DETALLES_ID;
SET GENERATOR GEN_ALBARANES_CLI_DETALLES_ID TO 1;

/* Trigger: TRI_INSERT_ALBARANES_CLI_DET */
CREATE TRIGGER TRI_INSERT_ALBARANES_CLI_DET FOR ALBARANES_CLIENTE_DETALLES ACTIVE BEFORE INSERT POSITION 0 AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_ALBARANES_CLI_DET */
CREATE TRIGGER TRI_UPDATE_ALBARANES_CLI_DET FOR ALBARANES_CLIENTE_DETALLES ACTIVE BEFORE UPDATE POSITION 0 AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE TABLE ALBARANES_PROVEEDOR (
    ID                   TIPO_ID NOT NULL,
    ID_EMPRESA           TIPO_ID,
    ID_PROVEEDOR         TIPO_ID,
    FECHA_ALBARAN        DATE,
    ID_PEDIDO            TIPO_ID,    
    ID_FACTURA           TIPO_ID,
    REFERENCIA           VARCHAR(255),
    CALLE                VARCHAR(255),
    CODIGO_POSTAL        VARCHAR(10),
    POBLACION            VARCHAR(255),
    PROVINCIA            VARCHAR(255),
    PERSONA_CONTACTO     VARCHAR(255),
    TELEFONO             VARCHAR(25),
    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,
    INCIDENCIAS          TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS  SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA           TIMESTAMP,
    FECHA_MODIFICACION   TIMESTAMP,
    USUARIO              TIPO_USUARIO
);

ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT PK_ALBARAN_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT FK_ALBARAN_PROVEEDOR1 FOREIGN KEY (ID_PROVEEDOR) REFERENCES CONTACTOS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT FK_ALBARAN_PROVEEDOR2 FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT FK_ALBARAN_PROVEEDOR3 FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS_CLIENTE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT FK_ALBARAN_PROVEEDOR4 FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_CLIENTE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;

CREATE GENERATOR GEN_ALBARANES_PRO_ID;
SET GENERATOR GEN_ALBARANES_PRO_ID TO 1;

/* Trigger: TRI_INSERT_ALBARANES_PROVEEDOR */
CREATE TRIGGER TRI_INSERT_ALBARANES_PROVEEDOR FOR ALBARANES_PROVEEDOR ACTIVE BEFORE INSERT POSITION 0 AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_ALBARANES_PROVEEDOR */
CREATE TRIGGER TRI_UPDATE_ALBARANES_PROVEEDOR FOR ALBARANES_PROVEEDOR
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE TABLE ALBARANES_PROVEEDOR_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_ALBARAN          TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(10),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            INTEGER,
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

ALTER TABLE ALBARANES_PROVEEDOR_DETALLES ADD CONSTRAINT PK_ALBARANES_PROVEEDOR_DETALLES PRIMARY KEY (ID);

CREATE GENERATOR GEN_ALBARANES_PRO_DETALLES_ID;
SET GENERATOR GEN_ALBARANES_PRO_DETALLES_ID TO 1;

/* Trigger: TRI_INSERT_ALBARANES_PRO_DET */
CREATE TRIGGER TRI_INSERT_ALBARANES_PRO_DET FOR ALBARANES_PROVEEDOR_DETALLES ACTIVE BEFORE INSERT POSITION 0 AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_ALBARANES_PRO_DET */
CREATE TRIGGER TRI_UPDATE_ALBARANES_PRO_DET FOR ALBARANES_PROVEEDOR_DETALLES ACTIVE BEFORE UPDATE POSITION 0 AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;



CREATE TABLE REMESAS_CLIENTE (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    FECHA_REMESA        DATE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    DESCRIPCION         VARCHAR(255),
    FECHA_ALTA          DATE,
    FECHA_MODIFICACION  DATE,
    USUARIO             TIPO_USUARIO,
    ID_DATOS_BANCO      TIPO_ID
);
ALTER TABLE REMESAS_CLIENTE ADD CONSTRAINT PK_REMESAS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE REMESAS_CLIENTE ADD CONSTRAINT FK_REMESAS_CLIENTE FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID);

/* Trigger: TRI_INSERT_REMESAS_CLIENTE */
CREATE TRIGGER TRI_INSERT_REMESAS_CLIENTE FOR REMESAS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_REMESAS_CLI */
CREATE TRIGGER TRI_UPDATE_REMESAS_CLI FOR REMESAS_CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE GENERATOR GEN_REMESAS_CLIENTE_ID;
SET GENERATOR GEN_REMESAS_CLIENTE_ID TO 1;

CREATE TABLE RECIBOS_CLIENTE (
    ID                  TIPO_ID NOT NULL,
    ID_FACTURA          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    FECHA_EMISION       DATE,
    FECHA_VENCIMIENTO   DATE,
    DESCRIPCION         VARCHAR(255),
    OBSERVACIONES       VARCHAR(255),
    IMPORTE             TIPO_IMPORTE,
    OTROS_GASTOS        TIPO_IMPORTE,
    FECHA_ALTA          DATE,
    FECHA_MODIFICACION  DATE,
    USUARIO             TIPO_USUARIO,
    ID_REMESA           TIPO_ID
);
ALTER TABLE RECIBOS_CLIENTE ADD CONSTRAINT PK_RECIBOS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE RECIBOS_CLIENTE ADD CONSTRAINT FK_RECIBOS_CLIENTE FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_CLIENTE (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RECIBOS_CLIENTE ADD CONSTRAINT FK_RECIBOS_CLIENTE2 FOREIGN KEY (ID_REMESA) REFERENCES REMESAS_CLIENTE (ID) ON DELETE SET NULL ON UPDATE SET NULL;

/* Trigger: TRI_INSERT_RECIBOS_CLIENTE */
CREATE TRIGGER TRI_INSERT_RECIBOS_CLIENTE FOR RECIBOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_RECIBOS_CLIENTE */
CREATE TRIGGER TRI_UPDATE_RECIBOS_CLIENTE FOR RECIBOS_CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE GENERATOR GEN_RECIBOS_CLIENTE_ID;
SET GENERATOR GEN_RECIBOS_CLIENTE_ID TO 1;

CREATE TABLE PAGOS_CLIENTE (
    ID                  TIPO_ID NOT NULL,
    ID_RECIBO           TIPO_ID,
    TIPO                VARCHAR(255),
    FECHA_PAGO          DATE,
    TITULAR             VARCHAR(255),
    ENTIDAD             VARCHAR(15),
    SUCURSAL            VARCHAR(15),
    DC                  VARCHAR(15),
    CUENTA              VARCHAR(15),
    FECHA_ALTA          DATE,
    FECHA_MODIFICACION  DATE,
    USUARIO             TIPO_USUARIO
);
ALTER TABLE PAGOS_CLIENTE ADD CONSTRAINT PK_PAGOS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE PAGOS_CLIENTE ADD CONSTRAINT FK_PAGOS_CLIENTE FOREIGN KEY (ID_RECIBO) REFERENCES RECIBOS_CLIENTE (ID);

/* Trigger: TRI_INSERT_PAGOS_CLIENTE */
CREATE TRIGGER TRI_INSERT_PAGOS_CLIENTE FOR PAGOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.FECHA_ALTA = current_timestamp;
  NEW.FECHA_MODIFICACION = Null;
end;

/* Trigger: TRI_UPDATE_PAGOS_CLIENTE */
CREATE TRIGGER TRI_UPDATE_PAGOS_CLIENTE FOR PAGOS_CLIENTE
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  NEW.FECHA_MODIFICACION = current_timestamp;
end;

CREATE GENERATOR GEN_PAGOS_CLIENTE_ID;
SET GENERATOR GEN_PAGOS_CLIENTE_ID TO 1;

DECLARE EXTERNAL FUNCTION MOD
    INTEGER,
    INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'IB_UDF_mod' MODULE_NAME 'ib_udf';


CREATE TABLE MOVIMIENTOS (
    ID                TIPO_ID NOT NULL,
    ID_ALMACEN        TIPO_ID,
    ID_ARTICULO       TIPO_ID,
    FECHA_MOVIMIENTO  DATE,
    TIPO              VARCHAR(1),
    CANTIDAD          INTEGER,
    CAUSA             TIPO_CONCEPTO
);
ALTER TABLE MOVIMIENTOS ADD CONSTRAINT PK_MOVIMIENTOS PRIMARY KEY (ID);
ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS FOREIGN KEY (ID_ARTICULO) REFERENCES ARTICULOS (ID);
ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS2 FOREIGN KEY (ID_ALMACEN) REFERENCES ALMACENES (ID);
CREATE INDEX MOVIMIENTOS_IDX1 ON MOVIMIENTOS (TIPO);



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

INSERT INTO CATEGORIAS (ID, CATEGORIA) VALUES (1, 'CLIENTE');
INSERT INTO CATEGORIAS (ID, CATEGORIA) VALUES (2, 'PROVEEDOR');
INSERT INTO CATEGORIAS (ID, CATEGORIA) VALUES (3, 'AGENTE');

COMMIT;


INSERT INTO REFERENCIAS (CODIGO, VALOR, ID_EMPRESA) VALUES('REF_FACTURAS_CLIENTE', '2007/001', 1);
COMMIT;