CREATE DOMAIN CODIGOSALMACENES AS
SMALLINT;

CREATE DOMAIN NOMBRESALMACEN AS
VARCHAR(100)
COLLATE ES_ES;

CREATE DOMAIN TIPOSALMACEN AS
VARCHAR(1)
DEFAULT 'O'
COLLATE ES_ES;

CREATE DOMAIN UNIDADESMEDIDA AS
VARCHAR(30)
COLLATE ES_ES;

CREATE DOMAIN SITUACIONESPEDIDO AS
VARCHAR(30) CHARACTER SET ISO8859_1
NOT NULL
COLLATE ES_ES;



insert into contadores values (18, 'ALMACENES', NULL, 0);
insert into contadores values (19, 'PEDIDOSPROVEEDOR', 12, 0);

/*INSERT INTO DETALLECONTADORES (CODIGOEMPRESA, CODIGOTABLA, SERIADO, DIA, MES, ANO, CONTADOR, CONTDIA, CONTMES, CONTANO) VALUES(0, 18, 'ALM', 0, 0, 0, 0, NULL, NULL, NULL);*/
INSERT INTO DETALLECONTADORES (CODIGOEMPRESA, CODIGOTABLA, SERIADO, DIA, MES, ANO, CONTADOR, CONTDIA, CONTMES, CONTANO) VALUES(0, 19, 'PED', 0, 0, 1, 0, NULL, NULL, '06');


CREATE TABLE UNIDADESMEDIDA (
    DESCRIPCION  UNIDADESMEDIDA NOT NULL
);

ALTER TABLE UNIDADESMEDIDA ADD CONSTRAINT PK_UNIDADESMEDIDA PRIMARY KEY (DESCRIPCION);



CREATE TABLE SITUPEDIDOS (
  DESCRIPCION SITUACIONESPEDIDO NOT NULL
);

INSERT INTO SITUPEDIDOS (DESCRIPCION) VALUES('No emitido');
INSERT INTO SITUPEDIDOS (DESCRIPCION) VALUES('Emitido');
INSERT INTO SITUPEDIDOS (DESCRIPCION) VALUES('Parcialmente recibido');
INSERT INTO SITUPEDIDOS (DESCRIPCION) VALUES('Totalmente recibido');
INSERT INTO SITUPEDIDOS (DESCRIPCION) VALUES('Devuelto');

COMMIT WORK;



CREATE TABLE ARTICULOS (
  CODIGO         CODIGOS NOT NULL,
  FAMILIA        FAMILIAS,
  DESCRIPCION    DESCRIPCIONES,
  UNIDADESMEDIDA UNIDADESMEDIDA,
  OBSERVACIONES  OBSERVACIONES,
  PRECIO         IMPORTES6
);

ALTER TABLE ARTICULOS ADD CONSTRAINT PK_ARTICULOS PRIMARY KEY (CODIGO);




CREATE TABLE ALMACENES (
  CODIGOEMPRESA   CODIGOSEMPRESAS NOT NULL,
  CODIGO          CODIGOSALMACENES NOT NULL,
  TIPO            TIPOSALMACEN NOT NULL,
  NOMBRE          NOMBRESALMACEN,
  CALLE           CALLES,
  NUMERO          NUMPISOS,
  PISO            NUMPISOS,
  CODIGOPOSTAL    CODIGOSPOSTALES,
  POBLACION       POBLACIONES,
  PROVINCIA       PROVINCIAS,
  TELEFONO        TELEFONOS,
  PERSONACONTACTO NOMBRES,
  CODIGOCLIENTE   CODIGOS
);

ALTER TABLE ALMACENES ADD CONSTRAINT PK_ALMACENES PRIMARY KEY (CODIGOEMPRESA, CODIGO);
ALTER TABLE ALMACENES ADD FOREIGN KEY (CODIGOEMPRESA) REFERENCES EMPRESAS (CODIGO) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ALMACENES ADD FOREIGN KEY (CODIGOCLIENTE) REFERENCES CLIENTES (CODIGO) ON DELETE NO ACTION ON UPDATE NO ACTION;



CREATE TABLE ESTADOALMACEN (
    CODIGOEMPRESA    CODIGOSEMPRESAS NOT NULL,
    CODIGOALMACEN    CODIGOSALMACENES NOT NULL,
    CODIGOARTICULO   CODIGOS NOT NULL,
    EXISTENCIAS      CANTIDADES,
    STOCKMIN         INTEGER,
    STOCKMAX         INTEGER,
    FECHARECEPCION   FECHAS,
    PRECIORECEPCION  IMPORTES6
);

