/******************************************************************************/
/****         Generated by IBExpert 2007.05.03 23/09/2008 10:55:38         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'FACTUGES.FDB' PAGE_SIZE 4096
DEFAULT CHARACTER SET ISO8859_1;

/******************************************************************************/
/****                        User Defined Functions                        ****/
/******************************************************************************/

DECLARE EXTERNAL FUNCTION F_RTFTOTEXT
	CString(32767)
    RETURNS CString(32767)
    ENTRY_POINT 'RtfToText' MODULE_NAME 'udf_RtfToText.dll';

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


DECLARE EXTERNAL FUNCTION STRLEN
    CSTRING(254)
    RETURNS INTEGER BY VALUE
    ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';


DECLARE EXTERNAL FUNCTION SUBSTR
    CSTRING(254),
    SMALLINT,
    SMALLINT
    RETURNS CSTRING(254) FREE_IT
    ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';




/******************************************************************************/
/****                               Domains                                ****/
/******************************************************************************/

CREATE DOMAIN TIPO_BINARIO AS
BLOB SUB_TYPE 0 SEGMENT SIZE 80;

CREATE DOMAIN TIPO_BOOLEANO AS
SMALLINT;

CREATE DOMAIN TIPO_CANTIDAD AS
NUMERIC(11,2);

CREATE DOMAIN TIPO_CONCEPTO AS
VARCHAR(2000);

CREATE DOMAIN TIPO_ID AS
INTEGER;

CREATE DOMAIN TIPO_IMPORTE AS
NUMERIC(11,2);

CREATE DOMAIN TIPO_NOTAS AS
BLOB SUB_TYPE 1 SEGMENT SIZE 80;

CREATE DOMAIN TIPO_PERFIL AS
VARCHAR(15);

CREATE DOMAIN TIPO_PORCENTAJE AS
FLOAT;

CREATE DOMAIN TIPO_USUARIO AS
VARCHAR(30);

/******************************************************************************/
/****                              Generators                              ****/
/******************************************************************************/

CREATE GENERATOR GEN_AGENTES_COMISIONES_ID;
SET GENERATOR GEN_AGENTES_COMISIONES_ID TO 1;

CREATE GENERATOR GEN_ALBARANES_CLI_DETALLES_ID;
SET GENERATOR GEN_ALBARANES_CLI_DETALLES_ID TO 1;

CREATE GENERATOR GEN_ALBARANES_CLI_ID;
SET GENERATOR GEN_ALBARANES_CLI_ID TO 1;

CREATE GENERATOR GEN_ALBARANES_PRO_DETALLES_ID;
SET GENERATOR GEN_ALBARANES_PRO_DETALLES_ID TO 1;

CREATE GENERATOR GEN_ALBARANES_PRO_ID;
SET GENERATOR GEN_ALBARANES_PRO_ID TO 1;

CREATE GENERATOR GEN_ALMACENES_ID;
SET GENERATOR GEN_ALMACENES_ID TO 1;

CREATE GENERATOR GEN_ARTICULOS_ID;
SET GENERATOR GEN_ARTICULOS_ID TO 1;

CREATE GENERATOR GEN_ARTICULOS_PROVEEDORES_ID;
SET GENERATOR GEN_ARTICULOS_PROVEEDORES_ID TO 1;

CREATE GENERATOR GEN_CATEGORIAS_ID;
SET GENERATOR GEN_CATEGORIAS_ID TO 1;

CREATE GENERATOR GEN_CLIENTES_DTOS_PROV_ID;
SET GENERATOR GEN_CLIENTES_DTOS_PROV_ID TO 1;

CREATE GENERATOR GEN_CLIENTES_GRUPOS_ID;
SET GENERATOR GEN_CLIENTES_GRUPOS_ID TO 1;

CREATE GENERATOR GEN_COMISIONES_LIQUID_ID;
SET GENERATOR GEN_COMISIONES_LIQUID_ID TO 1;

CREATE GENERATOR GEN_CONFIGURACION_ID;
SET GENERATOR GEN_CONFIGURACION_ID TO 1;

CREATE GENERATOR GEN_CONTACTOS_DATOS_BANCO_ID;
SET GENERATOR GEN_CONTACTOS_DATOS_BANCO_ID TO 1;

CREATE GENERATOR GEN_CONTACTOS_DIR_ID;
SET GENERATOR GEN_CONTACTOS_DIR_ID TO 1;

CREATE GENERATOR GEN_CONTACTOS_ID;
SET GENERATOR GEN_CONTACTOS_ID TO 1;

CREATE GENERATOR GEN_CONTACTOS_PERSONAL_ID;
SET GENERATOR GEN_CONTACTOS_PERSONAL_ID TO 1;

CREATE GENERATOR GEN_EMPLEADOS_GRUPOS_ID;
SET GENERATOR GEN_EMPLEADOS_GRUPOS_ID TO 1;

CREATE GENERATOR GEN_EMPRESAS_CONTACTOS_ID;
SET GENERATOR GEN_EMPRESAS_CONTACTOS_ID TO 1;

CREATE GENERATOR GEN_EMPRESAS_DATOS_BANCO_ID;
SET GENERATOR GEN_EMPRESAS_DATOS_BANCO_ID TO 1;

CREATE GENERATOR GEN_EMPRESAS_ID;
SET GENERATOR GEN_EMPRESAS_ID TO 1;

CREATE GENERATOR GEN_EMPRESAS_USUARIOS_ID;
SET GENERATOR GEN_EMPRESAS_USUARIOS_ID TO 1;

CREATE GENERATOR GEN_FABRICANTES_ID;
SET GENERATOR GEN_FABRICANTES_ID TO 1;

CREATE GENERATOR GEN_FACTURAS_CLIENTE_ID;
SET GENERATOR GEN_FACTURAS_CLIENTE_ID TO 1;

CREATE GENERATOR GEN_FACTURAS_PROVEEDOR_ID;
SET GENERATOR GEN_FACTURAS_PROVEEDOR_ID TO 1;

CREATE GENERATOR GEN_FACTURA_CLIENTE_DETALLES_ID;
SET GENERATOR GEN_FACTURA_CLIENTE_DETALLES_ID TO 1;

CREATE GENERATOR GEN_FACTURA_PROV_DETALLES_ID;
SET GENERATOR GEN_FACTURA_PROV_DETALLES_ID TO 1;

CREATE GENERATOR GEN_FAMILIAS_ID;
SET GENERATOR GEN_FAMILIAS_ID TO 1;

CREATE GENERATOR GEN_FORMAS_PAGO_ID;
SET GENERATOR GEN_FORMAS_PAGO_ID TO 1;

CREATE GENERATOR GEN_FORMAS_PAGO_PLAZOS_ID;
SET GENERATOR GEN_FORMAS_PAGO_PLAZOS_ID TO 1;

CREATE GENERATOR GEN_INFORMES_ID;
SET GENERATOR GEN_INFORMES_ID TO 1;

CREATE GENERATOR GEN_MOVIMIENTOS_ID;
SET GENERATOR GEN_MOVIMIENTOS_ID TO 1;

CREATE GENERATOR GEN_OBRAS_EJECUCIONES_ID;
SET GENERATOR GEN_OBRAS_EJECUCIONES_ID TO 1;

CREATE GENERATOR GEN_OBRAS_EJEC_PRESUPUESTOS_ID;
SET GENERATOR GEN_OBRAS_EJEC_PRESUPUESTOS_ID TO 1;

CREATE GENERATOR GEN_OBRAS_EJEC_PEDIDOS_PROV_ID;
SET GENERATOR GEN_OBRAS_EJEC_PEDIDOS_PROV_ID TO 1;

CREATE GENERATOR GEN_PAGOS_CLIENTE_ID;
SET GENERATOR GEN_PAGOS_CLIENTE_ID TO 1;

CREATE GENERATOR GEN_PAGOS_PROVEEDOR_ID;
SET GENERATOR GEN_PAGOS_PROVEEDOR_ID TO 1;

CREATE GENERATOR GEN_PEDIDOS_CLI_DETALLES_ID;
SET GENERATOR GEN_PEDIDOS_CLI_DETALLES_ID TO 1;

CREATE GENERATOR GEN_PEDIDOS_CLI_ID;
SET GENERATOR GEN_PEDIDOS_CLI_ID TO 1;

CREATE GENERATOR GEN_PEDIDOS_PROV_DETALLES_ID;
SET GENERATOR GEN_PEDIDOS_PROV_DETALLES_ID TO 1;

CREATE GENERATOR GEN_PEDIDOS_PROV_ID;
SET GENERATOR GEN_PEDIDOS_PROV_ID TO 1;

CREATE GENERATOR GEN_PEDIDOS_PROV_PEDIDOS_ID;
SET GENERATOR GEN_PEDIDOS_PROV_PEDIDOS_ID TO 1;

CREATE GENERATOR GEN_PERMISOSEX_ID;
SET GENERATOR GEN_PERMISOSEX_ID TO 1;

CREATE GENERATOR GEN_PERMISOS_ID;
SET GENERATOR GEN_PERMISOS_ID TO 1;

CREATE GENERATOR GEN_PRESUPUESTOS_CLI_DETALLE_ID;
SET GENERATOR GEN_PRESUPUESTOS_CLI_DETALLE_ID TO 1;

CREATE GENERATOR GEN_PRESUPUESTOS_CLI_ID;
SET GENERATOR GEN_PRESUPUESTOS_CLI_ID TO 1;

CREATE GENERATOR GEN_PROVEEDORES_GRUPOS_ID;
SET GENERATOR GEN_PROVEEDORES_GRUPOS_ID TO 1;

CREATE GENERATOR GEN_RECIBOS_CLIENTE_ID;
SET GENERATOR GEN_RECIBOS_CLIENTE_ID TO 1;

CREATE GENERATOR GEN_RECIBOS_PROVEEDOR_ID;
SET GENERATOR GEN_RECIBOS_PROVEEDOR_ID TO 1;

CREATE GENERATOR GEN_REFERENCIAS_ID;
SET GENERATOR GEN_REFERENCIAS_ID TO 1;

CREATE GENERATOR GEN_REMESAS_CLIENTE_ID;
SET GENERATOR GEN_REMESAS_CLIENTE_ID TO 1;

CREATE GENERATOR GEN_REMESAS_PROVEEDOR_ID;
SET GENERATOR GEN_REMESAS_PROVEEDOR_ID TO 1;

CREATE GENERATOR GEN_TIENDA_WEB_ID;
SET GENERATOR GEN_TIENDA_WEB_ID TO 1;

CREATE GENERATOR GEN_TIPOS_IVA_ID;
SET GENERATOR GEN_TIPOS_IVA_ID TO 1;

CREATE GENERATOR GEN_UNIDADES_MEDIDA_ID;
SET GENERATOR GEN_UNIDADES_MEDIDA_ID TO 1;

CREATE GENERATOR GEN_USUARIOS_ID;
SET GENERATOR GEN_USUARIOS_ID TO 1;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE AGENTES_COMISIONES (
    ID            TIPO_ID NOT NULL,
    ID_AGENTE     TIPO_ID DEFAULT 0 NOT NULL,
    ID_PROVEEDOR  SMALLINT DEFAULT 0 NOT NULL,
    COMISION      TIPO_PORCENTAJE DEFAULT 0
);

CREATE TABLE ALBARANES_CLIENTE (
    ID                    TIPO_ID NOT NULL,
    ID_EMPRESA            TIPO_ID,
    ID_CLIENTE            TIPO_ID,
    FECHA_ALBARAN         DATE,
    ID_ALMACEN            TIPO_ID,
    ID_PEDIDO             TIPO_ID,
    ID_FACTURA            TIPO_ID,
    TIPO                  VARCHAR(1),
    REFERENCIA            VARCHAR(255),
    ID_DIRECCION          TIPO_ID,
    CALLE                 VARCHAR(255),
    CODIGO_POSTAL         VARCHAR(10),
    POBLACION             VARCHAR(255),
    PROVINCIA             VARCHAR(255),
    PERSONA_CONTACTO      VARCHAR(255),
    TELEFONO              VARCHAR(25),
    IMPORTE_NETO          TIPO_IMPORTE,
    IMPORTE_PORTE         TIPO_IMPORTE,
    DESCUENTO             TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO     TIPO_IMPORTE,
    BASE_IMPONIBLE        TIPO_IMPORTE,
    IVA                   TIPO_PORCENTAJE,
    IMPORTE_IVA           TIPO_IMPORTE,
    IMPORTE_TOTAL         TIPO_IMPORTE,
    OBSERVACIONES         TIPO_NOTAS,
    INCIDENCIAS           TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS   SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA            TIMESTAMP,
    FECHA_MODIFICACION    TIMESTAMP,
    USUARIO               TIPO_USUARIO,
    ID_FORMA_PAGO         TIPO_ID,
    FECHA_ENVIO           DATE,
    FECHA_RECEPCION       DATE,
    FECHA_PREVISTA_ENVIO  DATE,
    REFERENCIA_CLIENTE    VARCHAR(255),
    ID_ALBARAN_DEV        TIPO_ID 
);

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

CREATE TABLE ALBARANES_PROVEEDOR (
    ID                    TIPO_ID NOT NULL,
    ID_EMPRESA            TIPO_ID,
    ID_PROVEEDOR          TIPO_ID,
    ID_DIRECCION					TIPO_ID,
    PERSONA_CONTACTO_PROV VARCHAR(255),
    FECHA_ALBARAN         DATE,
    ID_PEDIDO             TIPO_ID,
    ID_FACTURA            TIPO_ID,
    TIPO                  VARCHAR(1),
    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,
    INCIDENCIAS           TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS   SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA            TIMESTAMP,
    FECHA_MODIFICACION    TIMESTAMP,
    USUARIO               TIPO_USUARIO,
    ID_ALMACEN            TIPO_ID,
    ID_FORMA_PAGO         TIPO_ID,
    IMPORTE_NETO          TIPO_IMPORTE,
    IMPORTE_PORTE         TIPO_IMPORTE,
    REFERENCIA_PROVEEDOR  VARCHAR(255),
    REF_FACTURA_PROV      VARCHAR(255),
    ID_ALBARAN					  TIPO_ID,
    ID_ALBARAN_DEV        TIPO_ID    
);

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

CREATE TABLE ALMACENES (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID NOT NULL,
    TIPO_ALMACEN        VARCHAR(10),
    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
);

CREATE TABLE ARTICULOS (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    DESCRIPCION         VARCHAR(255),
    FAMILIA             VARCHAR(255),
    UNIDAD_MEDIDA       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,
    TIENDA_WEB          TIPO_BOOLEANO DEFAULT 0,
    FABRICANTE          VARCHAR(255),
    REFERENCIA_FABR     VARCHAR(255),
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP,
    USUARIO             TIPO_USUARIO,
    INVENTARIABLE       TIPO_BOOLEANO,
    ELIMINADO           TIPO_BOOLEANO,
    PARAM_MARGEN        FLOAT,
    TIEMPO              INTEGER,
    PARAM_TIEMPO        FLOAT,
    MANO_OBRA           TIPO_IMPORTE
);

CREATE TABLE ARTICULOS_PROVEEDORES (
    ID                TIPO_ID NOT NULL,
    ID_ARTICULO       TIPO_ID,
    ID_PROVEEDOR      TIPO_ID,
    REFERENCIA_PROV   VARCHAR(255),
    PRECIO_COSTE      TIPO_IMPORTE,
    DESCUENTO         TIPO_PORCENTAJE,
    PRECIO_NETO       TIPO_IMPORTE,
    PRECIO_PORTE      TIPO_IMPORTE,
    PRECIO_PVP_VENTA  TIPO_IMPORTE,
    PRECIO_PVP_TOTAL  TIPO_IMPORTE
);

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

CREATE TABLE CLIENTES_DATOS (
    ID_CLIENTE            TIPO_ID NOT NULL,
    ID_AGENTE             TIPO_ID,
    GRUPO_CLIENTE         VARCHAR(255),
    NOMBRE_COMERCIAL      VARCHAR(255),
    VENCIMIENTO_FACTURAS  INTEGER,
    BLOQUEADO             TIPO_BOOLEANO DEFAULT 0 NOT NULL,
    REGIMEN_IVA           VARCHAR(255),
    MOTIVO_BLOQUEO        VARCHAR(255),
    RECARGO_EQUIVALENCIA  TIPO_BOOLEANO,
    ID_TIPO_IVA           TIPO_ID,
    ID_FORMA_PAGO         TIPO_ID,
    TIENDA_WEB            TIPO_BOOLEANO,
    DESCUENTO             TIPO_PORCENTAJE,
    RAPEL                   SMALLINT,
    EMAIL_ADMINISTRACION    VARCHAR(255),
    CODIGO_ASIGNADO       VARCHAR(255),
    VENCIMIENTO_FACTURAS_1  SMALLINT,
    VENCIMIENTO_FACTURAS_2  SMALLINT,
    VENCIMIENTO_FACTURAS_3  SMALLINT,
    FELICITACION				  TIPO_BOOLEANO    
);

CREATE TABLE CLIENTES_DTOS_PROVEEDORES (
    ID            TIPO_ID NOT NULL,
    ID_CLIENTE    TIPO_ID DEFAULT 0 NOT NULL,
    ID_PROVEEDOR  SMALLINT DEFAULT 0 NOT NULL,
    DESCUENTO     TIPO_PORCENTAJE DEFAULT 0
);

CREATE TABLE CLIENTES_GRUPOS (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255)
);

CREATE TABLE COMISIONES_LIQUIDADAS (
    ID                  TIPO_ID NOT NULL,
    ID_EMPRESA          TIPO_ID,
    REFERENCIA          VARCHAR(255),
    ID_AGENTE           TIPO_ID,
    DESCRIPCION         VARCHAR(255),
    FECHA               DATE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP,
    USUARIO             TIPO_USUARIO
);

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

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,
    REFERENCIA          VARCHAR(255),
    PERSONA_CONTACTO    VARCHAR(255)
);

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

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),
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE CONTACTOS_DATOS_PERSONAL (
    ID                  TIPO_ID NOT NULL,
    ID_CONTACTO         TIPO_ID NOT NULL,
    NOMBRE              VARCHAR(255),
    PUESTO              VARCHAR(255),
    TELEFONO            VARCHAR(25),
    MOVIL               VARCHAR(25),
    FAX                 VARCHAR(25),
    EMAIL               VARCHAR(255),
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

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),
    NOMBRE              VARCHAR(255),
    TELEFONO            VARCHAR(25),
    MOVIL               VARCHAR(25),
    FAX                 VARCHAR(25),
    EMAIL               VARCHAR(255),
    NOTAS               TIPO_NOTAS,
    PORTE               TIPO_IMPORTE,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE EMPLEADOS_DATOS (
    ID_EMPLEADO         TIPO_ID NOT NULL,
    FECHA_NACIMIENTO    DATE,
    CATEGORIA           VARCHAR(255),
    FECHA_ALTA_EMPRESA  DATE,
    FORMACION_BASE      TIPO_NOTAS,
    FORMACION_COMPLE    TIPO_NOTAS,
    FORMACION_RECIBIDA  TIPO_NOTAS,
    EXPERIENCIA         TIPO_NOTAS,
    CONTRATO            VARCHAR(255),
    DURACION            VARCHAR(255),
    FECHA_BAJA          DATE,
    CAUSA_BAJA          VARCHAR(255)
);

CREATE TABLE AGENTES_DATOS (
    ID_AGENTE           TIPO_ID NOT NULL,
    FECHA_ALTA_EMPRESA  DATE,
    FECHA_BAJA          DATE,
    CAUSA_BAJA          VARCHAR(255)
);

CREATE TABLE EMPLEADOS_GRUPOS (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255)
);

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),
    PARAM_TIEMPO        TIPO_IMPORTE,
    PARAM_MARGEN        TIPO_PORCENTAJE,
    ID_TIPO_IVA         SMALLINT,
    ID_FORMA_PAGO       SMALLINT,  
    ID_ALMACEN          SMALLINT  
);

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

CREATE TABLE EMPRESAS_DATOS_BANCO (
    ID          TIPO_ID NOT NULL,
    ID_EMPRESA  TIPO_ID NOT NULL,
    NOMBRE      VARCHAR(255),
    ENTIDAD     VARCHAR(15),
    SUCURSAL    VARCHAR(15),
    DC          VARCHAR(15),
    CUENTA      VARCHAR(15),
    SUFIJO_N19  VARCHAR(3),
    SUFIJO_N58  VARCHAR(3),
    IBAN        VARCHAR(255) COLLATE ES_ES,
    SWIFT       VARCHAR(255) COLLATE ES_ES
);

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

CREATE TABLE FABRICANTES (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255)
);

CREATE TABLE FACTURAS_CLIENTE (
    ID                     TIPO_ID NOT NULL,
    ID_EMPRESA             TIPO_ID,
    REFERENCIA             VARCHAR(255),
    FECHA_FACTURA          DATE,
    FECHA_VENCIMIENTO      DATE,    
    FECHA_RETENCION        DATE,
    BASE_IMPONIBLE         TIPO_IMPORTE,
    DESCUENTO              TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO      TIPO_IMPORTE,
    DESCRIPCION_DESCUENTO  VARCHAR(255) COLLATE ES_ES,    
    IVA                    TIPO_PORCENTAJE,
    IMPORTE_IVA            TIPO_IMPORTE,
    RE                     TIPO_PORCENTAJE,
    IMPORTE_RE             TIPO_IMPORTE,
    IMPORTE_TOTAL          TIPO_IMPORTE,
    OBSERVACIONES          TIPO_NOTAS,
    ID_CLIENTE             TIPO_ID,
    NIF_CIF                VARCHAR(15),
    NOMBRE                 VARCHAR(255),
	  ID_DIRECCION		       TIPO_ID,
    CALLE                  VARCHAR(255),
    POBLACION              VARCHAR(255),
    PROVINCIA              VARCHAR(255),
    CODIGO_POSTAL          VARCHAR(10),
    FECHA_ALTA             TIMESTAMP,
    FECHA_MODIFICACION     TIMESTAMP,
    USUARIO                TIPO_USUARIO,
    ID_FORMA_PAGO          TIPO_ID,
    IMPORTE_NETO           TIPO_IMPORTE,
    IMPORTE_PORTE          TIPO_IMPORTE,
    ID_TIPO_IVA            TIPO_ID,
    RECARGO_EQUIVALENCIA   TIPO_BOOLEANO,
    ID_COMISION_LIQUIDADA  TIPO_ID,
    DATOS_BANCARIOS        VARCHAR(255),
	  CLIENTE_FINAL          VARCHAR(255),
    RETENCION              TIPO_PORCENTAJE,
    IMPORTE_RETENCION      TIPO_IMPORTE
);