ALTER TABLE ESTADOALMACEN ADD CONSTRAINT PK_ESTADOALMACEN PRIMARY KEY (CODIGOEMPRESA, CODIGOALMACEN, CODIGOARTICULO);
ALTER TABLE ESTADOALMACEN ADD FOREIGN KEY (CODIGOARTICULO) REFERENCES ARTICULOS (CODIGO) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ESTADOALMACEN ADD FOREIGN KEY (CODIGOEMPRESA, CODIGOALMACEN) REFERENCES ALMACENES (CODIGOEMPRESA, CODIGO) ON DELETE CASCADE ON UPDATE NO ACTION;



CREATE TABLE ESTADOOBRASHISTORICAS (
    CODIGOEMPRESA    CODIGOSEMPRESAS NOT NULL,
    CODIGOOBRA       CODIGOSALMACENES NOT NULL,
    FECHACIERRE      FECHAS NOT NULL,
    CODIGOARTICULO   CODIGOS NOT NULL,
    FAMILIA          FAMILIAS,
    DESCRIPCION      DESCRIPCIONES,
    UNIDADESMEDIDA   UNIDADESMEDIDA,
    EXISTENCIAS      CANTIDADES,
    OBSERVACIONES    OBSERVACIONES,
    PRECIORECEPCION  IMPORTES6,
    FECHARECEPCION   FECHAS
);

ALTER TABLE ESTADOOBRASHISTORICAS ADD CONSTRAINT PK_ESTADOOBRASHISTORICAS PRIMARY KEY (CODIGOEMPRESA, FECHACIERRE, CODIGOOBRA, CODIGOARTICULO);
ALTER TABLE ESTADOOBRASHISTORICAS ADD FOREIGN KEY (CODIGOEMPRESA, CODIGOOBRA, FECHACIERRE) REFERENCES OBRASHISTORICAS (CODIGOEMPRESA, CODIGO, FECHACIERRE) ON DELETE CASCADE ON UPDATE NO ACTION;


CREATE TABLE OBRASPRESUPUESTOS (
    CODIGOEMPRESA      CODIGOSEMPRESAS NOT NULL,
    CODIGOALMACEN      CODIGOSALMACENES NOT NULL,
    CODIGOPRESUPUESTO  CODIGOSESPECIALES NOT NULL
);

ALTER TABLE OBRASPRESUPUESTOS ADD CONSTRAINT PK_OBRASPRESUPUESTOS PRIMARY KEY (CODIGOPRESUPUESTO, CODIGOALMACEN, CODIGOEMPRESA);
ALTER TABLE OBRASPRESUPUESTOS ADD CONSTRAINT FK_OBRASPRESUPUESTOS FOREIGN KEY (CODIGOEMPRESA, CODIGOALMACEN) REFERENCES ALMACENES (CODIGOEMPRESA, CODIGO) ON DELETE CASCADE ON UPDATE CASCADE;
/*ALTER TABLE OBRASPRESUPUESTOS ADD CONSTRAINT FK_OBRASPRESUPUESTOS2 FOREIGN KEY (CODIGOEMPRESA, CODIGOPRESUPUESTO) REFERENCES PRESUPUESTOSCLIENTE (CODIGOEMPRESA, CODIGO) ON DELETE CASCADE ON UPDATE CASCADE;*/


CREATE TABLE OBRASHISTORICASPRESUPUESTOS (
    CODIGOEMPRESA      CODIGOSEMPRESAS NOT NULL,
    CODIGOALMACEN      CODIGOSALMACENES NOT NULL,
    FECHACIERRE        FECHAS NOT NULL,
    CODIGOPRESUPUESTO  CODIGOSESPECIALES NOT NULL
);

ALTER TABLE OBRASHISTORICASPRESUPUESTOS ADD CONSTRAINT PK_OBRASHISTORICASPRESUPUES PRIMARY KEY (CODIGOEMPRESA, CODIGOALMACEN, FECHACIERRE, CODIGOPRESUPUESTO);
ALTER TABLE OBRASHISTORICASPRESUPUESTOS ADD CONSTRAINT FK_OBRASHISTORICASPRESUPUES FOREIGN KEY (CODIGOEMPRESA, CODIGOALMACEN, FECHACIERRE) REFERENCES OBRASHISTORICAS (CODIGOEMPRESA, CODIGO, FECHACIERRE) ON DELETE CASCADE ON UPDATE CASCADE;