CREATE TABLE FACTURAS_CLIENTE_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_FACTURA          TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(25),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            TIPO_CANTIDAD,
    UNIDAD_MEDIDA       VARCHAR(255),
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_PORTE       TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE FACTURAS_PROVEEDOR (
    ID                    TIPO_ID NOT NULL,
    ID_EMPRESA            TIPO_ID,
    REFERENCIA            VARCHAR(255),
    REFERENCIA_PROVEEDOR  VARCHAR(255),
    FECHA_FACTURA         DATE,
    BASE_IMPONIBLE        TIPO_IMPORTE,
    DESCUENTO             TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO     TIPO_IMPORTE,
    IVA                   TIPO_PORCENTAJE,
    IMPORTE_IVA           TIPO_IMPORTE,
    RE                    TIPO_PORCENTAJE,
    IMPORTE_RE            TIPO_IMPORTE,
    IMPORTE_TOTAL         TIPO_IMPORTE,
    OBSERVACIONES         TIPO_NOTAS,
    ID_PROVEEDOR          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,
    ID_FORMA_PAGO         TIPO_ID,
    IMPORTE_NETO          TIPO_IMPORTE,
    IMPORTE_PORTE         TIPO_IMPORTE,
    ID_TIPO_IVA           TIPO_ID,
    RECARGO_EQUIVALENCIA  TIPO_BOOLEANO,
	  DATOS_BANCARIOS		    VARCHAR(255),
	  FECHA_VENCIMIENTO     DATE
);

CREATE TABLE FACTURAS_PROVEEDOR_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_FACTURA          TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(25),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            TIPO_CANTIDAD,
    UNIDAD_MEDIDA       VARCHAR(255),
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_PORTE       TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE FACTURAS_PROVEEDOR_PEDIDOS (
    ID                  TIPO_ID NOT NULL,
    ID_FACTURA          TIPO_ID NOT NULL,
    ID_PEDIDO           TIPO_ID,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE FAMILIAS (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255)
);

CREATE TABLE FORMAS_PAGO (
    ID           TIPO_ID NOT NULL,
    REFERENCIA   VARCHAR(255),
    DESCRIPCION  VARCHAR(255),
    TITULAR      VARCHAR(255),
    ENTIDAD      VARCHAR(15),
    SUCURSAL     VARCHAR(15),
    DC           VARCHAR(15),
    CUENTA       VARCHAR(15)
);

CREATE TABLE FORMAS_PAGO_PLAZOS (
    ID             TIPO_ID NOT NULL,
    ID_FORMA_PAGO  TIPO_ID NOT NULL,
    NUM_DIAS       SMALLINT,
    PORCENTAJE     TIPO_PORCENTAJE
);

CREATE TABLE INFORMES (
    ID           SMALLINT NOT NULL,
    ID_EMPRESA   TIPO_ID,
    CATEGORIA    VARCHAR(30),
    CONTROLLER   VARCHAR(255),
    ICONO        SMALLINT,
    NOMBRE       VARCHAR(50),
    DESCRIPCION  VARCHAR(255),
    ORDEN        SMALLINT,
    MODIFICABLE  CHAR(1),
    VISTA        BLOB SUB_TYPE 2 SEGMENT SIZE 4096,
    TIPO_AGRUPACION  TIPO_ID    
);

CREATE TABLE MOVIMIENTOS (
    ID                  TIPO_ID NOT NULL,
    ID_ALMACEN          TIPO_ID,
    ID_ARTICULO         TIPO_ID,
    FECHA_MOVIMIENTO    DATE,
    TIPO                VARCHAR(1),
    CANTIDAD            TIPO_CANTIDAD,
    CAUSA               TIPO_CONCEPTO,
    ID_ALMACEN_RESERVA  TIPO_ID
);

CREATE TABLE OBRAS_DATOS (
    ID_ALMACEN      TIPO_ID NOT NULL,
    ID_CLIENTE      TIPO_ID
);

CREATE TABLE OBRAS_EJECUCIONES (
    ID                  TIPO_ID NOT NULL,
    ID_OBRA             TIPO_ID,
	FECHA_INICIO		DATE,
	FECHA_FIN			DATE,
	ID_SUBCONTRATA		TIPO_ID,
	OBSERVACIONES       TIPO_NOTAS,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE OBRAS_EJECUCIONES_PRESUPUESTOS (
    ID                  TIPO_ID NOT NULL,
    ID_EJECUCION        TIPO_ID,
	ID_PRESUPUESTO      TIPO_ID
);

CREATE TABLE OBRAS_EJECUCIONES_PEDIDOS_PROV (
    ID                  TIPO_ID NOT NULL,
    ID_EJECUCION        TIPO_ID,
	ID_PEDIDO           TIPO_ID,
	ID_PRESUPUESTO      TIPO_ID
);


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

CREATE TABLE PAGOS_PROVEEDOR (
    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
);

CREATE TABLE PEDIDOS_CLIENTE (
    ID                    TIPO_ID NOT NULL,
    ID_EMPRESA            TIPO_ID,
    ID_CLIENTE            TIPO_ID,
    REFERENCIA            VARCHAR(255),
    FECHA_PEDIDO          DATE,
    CALLE                 VARCHAR(255),
    CODIGO_POSTAL         VARCHAR(10),
    POBLACION             VARCHAR(255),
    PROVINCIA             VARCHAR(255),
    PERSONA_CONTACTO      VARCHAR(255),
    TELEFONO              VARCHAR(25),
    OBSERVACIONES         TIPO_NOTAS,
    INCIDENCIAS           TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS   SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA            TIMESTAMP,
    FECHA_MODIFICACION    TIMESTAMP,
    USUARIO               TIPO_USUARIO,
    IMPORTE_NETO          TIPO_IMPORTE,
    IMPORTE_PORTE         TIPO_IMPORTE,
    DESCUENTO             TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO     TIPO_IMPORTE,
    BASE_IMPONIBLE        TIPO_IMPORTE,
    IVA                   TIPO_PORCENTAJE,
    IMPORTE_IVA           TIPO_IMPORTE,
    IMPORTE_TOTAL         TIPO_IMPORTE,
    ID_FORMA_PAGO         TIPO_ID,
    REF_TIENDA_WEB        INTEGER,
    FECHA_PREVISTA_ENVIO  DATE,
    REFERENCIA_CLIENTE    VARCHAR(255)
);

CREATE TABLE PEDIDOS_CLIENTE_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_PEDIDO           TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(25),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            TIPO_CANTIDAD,
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_PORTE       TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE PEDIDOS_PROVEEDOR (
    ID                   TIPO_ID NOT NULL,
    ID_EMPRESA           TIPO_ID,
    ID_PROVEEDOR         TIPO_ID,
    ID_DIRECCION         TIPO_ID,
    PERSONA_CONTACTO_PROV VARCHAR(255),
    REFERENCIA           VARCHAR(255),
    FECHA_PEDIDO         DATE,
    FECHA_CONFIRMACION   DATE,
    FECHA_ENTREGA        DATE,
    ID_ALMACEN           TIPO_ID,
    ID_OBRA              TIPO_ID,
    OBSERVACIONES        TIPO_NOTAS,
    INCIDENCIAS          TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS  SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA           TIMESTAMP,
    FECHA_MODIFICACION   TIMESTAMP,
    USUARIO              TIPO_USUARIO,    
    CALLE                VARCHAR(255),
    CODIGO_POSTAL        VARCHAR(10),
    POBLACION            VARCHAR(255),
    PROVINCIA            VARCHAR(255),
    PERSONA_CONTACTO     VARCHAR(255),
    TELEFONO             VARCHAR(25),
    ID_PEDIDO_CLIENTE    TIPO_ID,
    IMPORTE_NETO         TIPO_IMPORTE,
    IMPORTE_PORTE        TIPO_IMPORTE,
    DESCUENTO            TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO    TIPO_IMPORTE,
    BASE_IMPONIBLE       TIPO_IMPORTE,
    IVA                  TIPO_PORCENTAJE,
    IMPORTE_IVA          TIPO_IMPORTE,
    IMPORTE_TOTAL        TIPO_IMPORTE,
    ID_FORMA_PAGO        TIPO_ID,
    FECHA_ENVIO          DATE,
    ID_FACTURA           TIPO_ID,
    REF_FACTURA_PROV     VARCHAR(255) COLLATE ES_ES
);

CREATE TABLE PEDIDOS_PROVEEDOR_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_PEDIDO           TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(25),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            TIPO_CANTIDAD,
    UNIDAD_MEDIDA       VARCHAR(255),
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_PORTE       TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE PERMISOS (
    ID          TIPO_ID NOT NULL,
    ID_USUARIO  TIPO_ID,
    MODULO      VARCHAR(50),
    NOMBRECOMP  VARCHAR(50),
    CHECKSUM    VARCHAR(250)
);

CREATE TABLE PERMISOSEX (
    ID          TIPO_ID NOT NULL,
    ID_USUARIO  TIPO_ID,
    MODULO      VARCHAR(50),
    NOMBRECOMP  VARCHAR(50),
    NOMBREFORM  VARCHAR(50),
    CHECKSUM    VARCHAR(250)
);

CREATE TABLE POBLACIONES (
    ID            TIPO_ID NOT NULL,
    ID_PROVINCIA  TIPO_ID NOT NULL,
    DESCRIPCION   VARCHAR(255) NOT NULL
);

CREATE TABLE PRESUPUESTOS_CLIENTE (
    ID                   TIPO_ID NOT NULL,
    ID_EMPRESA           TIPO_ID,
    ID_CLIENTE           TIPO_ID,
    REFERENCIA           VARCHAR(255),
    REFERENCIA_AUX       VARCHAR(255),
    FECHA_PRESUPUESTO    DATE,
    FECHA_DECISION       DATE,
    SITUACION            VARCHAR(255),
    PORTADA              TIPO_NOTAS,
    MEMORIA              TIPO_NOTAS,
    OBSERVACIONES        TIPO_NOTAS,
    INCIDENCIAS          TIPO_NOTAS,
    INCIDENCIAS_ACTIVAS  SMALLINT DEFAULT 0 NOT NULL,
    FECHA_ALTA           TIMESTAMP,
    FECHA_MODIFICACION   TIMESTAMP,
    USUARIO              TIPO_USUARIO,
    IMPORTE_NETO         TIPO_IMPORTE,
    IMPORTE_PORTE        TIPO_IMPORTE,
    DESCUENTO            TIPO_PORCENTAJE,
    IMPORTE_DESCUENTO    TIPO_IMPORTE,
    BASE_IMPONIBLE       TIPO_IMPORTE,
    IVA                  TIPO_PORCENTAJE,
    IMPORTE_IVA          TIPO_IMPORTE,
    IMPORTE_TOTAL        TIPO_IMPORTE,
    ID_FORMA_PAGO        TIPO_ID,
    REFERENCIA_CLIENTE   VARCHAR(255),
    CLIENTE_FINAL        VARCHAR(255),
    ID_FACTURA           TIPO_ID,
    PERSONA_CONTACTO     VARCHAR(255),
    ID_DIRECCION         TIPO_ID,
    DESCRIPCION_BONIFICACION  VARCHAR(255) COLLATE ES_ES,
    IMPORTE_BONIFICACION      TIPO_IMPORTE 
);

CREATE TABLE PRESUPUESTOS_CLIENTE_DETALLES (
    ID                  TIPO_ID NOT NULL,
    ID_PRESUPUESTO      TIPO_ID NOT NULL,
    POSICION            INTEGER,
    TIPO_DETALLE        VARCHAR(25),
    ID_ARTICULO         TIPO_ID,
    CONCEPTO            TIPO_CONCEPTO,
    CANTIDAD            TIPO_CANTIDAD,
    UNIDAD_MEDIDA       VARCHAR(255),
    IMPORTE_UNIDAD      TIPO_IMPORTE,
    DESCUENTO           TIPO_PORCENTAJE,
    IMPORTE_PORTE       TIPO_IMPORTE,
    IMPORTE_TOTAL       TIPO_IMPORTE,
    VISIBLE             TIPO_BOOLEANO,
    FECHA_ALTA          TIMESTAMP,
    FECHA_MODIFICACION  TIMESTAMP
);

CREATE TABLE PROVEEDORES_DATOS (
    ID_PROVEEDOR           TIPO_ID NOT NULL,
    DESCUENTO              TIPO_PORCENTAJE,
    REGIMEN_IVA            VARCHAR(255),
    ID_TIPO_IVA            TIPO_ID,
    ID_FORMA_PAGO          TIPO_ID,
    TIENDA_WEB             TIPO_BOOLEANO,
    EMAIL_ADMINISTRACION    VARCHAR(255),    
    GRUPO_PROVEEDOR        VARCHAR(255),
    DESCRIPCION_PROVEEDOR  VARCHAR(255),
    CODIGO_ASIGNADO        VARCHAR(255),
    CERTIFICACION          VARCHAR(255),
    HOMOLOGADO             SMALLINT,
    SUBCONTRATA            TIPO_BOOLEANO,
    VENCIMIENTO_FACTURAS_1  SMALLINT,
    VENCIMIENTO_FACTURAS_2  SMALLINT,
    VENCIMIENTO_FACTURAS_3  SMALLINT        
);

CREATE TABLE PROVEEDORES_GRUPOS (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255)
);

CREATE TABLE PROVINCIAS (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255) NOT NULL
);

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,
    ID_RECIBO_COMPENSADO  INTEGER
);

CREATE TABLE RECIBOS_PROVEEDOR (
    ID                    TIPO_ID NOT NULL,
    ID_FACTURA            TIPO_ID,
    REFERENCIA            VARCHAR(255),
    REFERENCIA_PROVEEDOR  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,
    ID_RECIBO_COMPENSADO  INTEGER
);

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

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,
    TIPO                VARCHAR(40)
);

CREATE TABLE REMESAS_PROVEEDOR (
    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,
    TIPO                VARCHAR(40)
);

CREATE TABLE TIENDA_WEB (
    ID                    TIPO_ID NOT NULL,
    ID_EMPRESA            TIPO_ID NOT NULL,
    TIENDA_ACTIVA         TIPO_BOOLEANO DEFAULT 0 NOT NULL,
    ULTIMA_ACTUALIZACION  TIMESTAMP,
    BDSERVER              VARCHAR(255),
    BDPORT                VARCHAR(20),
    BDNAME                VARCHAR(255),
    BDUSER                VARCHAR(255),
    BDPASS                VARCHAR(255)
);

CREATE TABLE TIPOS_IVA (
    ID           TIPO_ID NOT NULL,
    REFERENCIA   VARCHAR(255),
    DESCRIPCION  VARCHAR(255),
    IVA          TIPO_PORCENTAJE,
    RE           TIPO_PORCENTAJE
);

CREATE TABLE UNIDADES_MEDIDA (
    ID           TIPO_ID NOT NULL,
    DESCRIPCION  VARCHAR(255)
);

CREATE TABLE USUARIOS (
    ID           TIPO_ID NOT NULL,
    USERNAME     VARCHAR(30),
    LOGIN        TIPO_USUARIO,
    PASS         VARCHAR(250),
    PASSEXPIRED  DATE,
    BLOQUEADO    TIPO_BOOLEANO,
    EMAIL        VARCHAR(150),
    USERDAYSSUN  INTEGER,
    PRIVILEGED   INTEGER,
    TIPO         CHAR(1),
    ID_PERFIL    TIPO_ID,
    CHECKSUM     VARCHAR(250)
);

CREATE TABLE USUARIOS_EVENTOS (
    APLICACION   VARCHAR(250),
    ID_USUARIO   TIPO_ID,
    FECHA        CHAR(10),
    HORA         CHAR(8),
    FORM         VARCHAR(250),
    TITULO_FORM  VARCHAR(100),
    EVENTO       VARCHAR(50),
    NOTAS        TIPO_NOTAS,
    TNAME        VARCHAR(20)
);

CREATE TABLE USUARIOS_LOGON (
    LOGONID     CHAR(38) NOT NULL,
    ID_USUARIO  TIPO_ID,
    APLICACION  VARCHAR(50),
    EQUIPO      VARCHAR(50),
    DATA        VARCHAR(14)
);



/******************************************************************************/
/****                                Views                                 ****/
/******************************************************************************/


/* View: V_ALB_CLI_SITUACION */
CREATE VIEW V_ALB_CLI_SITUACION(
    ID,
    SITUACION)
AS
SELECT ALBARANES_CLIENTE.ID,
  case when (FECHA_RECEPCION is not null) then 'SERVIDO'
       when (FECHA_ENVIO is null) then 'PENDIENTE'
       when (FECHA_ENVIO <= current_date) then 'ENVIADO'
       when (FECHA_ENVIO > current_date) then 'PENDIENTE'
       else 'N/A'
  end as SITUACION
FROM ALBARANES_CLIENTE
;