CREATE TABLE OBRASHISTORICAS (
    CODIGOEMPRESA    CODIGOSEMPRESAS NOT NULL,
    CODIGO           CODIGOSALMACENES NOT NULL,
    FECHACIERRE      FECHAS NOT NULL,
    NOMBRE           NOMBRESALMACEN,
    CALLE            CALLES,
    NUMERO           NUMPISOS,
    PISO             NUMPISOS,
    CODIGOPOSTAL     CODIGOSPOSTALES,
    POBLACION        POBLACIONES,
    PROVINCIA        PROVINCIAS,
    TELEFONO         TELEFONOS,
    PERSONACONTACTO  NOMBRES
);

ALTER TABLE OBRASHISTORICAS ADD CONSTRAINT PK_OBRASHISTORICAS PRIMARY KEY (CODIGOEMPRESA, CODIGO, FECHACIERRE);
ALTER TABLE OBRASHISTORICAS ADD FOREIGN KEY (CODIGOEMPRESA) REFERENCES EMPRESAS (CODIGO) ON DELETE NO ACTION ON UPDATE NO ACTION;


CREATE TABLE TIPOSMOVIMIENTOS (
  DESCRIPCION VARCHAR(20) NOT NULL
);

INSERT INTO TIPOSMOVIMIENTOS (DESCRIPCION) VALUES('Traslado');
INSERT INTO TIPOSMOVIMIENTOS (DESCRIPCION) VALUES('Regularización');
INSERT INTO TIPOSMOVIMIENTOS (DESCRIPCION) VALUES('Pedido');
INSERT INTO TIPOSMOVIMIENTOS (DESCRIPCION) VALUES('Devolucion');

COMMIT WORK;


CREATE TABLE MOVIMIENTOS (
  CODIGO              CODIGOSESPECIALES NOT NULL,
  CODIGOEMPRESA       CODIGOSEMPRESAS NOT NULL,
  CODIGOALMACEN       CODIGOSALMACENES NOT NULL,
  CODIGOARTICULO      CODIGOS NOT NULL,
  NOMBREALMACEN       NOMBRESALMACEN,
  DESCRIPCIONARTICULO DESCRIPCIONES,
  FAMILIA             FAMILIAS,
  UNIDADES            UNIDADESMEDIDA,
  TIPOOPERACION       VARCHAR(12) NOT NULL,
  TIPOMOVIMIENTO      VARCHAR(15) NOT NULL,
  CANTIDAD            CANTIDADES NOT NULL,
  STOCKNUEVO          CANTIDADES,
  STOCKANTIGUO        CANTIDADES,
  FECHA               FECHAS NOT NULL,
  HORA                HORAS NOT NULL,
  USUARIO             NOMBRES NOT NULL,
  CAUSA               OBSERVACIONES,
  NOMBRECLIENTE       NOMBRES
);

ALTER TABLE MOVIMIENTOS ADD CONSTRAINT
PK_MOVIMIENTOS
PRIMARY KEY (CODIGO);

ALTER TABLE MOVIMIENTOS ADD
FOREIGN KEY (CODIGOEMPRESA, CODIGOALMACEN) REFERENCES ALMACENES (CODIGOEMPRESA, CODIGO) 
ON DELETE CASCADE;



CREATE TABLE PEDIDOSPROVEEDOR (
    CODIGOEMPRESA           CODIGOSEMPRESAS NOT NULL,
    CODIGO                  CODIGOSESPECIALES NOT NULL,
    FECHAALTA               FECHAS NOT NULL,
    FECHAEMISION            FECHAS,
    FECHARECEPCION          FECHAS,
    FECHADEVOLUCION         FECHAS,
    SITUACION               SITUACIONESPEDIDO NOT NULL,
    USUARIO                 NOMBRES NOT NULL,
    NOTAS                   OBSERVACIONES,
    CODIGOPROVEEDOR         CODIGOS,
    NIFCIF                  NIFCIFS,
    NOMBRE                  NOMBRES,
    FAX                     TELEFONOS,
    PERSONACONTACTO         NOMBRES,
    CODIGOCLIENTE           CODIGOS,
    CODIGOALMACEN           CODIGOSALMACENES,
    NOMBREALMACEN           NOMBRESALMACEN,
    CALLEALMACEN            CALLES,
    NUMEROALMACEN           NUMPISOS,
    PISOALMACEN             NUMPISOS,
    CODIGOPOSTALALMACEN     CODIGOSPOSTALES,
    POBLACIONALMACEN        POBLACIONES,
    PROVINCIAALMACEN        PROVINCIAS,
    PERSONACONTACTOALMACEN  NOMBRES,
    IMPORTETOTAL            IMPORTES2,
    CODIGOFACTURA           CODIGOSESPECIALES,
    CODIGOOBRA              CODIGOSALMACENES,
    NOMBREOBRA              NOMBRESALMACEN
);

ALTER TABLE PEDIDOSPROVEEDOR ADD CONSTRAINT PK_PEDIDOSPROVEEDOR PRIMARY KEY (CODIGOEMPRESA, CODIGO);
ALTER TABLE PEDIDOSPROVEEDOR ADD FOREIGN KEY (CODIGOEMPRESA) REFERENCES EMPRESAS (CODIGO) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE PEDIDOSPROVEEDOR ADD FOREIGN KEY (CODIGOEMPRESA, CODIGOFACTURA) REFERENCES FACTURASPROVEEDOR (CODIGOEMPRESA, CODIGO) ON UPDATE CASCADE;



CREATE TABLE DETALLESPEDIDOSPROVEEDOR (
  CODIGOEMPRESA  CODIGOSEMPRESAS NOT NULL,
  CODIGOPEDIDO   CODIGOSESPECIALES NOT NULL,
  NUMCONCEPTO    NUMCONCEPTOS NOT NULL,
  CODIGOARTICULO CODIGOS,
  REFERENCIA     REFERENCIAS,
  DESCRIPCION    DESCRIPCIONES,
  CANTIDAD       CANTIDADES,
  UNIDADESMEDIDA UNIDADESMEDIDA,
  PRECIO         IMPORTES6,
  DESCUENTO      PORCENTAJES,
  TOTAL          IMPORTES6,
  PENDIENTES     CANTIDADES
);

ALTER TABLE DETALLESPEDIDOSPROVEEDOR ADD CONSTRAINT PK_DETALLESPEDIDOSPROVEEDOR PRIMARY KEY (CODIGOEMPRESA, CODIGOPEDIDO, NUMCONCEPTO);
ALTER TABLE DETALLESPEDIDOSPROVEEDOR ADD FOREIGN KEY (CODIGOEMPRESA, CODIGOPEDIDO) REFERENCES PEDIDOSPROVEEDOR (CODIGOEMPRESA, CODIGO) ON DELETE CASCADE ON UPDATE CASCADE;

CREATE INDEX DETALLESPEDIDOSPROVEEDOR_IDX1 ON DETALLESPEDIDOSPROVEEDOR (CODIGOARTICULO);


CREATE TABLE OBRASHISTORICAS (
    CODIGOEMPRESA    CODIGOSEMPRESAS NOT NULL,
    CODIGO           CODIGOSALMACENES NOT NULL,
    FECHACIERRE      FECHAS NOT NULL,
    NOMBRE           NOMBRESALMACEN,
    CALLE            CALLES,
    NUMERO           NUMPISOS,
    PISO             NUMPISOS,
    CODIGOPOSTAL     CODIGOSPOSTALES,
    POBLACION        POBLACIONES,
    PROVINCIA        PROVINCIAS,
    TELEFONO         TELEFONOS,
    PERSONACONTACTO  NOMBRES
);
ALTER TABLE OBRASHISTORICAS ADD CONSTRAINT PK_OBRASHISTORICAS PRIMARY KEY (CODIGOEMPRESA, CODIGO, FECHACIERRE);
ALTER TABLE OBRASHISTORICAS ADD CONSTRAINT FK_OBRASHISTORICAS FOREIGN KEY (CODIGOEMPRESA) REFERENCES EMPRESAS (CODIGO);


CREATE TABLE ESTADOOBRASHISTORICAS (
    CODIGOEMPRESA    CODIGOSEMPRESAS NOT NULL,
    CODIGOOBRA       CODIGOSALMACENES NOT NULL,
    FECHACIERRE      FECHAS NOT NULL,
    CODIGOARTICULO   CODIGOS NOT NULL,
    FAMILIA          FAMILIAS,
    DESCRIPCION      DESCRIPCIONES,
    UNIDADESMEDIDA   UNIDADESMEDIDA,
    EXISTENCIAS      CANTIDADES,
    OBSERVACIONES    OBSERVACIONES,
    PRECIORECEPCION  IMPORTES6,
    FECHARECEPCION   FECHAS
);
ALTER TABLE ESTADOOBRASHISTORICAS ADD CONSTRAINT PK_ESTADOOBRASHISTORICAS PRIMARY KEY (CODIGOEMPRESA, FECHACIERRE, CODIGOOBRA, CODIGOARTICULO);
ALTER TABLE ESTADOOBRASHISTORICAS ADD FOREIGN KEY (CODIGOEMPRESA, CODIGOOBRA, FECHACIERRE) REFERENCES OBRASHISTORICAS (CODIGOEMPRESA, CODIGO, FECHACIERRE) ON DELETE CASCADE ON UPDATE NO ACTION;

ALTER TABLE ARTICULOS ADD UNIDADESMEDIDA UNIDADESMEDIDA COLLATE ES_ES;