/* View: V_ALB_CLI_DETALLES */
CREATE VIEW V_ALB_CLI_DETALLES(
    ID_ALBARAN,
    ID_PEDIDO,
    SITUACION,
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT  ALBARANES_CLIENTE_DETALLES.ID_ALBARAN,
        ALBARANES_CLIENTE_DETALLES.ID_PEDIDO,
        V_ALB_CLI_SITUACION.SITUACION,
        ALBARANES_CLIENTE.ID_ALMACEN,
        COALESCE(ALBARANES_CLIENTE_DETALLES.ID_ARTICULO, 0),
        SUM(COALESCE(ALBARANES_CLIENTE_DETALLES.CANTIDAD, 0))

FROM ALBARANES_CLIENTE_DETALLES
INNER JOIN ALBARANES_CLIENTE
ON (ALBARANES_CLIENTE_DETALLES.ID_ALBARAN = ALBARANES_CLIENTE.ID)
INNER JOIN V_ALB_CLI_SITUACION
ON (ALBARANES_CLIENTE_DETALLES.ID_ALBARAN = V_ALB_CLI_SITUACION.ID)

/*Mantenemos los articulos inventariables y aquellos que no existan en nuestro catálogo con el fin de no falsear la situación de los pedidos
LEFT JOIN ARTICULOS
ON (ALBARANES_CLIENTE_DETALLES.ID_ARTICULO = ARTICULOS.ID)

WHERE (ALBARANES_CLIENTE_DETALLES.ID_ARTICULO is not null)
AND   (ARTICULOS.INVENTARIABLE = 1)
*/

group BY  ALBARANES_CLIENTE_DETALLES.ID_ALBARAN,
          ALBARANES_CLIENTE_DETALLES.ID_PEDIDO,
          V_ALB_CLI_SITUACION.SITUACION,
          ALBARANES_CLIENTE.ID_ALMACEN,
          ALBARANES_CLIENTE_DETALLES.ID_ARTICULO
;



/* View: V_ALB_PROV_DETALLES */
CREATE VIEW V_ALB_PROV_DETALLES(
    ID_ALBARAN,
    ID_PEDIDO,
    ID_ALMACEN,
    ID_ARTICULO,
    DESCRIPCION,	
    CANTIDAD)
AS
SELECT  ALBARANES_PROVEEDOR_DETALLES.ID_ALBARAN,
        ALBARANES_PROVEEDOR.ID_PEDIDO,
        ALBARANES_PROVEEDOR.ID_ALMACEN,
        COALESCE(ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO, 0),
        CASE
            WHEN ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO IS NULL THEN ALBARANES_PROVEEDOR_DETALLES.CONCEPTO
            ELSE NULL
        END,
        SUM (COALESCE(ALBARANES_PROVEEDOR_DETALLES.CANTIDAD, 0)) AS CANTIDAD
FROM ALBARANES_PROVEEDOR_DETALLES INNER JOIN ALBARANES_PROVEEDOR ON (ALBARANES_PROVEEDOR_DETALLES.ID_ALBARAN = ALBARANES_PROVEEDOR.ID)

/*Mantenemos los articulos inventariables y aquellos que no existan en nuestro catálogo con el fin de no falsear la situación de los pedidos
LEFT JOIN ARTICULOS
ON (ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO = ARTICULOS.ID)

WHERE (ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO is not null)
AND   (ARTICULOS.INVENTARIABLE = 1)
*/

GROUP BY ALBARANES_PROVEEDOR_DETALLES.ID_ALBARAN,
        ALBARANES_PROVEEDOR.ID_PEDIDO,
        ALBARANES_PROVEEDOR.ID_ALMACEN,
        ALBARANES_PROVEEDOR_DETALLES.ID_ARTICULO,
        5
;


/* View: V_ALBARANES_CLIENTE */
CREATE VIEW V_ALBARANES_CLIENTE(
    ID,
    ID_EMPRESA,
    ID_CLIENTE,
    NOMBRE,
    FECHA_ALBARAN,
    REFERENCIA,
    REFERENCIA_CLIENTE,
    TIPO,
    SITUACION,
    ID_ALMACEN,
    NOMBRE_ALMACEN,
    ID_PEDIDO,
    REF_PEDIDO,
    ID_FACTURA,
    REF_FACTURA,
    ID_DIRECCION,
    CALLE,
    CODIGO_POSTAL,
    POBLACION,
    PROVINCIA,
    PERSONA_CONTACTO,
    TELEFONO,
    IMPORTE_NETO,
    IMPORTE_PORTE,
    DESCUENTO,
    IMPORTE_DESCUENTO,
    BASE_IMPONIBLE,
    IVA,
    IMPORTE_IVA,
    IMPORTE_TOTAL,
    OBSERVACIONES,
    INCIDENCIAS,
    INCIDENCIAS_ACTIVAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_FORMA_PAGO,
    FECHA_PREVISTA_ENVIO,
    FECHA_ENVIO,
    FECHA_RECEPCION)
AS
SELECT
  ALBARANES_CLIENTE.ID,
  ALBARANES_CLIENTE.ID_EMPRESA,
  ALBARANES_CLIENTE.ID_CLIENTE,
  CONTACTOS.NOMBRE,
  ALBARANES_CLIENTE.FECHA_ALBARAN,
  ALBARANES_CLIENTE.REFERENCIA,
  ALBARANES_CLIENTE.REFERENCIA_CLIENTE,
  ALBARANES_CLIENTE.TIPO,  
  TRIM(V_ALB_CLI_SITUACION.SITUACION),
  ALBARANES_CLIENTE.ID_ALMACEN,
  ALMACENES.NOMBRE AS NOMBRE_ALMACEN,
  ALBARANES_CLIENTE.ID_PEDIDO,
  PEDIDOS_CLIENTE.REFERENCIA AS REF_PEDIDO,
  ALBARANES_CLIENTE.ID_FACTURA,
  FACTURAS_CLIENTE.REFERENCIA AS REF_FACTURA,
  ALBARANES_CLIENTE.ID_DIRECCION,
  ALBARANES_CLIENTE.CALLE,
  ALBARANES_CLIENTE.CODIGO_POSTAL,
  ALBARANES_CLIENTE.POBLACION,
  ALBARANES_CLIENTE.PROVINCIA,
  ALBARANES_CLIENTE.PERSONA_CONTACTO,
  ALBARANES_CLIENTE.TELEFONO,
  ALBARANES_CLIENTE.IMPORTE_NETO,
  ALBARANES_CLIENTE.IMPORTE_PORTE,
  ALBARANES_CLIENTE.DESCUENTO,
  ALBARANES_CLIENTE.IMPORTE_DESCUENTO,
  ALBARANES_CLIENTE.BASE_IMPONIBLE,
  ALBARANES_CLIENTE.IVA,
  ALBARANES_CLIENTE.IMPORTE_IVA,
  ALBARANES_CLIENTE.IMPORTE_TOTAL,
  ALBARANES_CLIENTE.OBSERVACIONES,
  ALBARANES_CLIENTE.INCIDENCIAS,
  ALBARANES_CLIENTE.INCIDENCIAS_ACTIVAS,
  ALBARANES_CLIENTE.FECHA_ALTA,
  ALBARANES_CLIENTE.FECHA_MODIFICACION,
  ALBARANES_CLIENTE.USUARIO,
  ALBARANES_CLIENTE.ID_FORMA_PAGO,
  ALBARANES_CLIENTE.FECHA_PREVISTA_ENVIO,
  ALBARANES_CLIENTE.FECHA_ENVIO,
  ALBARANES_CLIENTE.FECHA_RECEPCION
FROM
  ALBARANES_CLIENTE
  LEFT OUTER JOIN CONTACTOS ON (CONTACTOS.ID = ALBARANES_CLIENTE.ID_CLIENTE)
  LEFT OUTER JOIN PEDIDOS_CLIENTE ON (PEDIDOS_CLIENTE.ID = ALBARANES_CLIENTE.ID_PEDIDO)
  LEFT OUTER JOIN FACTURAS_CLIENTE ON (FACTURAS_CLIENTE.ID = ALBARANES_CLIENTE.ID_FACTURA)
  LEFT OUTER JOIN V_ALB_CLI_SITUACION ON (V_ALB_CLI_SITUACION.ID = ALBARANES_CLIENTE.ID)
  LEFT OUTER JOIN ALMACENES ON (ALMACENES.ID = ALBARANES_CLIENTE.ID_ALMACEN)
;



/* View: V_ALBARANES_PROVEEDOR */
CREATE VIEW V_ALBARANES_PROVEEDOR(
    ID,
    ID_EMPRESA,
    ID_PROVEEDOR,    
    NOMBRE,
    ID_DIRECCION,
    PERSONA_CONTACTO_PROV,
    FECHA_ALBARAN,
    REFERENCIA,
    REFERENCIA_PROVEEDOR,
    TIPO,
    ID_ALMACEN,
    TIPO_ALMACEN,
    NOMBRE_ALMACEN,
    ID_PEDIDO,
    REF_PED_PROVEEDOR,
    ID_FACTURA,
    REF_FACTURA,
    REF_FACTURA_PROV,
    CALLE,
    CODIGO_POSTAL,
    POBLACION,
    PROVINCIA,
    PERSONA_CONTACTO,
    TELEFONO,
    IMPORTE_NETO,
    IMPORTE_PORTE,
    DESCUENTO,
    IMPORTE_DESCUENTO,
    BASE_IMPONIBLE,
    IVA,
    IMPORTE_IVA,
    IMPORTE_TOTAL,
    OBSERVACIONES,
    INCIDENCIAS,
    INCIDENCIAS_ACTIVAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_FORMA_PAGO,
    ID_ALBARAN,
    REFERENCIA_ALBARAN)
AS
SELECT
  ALBARANES_PROVEEDOR.ID,
  ALBARANES_PROVEEDOR.ID_EMPRESA,
  ALBARANES_PROVEEDOR.ID_PROVEEDOR,
  CONTACTOS.NOMBRE,
  ALBARANES_PROVEEDOR.ID_DIRECCION,
  ALBARANES_PROVEEDOR.PERSONA_CONTACTO_PROV,
  ALBARANES_PROVEEDOR.FECHA_ALBARAN,
  ALBARANES_PROVEEDOR.REFERENCIA,
  ALBARANES_PROVEEDOR.REFERENCIA_PROVEEDOR,
  ALBARANES_PROVEEDOR.TIPO,
  ALBARANES_PROVEEDOR.ID_ALMACEN,
  ALMACENES.TIPO_ALMACEN,
  ALMACENES.NOMBRE AS NOMBRE_ALMACEN,
  ALBARANES_PROVEEDOR.ID_PEDIDO,
  PEDIDOS_PROVEEDOR.REFERENCIA AS REF_PED_PROVEEDOR,
  ALBARANES_PROVEEDOR.ID_FACTURA,
  FACTURAS_PROVEEDOR.REFERENCIA AS REF_FACTURA,
  ALBARANES_PROVEEDOR.REF_FACTURA_PROV,
  ALBARANES_PROVEEDOR.CALLE,
  ALBARANES_PROVEEDOR.CODIGO_POSTAL,
  ALBARANES_PROVEEDOR.POBLACION,
  ALBARANES_PROVEEDOR.PROVINCIA,
  ALBARANES_PROVEEDOR.PERSONA_CONTACTO,
  ALBARANES_PROVEEDOR.TELEFONO,
  ALBARANES_PROVEEDOR.IMPORTE_NETO,
  ALBARANES_PROVEEDOR.IMPORTE_PORTE,
  ALBARANES_PROVEEDOR.DESCUENTO,
  ALBARANES_PROVEEDOR.IMPORTE_DESCUENTO,
  ALBARANES_PROVEEDOR.BASE_IMPONIBLE,
  ALBARANES_PROVEEDOR.IVA,
  ALBARANES_PROVEEDOR.IMPORTE_IVA,
  ALBARANES_PROVEEDOR.IMPORTE_TOTAL,
  ALBARANES_PROVEEDOR.OBSERVACIONES,
  ALBARANES_PROVEEDOR.INCIDENCIAS,
  ALBARANES_PROVEEDOR.INCIDENCIAS_ACTIVAS,
  ALBARANES_PROVEEDOR.FECHA_ALTA,
  ALBARANES_PROVEEDOR.FECHA_MODIFICACION,
  ALBARANES_PROVEEDOR.USUARIO,
  ALBARANES_PROVEEDOR.ID_FORMA_PAGO,
  ALBARANES_PROVEEDOR.ID_ALBARAN,
  ALB2.REFERENCIA AS REFERENCIA_ALBARAN
FROM
  ALBARANES_PROVEEDOR
  INNER JOIN CONTACTOS ON (CONTACTOS.ID = ALBARANES_PROVEEDOR.ID_PROVEEDOR)
  LEFT OUTER JOIN PEDIDOS_PROVEEDOR ON (PEDIDOS_PROVEEDOR.ID = ALBARANES_PROVEEDOR.ID_PEDIDO)
  LEFT OUTER JOIN FACTURAS_PROVEEDOR ON (FACTURAS_PROVEEDOR.ID = ALBARANES_PROVEEDOR.ID_FACTURA)
  LEFT OUTER JOIN ALMACENES ON (ALMACENES.ID = ALBARANES_PROVEEDOR.ID_ALMACEN)
  LEFT OUTER JOIN ALBARANES_PROVEEDOR ALB2 ON (ALB2.ID = ALBARANES_PROVEEDOR.ID_ALBARAN)
;



/* View: V_ALMACENES */
CREATE VIEW V_ALMACENES(
    ID,
    ID_EMPRESA,
    NOMBRE,
    CALLE,
    PROVINCIA,
    POBLACION,
    CODIGO_POSTAL,
    TELEFONO,
    MOVIL,
    FAX,
    PERSONA_CONTACTO,
    OBSERVACIONES,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO)
AS
SELECT ALMACENES.ID, ALMACENES.ID_EMPRESA, ALMACENES.NOMBRE,
    ALMACENES.CALLE, ALMACENES.PROVINCIA, ALMACENES.POBLACION, ALMACENES.CODIGO_POSTAL,
    ALMACENES.TELEFONO, ALMACENES.MOVIL, ALMACENES.FAX, ALMACENES.PERSONA_CONTACTO,
    ALMACENES.OBSERVACIONES, ALMACENES.FECHA_ALTA, ALMACENES.FECHA_MODIFICACION, ALMACENES.USUARIO
FROM ALMACENES
WHERE ALMACENES.TIPO_ALMACEN = 'ALMACEN'
;



/* View: V_ARTICULOS_PARA_COMPRA */
CREATE VIEW V_ARTICULOS_PARA_COMPRA(
    ID,
    ID_EMPRESA,
    REFERENCIA,
    DESCRIPCION,
    UNIDAD_MEDIDA,
    FAMILIA,
    IMAGEN,
    COMISIONABLE,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    REFERENCIA_PROV,
    PRECIO_COSTE,
    PRECIO_PORTE,
    DESCUENTO,
    PRECIO_NETO,
    INVENTARIABLE,
    ID_PROVEEDOR,
    NOMBRE_PROVEEDOR,
    ELIMINADO,
    FABRICANTE,
    REFERENCIA_FABR,
    PARAM_MARGEN,
    PRECIO_PVP_VENTA,
    TIEMPO,
    PARAM_TIEMPO,
    MANO_OBRA,
    PRECIO_PVP_TOTAL,
    ID_ARTICULO)
AS
SELECT ARTICULOS.ID, ARTICULOS.ID_EMPRESA, ARTICULOS.REFERENCIA, ARTICULOS.DESCRIPCION,
       ARTICULOS.UNIDAD_MEDIDA, ARTICULOS.FAMILIA, ARTICULOS.IMAGEN, 
       ARTICULOS.COMISIONABLE, ARTICULOS.FECHA_ALTA,
       ARTICULOS.FECHA_MODIFICACION, ARTICULOS.USUARIO,
       ARTICULOS_PROVEEDORES.REFERENCIA_PROV,
       ARTICULOS_PROVEEDORES.PRECIO_COSTE,
       ARTICULOS_PROVEEDORES.PRECIO_PORTE,
       ARTICULOS_PROVEEDORES.DESCUENTO,
       ARTICULOS_PROVEEDORES.PRECIO_NETO,
       ARTICULOS.INVENTARIABLE,
       ARTICULOS_PROVEEDORES.ID_PROVEEDOR,
       CONTACTOS.NOMBRE AS NOMBRE_PROVEEDOR,
       ARTICULOS.ELIMINADO,
       ARTICULOS.FABRICANTE,
       ARTICULOS.REFERENCIA_FABR,
       ARTICULOS.PARAM_MARGEN,
       ARTICULOS_PROVEEDORES.PRECIO_PVP_VENTA,
       ARTICULOS.TIEMPO,
       ARTICULOS.PARAM_TIEMPO,
       ARTICULOS.MANO_OBRA,
       ARTICULOS_PROVEEDORES.PRECIO_PVP_TOTAL,
       ARTICULOS.ID
FROM ARTICULOS
LEFT OUTER JOIN ARTICULOS_PROVEEDORES ON (ARTICULOS_PROVEEDORES.ID_ARTICULO = ARTICULOS.ID)
LEFT OUTER JOIN CONTACTOS ON (CONTACTOS.ID = ARTICULOS_PROVEEDORES.ID_PROVEEDOR)
WHERE (ARTICULOS.ELIMINADO = 0)
;



/* View: V_ARTICULOS_PVP_MAX */
CREATE VIEW V_ARTICULOS_PVP_MAX(
    ID_ARTICULO,
    PRECIO_PVP_VENTA,
    PRECIO_PVP_TOTAL)
AS
select
ID_ARTICULO, MAX(COALESCE(PRECIO_PVP_VENTA,0)) as PRECIO_PVP_VENTA, MAX(COALESCE(PRECIO_PVP_TOTAL,0)) as PRECIO_PVP_TOTAL
from ARTICULOS_PROVEEDORES
group by 1
;



/* View: V_ARTICULOS_PARA_VENTA */
CREATE VIEW V_ARTICULOS_PARA_VENTA(
    ID,
    ID_EMPRESA,
    REFERENCIA,
    DESCRIPCION,
    UNIDAD_MEDIDA,
    FAMILIA,
    IMAGEN,
    COMISIONABLE,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    REFERENCIA_PROV,
    PRECIO_COSTE,
    PRECIO_PORTE,
    DESCUENTO,
    PRECIO_NETO,
    INVENTARIABLE,
    ELIMINADO,
    FABRICANTE,
    REFERENCIA_FABR,
    PARAM_MARGEN,
    PRECIO_PVP_VENTA,
    TIEMPO,
    PARAM_TIEMPO,
    MANO_OBRA,
    PRECIO_PVP_TOTAL)
AS
SELECT ARTICULOS.ID, ARTICULOS.ID_EMPRESA, ARTICULOS.REFERENCIA, ARTICULOS.DESCRIPCION,
       ARTICULOS.UNIDAD_MEDIDA, ARTICULOS.FAMILIA, ARTICULOS.IMAGEN, 
       ARTICULOS.COMISIONABLE, ARTICULOS.FECHA_ALTA,
       ARTICULOS.FECHA_MODIFICACION, ARTICULOS.USUARIO,

/*Estos Campos se necesitan para que no se tenga que tocar la lógica de selección de articulos de toda la aplicación*/
       '' as REFERENCIA_PROV,
       0 as PRECIO_COSTE,
       0 as PRECIO_PORTE,
       0 as DESCUENTO,
       0 as PRECIO_NETO,

       ARTICULOS.INVENTARIABLE,
       ARTICULOS.ELIMINADO,
       ARTICULOS.FABRICANTE,
       ARTICULOS.REFERENCIA_FABR,
       ARTICULOS.PARAM_MARGEN,
       V_ARTICULOS_PVP_MAX.PRECIO_PVP_VENTA,
       ARTICULOS.TIEMPO,
       ARTICULOS.PARAM_TIEMPO,
       ARTICULOS.MANO_OBRA,
       V_ARTICULOS_PVP_MAX.PRECIO_PVP_TOTAL

FROM ARTICULOS
LEFT OUTER JOIN V_ARTICULOS_PVP_MAX ON (V_ARTICULOS_PVP_MAX.ID_ARTICULO = ARTICULOS.ID)
WHERE (ARTICULOS.ELIMINADO = 0)
;



/* View: V_CONTACTOS */
CREATE VIEW V_CONTACTOS(
    ID,
    ID_CATEGORIA,
    NIF_CIF,
    NOMBRE,
    PERSONA_CONTACTO,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    TELEFONO_1,
    TELEFONO_2,
    MOVIL_1,
    MOVIL_2,
    FAX,
    EMAIL_1,
    EMAIL_2,
    PAGINA_WEB,
    NOTAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_EMPRESA,
    REFERENCIA)
AS
SELECT CONTACTOS.ID,
       CONTACTOS_CATEGORIAS.ID_CATEGORIA,
       CONTACTOS.NIF_CIF,
       CONTACTOS.NOMBRE,
       CONTACTOS.PERSONA_CONTACTO,
       CONTACTOS.CALLE,
       CONTACTOS.POBLACION,
       CONTACTOS.PROVINCIA,
       CONTACTOS.CODIGO_POSTAL,
       CONTACTOS.TELEFONO_1,
       CONTACTOS.TELEFONO_2,
       CONTACTOS.MOVIL_1,
       CONTACTOS.MOVIL_2,
       CONTACTOS.FAX,
       CONTACTOS.EMAIL_1,
       CONTACTOS.EMAIL_2,
       CONTACTOS.PAGINA_WEB,
       CONTACTOS.NOTAS,
       CONTACTOS.FECHA_ALTA,
       CONTACTOS.FECHA_MODIFICACION,
       CONTACTOS.USUARIO,
       EMPRESAS_CONTACTOS.ID_EMPRESA,
       CONTACTOS.REFERENCIA
FROM CONTACTOS
     INNER JOIN CONTACTOS_CATEGORIAS ON (CONTACTOS_CATEGORIAS.ID_CONTACTO =
     CONTACTOS.ID)
     INNER JOIN EMPRESAS_CONTACTOS ON (EMPRESAS_CONTACTOS.ID_CONTACTO =
     CONTACTOS.ID)
;



/* View: V_CLIENTES */
/* View: V_CLIENTES */
CREATE VIEW V_CLIENTES(
    ID,
    ID_CATEGORIA,
    NIF_CIF,
    NOMBRE,
    PERSONA_CONTACTO,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    TELEFONO_1,
    TELEFONO_2,
    MOVIL_1,
    MOVIL_2,
    FAX,
    EMAIL_1,
    EMAIL_2,
    PAGINA_WEB,
    NOTAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_EMPRESA,  
    REFERENCIA,
    ID_AGENTE,
    GRUPO_CLIENTE,
    NOMBRE_COMERCIAL,
    VENCIMIENTO_FACTURAS_1,
    VENCIMIENTO_FACTURAS_2,
    VENCIMIENTO_FACTURAS_3,
    BLOQUEADO,
    AGENTE,
    RAPEL,
    EMAIL_ADMINISTRACION,    
    REGIMEN_IVA,
    MOTIVO_BLOQUEO,
    RECARGO_EQUIVALENCIA,
    ID_TIPO_IVA,
    ID_FORMA_PAGO,
    TIENDA_WEB,
    CODIGO_ASIGNADO,
    DESCUENTO,
    FELICITACION)
AS
SELECT
  V_CONTACTOS.ID,
  V_CONTACTOS.ID_CATEGORIA,
  V_CONTACTOS.NIF_CIF,
  V_CONTACTOS.NOMBRE,
  V_CONTACTOS.PERSONA_CONTACTO,
  V_CONTACTOS.CALLE,
  V_CONTACTOS.POBLACION,
  V_CONTACTOS.PROVINCIA,
  V_CONTACTOS.CODIGO_POSTAL,
  V_CONTACTOS.TELEFONO_1,
  V_CONTACTOS.TELEFONO_2,
  V_CONTACTOS.MOVIL_1,
  V_CONTACTOS.MOVIL_2,
  V_CONTACTOS.FAX,
  V_CONTACTOS.EMAIL_1,
  V_CONTACTOS.EMAIL_2,
  V_CONTACTOS.PAGINA_WEB,
  V_CONTACTOS.NOTAS,
  V_CONTACTOS.FECHA_ALTA,
  V_CONTACTOS.FECHA_MODIFICACION,
  V_CONTACTOS.USUARIO,
  V_CONTACTOS.ID_EMPRESA,
  V_CONTACTOS.REFERENCIA,
  CLIENTES_DATOS.ID_AGENTE,
  CLIENTES_DATOS.GRUPO_CLIENTE,
  CLIENTES_DATOS.NOMBRE_COMERCIAL,
  CLIENTES_DATOS.VENCIMIENTO_FACTURAS_1,
  CLIENTES_DATOS.VENCIMIENTO_FACTURAS_2,
  CLIENTES_DATOS.VENCIMIENTO_FACTURAS_3,
  CLIENTES_DATOS.BLOQUEADO,
  CONTACTOS.NOMBRE AS AGENTE,
  CLIENTES_DATOS.RAPEL,
  CLIENTES_DATOS.EMAIL_ADMINISTRACION,
  CLIENTES_DATOS.REGIMEN_IVA,
  CLIENTES_DATOS.MOTIVO_BLOQUEO,
  CLIENTES_DATOS.RECARGO_EQUIVALENCIA,
  CLIENTES_DATOS.ID_TIPO_IVA,
  CLIENTES_DATOS.ID_FORMA_PAGO,
  CLIENTES_DATOS.TIENDA_WEB,
  CLIENTES_DATOS.CODIGO_ASIGNADO,
  CLIENTES_DATOS.DESCUENTO,
  CLIENTES_DATOS.FELICITACION
FROM
  V_CONTACTOS
  LEFT OUTER JOIN CLIENTES_DATOS ON (V_CONTACTOS.ID = CLIENTES_DATOS.ID_CLIENTE)
  LEFT OUTER JOIN CONTACTOS ON (CLIENTES_DATOS.ID_AGENTE = CONTACTOS.ID)
WHERE
  V_CONTACTOS.ID_CATEGORIA = 1
;

CREATE VIEW V_AGENTES(
    ID,
    ID_CATEGORIA,
    NIF_CIF,
    NOMBRE,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    TELEFONO_1,
    TELEFONO_2,
    MOVIL_1,
    MOVIL_2,
    FAX,
    EMAIL_1,
    EMAIL_2,
    PAGINA_WEB,
    NOTAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_EMPRESA,
    REFERENCIA,
    FECHA_ALTA_EMPRESA,
    FECHA_BAJA,
    CAUSA_BAJA)
AS
SELECT V_CONTACTOS.ID,
  V_CONTACTOS.ID_CATEGORIA,
  V_CONTACTOS.NIF_CIF,
  V_CONTACTOS.NOMBRE,
  V_CONTACTOS.CALLE,
  V_CONTACTOS.POBLACION,
  V_CONTACTOS.PROVINCIA,
  V_CONTACTOS.CODIGO_POSTAL,
  V_CONTACTOS.TELEFONO_1,
  V_CONTACTOS.TELEFONO_2,
  V_CONTACTOS.MOVIL_1,
  V_CONTACTOS.MOVIL_2,
  V_CONTACTOS.FAX,
  V_CONTACTOS.EMAIL_1,
  V_CONTACTOS.EMAIL_2,
  V_CONTACTOS.PAGINA_WEB,
  V_CONTACTOS.NOTAS,
  V_CONTACTOS.FECHA_ALTA,
  V_CONTACTOS.FECHA_MODIFICACION,
  V_CONTACTOS.USUARIO,
  V_CONTACTOS.ID_EMPRESA, V_CONTACTOS.REFERENCIA,
  AGENTES_DATOS.FECHA_ALTA_EMPRESA,
  AGENTES_DATOS.FECHA_BAJA,
  AGENTES_DATOS.CAUSA_BAJA
  FROM V_CONTACTOS
INNER JOIN AGENTES_DATOS ON (AGENTES_DATOS.ID_AGENTE = V_CONTACTOS.ID)
 WHERE V_CONTACTOS.ID_CATEGORIA = 3
;

/* View: V_EMPLEADOS */
CREATE VIEW V_EMPLEADOS(
    ID,
    ID_CATEGORIA,
    NIF_CIF,
    NOMBRE,
    PERSONA_CONTACTO,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    TELEFONO_1,
    TELEFONO_2,
    MOVIL_1,
    MOVIL_2,
    FAX,
    EMAIL_1,
    EMAIL_2,
    PAGINA_WEB,
    NOTAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_EMPRESA,
    REFERENCIA,
    FECHA_NACIMIENTO,
    CATEGORIA,
    FECHA_ALTA_EMPRESA,
    FORMACION_BASE,
    FORMACION_COMPLE,
    FORMACION_RECIBIDA,
    EXPERIENCIA,
    CONTRATO,
    DURACION,
    FECHA_BAJA,
    CAUSA_BAJA)
AS
SELECT V_CONTACTOS.ID,
  V_CONTACTOS.ID_CATEGORIA,
  V_CONTACTOS.NIF_CIF,
  V_CONTACTOS.NOMBRE,
  V_CONTACTOS.PERSONA_CONTACTO,
  V_CONTACTOS.CALLE,
  V_CONTACTOS.POBLACION,
  V_CONTACTOS.PROVINCIA,
  V_CONTACTOS.CODIGO_POSTAL,
  V_CONTACTOS.TELEFONO_1,
  V_CONTACTOS.TELEFONO_2,
  V_CONTACTOS.MOVIL_1,
  V_CONTACTOS.MOVIL_2,
  V_CONTACTOS.FAX,
  V_CONTACTOS.EMAIL_1,
  V_CONTACTOS.EMAIL_2,
  V_CONTACTOS.PAGINA_WEB,
  V_CONTACTOS.NOTAS,
  V_CONTACTOS.FECHA_ALTA,
  V_CONTACTOS.FECHA_MODIFICACION,
  V_CONTACTOS.USUARIO,
  V_CONTACTOS.ID_EMPRESA, 
  V_CONTACTOS.REFERENCIA,
  
  EMPLEADOS_DATOS.FECHA_NACIMIENTO,
  EMPLEADOS_DATOS.CATEGORIA,
  EMPLEADOS_DATOS.FECHA_ALTA_EMPRESA,
  EMPLEADOS_DATOS.FORMACION_BASE,
  EMPLEADOS_DATOS.FORMACION_COMPLE,
  EMPLEADOS_DATOS.FORMACION_RECIBIDA,
  EMPLEADOS_DATOS.EXPERIENCIA,
  EMPLEADOS_DATOS.CONTRATO,
  EMPLEADOS_DATOS.DURACION,
  EMPLEADOS_DATOS.FECHA_BAJA,
  EMPLEADOS_DATOS.CAUSA_BAJA
 
FROM V_CONTACTOS
INNER JOIN EMPLEADOS_DATOS ON (EMPLEADOS_DATOS.ID_EMPLEADO = V_CONTACTOS.ID)
WHERE V_CONTACTOS.ID_CATEGORIA = 3
;

/* View: V_REC_FAC_CLI */
CREATE VIEW V_REC_FAC_CLI(
    ID_FACTURA,
    NUM_RECIBOS)
AS
SELECT FACTURAS_CLIENTE.ID, COUNT(RECIBOS_CLIENTE.ID)
FROM FACTURAS_CLIENTE
LEFT JOIN RECIBOS_CLIENTE
ON (RECIBOS_CLIENTE.ID_FACTURA = FACTURAS_CLIENTE.ID)
GROUP BY FACTURAS_CLIENTE.ID
;



/* View: V_REC_CLI_SITUACION */
CREATE VIEW V_REC_CLI_SITUACION(
    ID_RECIBO,
    SITUACION)
AS
SELECT RECIBOS_CLIENTE.ID,
CASE WHEN (COUNT(PAGOS_CLIENTE.ID_RECIBO)=0) THEN 'PENDIENTE'
     WHEN (MOD(COUNT(PAGOS_CLIENTE.ID_RECIBO), 2)=0) THEN 'DEVUELTO'
     ELSE 'COBRADO'
END
FROM RECIBOS_CLIENTE
LEFT JOIN PAGOS_CLIENTE
ON (PAGOS_CLIENTE.ID_RECIBO = RECIBOS_CLIENTE.ID)
GROUP BY RECIBOS_CLIENTE.ID
;



/* View: V_REC_FAC_CLI_COBRADOS */
CREATE VIEW V_REC_FAC_CLI_COBRADOS(
    ID_FACTURA,
    NUM_REC_COBRADOS)
AS
SELECT RECIBOS_CLIENTE.ID_FACTURA, COUNT(V_REC_CLI_SITUACION.ID_RECIBO)
FROM V_REC_CLI_SITUACION LEFT JOIN RECIBOS_CLIENTE ON
     (RECIBOS_CLIENTE.ID = V_REC_CLI_SITUACION.ID_RECIBO)
WHERE (TRIM(V_REC_CLI_SITUACION.SITUACION) = 'COBRADO')
GROUP BY RECIBOS_CLIENTE.ID_FACTURA
;



/* View: V_FAC_CLI_SITUACION */
CREATE VIEW V_FAC_CLI_SITUACION(
    ID_FACTURA,
    SITUACION)
AS
SELECT ID_FACTURA,
CASE
    WHEN ((SUM(NUM_RECIBOS) = 0)
         OR (SUM(NUM_REC_COBRADOS) = 0)) THEN 'PENDIENTE'
    WHEN (SUM(NUM_RECIBOS) = SUM(NUM_REC_COBRADOS)) THEN 'PAGADA'
    ELSE 'PARCIALMENTE PAGADA'
END AS SITUACION
FROM
(
 SELECT ID_FACTURA, NUM_RECIBOS, 0 AS NUM_REC_COBRADOS
 FROM V_REC_FAC_CLI
 UNION ALL
 SELECT ID_FACTURA, 0 AS NUM_RECIBOS, NUM_REC_COBRADOS
 FROM V_REC_FAC_CLI_COBRADOS
)
GROUP BY ID_FACTURA
;



/* View: V_REC_FAC_PRO */
CREATE VIEW V_REC_FAC_PRO(
    ID_FACTURA,
    NUM_RECIBOS)
AS
SELECT FACTURAS_PROVEEDOR.ID, COUNT(RECIBOS_PROVEEDOR.ID)
FROM FACTURAS_PROVEEDOR
LEFT JOIN RECIBOS_PROVEEDOR
ON (RECIBOS_PROVEEDOR.ID_FACTURA = FACTURAS_PROVEEDOR.ID)
GROUP BY FACTURAS_PROVEEDOR.ID
;



/* View: V_REC_PRO_SITUACION */
CREATE VIEW V_REC_PRO_SITUACION(
    ID_RECIBO,
    SITUACION)
AS
SELECT RECIBOS_PROVEEDOR.ID,
CASE WHEN (COUNT(PAGOS_PROVEEDOR.ID_RECIBO)=0) THEN 'PENDIENTE'
     WHEN (MOD(COUNT(PAGOS_PROVEEDOR.ID_RECIBO), 2)=0) THEN 'DEVUELTO'
     ELSE 'PAGADO'
END
FROM RECIBOS_PROVEEDOR
LEFT JOIN PAGOS_PROVEEDOR
ON (PAGOS_PROVEEDOR.ID_RECIBO = RECIBOS_PROVEEDOR.ID)
GROUP BY RECIBOS_PROVEEDOR.ID
;



/* View: V_REC_FAC_PRO_PAGADOS */
CREATE VIEW V_REC_FAC_PRO_PAGADOS(
    ID_FACTURA,
    NUM_REC_PAGADOS)
AS
SELECT RECIBOS_PROVEEDOR.ID_FACTURA, COUNT(V_REC_PRO_SITUACION.ID_RECIBO)
FROM V_REC_PRO_SITUACION LEFT JOIN RECIBOS_PROVEEDOR ON
     (RECIBOS_PROVEEDOR.ID = V_REC_PRO_SITUACION.ID_RECIBO)
WHERE (TRIM(V_REC_PRO_SITUACION.SITUACION) = 'PAGADO')
GROUP BY RECIBOS_PROVEEDOR.ID_FACTURA
;



/* View: V_FAC_PRO_SITUACION */
CREATE VIEW V_FAC_PRO_SITUACION(
    ID_FACTURA,
    SITUACION)
AS
SELECT ID_FACTURA,
CASE
    WHEN ((SUM(NUM_RECIBOS) = 0)
         OR (SUM(NUM_REC_PAGADOS) = 0)) THEN 'PENDIENTE'
    WHEN (SUM(NUM_RECIBOS) = SUM(NUM_REC_PAGADOS)) THEN 'PAGADA'
    ELSE 'PARCIALMENTE PAGADA'
END AS SITUACION
FROM
(
 SELECT ID_FACTURA, NUM_RECIBOS, 0 AS NUM_REC_PAGADOS
 FROM V_REC_FAC_PRO
 UNION ALL
 SELECT ID_FACTURA, 0 AS NUM_RECIBOS, NUM_REC_PAGADOS
 FROM V_REC_FAC_PRO_PAGADOS
)
GROUP BY ID_FACTURA
;



/* View: V_FACTURAS_CLIENTE */
CREATE VIEW V_FACTURAS_CLIENTE(
	ID,
	ID_EMPRESA,
	REFERENCIA,
	TIPO,
	ID_COMISION_LIQUIDADA,
	FECHA_FACTURA,
  FECHA_VENCIMIENTO,	
  FECHA_RETENCION,
	SITUACION,
	BASE_IMPONIBLE,
	DESCUENTO,
	IMPORTE_DESCUENTO,
	IVA,
	IMPORTE_IVA,
	RE,
	IMPORTE_RE,
	IMPORTE_TOTAL,
	OBSERVACIONES,
	ID_CLIENTE,
	NIF_CIF,
	NOMBRE,
	ID_DIRECCION,
	CALLE,
	POBLACION,
	PROVINCIA,
	CODIGO_POSTAL,
	DATOS_BANCARIOS,
	CLIENTE_FINAL,
	FECHA_ALTA,
	FECHA_MODIFICACION,
	USUARIO,
	ID_FORMA_PAGO,
	RECARGO_EQUIVALENCIA,
	ID_TIPO_IVA,
	IMPORTE_NETO,
	IMPORTE_PORTE,
	ID_AGENTE,
	REFERENCIA_COMISION,
	RETENCION,
	IMPORTE_RETENCION)
 AS 
SELECT FACTURAS_CLIENTE.ID,
  FACTURAS_CLIENTE.ID_EMPRESA,
  FACTURAS_CLIENTE.REFERENCIA,
  CASE WHEN (FACTURAS_CLIENTE.IMPORTE_TOTAL < 0) THEN 'A' ELSE 'F' END AS TIPO,
  FACTURAS_CLIENTE.ID_COMISION_LIQUIDADA,
  FACTURAS_CLIENTE.FECHA_FACTURA,
  FACTURAS_CLIENTE.FECHA_VENCIMIENTO,  
  FACTURAS_CLIENTE.FECHA_RETENCION,  
  TRIM(V_FAC_CLI_SITUACION.SITUACION),
  FACTURAS_CLIENTE.BASE_IMPONIBLE,
  FACTURAS_CLIENTE.DESCUENTO,
  FACTURAS_CLIENTE.IMPORTE_DESCUENTO,
  FACTURAS_CLIENTE.IVA,
  FACTURAS_CLIENTE.IMPORTE_IVA,
  FACTURAS_CLIENTE.RE,
  FACTURAS_CLIENTE.IMPORTE_RE,
  FACTURAS_CLIENTE.IMPORTE_TOTAL,
  FACTURAS_CLIENTE.OBSERVACIONES,
  FACTURAS_CLIENTE.ID_CLIENTE,
  FACTURAS_CLIENTE.NIF_CIF,
  FACTURAS_CLIENTE.NOMBRE,
  FACTURAS_CLIENTE.ID_DIRECCION,
  FACTURAS_CLIENTE.CALLE,
  FACTURAS_CLIENTE.POBLACION,
  FACTURAS_CLIENTE.PROVINCIA,
  FACTURAS_CLIENTE.CODIGO_POSTAL,
  FACTURAS_CLIENTE.DATOS_BANCARIOS,
  FACTURAS_CLIENTE.CLIENTE_FINAL,
  FACTURAS_CLIENTE.FECHA_ALTA,
  FACTURAS_CLIENTE.FECHA_MODIFICACION,
  FACTURAS_CLIENTE.USUARIO,
  FACTURAS_CLIENTE.ID_FORMA_PAGO,
  FACTURAS_CLIENTE.RECARGO_EQUIVALENCIA,
  FACTURAS_CLIENTE.ID_TIPO_IVA,
  FACTURAS_CLIENTE.IMPORTE_NETO,
  FACTURAS_CLIENTE.IMPORTE_PORTE,
  CLIENTES_DATOS.ID_AGENTE,
  COMISIONES_LIQUIDADAS.REFERENCIA,
  FACTURAS_CLIENTE.RETENCION,
  FACTURAS_CLIENTE.IMPORTE_RETENCION
  FROM V_FAC_CLI_SITUACION
  LEFT JOIN FACTURAS_CLIENTE
  ON (FACTURAS_CLIENTE.ID = V_FAC_CLI_SITUACION.ID_FACTURA)
  LEFT JOIN COMISIONES_LIQUIDADAS
  ON (COMISIONES_LIQUIDADAS.ID = FACTURAS_CLIENTE.ID_COMISION_LIQUIDADA)
  LEFT JOIN CLIENTES_DATOS
  ON (CLIENTES_DATOS.ID_CLIENTE = FACTURAS_CLIENTE.ID_CLIENTE);
;


/* View: V_FACTURAS_PROVEEDOR */
CREATE VIEW V_FACTURAS_PROVEEDOR(
    ID,
    ID_EMPRESA,
    REFERENCIA,
    TIPO,
    REFERENCIA_PROVEEDOR,
    FECHA_FACTURA,
    FECHA_VENCIMIENTO,
    SITUACION,
    BASE_IMPONIBLE,
    DESCUENTO,
    IMPORTE_DESCUENTO,
    IVA,
    IMPORTE_IVA,
    RE,
    IMPORTE_RE,
    IMPORTE_TOTAL,
    OBSERVACIONES,
    ID_PROVEEDOR,
    NIF_CIF,
    NOMBRE,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_FORMA_PAGO,
    RECARGO_EQUIVALENCIA,
    ID_TIPO_IVA,
    IMPORTE_NETO,
    IMPORTE_PORTE,
	DATOS_BANCARIOS)
AS
SELECT FACTURAS_PROVEEDOR.ID,
  FACTURAS_PROVEEDOR.ID_EMPRESA,
  FACTURAS_PROVEEDOR.REFERENCIA,
  CASE WHEN (FACTURAS_PROVEEDOR.IMPORTE_TOTAL < 0) THEN 'A' ELSE 'F' END AS TIPO,
  FACTURAS_PROVEEDOR.REFERENCIA_PROVEEDOR,
  FACTURAS_PROVEEDOR.FECHA_FACTURA,
  FACTURAS_PROVEEDOR.FECHA_VENCIMIENTO,  
  TRIM(V_FAC_PRO_SITUACION.SITUACION),
  FACTURAS_PROVEEDOR.BASE_IMPONIBLE,
  FACTURAS_PROVEEDOR.DESCUENTO,
  FACTURAS_PROVEEDOR.IMPORTE_DESCUENTO,
  FACTURAS_PROVEEDOR.IVA,
  FACTURAS_PROVEEDOR.IMPORTE_IVA,
  FACTURAS_PROVEEDOR.RE,
  FACTURAS_PROVEEDOR.IMPORTE_RE,
  FACTURAS_PROVEEDOR.IMPORTE_TOTAL,
  FACTURAS_PROVEEDOR.OBSERVACIONES,
  FACTURAS_PROVEEDOR.ID_PROVEEDOR,
  FACTURAS_PROVEEDOR.NIF_CIF,
  FACTURAS_PROVEEDOR.NOMBRE,
  FACTURAS_PROVEEDOR.CALLE,
  FACTURAS_PROVEEDOR.POBLACION,
  FACTURAS_PROVEEDOR.PROVINCIA,
  FACTURAS_PROVEEDOR.CODIGO_POSTAL,
  FACTURAS_PROVEEDOR.FECHA_ALTA,
  FACTURAS_PROVEEDOR.FECHA_MODIFICACION,
  FACTURAS_PROVEEDOR.USUARIO,
  FACTURAS_PROVEEDOR.ID_FORMA_PAGO,
  FACTURAS_PROVEEDOR.RECARGO_EQUIVALENCIA,
  FACTURAS_PROVEEDOR.ID_TIPO_IVA,
  FACTURAS_PROVEEDOR.IMPORTE_NETO,
  FACTURAS_PROVEEDOR.IMPORTE_PORTE,
  FACTURAS_PROVEEDOR.DATOS_BANCARIOS
  FROM V_FAC_PRO_SITUACION
  LEFT JOIN FACTURAS_PROVEEDOR
  ON (FACTURAS_PROVEEDOR.ID = V_FAC_PRO_SITUACION.ID_FACTURA)
  LEFT JOIN PROVEEDORES_DATOS
  ON (PROVEEDORES_DATOS.ID_PROVEEDOR = FACTURAS_PROVEEDOR.ID_PROVEEDOR)
;



/* View: V_HIS_MOV_ALB_CLI */
CREATE VIEW V_HIS_MOV_ALB_CLI(
    FECHA,
    ID_ALMACEN,
    ID_ARTICULO,
    TIPO_MOVIMIENTO,
    CANTIDAD,
    CAUSA)
AS
SELECT
        ALBARANES_CLIENTE.FECHA_ALBARAN,
        V_ALB_CLI_DETALLES.ID_ALMACEN,
        V_ALB_CLI_DETALLES.ID_ARTICULO,
        CASE WHEN V_ALB_CLI_DETALLES.CANTIDAD < 0 THEN 'E'
        ELSE 'S' END,
        (-1)*V_ALB_CLI_DETALLES.CANTIDAD,
        CASE WHEN ALBARANES_CLIENTE.IMPORTE_TOTAL < 0 THEN 'Orden de devolución de cliente ' || ALBARANES_CLIENTE.REFERENCIA
        ELSE 'Albarán de cliente ' || ALBARANES_CLIENTE.REFERENCIA END

FROM V_ALB_CLI_DETALLES
LEFT JOIN ALBARANES_CLIENTE
ON (V_ALB_CLI_DETALLES.ID_ALBARAN = ALBARANES_CLIENTE.ID)

WHERE (V_ALB_CLI_DETALLES.ID_ALMACEN IS NOT NULL)
AND (V_ALB_CLI_DETALLES.SITUACION in ('ENVIADO', 'SERVIDO'))
;



/* View: V_HIS_MOV_ALB_PROV */
CREATE VIEW V_HIS_MOV_ALB_PROV(
    FECHA,
    ID_ALMACEN,
    ID_ARTICULO,
    TIPO_MOVIMIENTO,
    CANTIDAD,
    CAUSA)
AS
SELECT
        ALBARANES_PROVEEDOR.FECHA_ALBARAN,
        V_ALB_PROV_DETALLES.ID_ALMACEN,
        V_ALB_PROV_DETALLES.ID_ARTICULO,
        CASE WHEN V_ALB_PROV_DETALLES.CANTIDAD < 0 THEN 'S'
        ELSE 'E' END,
        V_ALB_PROV_DETALLES.CANTIDAD,
        CASE WHEN ALBARANES_PROVEEDOR.IMPORTE_TOTAL < 0 THEN 'Orden de devolución ' || ALBARANES_PROVEEDOR.REFERENCIA
        ELSE 'Albarán de proveedor ' || ALBARANES_PROVEEDOR.REFERENCIA END


FROM V_ALB_PROV_DETALLES
LEFT JOIN ALBARANES_PROVEEDOR
ON (V_ALB_PROV_DETALLES.ID_ALBARAN = ALBARANES_PROVEEDOR.ID)
WHERE (V_ALB_PROV_DETALLES.ID_ALMACEN IS NOT NULL)
;



/* View: V_HIS_MOV_REGULARIZACIONES */
CREATE VIEW V_HIS_MOV_REGULARIZACIONES(
    FECHA,
    ID_ALMACEN,
    ID_ARTICULO,
    TIPO_MOVIMIENTO,
    CANTIDAD,
    CAUSA)
AS
SELECT FECHA_MOVIMIENTO, ID_ALMACEN, ID_ARTICULO, TIPO,
CASE WHEN TIPO = 'S' THEN (-1)* CANTIDAD
        ELSE CANTIDAD END,
'Regularizaci¢n por - ' || CAUSA
FROM MOVIMIENTOS
;



/* View: V_HIS_MOV_AUX */
CREATE VIEW V_HIS_MOV_AUX(
    FECHA,
    ID_ALMACEN,
    ID_ARTICULO,
    TIPO_MOVIMIENTO,
    CANTIDAD,
    CAUSA)
AS
SELECT
  FECHA,
  ID_ALMACEN,
  ID_ARTICULO,
  TIPO_MOVIMIENTO,
  CANTIDAD,
  CAUSA
FROM V_HIS_MOV_ALB_PROV
UNION ALL
SELECT
  FECHA,
  ID_ALMACEN,
  ID_ARTICULO,
  TIPO_MOVIMIENTO,
  CANTIDAD,
  CAUSA
FROM V_HIS_MOV_ALB_CLI
UNION ALL
SELECT
  FECHA,
  ID_ALMACEN,
  ID_ARTICULO,
  TIPO_MOVIMIENTO,
  CANTIDAD,
  CAUSA
FROM V_HIS_MOV_REGULARIZACIONES
;



/* View: V_HISTORICO_MOVIMIENTOS */
CREATE VIEW V_HISTORICO_MOVIMIENTOS(
    FECHA,
    ID_ALMACEN,
    ID_EMPRESA,
    NOMBRE_ALMACEN,
    ID_ARTICULO,
    FAMILIA,
    REFERENCIA,
    UNIDAD_MEDIDA,
    FABRICANTE,
    REFERENCIA_FABR,
    DESCRIPCION,
    TIPO_MOVIMIENTO,
    CANTIDAD,
    CAUSA)
AS
SELECT
  V_HIS_MOV_AUX.FECHA,
  V_HIS_MOV_AUX.ID_ALMACEN,
  ALMACENES.ID_EMPRESA,
  ALMACENES.NOMBRE,
  V_HIS_MOV_AUX.ID_ARTICULO,
  ARTICULOS.FAMILIA,
  ARTICULOS.REFERENCIA,
  ARTICULOS.UNIDAD_MEDIDA,
  ARTICULOS.FABRICANTE,
  ARTICULOS.REFERENCIA_FABR,
  ARTICULOS.DESCRIPCION,
  V_HIS_MOV_AUX.TIPO_MOVIMIENTO,
  V_HIS_MOV_AUX.CANTIDAD,
  V_HIS_MOV_AUX.CAUSA

FROM V_HIS_MOV_AUX
LEFT JOIN ALMACENES ON (ALMACENES.ID = V_HIS_MOV_AUX.ID_ALMACEN)
LEFT JOIN ARTICULOS ON (ARTICULOS.ID = V_HIS_MOV_AUX.ID_ARTICULO)

WHERE (V_HIS_MOV_AUX.ID_ARTICULO <> 0)
AND   (ARTICULOS.INVENTARIABLE = 1)
;


/* View: V_INV_DETALLE_RESERVAS */
CREATE VIEW V_INV_DETALLE_RESERVAS(
    ID,
    ID_EMPRESA,
    ID_ALMACEN,
    NOMBRE_ALMACEN,
    FECHA_RESERVA,
    CAUSA_RESERVA,
    ID_ARTICULO,
    REFERENCIA,
    DESCRIPCION,
    FAMILIA,
    UNIDAD_MEDIDA,
    FABRICANTE,
    REFERENCIA_FABR,
    CANTIDAD,
    ID_ALMACEN_RESERVA,
    NOMBRE_ALMACEN_RESERVA,
    ID_EMPRESA_ALMACEN_RESERVA)
AS
select movimientos.id, almacenes1.ID_EMPRESA, movimientos.ID_ALMACEN, almacenes1.nombre as nombre_almacen,
movimientos.fecha_movimiento as fecha_reserva, movimientos.causa, movimientos.id_articulo,
articulos.referencia, articulos.descripcion, articulos.familia,
articulos.unidad_medida, articulos.fabricante, articulos.referencia_fabr,
movimientos.cantidad, movimientos.id_almacen_reserva,
almacenes2.nombre as nombre_almacen_reserva, almacenes2.id_empresa
from movimientos
left join almacenes almacenes1 on (almacenes1.ID = movimientos.ID_ALMACEN)
left join almacenes almacenes2 on (almacenes2.ID = movimientos.ID_ALMACEN_RESERVA)
left join articulos on (articulos.id = movimientos.id_articulo)
where tipo = 'R'
;
;



/* View: V_INV_ENTRADAS_ALB */
CREATE VIEW V_INV_ENTRADAS_ALB(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD)
FROM V_ALB_PROV_DETALLES
WHERE (ID_ALMACEN IS NOT NULL)
GROUP BY ID_ALMACEN, ID_ARTICULO
;



/* View: V_INV_ENTRADAS_MOV */
CREATE VIEW V_INV_ENTRADAS_MOV(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD)
FROM MOVIMIENTOS
WHERE TIPO = 'E'
GROUP BY ID_ALMACEN, ID_ARTICULO
;



/* View: V_INV_ENTRADAS_AUX */
CREATE VIEW V_INV_ENTRADAS_AUX(
    TIPO,
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT  'ALB',
    ID_ALMACEN,
        ID_ARTICULO,
        CANTIDAD
FROM V_INV_ENTRADAS_ALB
UNION ALL
SELECT  'MOV',
    ID_ALMACEN,
        ID_ARTICULO,
        CANTIDAD
FROM V_INV_ENTRADAS_MOV
;



/* View: V_INV_ENTRADAS */
CREATE VIEW V_INV_ENTRADAS(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT
ID_ALMACEN,
ID_ARTICULO,
SUM(CANTIDAD) as CANTIDAD
FROM V_INV_ENTRADAS_AUX

GROUP BY ID_ALMACEN,
         ID_ARTICULO
;



/* View: V_PED_PROV_ARTICULOS_RECIBIDOS */
CREATE VIEW V_PED_PROV_ARTICULOS_RECIBIDOS(
    ID_PEDIDO,
    ID_ARTICULO,
	DESCRIPCION,
    CANTIDAD)
AS
SELECT ID_PEDIDO, ID_ARTICULO, DESCRIPCION,
    SUM(CANTIDAD) AS CANTIDAD
FROM V_ALB_PROV_DETALLES
WHERE (ID_PEDIDO is not null)
GROUP BY ID_PEDIDO, ID_ARTICULO, DESCRIPCION;


/* View: V_PED_PROV_DETALLES */
CREATE VIEW V_PED_PROV_DETALLES(
    ID_PEDIDO,
    ID_ALMACEN,
    ID_ARTICULO,
    DESCRIPCION,
    CANTIDAD)
AS
SELECT  PEDIDOS_PROVEEDOR_DETALLES.ID_PEDIDO,
        PEDIDOS_PROVEEDOR.ID_ALMACEN,
        COALESCE(PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO, 0),
        CASE
            WHEN PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO IS NULL THEN PEDIDOS_PROVEEDOR_DETALLES.CONCEPTO
            ELSE NULL
        END,
        SUM(COALESCE(PEDIDOS_PROVEEDOR_DETALLES.CANTIDAD, 0))

FROM PEDIDOS_PROVEEDOR_DETALLES
LEFT JOIN PEDIDOS_PROVEEDOR
ON (PEDIDOS_PROVEEDOR_DETALLES.ID_PEDIDO = PEDIDOS_PROVEEDOR.ID)

/*Mantenemos los articulos inventariables y aquellos que no existan en nuestro catálogo con el fin de no falsear la situación de los pedidos
LEFT JOIN ARTICULOS
ON (PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO = ARTICULOS.ID)

WHERE (PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO is not null)
AND   (ARTICULOS.INVENTARIABLE = 1)
*/

GROUP BY PEDIDOS_PROVEEDOR_DETALLES.ID_PEDIDO,
         PEDIDOS_PROVEEDOR.ID_ALMACEN,
         PEDIDOS_PROVEEDOR_DETALLES.ID_ARTICULO,
         4;



/* View: V_PED_PROV_ARTICULOS_AUX */
CREATE VIEW V_PED_PROV_ARTICULOS_AUX(
    ID_PEDIDO,
    ID_ARTICULO,
	DESCRIPCION,
    CANTIDAD_PEDIDA,
    CANTIDAD_RECIBIDA)
AS
SELECT
      V_PED_PROV_DETALLES.ID_PEDIDO,
      V_PED_PROV_DETALLES.ID_ARTICULO,
      V_PED_PROV_DETALLES.DESCRIPCION,
      V_PED_PROV_DETALLES.CANTIDAD AS CANTIDAD_PEDIDA,
      0 as CANTIDAD_RECIBIDA
FROM V_PED_PROV_DETALLES
UNION ALL
SELECT
      V_PED_PROV_ARTICULOS_RECIBIDOS.ID_PEDIDO,
      V_PED_PROV_ARTICULOS_RECIBIDOS.ID_ARTICULO,
      V_PED_PROV_ARTICULOS_RECIBIDOS.DESCRIPCION,
      NULL as CANTIDAD_PEDIDA,
      V_PED_PROV_ARTICULOS_RECIBIDOS.CANTIDAD AS CANTIDAD_RECIBIDA
FROM V_PED_PROV_ARTICULOS_RECIBIDOS
;


/* View: V_PED_PROV_ARTICULOS */
CREATE VIEW V_PED_PROV_ARTICULOS(
    ID_PEDIDO,
    ID_ARTICULO,
	DESCRIPCION,
    CANTIDAD_PEDIDA,
    CANTIDAD_RECIBIDA,
    CANTIDAD_PENDIENTE)
AS
SELECT ID_PEDIDO,
       /*PEDIDOS_PROVEEDOR.ID_ALMACEN,*/
       ID_ARTICULO,
       DESCRIPCION,
       SUM(CANTIDAD_PEDIDA) as CANTIDAD_PEDIDA,
       SUM(CANTIDAD_RECIBIDA) as CANTIDAD_RECIBIDA,
       SUM(CANTIDAD_PEDIDA) - SUM(CANTIDAD_RECIBIDA) as CANTIDAD_PENDIENTE
FROM V_PED_PROV_ARTICULOS_AUX
/*
LEFT JOIN PEDIDOS_PROVEEDOR
ON (PEDIDOS_PROVEEDOR.ID = V_PED_PROV_ARTICULOS_AUX.ID_PEDIDO)
*/
GROUP BY ID_PEDIDO,
         /*PEDIDOS_PROVEEDOR.ID_ALMACEN,*/
         ID_ARTICULO,
         DESCRIPCION
HAVING SUM(CANTIDAD_PEDIDA) IS NOT NULL
;



/* View: V_INV_ENTRADAS_PENDIENTES */
CREATE VIEW V_INV_ENTRADAS_PENDIENTES(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT PEDIDOS_PROVEEDOR.ID_ALMACEN, V_PED_PROV_ARTICULOS.ID_ARTICULO, SUM(V_PED_PROV_ARTICULOS.CANTIDAD_PENDIENTE)
FROM V_PED_PROV_ARTICULOS
LEFT JOIN PEDIDOS_PROVEEDOR
ON (PEDIDOS_PROVEEDOR.ID = V_PED_PROV_ARTICULOS.ID_PEDIDO)
WHERE (PEDIDOS_PROVEEDOR.ID_ALMACEN IS NOT NULL)
GROUP BY PEDIDOS_PROVEEDOR.ID_ALMACEN, V_PED_PROV_ARTICULOS.ID_ARTICULO
;



/* View: V_INV_RESERVAS_AUX */
CREATE VIEW V_INV_RESERVAS_AUX(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD)
FROM V_ALB_CLI_DETALLES
WHERE (ID_ALMACEN IS NOT NULL)
AND (SITUACION = 'PENDIENTE')
GROUP BY ID_ALMACEN, ID_ARTICULO
UNION ALL
SELECT  ID_ALMACEN,
        ID_ARTICULO,
        CANTIDAD
FROM MOVIMIENTOS
WHERE TIPO = 'R'
;



/* View: V_INV_RESERVAS */
CREATE VIEW V_INV_RESERVAS(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD)
FROM V_INV_RESERVAS_AUX
GROUP BY ID_ALMACEN, ID_ARTICULO
;



/* View: V_INV_SALIDAS_ALB */
CREATE VIEW V_INV_SALIDAS_ALB(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD)
FROM V_ALB_CLI_DETALLES
WHERE (ID_ALMACEN IS NOT NULL)
AND (SITUACION in ('ENVIADO', 'SERVIDO'))
GROUP BY ID_ALMACEN, ID_ARTICULO
;



/* View: V_INV_SALIDAS_MOV */
CREATE VIEW V_INV_SALIDAS_MOV(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT ID_ALMACEN, ID_ARTICULO, SUM(CANTIDAD)
FROM MOVIMIENTOS
WHERE TIPO = 'S'
GROUP BY ID_ALMACEN, ID_ARTICULO
;



/* View: V_INV_SALIDAS_AUX */
CREATE VIEW V_INV_SALIDAS_AUX(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT  ID_ALMACEN,
        ID_ARTICULO,
        CANTIDAD
FROM V_INV_SALIDAS_ALB
UNION ALL
SELECT  ID_ALMACEN,
        ID_ARTICULO,
        CANTIDAD
FROM V_INV_SALIDAS_MOV
;



/* View: V_INV_SALIDAS */
CREATE VIEW V_INV_SALIDAS(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT
ID_ALMACEN,
ID_ARTICULO,
SUM(CANTIDAD) as CANTIDAD
FROM V_INV_SALIDAS_AUX

GROUP BY ID_ALMACEN,
         ID_ARTICULO
;



/* View: V_INV_STOCK_AUX */
CREATE VIEW V_INV_STOCK_AUX(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD_ENTRADA,
    CANTIDAD_SALIDA)
AS
SELECT  ID_ALMACEN,
        ID_ARTICULO,
        CANTIDAD as CANTIDAD_ENTRADA,
        0 as CANTIDAD_SALIDA
FROM V_INV_ENTRADAS
UNION ALL
SELECT  ID_ALMACEN,
        ID_ARTICULO,
        0 as CANTIDAD_ENTRADA,
        CANTIDAD as CANTIDAD_SALIDA
FROM V_INV_SALIDAS
;



/* View: V_INV_STOCK */
CREATE VIEW V_INV_STOCK(
    ID_ALMACEN,
    ID_ARTICULO,
    CANTIDAD)
AS
SELECT
ID_ALMACEN,
ID_ARTICULO,
(SUM(CANTIDAD_ENTRADA) - SUM(CANTIDAD_SALIDA)) as CANTIDAD
FROM V_INV_STOCK_AUX
GROUP BY ID_ALMACEN,
         ID_ARTICULO
;



/* View: V_INVENTARIO_AUX */
CREATE VIEW V_INVENTARIO_AUX(
    ID_ALMACEN,
    ID_ARTICULO,
    STOCK,
    PENDIENTE_RECEPCION,
    RESERVA)
AS
SELECT ID_ALMACEN, ID_ARTICULO, CANTIDAD as STOCK, 0 as PENDIENTES, 0 as RESERVADAS
FROM V_INV_STOCK
UNION ALL
SELECT ID_ALMACEN, ID_ARTICULO, 0 as STOCK, CANTIDAD as PENDIENTES, 0 AS RESERVADAS
FROM V_INV_ENTRADAS_PENDIENTES
UNION ALL
SELECT ID_ALMACEN, ID_ARTICULO, 0 as STOCK, 0 as PENDIENTES, CANTIDAD AS RESERVADAS
FROM V_INV_RESERVAS
;



/* View: V_INVENTARIO */
CREATE VIEW V_INVENTARIO(
    ID_ALMACEN,
    ID_EMPRESA,
    TIPO_ALMACEN,
    NOMBRE,
    ID_ARTICULO,
    REFERENCIA,
    FAMILIA,
    DESCRIPCION,
    REFERENCIA_FAB,
    UNIDAD_MEDIDA,
    STOCK,
    UNIDADES_ALMACEN,
    RESERVA,
    PENDIENTE_RECEPCION)
AS
SELECT ID_ALMACEN,
       ALMACENES.ID_EMPRESA,
       ALMACENES.TIPO_ALMACEN,
       ALMACENES.NOMBRE,
       ID_ARTICULO,
       ARTICULOS.REFERENCIA,
       ARTICULOS.FAMILIA,
       ARTICULOS.DESCRIPCION,
       ARTICULOS.REFERENCIA_FABR,
       ARTICULOS.UNIDAD_MEDIDA,
/*       COALESCE(ARTICULOS.PRECIO_NETO,0) as PRECIO_NETO,*/
       (SUM(STOCK) - SUM(RESERVA)) as STOCK,
       SUM(STOCK) as UNIDADES_ALMACEN,

       /*Si las unidades son negativas no se tiene en cuenta el coste*/
/*       CASE WHEN (SUM(STOCK) < 0) THEN 0
            ELSE (COALESCE(ARTICULOS.PRECIO_NETO,0) * SUM(STOCK))
       END as COSTE_UNIDADES,
*/
       SUM(RESERVA) as RESERVA,
       SUM(PENDIENTE_RECEPCION) as PENDIENTE_RECEPCION

FROM V_INVENTARIO_AUX
LEFT JOIN ARTICULOS
ON (ARTICULOS.ID = V_INVENTARIO_AUX.ID_ARTICULO)
LEFT JOIN ALMACENES
ON (ALMACENES.ID = V_INVENTARIO_AUX.ID_ALMACEN)

WHERE (ID_ARTICULO <> 0)
AND   (ARTICULOS.ELIMINADO = 0)
AND   (ARTICULOS.INVENTARIABLE = 1)

GROUP BY ID_ALMACEN,
         ALMACENES.ID_EMPRESA,
         ALMACENES.TIPO_ALMACEN,
         ALMACENES.NOMBRE,
         ID_ARTICULO,
         ARTICULOS.REFERENCIA,
         ARTICULOS.FAMILIA,
         ARTICULOS.DESCRIPCION,
         ARTICULOS.REFERENCIA_FABR,
         ARTICULOS.UNIDAD_MEDIDA
/*         ARTICULOS.PRECIO_NETO*/

/*QUITAMOS AQUELLAS TUPLAS DE LAS QUE NO TENEMOS UNIDADES EN EL ALAMCEN, NO HAY RESERVAS NI PEDIDOS PENDIENTES DE RECIBIR*/
HAVING ((SUM(STOCK) <> 0 ) OR (SUM(RESERVA) <> 0) OR (SUM(PENDIENTE_RECEPCION) <> 0))
;


/* View: V_OBRAS */
CREATE VIEW V_OBRAS(
    ID,
    ID_EMPRESA,
    NOMBRE,
    CALLE,
    PROVINCIA,
    POBLACION,
    CODIGO_POSTAL,
    TELEFONO,
    MOVIL,
    FAX,
    PERSONA_CONTACTO,
    OBSERVACIONES,
    ID_CLIENTE,
    NOMBRE_CLIENTE,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_EJECUCION)
AS
SELECT ALMACENES.ID, ALMACENES.ID_EMPRESA, ALMACENES.NOMBRE,
    ALMACENES.CALLE, ALMACENES.PROVINCIA, ALMACENES.POBLACION, ALMACENES.CODIGO_POSTAL,
    ALMACENES.TELEFONO, ALMACENES.MOVIL, ALMACENES.FAX, ALMACENES.PERSONA_CONTACTO,
    ALMACENES.OBSERVACIONES, OBRAS_DATOS.ID_CLIENTE, CLIENTES.NOMBRE AS NOMBRE_CLIENTE,     
    ALMACENES.FECHA_ALTA, ALMACENES.FECHA_MODIFICACION, ALMACENES.USUARIO,
    CASE
        WHEN (OBRAS_EJECUCIONES.FECHA_INICIO IS NULL) THEN NULL
        WHEN (OBRAS_EJECUCIONES.FECHA_INICIO IS NOT NULL) THEN OBRAS_EJECUCIONES.ID
    END AS ID_EJECUCION
FROM ALMACENES
INNER JOIN OBRAS_DATOS ON (OBRAS_DATOS.ID_ALMACEN = ALMACENES.ID)
LEFT OUTER JOIN CONTACTOS AS CLIENTES ON (CLIENTES.ID = OBRAS_DATOS.ID_CLIENTE) 
LEFT OUTER JOIN OBRAS_EJECUCIONES ON ((OBRAS_EJECUCIONES.ID_OBRA = ALMACENES.ID) AND (OBRAS_EJECUCIONES.FECHA_FIN IS NULL))
WHERE ALMACENES.TIPO_ALMACEN = 'OBRA';


/* View: V_OBRAS_EJECUCIONES */
CREATE VIEW V_OBRAS_EJECUCIONES(
    ID,
    ID_OBRA,
    FECHA_INICIO,
    FECHA_FIN,
    ID_SUBCONTRATA,
    NOMBRE,
    IMPORTE_GASTOS,
    IMPORTE_INGRESOS,
    IMPORTE_TOTAL,
    OBSERVACIONES,
    FECHA_ALTA,
    FECHA_MODIFICACION)
AS
SELECT
    OBRAS_EJECUCIONES.ID,
    OBRAS_EJECUCIONES.ID_OBRA,
    OBRAS_EJECUCIONES.FECHA_INICIO,
    OBRAS_EJECUCIONES.FECHA_FIN,
    OBRAS_EJECUCIONES.ID_SUBCONTRATA,
    CONTACTOS.NOMBRE,
    COALESCE(SUM(PEDIDOS_PROVEEDOR.BASE_IMPONIBLE), 0) IMPORTE_GASTOS,
    COALESCE(SUM(PRESUPUESTOS_CLIENTE.BASE_IMPONIBLE), 0) IMPORTE_INGRESOS,
    COALESCE(SUM(PRESUPUESTOS_CLIENTE.BASE_IMPONIBLE), 0) - COALESCE(SUM(PEDIDOS_PROVEEDOR.BASE_IMPONIBLE), 0) IMPORTE_TOTAL,
    OBRAS_EJECUCIONES.OBSERVACIONES,
    OBRAS_EJECUCIONES.FECHA_ALTA,
    OBRAS_EJECUCIONES.FECHA_MODIFICACION
FROM OBRAS_EJECUCIONES
   LEFT OUTER JOIN CONTACTOS ON (CONTACTOS.ID = OBRAS_EJECUCIONES.ID_SUBCONTRATA)
   LEFT OUTER JOIN OBRAS_EJECUCIONES_PRESUPUESTOS ON (OBRAS_EJECUCIONES_PRESUPUESTOS.ID_EJECUCION = OBRAS_EJECUCIONES.ID)
   LEFT OUTER JOIN PRESUPUESTOS_CLIENTE ON (PRESUPUESTOS_CLIENTE.ID = OBRAS_EJECUCIONES_PRESUPUESTOS.ID_PRESUPUESTO)
   LEFT OUTER JOIN OBRAS_EJECUCIONES_PEDIDOS_PROV ON (OBRAS_EJECUCIONES_PEDIDOS_PROV.ID_EJECUCION = OBRAS_EJECUCIONES.ID)
   LEFT OUTER JOIN PEDIDOS_PROVEEDOR ON (PEDIDOS_PROVEEDOR.ID = OBRAS_EJECUCIONES_PEDIDOS_PROV.ID_PEDIDO)
GROUP BY
    OBRAS_EJECUCIONES.ID,
    OBRAS_EJECUCIONES.ID_OBRA,
    OBRAS_EJECUCIONES.FECHA_INICIO,
    OBRAS_EJECUCIONES.FECHA_FIN,
    OBRAS_EJECUCIONES.ID_SUBCONTRATA,
    CONTACTOS.NOMBRE,
    OBRAS_EJECUCIONES.OBSERVACIONES,
    OBRAS_EJECUCIONES.FECHA_ALTA,
    OBRAS_EJECUCIONES.FECHA_MODIFICACION;


/* View: V_PED_PROV_SITUACION */
CREATE VIEW V_PED_PROV_SITUACION(
    ID_PEDIDO,
    SITUACION)
AS
SELECT ID_PEDIDO,
CASE WHEN (SUM(CANTIDAD_PENDIENTE) > 0) AND (SUM(CANTIDAD_RECIBIDA) = 0) THEN 'PENDIENTE'
     WHEN (SUM(CANTIDAD_PENDIENTE) <= 0) THEN 'RECIBIDO'
     WHEN (SUM(CANTIDAD_PENDIENTE) > 0) AND (SUM(CANTIDAD_RECIBIDA) > 0) THEN 'PARCIAL'
     ELSE 'N/A'
END AS SITUACION
FROM V_PED_PROV_ARTICULOS
GROUP BY V_PED_PROV_ARTICULOS.ID_PEDIDO
;



/* View: V_PEDIDOS_PROVEEDOR */
CREATE VIEW V_PEDIDOS_PROVEEDOR(
    ID,
    ID_EMPRESA,
    ID_PROVEEDOR,
    NOMBRE,    
    ID_DIRECCION,
    PERSONA_CONTACTO_PROV,
    REFERENCIA,
    SITUACION,
    FECHA_ENVIO,
    FECHA_PEDIDO,
    FECHA_CONFIRMACION,
    FECHA_ENTREGA,
    ID_ALMACEN,
    TIPO_ALMACEN,
    NOMBRE_ALMACEN,
    ID_OBRA,
    NOMBRE_OBRA,
    OBSERVACIONES,
    IMPORTE_TOTAL,
    INCIDENCIAS,
    INCIDENCIAS_ACTIVAS,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    PERSONA_CONTACTO,
    TELEFONO,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_PEDIDO_CLIENTE,
    REF_PED_CLIENTE,
    IMPORTE_NETO,
    IMPORTE_PORTE,
    DESCUENTO,
    IMPORTE_DESCUENTO,
    BASE_IMPONIBLE,
    IVA,
    IMPORTE_IVA,
    ID_FORMA_PAGO,
    ID_FACTURA,
    REF_FACTURA_PROV)
AS
SELECT
  PEDIDOS_PROVEEDOR.ID,
  PEDIDOS_PROVEEDOR.ID_EMPRESA,
  PEDIDOS_PROVEEDOR.ID_PROVEEDOR,
  CONTACTOS.NOMBRE,
  PEDIDOS_PROVEEDOR.ID_DIRECCION,
  PEDIDOS_PROVEEDOR.PERSONA_CONTACTO_PROV,
  PEDIDOS_PROVEEDOR.REFERENCIA,
  TRIM(V_PED_PROV_SITUACION.SITUACION),
  PEDIDOS_PROVEEDOR.FECHA_ENVIO,
  PEDIDOS_PROVEEDOR.FECHA_PEDIDO,
  PEDIDOS_PROVEEDOR.FECHA_CONFIRMACION,
  PEDIDOS_PROVEEDOR.FECHA_ENTREGA,
  PEDIDOS_PROVEEDOR.ID_ALMACEN,
  ALMACENES.TIPO_ALMACEN,
  ALMACENES.NOMBRE AS NOMBRE_ALMACEN,
  PEDIDOS_PROVEEDOR.ID_OBRA,
  OBRAS.NOMBRE AS NOMBRE_OBRA,
  PEDIDOS_PROVEEDOR.OBSERVACIONES,
  PEDIDOS_PROVEEDOR.IMPORTE_TOTAL,
  PEDIDOS_PROVEEDOR.INCIDENCIAS,
  PEDIDOS_PROVEEDOR.INCIDENCIAS_ACTIVAS,
  PEDIDOS_PROVEEDOR.CALLE,
  PEDIDOS_PROVEEDOR.POBLACION,
  PEDIDOS_PROVEEDOR.PROVINCIA,
  PEDIDOS_PROVEEDOR.CODIGO_POSTAL,
  PEDIDOS_PROVEEDOR.PERSONA_CONTACTO,
  PEDIDOS_PROVEEDOR.TELEFONO,
  PEDIDOS_PROVEEDOR.FECHA_ALTA,
  PEDIDOS_PROVEEDOR.FECHA_MODIFICACION,
  PEDIDOS_PROVEEDOR.USUARIO,
  PEDIDOS_PROVEEDOR.ID_PEDIDO_CLIENTE,
  PEDIDOS_CLIENTE.REFERENCIA AS REF_PED_CLIENTE,
  PEDIDOS_PROVEEDOR.IMPORTE_NETO,
  PEDIDOS_PROVEEDOR.IMPORTE_PORTE,
  PEDIDOS_PROVEEDOR.DESCUENTO,
  PEDIDOS_PROVEEDOR.IMPORTE_DESCUENTO,
  PEDIDOS_PROVEEDOR.BASE_IMPONIBLE,
  PEDIDOS_PROVEEDOR.IVA,
  PEDIDOS_PROVEEDOR.IMPORTE_IVA,
  PEDIDOS_PROVEEDOR.ID_FORMA_PAGO,
  PEDIDOS_PROVEEDOR.ID_FACTURA,
  FACTURAS_PROVEEDOR.REFERENCIA

FROM
  PEDIDOS_PROVEEDOR
  INNER JOIN CONTACTOS ON (PEDIDOS_PROVEEDOR.ID_PROVEEDOR = CONTACTOS.ID)
  LEFT OUTER JOIN V_PED_PROV_SITUACION ON (V_PED_PROV_SITUACION.ID_PEDIDO = PEDIDOS_PROVEEDOR.ID)
  LEFT OUTER JOIN ALMACENES ON (ALMACENES.ID = PEDIDOS_PROVEEDOR.ID_ALMACEN)
  LEFT OUTER JOIN ALMACENES OBRAS ON (OBRAS.ID = PEDIDOS_PROVEEDOR.ID_OBRA)
  LEFT OUTER JOIN PEDIDOS_CLIENTE ON (PEDIDOS_CLIENTE.ID = PEDIDOS_PROVEEDOR.ID_PEDIDO_CLIENTE)
  LEFT OUTER JOIN FACTURAS_PROVEEDOR ON (FACTURAS_PROVEEDOR.ID = PEDIDOS_PROVEEDOR.ID_FACTURA)
;



/* View: V_PRESUPUESTOS_CLIENTE */
CREATE VIEW V_PRESUPUESTOS_CLIENTE(
    ID,
    ID_EMPRESA,
    FECHA_PRESUPUESTO,
    FECHA_DECISION,
    REFERENCIA,
    REFERENCIA_AUX,
    SITUACION,
    ID_CLIENTE,
    ID_DIRECCION,
    NIF_CIF,
    NOMBRE,
    REFERENCIA_CLIENTE,
    CLIENTE_FINAL,
    PORTADA,
    MEMORIA,
    OBSERVACIONES,
    INCIDENCIAS,
    INCIDENCIAS_ACTIVAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    IMPORTE_NETO,
    IMPORTE_PORTE,
    DESCUENTO,
    IMPORTE_DESCUENTO,
    BASE_IMPONIBLE,
    IVA,
    IMPORTE_IVA,
    IMPORTE_TOTAL,
    ID_FORMA_PAGO,
    ID_FACTURA,
    FACTURA,
    PERSONA_CONTACTO,
    DESCRIPCION_BONIFICACION,
    IMPORTE_BONIFICACION)
AS
SELECT
  PRESUPUESTOS_CLIENTE.ID,
  PRESUPUESTOS_CLIENTE.ID_EMPRESA,
  PRESUPUESTOS_CLIENTE.FECHA_PRESUPUESTO,
  PRESUPUESTOS_CLIENTE.FECHA_DECISION,
  PRESUPUESTOS_CLIENTE.REFERENCIA,
  PRESUPUESTOS_CLIENTE.REFERENCIA_AUX,
  PRESUPUESTOS_CLIENTE.SITUACION,  
  PRESUPUESTOS_CLIENTE.ID_CLIENTE,
  PRESUPUESTOS_CLIENTE.ID_DIRECCION,  
  CONTACTOS.NIF_CIF,
  CONTACTOS.NOMBRE,
  PRESUPUESTOS_CLIENTE.REFERENCIA_CLIENTE,
  PRESUPUESTOS_CLIENTE.CLIENTE_FINAL,  
  PRESUPUESTOS_CLIENTE.PORTADA,
  PRESUPUESTOS_CLIENTE.MEMORIA,
  PRESUPUESTOS_CLIENTE.OBSERVACIONES,
  PRESUPUESTOS_CLIENTE.INCIDENCIAS,
  PRESUPUESTOS_CLIENTE.INCIDENCIAS_ACTIVAS,
  PRESUPUESTOS_CLIENTE.FECHA_ALTA,
  PRESUPUESTOS_CLIENTE.FECHA_MODIFICACION,
  PRESUPUESTOS_CLIENTE.USUARIO,
  PRESUPUESTOS_CLIENTE.IMPORTE_NETO,
  PRESUPUESTOS_CLIENTE.IMPORTE_PORTE,
  PRESUPUESTOS_CLIENTE.DESCUENTO,
  PRESUPUESTOS_CLIENTE.IMPORTE_DESCUENTO,
  PRESUPUESTOS_CLIENTE.BASE_IMPONIBLE,
  PRESUPUESTOS_CLIENTE.IVA,
  PRESUPUESTOS_CLIENTE.IMPORTE_IVA,
  PRESUPUESTOS_CLIENTE.IMPORTE_TOTAL,
  PRESUPUESTOS_CLIENTE.ID_FORMA_PAGO,
  PRESUPUESTOS_CLIENTE.ID_FACTURA,
  FACTURAS_CLIENTE.REFERENCIA,
  PRESUPUESTOS_CLIENTE.PERSONA_CONTACTO,
  PRESUPUESTOS_CLIENTE.DESCRIPCION_BONIFICACION,
  PRESUPUESTOS_CLIENTE.IMPORTE_BONIFICACION  
FROM
  PRESUPUESTOS_CLIENTE
  INNER JOIN CONTACTOS ON (CONTACTOS.ID = PRESUPUESTOS_CLIENTE.ID_CLIENTE)  
  LEFT OUTER JOIN FACTURAS_CLIENTE ON (FACTURAS_CLIENTE.ID = PRESUPUESTOS_CLIENTE.ID_FACTURA)
;



/* View: V_PROVEEDORES */
CREATE VIEW V_PROVEEDORES(
    ID,
    ID_CATEGORIA,
    NIF_CIF,
    NOMBRE,
    PERSONA_CONTACTO,
    CALLE,
    POBLACION,
    PROVINCIA,
    CODIGO_POSTAL,
    TELEFONO_1,
    TELEFONO_2,
    MOVIL_1,
    MOVIL_2,
    FAX,
    EMAIL_1,
    EMAIL_2,
    PAGINA_WEB,
    NOTAS,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    ID_EMPRESA,
    REFERENCIA,
    DESCUENTO,
    DESCRIPCION_PROVEEDOR,
    CODIGO_ASIGNADO,
    GRUPO_PROVEEDOR,
    REGIMEN_IVA,
    ID_TIPO_IVA,
    ID_FORMA_PAGO,
    TIENDA_WEB,
    HOMOLOGADO,
    CERTIFICACION,
    SUBCONTRATA,
    EMAIL_ADMINISTRACION,
    VENCIMIENTO_FACTURAS_1,
    VENCIMIENTO_FACTURAS_2,
    VENCIMIENTO_FACTURAS_3)
AS
SELECT
  V_CONTACTOS.ID,
  V_CONTACTOS.ID_CATEGORIA,
  V_CONTACTOS.NIF_CIF,
  V_CONTACTOS.NOMBRE,
  V_CONTACTOS.PERSONA_CONTACTO,
  V_CONTACTOS.CALLE,
  V_CONTACTOS.POBLACION,
  V_CONTACTOS.PROVINCIA,
  V_CONTACTOS.CODIGO_POSTAL,
  V_CONTACTOS.TELEFONO_1,
  V_CONTACTOS.TELEFONO_2,
  V_CONTACTOS.MOVIL_1,
  V_CONTACTOS.MOVIL_2,
  V_CONTACTOS.FAX,
  V_CONTACTOS.EMAIL_1,
  V_CONTACTOS.EMAIL_2,
  V_CONTACTOS.PAGINA_WEB,
  V_CONTACTOS.NOTAS,
  V_CONTACTOS.FECHA_ALTA,
  V_CONTACTOS.FECHA_MODIFICACION,
  V_CONTACTOS.USUARIO,
  V_CONTACTOS.ID_EMPRESA,
  V_CONTACTOS.REFERENCIA,
  PROVEEDORES_DATOS.DESCUENTO,
  PROVEEDORES_DATOS.DESCRIPCION_PROVEEDOR,
  PROVEEDORES_DATOS.CODIGO_ASIGNADO,
  PROVEEDORES_DATOS.GRUPO_PROVEEDOR,
  PROVEEDORES_DATOS.REGIMEN_IVA,
  PROVEEDORES_DATOS.ID_TIPO_IVA,
  PROVEEDORES_DATOS.ID_FORMA_PAGO,
  PROVEEDORES_DATOS.TIENDA_WEB,
  PROVEEDORES_DATOS.HOMOLOGADO,
  PROVEEDORES_DATOS.CERTIFICACION,
  PROVEEDORES_DATOS.SUBCONTRATA,
  PROVEEDORES_DATOS.EMAIL_ADMINISTRACION,
  PROVEEDORES_DATOS.VENCIMIENTO_FACTURAS_1,
  PROVEEDORES_DATOS.VENCIMIENTO_FACTURAS_2,
  PROVEEDORES_DATOS.VENCIMIENTO_FACTURAS_3
  
FROM
  V_CONTACTOS
  INNER JOIN PROVEEDORES_DATOS ON (PROVEEDORES_DATOS.ID_PROVEEDOR = V_CONTACTOS.ID)
WHERE
  V_CONTACTOS.ID_CATEGORIA = 2
;



/* View: V_REC_CLI_COMPENSADOS */
CREATE VIEW V_REC_CLI_COMPENSADOS(
    ID_RECIBO,
    IMPORTE_TOTAL_COMPENSADO)
AS
select ID_RECIBO_COMPENSADO, SUM((IMPORTE + OTROS_GASTOS)) as IMPORTE_TOTAL
from RECIBOS_CLIENTE
where ID_RECIBO_COMPENSADO is not null
group by ID_RECIBO_COMPENSADO
;



/* View: V_REC_PRO_COMPENSADOS */
CREATE VIEW V_REC_PRO_COMPENSADOS(
    ID_RECIBO,
    IMPORTE_TOTAL_COMPENSADO)
AS
select ID_RECIBO_COMPENSADO, SUM((IMPORTE + OTROS_GASTOS)) as IMPORTE_TOTAL
from RECIBOS_PROVEEDOR
where ID_RECIBO_COMPENSADO is not null
group by ID_RECIBO_COMPENSADO
;


/* View: V_RECIBOS_CLIENTE */
CREATE VIEW V_RECIBOS_CLIENTE(
    ID,
    ID_RECIBO_COMPENSADO,
    REFERENCIA_REC_COMPENSADO,
    REFERENCIA,
    SITUACION,
    ID_FACTURA,
    ID_REMESA,
    REFERENCIA_REMESA,
    FECHA_EMISION,
    FECHA_VENCIMIENTO,
    DESCRIPCION,
    OBSERVACIONES,
    IMPORTE,
    OTROS_GASTOS,
    IMPORTE_TOTAL,
    FECHA_FACTURA,
    FORMA_PAGO_FACTURA,
    IMPORTE_FACTURA,
    ID_EMPRESA,
    DATOS_BANCARIOS,
    ID_CLIENTE,
    NOMBRE_CLIENTE,
    NIF_CIF_CLIENTE,
    CALLE_CLIENTE,
    POBLACION_CLIENTE,
    CODIGO_POSTAL_CLIENTE,
    PROVINCIA_CLIENTE,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO)
AS
SELECT RECIBOS_CLIENTE.ID,
       RECIBOS_CLIENTE.ID_RECIBO_COMPENSADO,
       RECIBO_COMPENSADO1.REFERENCIA,
       RECIBOS_CLIENTE.REFERENCIA,
       CASE
       WHEN RECIBOS_CLIENTE.ID_RECIBO_COMPENSADO IS NULL
       THEN TRIM(V_REC_CLI_SITUACION.SITUACION)
       ELSE TRIM(RECIBO_COMPENSADO2.SITUACION)
       END,
       RECIBOS_CLIENTE.ID_FACTURA,
       RECIBOS_CLIENTE.ID_REMESA, REMESAS_CLIENTE.REFERENCIA as REFERENCIA_REMESA,
       RECIBOS_CLIENTE.FECHA_EMISION, RECIBOS_CLIENTE.FECHA_VENCIMIENTO, RECIBOS_CLIENTE.DESCRIPCION,
       RECIBOS_CLIENTE.OBSERVACIONES, RECIBOS_CLIENTE.IMPORTE, RECIBOS_CLIENTE.OTROS_GASTOS,
       COALESCE(RECIBOS_CLIENTE.IMPORTE, 0) + COALESCE(RECIBOS_CLIENTE.OTROS_GASTOS, 0) + COALESCE(V_REC_CLI_COMPENSADOS.IMPORTE_TOTAL_COMPENSADO, 0),

       FACTURAS_CLIENTE.FECHA_FACTURA, FORMAS_PAGO.DESCRIPCION, FACTURAS_CLIENTE.IMPORTE_TOTAL,
       FACTURAS_CLIENTE.ID_EMPRESA, FACTURAS_CLIENTE.DATOS_BANCARIOS,

       CONTACTOS.ID as ID_CLIENTE, CONTACTOS.NOMBRE, CONTACTOS.NIF_CIF, CONTACTOS.CALLE, CONTACTOS.POBLACION, CONTACTOS.CODIGO_POSTAL, CONTACTOS.PROVINCIA,

       RECIBOS_CLIENTE.FECHA_ALTA,
       RECIBOS_CLIENTE.FECHA_MODIFICACION,
       RECIBOS_CLIENTE.USUARIO

FROM RECIBOS_CLIENTE
LEFT JOIN V_REC_CLI_SITUACION
ON (V_REC_CLI_SITUACION.ID_RECIBO = RECIBOS_CLIENTE.ID)
LEFT JOIN FACTURAS_CLIENTE
ON (FACTURAS_CLIENTE.ID = RECIBOS_CLIENTE.ID_FACTURA)
LEFT JOIN FORMAS_PAGO
ON (FORMAS_PAGO.ID = FACTURAS_CLIENTE.ID_FORMA_PAGO)
LEFT JOIN CONTACTOS
ON (CONTACTOS.ID = FACTURAS_CLIENTE.ID_CLIENTE)
LEFT JOIN REMESAS_CLIENTE
ON (REMESAS_CLIENTE.ID = RECIBOS_CLIENTE.ID_REMESA)
LEFT JOIN V_REC_CLI_COMPENSADOS
ON (V_REC_CLI_COMPENSADOS.ID_RECIBO = RECIBOS_CLIENTE.ID)
LEFT JOIN RECIBOS_CLIENTE RECIBO_COMPENSADO1
ON (RECIBO_COMPENSADO1.ID = RECIBOS_CLIENTE.ID_RECIBO_COMPENSADO)
LEFT JOIN V_REC_CLI_SITUACION RECIBO_COMPENSADO2
ON (RECIBO_COMPENSADO2.ID_RECIBO = RECIBOS_CLIENTE.ID_RECIBO_COMPENSADO)
;

/* View: V_RECIBOS_PROVEEDOR */
CREATE VIEW V_RECIBOS_PROVEEDOR(
    ID,
    ID_RECIBO_COMPENSADO,
    REFERENCIA_REC_COMPENSADO,
    REFERENCIA,
    REFERENCIA_PROVEEDOR,
    SITUACION,
    ID_FACTURA,
    ID_REMESA,
    REFERENCIA_REMESA,
    FECHA_EMISION,
    FECHA_VENCIMIENTO,
    DESCRIPCION,
    OBSERVACIONES,
    IMPORTE,
    OTROS_GASTOS,
    IMPORTE_TOTAL,
    REFERENCIA_FACTURA_PROV,
    FECHA_FACTURA,
    FORMA_PAGO_FACTURA,
    IMPORTE_FACTURA,
    ID_EMPRESA,
    DATOS_BANCARIOS,
    ID_PROVEEDOR,
    NOMBRE_PROVEEDOR,
    NIF_CIF_PROVEEDOR,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO)
AS
SELECT RECIBOS_PROVEEDOR.ID, 
       RECIBOS_PROVEEDOR.ID_RECIBO_COMPENSADO,
       RECIBO_COMPENSADO1.REFERENCIA,
       RECIBOS_PROVEEDOR.REFERENCIA, 
       RECIBOS_PROVEEDOR.REFERENCIA_PROVEEDOR,
       CASE
       WHEN RECIBOS_PROVEEDOR.ID_RECIBO_COMPENSADO IS NULL
       THEN TRIM(V_REC_PRO_SITUACION.SITUACION)
       ELSE TRIM(RECIBO_COMPENSADO2.SITUACION)
       END,
       RECIBOS_PROVEEDOR.ID_FACTURA,
       RECIBOS_PROVEEDOR.ID_REMESA, REMESAS_PROVEEDOR.REFERENCIA as REFERENCIA_REMESA,
       RECIBOS_PROVEEDOR.FECHA_EMISION, RECIBOS_PROVEEDOR.FECHA_VENCIMIENTO, RECIBOS_PROVEEDOR.DESCRIPCION,
       RECIBOS_PROVEEDOR.OBSERVACIONES, RECIBOS_PROVEEDOR.IMPORTE, RECIBOS_PROVEEDOR.OTROS_GASTOS,
       COALESCE(RECIBOS_PROVEEDOR.IMPORTE, 0) + COALESCE(RECIBOS_PROVEEDOR.OTROS_GASTOS, 0) + COALESCE(V_REC_PRO_COMPENSADOS.IMPORTE_TOTAL_COMPENSADO, 0),       

       FACTURAS_PROVEEDOR.REFERENCIA_PROVEEDOR, FACTURAS_PROVEEDOR.FECHA_FACTURA,
       FORMAS_PAGO.DESCRIPCION, FACTURAS_PROVEEDOR.IMPORTE_TOTAL,
       FACTURAS_PROVEEDOR.ID_EMPRESA, FACTURAS_PROVEEDOR.DATOS_BANCARIOS,

       CONTACTOS.ID as ID_PROVEEDOR, CONTACTOS.NOMBRE, CONTACTOS.NIF_CIF,

       RECIBOS_PROVEEDOR.FECHA_ALTA,
       RECIBOS_PROVEEDOR.FECHA_MODIFICACION,
       RECIBOS_PROVEEDOR.USUARIO

FROM RECIBOS_PROVEEDOR
LEFT JOIN V_REC_PRO_SITUACION
ON (V_REC_PRO_SITUACION.ID_RECIBO = RECIBOS_PROVEEDOR.ID)
LEFT JOIN FACTURAS_PROVEEDOR
ON (FACTURAS_PROVEEDOR.ID = RECIBOS_PROVEEDOR.ID_FACTURA)
LEFT JOIN FORMAS_PAGO
ON (FORMAS_PAGO.ID = FACTURAS_PROVEEDOR.ID_FORMA_PAGO)
LEFT JOIN CONTACTOS
ON (CONTACTOS.ID = FACTURAS_PROVEEDOR.ID_PROVEEDOR)
LEFT JOIN REMESAS_PROVEEDOR
ON (REMESAS_PROVEEDOR.ID = RECIBOS_PROVEEDOR.ID_REMESA)
LEFT JOIN V_REC_PRO_COMPENSADOS
ON (V_REC_PRO_COMPENSADOS.ID_RECIBO = RECIBOS_PROVEEDOR.ID)
LEFT JOIN RECIBOS_PROVEEDOR RECIBO_COMPENSADO1
ON (RECIBO_COMPENSADO1.ID = RECIBOS_PROVEEDOR.ID_RECIBO_COMPENSADO)
LEFT JOIN V_REC_PRO_SITUACION RECIBO_COMPENSADO2
ON (RECIBO_COMPENSADO2.ID_RECIBO = RECIBOS_PROVEEDOR.ID_RECIBO_COMPENSADO)
;

CREATE VIEW V_REMESAS_CLIENTE(
    ID,
    ID_EMPRESA,
    REFERENCIA,
    TIPO,
    FECHA_REMESA,
    DESCRIPCION,
    ID_DATOS_BANCO,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    NOMBRE,
    ENTIDAD,
    SUCURSAL,
    DC,
    CUENTA,
    SUFIJO_N19,
    SUFIJO_N58,
    IMPORTE_TOTAL)
AS
SELECT
  REMESAS_CLIENTE.ID,
  REMESAS_CLIENTE.ID_EMPRESA,
  REMESAS_CLIENTE.REFERENCIA,
  REMESAS_CLIENTE.TIPO,
  REMESAS_CLIENTE.FECHA_REMESA,
  REMESAS_CLIENTE.DESCRIPCION,
  REMESAS_CLIENTE.ID_DATOS_BANCO,
  REMESAS_CLIENTE.FECHA_ALTA,
  REMESAS_CLIENTE.FECHA_MODIFICACION,
  REMESAS_CLIENTE.USUARIO,
  EMPRESAS_DATOS_BANCO.NOMBRE,
  EMPRESAS_DATOS_BANCO.ENTIDAD,
  EMPRESAS_DATOS_BANCO.SUCURSAL,
  EMPRESAS_DATOS_BANCO.DC,
  EMPRESAS_DATOS_BANCO.CUENTA,
  EMPRESAS_DATOS_BANCO.SUFIJO_N19,
  EMPRESAS_DATOS_BANCO.SUFIJO_N58,
  SUM(COALESCE(RECIBOS_CLIENTE.IMPORTE,0) + COALESCE(RECIBOS_CLIENTE.OTROS_GASTOS,0) + COALESCE(V_REC_CLI_COMPENSADOS.IMPORTE_TOTAL_COMPENSADO,0)) as IMPORTE_TOTAL

FROM
  REMESAS_CLIENTE
  LEFT OUTER JOIN EMPRESAS_DATOS_BANCO ON (EMPRESAS_DATOS_BANCO.ID = REMESAS_CLIENTE.ID_DATOS_BANCO)
  LEFT OUTER JOIN RECIBOS_CLIENTE ON (RECIBOS_CLIENTE.ID_REMESA = REMESAS_CLIENTE.ID)
  LEFT OUTER JOIN V_REC_CLI_COMPENSADOS ON (V_REC_CLI_COMPENSADOS.ID_RECIBO = RECIBOS_CLIENTE.ID)
GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
;

CREATE VIEW V_REMESAS_PROVEEDOR(
    ID,
    ID_EMPRESA,
    REFERENCIA,
    TIPO,
    FECHA_REMESA,
    DESCRIPCION,
    ID_DATOS_BANCO,
    FECHA_ALTA,
    FECHA_MODIFICACION,
    USUARIO,
    NOMBRE,
    ENTIDAD,
    SUCURSAL,
    DC,
    CUENTA,
    SUFIJO_N19,
    SUFIJO_N58,
    IMPORTE_TOTAL)
AS
SELECT
  REMESAS_PROVEEDOR.ID,
  REMESAS_PROVEEDOR.ID_EMPRESA,
  REMESAS_PROVEEDOR.REFERENCIA,
  REMESAS_PROVEEDOR.TIPO,
  REMESAS_PROVEEDOR.FECHA_REMESA,
  REMESAS_PROVEEDOR.DESCRIPCION,
  REMESAS_PROVEEDOR.ID_DATOS_BANCO,
  REMESAS_PROVEEDOR.FECHA_ALTA,
  REMESAS_PROVEEDOR.FECHA_MODIFICACION,
  REMESAS_PROVEEDOR.USUARIO,
  EMPRESAS_DATOS_BANCO.NOMBRE,
  EMPRESAS_DATOS_BANCO.ENTIDAD,
  EMPRESAS_DATOS_BANCO.SUCURSAL,
  EMPRESAS_DATOS_BANCO.DC,
  EMPRESAS_DATOS_BANCO.CUENTA,
  EMPRESAS_DATOS_BANCO.SUFIJO_N19,
  EMPRESAS_DATOS_BANCO.SUFIJO_N58,
  SUM(COALESCE(RECIBOS_PROVEEDOR.IMPORTE,0) + COALESCE(RECIBOS_PROVEEDOR.OTROS_GASTOS,0) + COALESCE(V_REC_PRO_COMPENSADOS.IMPORTE_TOTAL_COMPENSADO,0)) as IMPORTE_TOTAL  

FROM
  REMESAS_PROVEEDOR
  LEFT OUTER JOIN EMPRESAS_DATOS_BANCO ON (EMPRESAS_DATOS_BANCO.ID = REMESAS_PROVEEDOR.ID_DATOS_BANCO)
  LEFT OUTER JOIN RECIBOS_PROVEEDOR ON (RECIBOS_PROVEEDOR.ID_REMESA = REMESAS_PROVEEDOR.ID)
  LEFT OUTER JOIN V_REC_PRO_COMPENSADOS ON (V_REC_PRO_COMPENSADOS.ID_RECIBO = RECIBOS_PROVEEDOR.ID)  
GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
;

/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE AGENTES_COMISIONES ADD CONSTRAINT PK_AGENTES_COMISIONES PRIMARY KEY (ID);
ALTER TABLE ALBARANES_CLIENTE ADD CONSTRAINT PK_ALBARAN_CLIENTE PRIMARY KEY (ID);
ALTER TABLE ALBARANES_CLIENTE_DETALLES ADD CONSTRAINT PK_ALBARANES_CLIENTE_DETALLES PRIMARY KEY (ID);
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT PK_ALBARAN_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE ALBARANES_PROVEEDOR_DETALLES ADD CONSTRAINT PK_ALBARANES_PROVEEDOR_DETALLES PRIMARY KEY (ID);
ALTER TABLE ALMACENES ADD CONSTRAINT PK_ALMACENES PRIMARY KEY (ID);
ALTER TABLE ARTICULOS ADD CONSTRAINT PK_ARTICULOS PRIMARY KEY (ID);
ALTER TABLE ARTICULOS_PROVEEDORES ADD CONSTRAINT PK_ARTICULOS_PROVEEDORES PRIMARY KEY (ID);
ALTER TABLE CATEGORIAS ADD CONSTRAINT PK_CATEGORIAS PRIMARY KEY (ID);
ALTER TABLE CLIENTES_DATOS ADD CONSTRAINT PK_CLIENTES_DATOS PRIMARY KEY (ID_CLIENTE);
ALTER TABLE CLIENTES_DTOS_PROVEEDORES ADD CONSTRAINT PK_CLIENTES_DTOS_PROV PRIMARY KEY (ID);
ALTER TABLE CLIENTES_GRUPOS ADD CONSTRAINT PK_CLIENTES_GRUPOS PRIMARY KEY (ID);
ALTER TABLE COMISIONES_LIQUIDADAS ADD CONSTRAINT PK_COMISIONES_LIQUIDADAS PRIMARY KEY (ID);
ALTER TABLE CONFIGURACION ADD CONSTRAINT PK_CONFIGURACION PRIMARY KEY (ID);
ALTER TABLE CONTACTOS ADD CONSTRAINT PK_CONTACTOS PRIMARY KEY (ID);
ALTER TABLE CONTACTOS_CATEGORIAS ADD CONSTRAINT PK_CONTACTOS_CATEGORIAS PRIMARY KEY (ID_CONTACTO, ID_CATEGORIA);
ALTER TABLE CONTACTOS_DATOS_BANCO ADD CONSTRAINT PK_CONTACTOS_DATOS_BANCO PRIMARY KEY (ID);
ALTER TABLE CONTACTOS_DATOS_PERSONAL ADD CONSTRAINT PK_CONTACTOS_DATOS_PER PRIMARY KEY (ID);
ALTER TABLE CONTACTOS_DIRECCIONES ADD CONSTRAINT PK_CONTACTOS_DIR PRIMARY KEY (ID);
ALTER TABLE EMPLEADOS_DATOS ADD CONSTRAINT PK_EMPLEADOS_DATOS PRIMARY KEY (ID_EMPLEADO);
ALTER TABLE AGENTES_DATOS ADD CONSTRAINT PK_AGENTES_DATOS PRIMARY KEY (ID_AGENTE);
ALTER TABLE EMPLEADOS_GRUPOS ADD CONSTRAINT PK_EMPLEADOS_GRUPOS PRIMARY KEY (ID);
ALTER TABLE EMPRESAS ADD CONSTRAINT PK_EMPRESAS PRIMARY KEY (ID);
ALTER TABLE EMPRESAS_CONTACTOS ADD CONSTRAINT PK_EMPRESAS_CONTACTOS PRIMARY KEY (ID);
ALTER TABLE EMPRESAS_DATOS_BANCO ADD CONSTRAINT PK_EMPRESAS_DATOS_BANCO PRIMARY KEY (ID);
ALTER TABLE EMPRESAS_USUARIOS ADD CONSTRAINT PK_EMPRESAS_USUARIOS PRIMARY KEY (ID);
ALTER TABLE FABRICANTES ADD PRIMARY KEY (ID);
ALTER TABLE FACTURAS_CLIENTE ADD CONSTRAINT PK_FACTURAS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE FACTURAS_CLIENTE_DETALLES ADD CONSTRAINT PK_FACTURAS_CLIENTE_DETALLES PRIMARY KEY (ID);
ALTER TABLE FACTURAS_PROVEEDOR ADD CONSTRAINT PK_FACTURAS_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE FACTURAS_PROVEEDOR_DETALLES ADD CONSTRAINT PK_FACTURAS_PROVEEDOR_DETALLES PRIMARY KEY (ID);
ALTER TABLE FACTURAS_PROVEEDOR_PEDIDOS ADD CONSTRAINT PK_FACTURAS_PROVEEDOR_PEDIDOS PRIMARY KEY (ID);
ALTER TABLE FAMILIAS ADD CONSTRAINT PK_FAMILIAS PRIMARY KEY (ID);
ALTER TABLE FORMAS_PAGO ADD PRIMARY KEY (ID);
ALTER TABLE FORMAS_PAGO_PLAZOS ADD PRIMARY KEY (ID);
ALTER TABLE INFORMES ADD CONSTRAINT PK_INFORMES PRIMARY KEY (ID);
ALTER TABLE MOVIMIENTOS ADD CONSTRAINT PK_MOVIMIENTOS PRIMARY KEY (ID);
ALTER TABLE OBRAS_EJECUCIONES ADD CONSTRAINT PK_OBRAS_EJE PRIMARY KEY (ID);
ALTER TABLE OBRAS_EJECUCIONES_PRESUPUESTOS ADD CONSTRAINT PK_OBRAS_EJE_PRE PRIMARY KEY (ID);
ALTER TABLE OBRAS_EJECUCIONES_PEDIDOS_PROV ADD CONSTRAINT PK_OBRAS_EJE_PED_PROV PRIMARY KEY (ID);
ALTER TABLE PAGOS_CLIENTE ADD CONSTRAINT PK_PAGOS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE PAGOS_PROVEEDOR ADD CONSTRAINT PK_PAGOS_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE PEDIDOS_CLIENTE ADD CONSTRAINT PK_PEDIDOS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE PEDIDOS_CLIENTE_DETALLES ADD CONSTRAINT PK_PEDIDOS_CLIENTE_DETALLES PRIMARY KEY (ID);
ALTER TABLE PEDIDOS_PROVEEDOR ADD CONSTRAINT PK_PEDIDOS_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE PEDIDOS_PROVEEDOR_DETALLES ADD CONSTRAINT PK_PEDIDOS_PROVEEDOR_DETALLES PRIMARY KEY (ID);
ALTER TABLE PERMISOS ADD CONSTRAINT PK_PERMISOS PRIMARY KEY (ID);
ALTER TABLE PERMISOSEX ADD CONSTRAINT PK_PERMISOSEX PRIMARY KEY (ID);
ALTER TABLE POBLACIONES ADD CONSTRAINT PK_POBLACIONES PRIMARY KEY (ID);
ALTER TABLE PRESUPUESTOS_CLIENTE ADD CONSTRAINT PK_PRESUPUESTOS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE PRESUPUESTOS_CLIENTE_DETALLES ADD CONSTRAINT PK_PRESUPUESTOS_CLIENTE_DETALLE PRIMARY KEY (ID);
ALTER TABLE PROVEEDORES_DATOS ADD CONSTRAINT PK_PROVEEDORES_DATOS PRIMARY KEY (ID_PROVEEDOR);
ALTER TABLE PROVEEDORES_GRUPOS ADD CONSTRAINT PK_PROVEEDORES_GRUPOS PRIMARY KEY (ID);
ALTER TABLE PROVINCIAS ADD CONSTRAINT PK_PROVINCIAS PRIMARY KEY (ID);
ALTER TABLE RECIBOS_CLIENTE ADD CONSTRAINT PK_RECIBOS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE RECIBOS_PROVEEDOR ADD CONSTRAINT PK_RECIBOS_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE REFERENCIAS ADD CONSTRAINT PK_REFERENCIAS PRIMARY KEY (ID);
ALTER TABLE REMESAS_CLIENTE ADD CONSTRAINT PK_REMESAS_CLIENTE PRIMARY KEY (ID);
ALTER TABLE REMESAS_PROVEEDOR ADD CONSTRAINT PK_REMESAS_PROVEEDOR PRIMARY KEY (ID);
ALTER TABLE TIENDA_WEB ADD CONSTRAINT PK_TIENDA_WEB PRIMARY KEY (ID);
ALTER TABLE TIPOS_IVA ADD PRIMARY KEY (ID);
ALTER TABLE UNIDADES_MEDIDA ADD PRIMARY KEY (ID);
ALTER TABLE USUARIOS ADD CONSTRAINT PK_USUARIOS PRIMARY KEY (ID);
ALTER TABLE USUARIOS_LOGON ADD CONSTRAINT PK_USUARIOS_LOGON PRIMARY KEY (LOGONID);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

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 SET NULL ON UPDATE SET NULL;
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT FK_ALBARANES_PROVEEDOR3 FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS_PROVEEDOR (ID) ON DELETE NO ACTION ON UPDATE CASCADE;
ALTER TABLE ALBARANES_PROVEEDOR ADD CONSTRAINT FK_ALBARANES_PROVEEDOR4 FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_PROVEEDOR (ID) ON DELETE SET NULL ON UPDATE CASCADE;
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 ALMACENES ADD CONSTRAINT FK_ALMACENES_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS_EMPRESA FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE COMISIONES_LIQUIDADAS ADD CONSTRAINT FK_COMISIONES_LIQUIDADAS FOREIGN KEY (ID_AGENTE) REFERENCES CONTACTOS (ID);
ALTER TABLE EMPRESAS_CONTACTOS ADD CONSTRAINT FK_EMPRESAS_CONTACTOS FOREIGN KEY (ID_CONTACTO) REFERENCES CONTACTOS (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE EMPRESAS_DATOS_BANCO ADD CONSTRAINT FK_EMPRESAS_DATOS_BANCO FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE CASCADE ON UPDATE CASCADE;
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;
ALTER TABLE FACTURAS_PROVEEDOR ADD CONSTRAINT FK_FACTURAS_PROVEEDOR_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS2 FOREIGN KEY (ID_ALMACEN) REFERENCES ALMACENES (ID);
ALTER TABLE OBRAS_EJECUCIONES_PRESUPUESTOS ADD CONSTRAINT FK_OBRAS_EJE_PRE_1 FOREIGN KEY (ID_EJECUCION) REFERENCES OBRAS_EJECUCIONES (ID);
ALTER TABLE OBRAS_EJECUCIONES_PRESUPUESTOS ADD CONSTRAINT FK_OBRAS_EJE_PRE_2 FOREIGN KEY (ID_PRESUPUESTO) REFERENCES PRESUPUESTOS_CLIENTE (ID);
ALTER TABLE OBRAS_EJECUCIONES_PEDIDOS_PROV ADD CONSTRAINT FK_OBRAS_EJE_PED_PROV_1 FOREIGN KEY (ID_EJECUCION) REFERENCES OBRAS_EJECUCIONES (ID);
ALTER TABLE OBRAS_EJECUCIONES_PEDIDOS_PROV ADD CONSTRAINT FK_OBRAS_EJE_PED_PROV_2 FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS_PROVEEDOR (ID);
ALTER TABLE OBRAS_EJECUCIONES_PEDIDOS_PROV ADD CONSTRAINT FK_OBRAS_EJE_PED_PROV_3 FOREIGN KEY (ID_PRESUPUESTO) REFERENCES PRESUPUESTOS_CLIENTE (ID);
ALTER TABLE PAGOS_CLIENTE ADD CONSTRAINT FK_PAGOS_CLIENTE FOREIGN KEY (ID_RECIBO) REFERENCES RECIBOS_CLIENTE (ID);
ALTER TABLE PAGOS_PROVEEDOR ADD CONSTRAINT FK_PAGOS_PROVEEDOR FOREIGN KEY (ID_RECIBO) REFERENCES RECIBOS_PROVEEDOR (ID);
ALTER TABLE PEDIDOS_CLIENTE ADD CONSTRAINT FK_PEDIDOS_CLIENTE FOREIGN KEY (ID_CLIENTE) REFERENCES CONTACTOS (ID);
ALTER TABLE PEDIDOS_CLIENTE ADD CONSTRAINT FK_PEDIDOS_CLIENTE_ID_EMPRESA FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (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);
ALTER TABLE PEDIDOS_PROVEEDOR ADD CONSTRAINT FK_PEDIDOS_PROVEEDOR_1 FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_PROVEEDOR (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE PRESUPUESTOS_CLIENTE ADD CONSTRAINT FK_PRESUPUESTOS_CLIENTE_1 FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID);
ALTER TABLE PRESUPUESTOS_CLIENTE ADD CONSTRAINT FK_PRESUPUESTOS_CLIENTE_2 FOREIGN KEY (ID_CLIENTE) REFERENCES CONTACTOS (ID);
ALTER TABLE PRESUPUESTOS_CLIENTE ADD CONSTRAINT FK_PRESUPUESTOS_CLIENTE_3 FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_CLIENTE (ID) ON DELETE SET NULL ON UPDATE SET NULL;
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;
ALTER TABLE RECIBOS_PROVEEDOR ADD CONSTRAINT FK_RECIBOS_PROVEEDOR FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_PROVEEDOR (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RECIBOS_PROVEEDOR ADD CONSTRAINT FK_RECIBOS_PROVEEDOR1 FOREIGN KEY (ID_REMESA) REFERENCES REMESAS_PROVEEDOR (ID) ON DELETE SET NULL ON UPDATE SET NULL;
ALTER TABLE REMESAS_CLIENTE ADD CONSTRAINT FK_REMESAS_CLIENTE FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID);
ALTER TABLE REMESAS_PROVEEDOR ADD CONSTRAINT FK_REMESAS_PROVEEDOR FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID);
ALTER TABLE TIENDA_WEB ADD CONSTRAINT FK_EMPRESAS_TIENDA_WEB FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE CASCADE ON UPDATE CASCADE;


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX IDX_AGENTES_COMISIONES1 ON AGENTES_COMISIONES (ID_AGENTE);
CREATE INDEX IDX_AGENTES_COMISIONES2 ON AGENTES_COMISIONES (ID_PROVEEDOR);
CREATE INDEX IDX_ALBARANES_CLIENTE1 ON ALBARANES_CLIENTE (ID_FORMA_PAGO);
CREATE INDEX IDX_ALBARANES_CLIENTE2 ON ALBARANES_CLIENTE (TIPO);
CREATE INDEX ALBARANES_CLIENTE_IDX1 ON ALBARANES_CLIENTE (ID_ALMACEN);
CREATE INDEX ALBARANES_CLIENTE_IDX2 ON ALBARANES_CLIENTE (ID_DIRECCION);
CREATE INDEX ALBARANES_CLIENTE_IDX3 ON ALBARANES_CLIENTE (FECHA_ALBARAN);
CREATE INDEX IDX_ALBARANES_CLIENTE_DETALLES ON ALBARANES_CLIENTE_DETALLES (ID_ARTICULO);
CREATE INDEX IDX_ALBARANES_CLIENTE_DETALLES1 ON ALBARANES_CLIENTE_DETALLES (ID_ALBARAN);
CREATE INDEX ALBARANES_CLIENTE_DETALLES_IDX1 ON ALBARANES_CLIENTE_DETALLES (ID_PEDIDO);
CREATE INDEX IDX_ALBARANES_PROVEEDOR1 ON ALBARANES_PROVEEDOR (ID_ALMACEN);
CREATE INDEX IDX_ALBARANES_PROVEEDOR2 ON ALBARANES_PROVEEDOR (ID_FORMA_PAGO);
CREATE INDEX IDX_ALBARANES_PROVEEDOR3 ON ALBARANES_PROVEEDOR (TIPO);
CREATE INDEX ALBARANES_PROVEEDOR_IDX1 ON ALBARANES_PROVEEDOR (ID_ALBARAN);
CREATE INDEX ALBARANES_PROVEEDOR_IDX2 ON ALBARANES_PROVEEDOR (FECHA_ALBARAN);
CREATE INDEX IDX_ALBARANES_PROV_DETALLES ON ALBARANES_PROVEEDOR_DETALLES (ID_ALBARAN);
CREATE INDEX IDX_ALBARANES_PROV_DETALLES1 ON ALBARANES_PROVEEDOR_DETALLES (ID_ARTICULO);
CREATE INDEX ALBARANES_PROVEEDOR_DETALL_IDX1 ON ALBARANES_PROVEEDOR_DETALLES (ID_PEDIDO);
CREATE INDEX ALMACENES_IDX1 ON ALMACENES (TIPO_ALMACEN);
CREATE INDEX ARTICULOS_PROVEEDORES_IDX1 ON ARTICULOS_PROVEEDORES (ID_ARTICULO);
CREATE INDEX ARTICULOS_PROVEEDORES_IDX2 ON ARTICULOS_PROVEEDORES (ID_PROVEEDOR);
CREATE INDEX IDX_CLIENTES_DATOS ON CLIENTES_DATOS (ID_TIPO_IVA);
CREATE INDEX IDX_CLIENTES_DATOS1 ON CLIENTES_DATOS (ID_FORMA_PAGO);
CREATE INDEX IDX_CLIENTES_DATOS_ID_AGENTE ON CLIENTES_DATOS (ID_AGENTE);
CREATE INDEX IDX_CLIENTES_DTOS_PROV_ID_CLI ON CLIENTES_DTOS_PROVEEDORES (ID_CLIENTE);
CREATE INDEX IDX_CLIENTES_DTOS_PROV_ID_PROV ON CLIENTES_DTOS_PROVEEDORES (ID_PROVEEDOR);
CREATE INDEX IDX_COMISIONES_LIQUIDADAS ON COMISIONES_LIQUIDADAS (ID_EMPRESA);
CREATE INDEX IDX_CONFIGURACION ON CONFIGURACION (ID_EMPRESA);
CREATE INDEX IDX_CONTACTOS_CATEGORIAS ON CONTACTOS_CATEGORIAS (ID_CONTACTO);
CREATE INDEX IDX_CONTACTOS_CATEGORIAS1 ON CONTACTOS_CATEGORIAS (ID_CATEGORIA);
CREATE INDEX IDX_CONTACTOS_DATOS_BANCO ON CONTACTOS_DATOS_BANCO (ID_CONTACTO);
CREATE INDEX IDX_CONTACTOS_PER_ID_CONTACTO ON CONTACTOS_DATOS_PERSONAL (ID_CONTACTO);
CREATE INDEX IDX_CONTACTOS_DIR_ID_CONTACTO ON CONTACTOS_DIRECCIONES (ID_CONTACTO);
CREATE INDEX IDX_EMPRESAS_CONTACTOS ON EMPRESAS_CONTACTOS (ID_EMPRESA, ID_CONTACTO);
CREATE INDEX IDX_EMPRESAS_USUARIOS ON EMPRESAS_USUARIOS (ID_EMPRESA, ID_USUARIO);
CREATE INDEX IDX_FACTURAS_CLIENTE ON FACTURAS_CLIENTE (ID_FORMA_PAGO);
CREATE INDEX IDX_FACTURAS_CLIENTE1 ON FACTURAS_CLIENTE (ID_TIPO_IVA);
CREATE INDEX IDX_FACTURAS_CLIENTE2 ON FACTURAS_CLIENTE (ID_COMISION_LIQUIDADA);
CREATE INDEX IDX_FACTURAS_CLIENTE3 ON FACTURAS_CLIENTE (ID_CLIENTE);
CREATE INDEX FACTURAS_CLIENTE_IDX1 ON FACTURAS_CLIENTE (FECHA_FACTURA);
CREATE INDEX FACTURAS_CLIENTE_IDX2 ON FACTURAS_CLIENTE (FECHA_VENCIMIENTO);
CREATE INDEX IDX_FACTURAS_CLIENTE_DETALLES1 ON FACTURAS_CLIENTE_DETALLES (ID_FACTURA);
CREATE INDEX IDX_FACTURAS_CLIENTE_DETALLES2 ON FACTURAS_CLIENTE_DETALLES (ID_ARTICULO);
CREATE INDEX IDX_FACTURAS_PROVEEDOR ON FACTURAS_PROVEEDOR (ID_PROVEEDOR);
CREATE INDEX IDX_FACTURAS_PROVEEDOR1 ON FACTURAS_PROVEEDOR (ID_FORMA_PAGO);
CREATE INDEX IDX_FACTURAS_PROVEEDOR2 ON FACTURAS_PROVEEDOR (ID_TIPO_IVA);
CREATE INDEX FACTURAS_PROVEEDOR_IDX1 ON FACTURAS_PROVEEDOR (FECHA_FACTURA);
CREATE INDEX FACTURAS_PROVEEDOR_IDX2 ON FACTURAS_PROVEEDOR (FECHA_VENCIMIENTO);
CREATE INDEX IDX_FACTURAS_PROVEEDOR_DETALLES ON FACTURAS_PROVEEDOR_DETALLES (ID_ARTICULO);
CREATE INDEX FACTURAS_PROVEEDOR_DETALLE_IDX1 ON FACTURAS_PROVEEDOR_DETALLES (ID_FACTURA);
CREATE INDEX IDX_FACTURAS_PROVEEDOR_PEDIDOS ON FACTURAS_PROVEEDOR_PEDIDOS (ID_PEDIDO);
CREATE INDEX FACTURAS_PROVEEDOR_PEDIDOS_IDX1 ON FACTURAS_PROVEEDOR_PEDIDOS (ID_FACTURA);
CREATE INDEX IDX_FORMAS_PAGO_PLAZOS ON FORMAS_PAGO_PLAZOS (ID_FORMA_PAGO);
CREATE INDEX IDX_INFORMES ON INFORMES (ID_EMPRESA);
CREATE INDEX IDX_MOVIMIENTOS ON MOVIMIENTOS (TIPO);
CREATE INDEX MOVIMIENTOS_IDX1 ON MOVIMIENTOS (ID_ARTICULO);
CREATE INDEX MOVIMIENTOS_IDX2 ON MOVIMIENTOS (FECHA_MOVIMIENTO);
CREATE INDEX MOVIMIENTOS_IDX3 ON MOVIMIENTOS (ID_ALMACEN_RESERVA);
CREATE INDEX OBRAS_DATOS_IDX1 ON OBRAS_DATOS (ID_ALMACEN);
CREATE INDEX OBRAS_DATOS_IDX2 ON OBRAS_DATOS (ID_CLIENTE);
CREATE INDEX PAGOS_CLIENTE_IDX1 ON PAGOS_CLIENTE (FECHA_PAGO);
CREATE INDEX PAGOS_PROVEEDOR_IDX1 ON PAGOS_PROVEEDOR (FECHA_PAGO);
CREATE INDEX IDX_PEDIDOS_CLIENTE ON PEDIDOS_CLIENTE (ID_FORMA_PAGO);
CREATE INDEX PEDIDOS_CLIENTE_IDX1 ON PEDIDOS_CLIENTE (FECHA_PEDIDO);
CREATE INDEX IDX_PEDIDOS_CLIENTE_DETALLES ON PEDIDOS_CLIENTE_DETALLES (ID_PEDIDO);
CREATE INDEX IDX_PEDIDOS_CLIENTE_DETALLES1 ON PEDIDOS_CLIENTE_DETALLES (ID_ARTICULO);
CREATE INDEX IDX_PEDIDOS_PROVEEDOR ON PEDIDOS_PROVEEDOR (ID_PEDIDO_CLIENTE);
CREATE INDEX IDX_PEDIDOS_PROVEEDOR1 ON PEDIDOS_PROVEEDOR (ID_ALMACEN);
CREATE INDEX IDX_PEDIDOS_PROVEEDOR2 ON PEDIDOS_PROVEEDOR (ID_FORMA_PAGO);
CREATE INDEX IDX_PEDIDOS_PROVEEDOR3 ON PEDIDOS_PROVEEDOR (ID_OBRA);
CREATE INDEX IDX_PEDIDOS_PROVEEDOR4 ON PEDIDOS_PROVEEDOR (ID_PROVEEDOR);
CREATE INDEX PEDIDOS_PROVEEDOR_IDX1 ON PEDIDOS_PROVEEDOR (FECHA_PEDIDO);
CREATE INDEX IDX_PEDIDOS_PROVEEDOR_DETALLES ON PEDIDOS_PROVEEDOR_DETALLES (ID_ARTICULO);
CREATE INDEX PEDIDOS_PROVEEDOR_DETALLES_IDX1 ON PEDIDOS_PROVEEDOR_DETALLES (ID_PEDIDO);
CREATE INDEX POBLACIONES_IDX1 ON POBLACIONES (ID_PROVINCIA);
CREATE INDEX PRESUPUESTOS_CLIENTE_IDX1 ON PRESUPUESTOS_CLIENTE (FECHA_PRESUPUESTO);
CREATE INDEX PRESUPUESTOS_CLIENTE_DETAL_IDX1 ON PRESUPUESTOS_CLIENTE_DETALLES (ID_PRESUPUESTO);
CREATE INDEX PRESUPUESTOS_CLIENTE_DETAL_IDX2 ON PRESUPUESTOS_CLIENTE_DETALLES (ID_ARTICULO);
CREATE INDEX IDX_PROVEEDORES_DATOS ON PROVEEDORES_DATOS (ID_TIPO_IVA);
CREATE INDEX IDX_PROVEEDORES_DATOS1 ON PROVEEDORES_DATOS (ID_FORMA_PAGO);
CREATE INDEX IDX_RECIBOS_CLIENTE ON RECIBOS_CLIENTE (ID_RECIBO_COMPENSADO);
CREATE INDEX RECIBOS_CLIENTE_IDX1 ON RECIBOS_CLIENTE (FECHA_EMISION);
CREATE INDEX RECIBOS_CLIENTE_IDX2 ON RECIBOS_CLIENTE (FECHA_VENCIMIENTO);
CREATE INDEX IDX_RECIBOS_PROVEEDOR ON RECIBOS_PROVEEDOR (ID_RECIBO_COMPENSADO);
CREATE INDEX RECIBOS_PROVEEDOR_IDX1 ON RECIBOS_PROVEEDOR (FECHA_EMISION);
CREATE INDEX RECIBOS_PROVEEDOR_IDX2 ON RECIBOS_PROVEEDOR (FECHA_VENCIMIENTO);
CREATE INDEX IDX_REFERENCIAS ON REFERENCIAS (ID_EMPRESA);
CREATE INDEX IDX_REMESAS_CLIENTE ON REMESAS_CLIENTE (ID_DATOS_BANCO);
CREATE INDEX REMESAS_CLIENTE_IDX1 ON REMESAS_CLIENTE (FECHA_REMESA);
CREATE INDEX IDX_REMESAS_PROVEEDOR ON REMESAS_PROVEEDOR (ID_DATOS_BANCO);
CREATE INDEX REMESAS_PROVEEDOR_IDX1 ON REMESAS_PROVEEDOR (FECHA_REMESA);


/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

SET TERM ^ ; 

CREATE PROCEDURE PRO_ART_RECALCULAR_PVP (
    ID_EMPRESA INTEGER,
    PARAM_MARGEN NUMERIC(2,2),
    PARAM_TIEMPO NUMERIC(11,2))
AS
declare variable id_articulo integer;
declare variable mano_obra numeric(11,2);
begin
  UPDATE ARTICULOS
  SET PARAM_TIEMPO = :PARAM_TIEMPO,
  PARAM_MARGEN = :PARAM_MARGEN,
  MANO_OBRA = (TIEMPO * :PARAM_TIEMPO)
  WHERE ID_EMPRESA = :ID_EMPRESA;

  for select ID, MANO_OBRA
  from articulos
  where ID_EMPRESA = :ID_EMPRESA
  into :ID_ARTICULO, :MANO_OBRA
  do
  begin
    update articulos_proveedores
    set PRECIO_PVP_VENTA = (PRECIO_NETO + PRECIO_PORTE) * (((:PARAM_MARGEN) / 100) + 1),
        PRECIO_PVP_TOTAL = ((PRECIO_NETO + PRECIO_PORTE) * (((:PARAM_MARGEN) / 100) + 1)) + :MANO_OBRA
     where id_articulo = :ID_ARTICULO;
  end

  suspend;
end
^


CREATE PROCEDURE PRO_PRES_CAPITULOS (
    AID INTEGER)
RETURNS (
    ID INTEGER,
    ID_PRESUPUESTO INTEGER,
    POSICION INTEGER,
    TIPO_DETALLE VARCHAR(25),
    CONCEPTO VARCHAR(2000),
    IMPORTE_TOTAL NUMERIC(11,2),
    VISIBLE SMALLINT)
AS
declare variable num_filas integer;
declare variable contador integer;
declare variable existe numeric(11,2);
declare variable total_acumulado numeric(11,2);
begin
    existe = 0;
    total_acumulado = 0.0;
    contador = 0;
    num_filas = 0;

    /* ¿Existe el presupuesto? */
    for select count(*)
        from presupuestos_cliente_detalles
        where id_presupuesto = :AID
        into :num_filas
    do
    begin
        if (num_filas = 0) then
            suspend;
    end

    /* Ver si hay conceptos al principio sin capitulos */
    for select id, id_presupuesto, posicion, tipo_detalle
        from presupuestos_cliente_detalles
        where id_presupuesto = :AID
        order by id_presupuesto, posicion
        rows 1
        into :ID, :ID_PRESUPUESTO, :POSICION, :TIPO_DETALLE
    do
    begin
        if (TIPO_DETALLE = 'Concepto') then
            EXISTE = 1;
    end

    if (existe = 1) then
    begin
        contador = 0;
        /* Existen conceptos sin capitulo */
        for select tipo_detalle, importe_total, coalesce(visible, 1)
            from presupuestos_cliente_detalles
            where id_presupuesto = :AID
            order by id_presupuesto, posicion
        into :TIPO_DETALLE, :IMPORTE_TOTAL, :VISIBLE
        do
        begin
            contador = contador + 1;

            if ((visible <> 0) and (tipo_detalle = 'Concepto')) then
                total_acumulado = total_acumulado + importe_total;

            if ((tipo_detalle <> 'Concepto') or (contador = num_filas))  then
            begin
                importe_total = total_acumulado;
                tipo_detalle = 'Titulo';
                concepto = 'General';
                visible = 1;
                ID = -1;
                posicion = -1;
                suspend;
                break;
            end
        end
    end


    for select id, id_presupuesto, posicion, tipo_detalle, F_RTFTOTEXT(concepto) as concepto,
           importe_total, coalesce(visible, 1)
    from presupuestos_cliente_detalles
    where ((tipo_detalle = 'Titulo') or (tipo_detalle = 'Titulo opcional'))and id_presupuesto = :AID
    order by id_presupuesto, posicion
    into :ID, :ID_PRESUPUESTO, :POSICION, :TIPO_DETALLE, :CONCEPTO,
         :IMPORTE_TOTAL, :VISIBLE
    do
        suspend;
end
^


CREATE PROCEDURE PRO_PRES_CAPITULOS_CONCEPTOS (
    AID INTEGER)
RETURNS (
    ID INTEGER,
    ID_PRESUPUESTO INTEGER,
    POSICION INTEGER,
    TIPO_DETALLE VARCHAR(25),
    ID_CAPITULO INTEGER,
    ID_ARTICULO INTEGER,
    REFERENCIA VARCHAR(255),
    CONCEPTO VARCHAR(2000),
    CANTIDAD NUMERIC(11,2),
    UNIDAD_MEDIDA VARCHAR(255),
    IMPORTE_UNIDAD NUMERIC(11,2),
    DESCUENTO NUMERIC(2,2),
    IMPORTE_PORTE NUMERIC(11,2),
    IMPORTE_TOTAL NUMERIC(11,2),
    VISIBLE SMALLINT)
AS
declare variable capitulo_actual integer;
begin
capitulo_actual = -1;
ID_CAPITULO = -1;
for select pre.id, pre.id_presupuesto, pre.posicion, pre.tipo_detalle,
           pre.id_articulo, articulos.referencia, 
           F_RTFTOTEXT(F_RTFTOTEXT(pre.CONCEPTO)) as CONCEPTO,
           pre.cantidad, pre.unidad_medida,
           case 
           when (pre.descuento <> 0) then (pre.importe_total / pre.cantidad)
           else pre.importe_unidad
           end as importe_unidad,          
           pre.descuento, pre.importe_porte,
           pre.importe_total, coalesce(pre.visible, 1)
    from presupuestos_cliente_detalles pre
         left join articulos on (pre.id_articulo = articulos.id)
    where pre.id_presupuesto = :AID
    order by pre.id_presupuesto, pre.posicion
    into :ID, :ID_PRESUPUESTO, :POSICION, :TIPO_DETALLE, :ID_ARTICULO,
         :REFERENCIA, :CONCEPTO, :CANTIDAD, :UNIDAD_MEDIDA, :IMPORTE_UNIDAD, :DESCUENTO,
         :IMPORTE_PORTE, :IMPORTE_TOTAL, :VISIBLE
do
    begin
        if (:tipo_detalle <> 'Concepto')  then
        begin
            capitulo_actual = :ID;
            ID_CAPITULO = capitulo_actual;
        end
        else
            suspend;
    end
end
^


CREATE PROCEDURE PRO_PRES_RESUMEN (
    AID INTEGER)
RETURNS (
    ID INTEGER,
    ID_PRESUPUESTO INTEGER,
    POSICION INTEGER,
    TIPO_DETALLE VARCHAR(25),
    CONCEPTO VARCHAR(2000),
    IMPORTE_TOTAL NUMERIC(11,2),
    VISIBLE SMALLINT)
AS
declare variable num_capitulos integer;
declare variable num_filas integer;
declare variable contador integer;
declare variable existe numeric(11,2);
declare variable total_acumulado numeric(11,2);
declare variable concepto_capitulo varchar(2000);
declare variable tipo varchar(25);
begin
    existe = 0;
    total_acumulado = 0.0;
    contador = 0;
    num_filas = 0;
    num_capitulos = 0;
    concepto_capitulo = '';
    tipo = '';

    /* ¿Existe el presupuesto? */
    for select count(*)
        from presupuestos_cliente_detalles
        where id_presupuesto = :AID
        into :num_filas
    do
    begin
        if (num_filas = 0) then
            suspend;
    end

    /* Ver si hay conceptos al principio sin capitulos */
    for select id, id_presupuesto, posicion, tipo_detalle
        from presupuestos_cliente_detalles
        where id_presupuesto = :AID
        order by id_presupuesto, posicion
        rows 1
        into :ID, :ID_PRESUPUESTO, :POSICION, :TIPO_DETALLE
    do
    begin
        if (TIPO_DETALLE = 'Concepto') then
            EXISTE = 1;
    end

    num_capitulos = 1;
    if (existe = 1) then
    begin
        contador = 0;
        /* Existen conceptos sin capitulo */
        for select tipo_detalle, coalesce(importe_total,0), coalesce(visible, 1)
            from presupuestos_cliente_detalles
            where id_presupuesto = :AID
            order by id_presupuesto, posicion
        into :TIPO_DETALLE, :IMPORTE_TOTAL, :VISIBLE
        do
        begin
            contador = contador + 1;

            if ((visible <> 0) and (tipo_detalle = 'Concepto')) then
                total_acumulado = total_acumulado + importe_total;

            if ((tipo_detalle <> 'Concepto') or (contador = num_filas))  then
            begin
                importe_total = total_acumulado;
                tipo_detalle = 'Titulo';
                if (num_capitulos > 1) then
                    concepto = 'CAPÍTULO ' || num_capitulos ||'. General';
                else
                    concepto = 'General';
                visible = 1;
                ID = -1;
                posicion = -1;
                suspend;
                break;
            end
        end
    end

    /* Tratar el resto de las filas */
    for select id, id_presupuesto, posicion, tipo_detalle,
        F_RTFTOTEXT(concepto) as concepto, coalesce(importe_total,0), coalesce(visible, 1)
        from presupuestos_cliente_detalles
        where id_presupuesto = :AID and
              tipo_detalle in ('Titulo', 'Titulo opcional', 'Subtotal')
        order by posicion
    into :ID, :ID_PRESUPUESTO, :POSICION, :TIPO_DETALLE, :CONCEPTO,
         :IMPORTE_TOTAL, :VISIBLE
    do
    begin
        contador = contador + 1;
        if ((tipo_detalle = 'Titulo') or (tipo_detalle = 'Titulo opcional'))  then
        begin
            concepto_capitulo = concepto;
            tipo = tipo_detalle;
        end
        if (tipo_detalle = 'Subtotal') then
        begin
            concepto = 'CAPÍTULO ' || num_capitulos || '. ' || concepto_capitulo;
            tipo_detalle = tipo;
            num_capitulos = num_capitulos + 1;
            suspend;
        end
    end
end
^

SET TERM ; ^

/******************************************************************************/
/****                             Descriptions                             ****/
/******************************************************************************/

