-- --------------------------------------------------------------------------------------------------------------
--  Cabeceras
-- --------------------------------------------------------------------------------------------------------------
-- + IDAlmacenDestino
-- + Contabilizado

DROP TABLE IF EXISTS _Cabeceras;
CREATE TEMPORARY TABLE _Cabeceras AS SELECT * FROM Cabeceras;

DROP TABLE Cabeceras;

CREATE TABLE Cabeceras (
    ID                         VARCHAR (128) PRIMARY KEY UNIQUE,
    IDTipoDocumento            VARCHAR (128),
    TipoMovimiento             INTEGER,
    Ejercicio                  INTEGER,
    IDSerie                    VARCHAR (128),
    CodigoSerie                VARCHAR (10),
    Numero                     INTEGER,
    Documento                  VARCHAR (15),
    FechaHora                  DATETIME,
    FechaServicio              DATE,
    ClientePotencial           INTEGER,           
    IDClienteProveedor         VARCHAR (128),
    CodigoClienteProveedor     VARCHAR (15),
    IDDireccion                VARCHAR (128),
    Referencia                 VARCHAR (50),
    NIF                        VARCHAR (15),
    NombreComercial            VARCHAR (60),
    NombreFiscal               VARCHAR (60),
    Domicilio                  VARCHAR (60),
    CodigoPostal               VARCHAR (10),
    Poblacion                  VARCHAR (30),
    Provincia                  VARCHAR (30),
    Pais                       VARCHAR (2),
    Telefono                   VARCHAR (12),
    OtrosDatosFiscales         TEXT,
    IDAlmacen                  VARCHAR (128),
    IDAlmacenDestino           VARCHAR (128),        /* NUEVO CAMPO */
    IDRepresentante            VARCHAR (128),
    IDTransportista            VARCHAR (128),
    IDOportunidad              VARCHAR (128),       
    IDFormaPago                VARCHAR (128),
    Recibos                    INTEGER,
    DiasPrimero                INTEGER,
    DiasResto                  INTEGER,
    ImporteBruto               REAL,
    DescuentoComercial         REAL,
    ImporteDescuentoComercial  REAL,
    DescuentoProntoPago        REAL,
    ImporteDescuentoProntoPago REAL,
    Retencion                  REAL,
    ImporteRetencion           REAL,
    RegimenIVA                 INTEGER,
    IDTipoIVA1                 VARCHAR (128),
    IDTipoIVA2                 VARCHAR (128),
    IDTipoIVA3                 VARCHAR (128),
    IDTipoIVA4                 VARCHAR (128),
    IDTipoIVA5                 VARCHAR (128),
    IDTipoIVA6                 VARCHAR (128),
    BaseImponible1             REAL,
    BaseImponible2             REAL,
    BaseImponible3             REAL,
    BaseImponible4             REAL,
    BaseImponible5             REAL,
    BaseImponible6             REAL,
    PorcentajeIVA1             REAL,
    PorcentajeIVA2             REAL,
    PorcentajeIVA3             REAL,
    PorcentajeIVA4             REAL,
    PorcentajeIVA5             REAL,
    PorcentajeIVA6             REAL,
    CuotaIVA1                  REAL,
    CuotaIVA2                  REAL,
    CuotaIVA3                  REAL,
    CuotaIVA4                  REAL,
    CuotaIVA5                  REAL,
    CuotaIVA6                  REAL,
    PorcentajeRecargo1         REAL,
    PorcentajeRecargo2         REAL,
    PorcentajeRecargo3         REAL,
    PorcentajeRecargo4         REAL,
    PorcentajeRecargo5         REAL,
    PorcentajeRecargo6         REAL,
    CuotaRecargo1              REAL,
    CuotaRecargo2              REAL,
    CuotaRecargo3              REAL,
    CuotaRecargo4              REAL,
    CuotaRecargo5              REAL,
    CuotaRecargo6              REAL,
    ImporteBases               REAL,
    ImporteCuotas              REAL,
    ImporteTasas               REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    Contabilizado              INTEGER,      /* NUEVO CAMPO */
    FechaHoraCreacion          DATETIME
);

INSERT INTO Cabeceras (
    ID,
    IDTipoDocumento,
    TipoMovimiento,
    Ejercicio,
    IDSerie,
    CodigoSerie,
    Numero,
    Documento,
    FechaHora,
    FechaServicio,
    ClientePotencial, 
    IDClienteProveedor,
    CodigoClienteProveedor,
    IDDireccion,
    Referencia,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono,
    OtrosDatosFiscales,
    IDAlmacen,
    IDRepresentante,
    IDTransportista,
    IDOportunidad,
    IDFormaPago,
    Recibos,
    DiasPrimero,
    DiasResto,
    ImporteBruto,
    DescuentoComercial,
    ImporteDescuentoComercial,
    DescuentoProntoPago,
    ImporteDescuentoProntoPago,
    Retencion,
    ImporteRetencion,
    RegimenIVA,
    IDTipoIVA1,
    IDTipoIVA2,
    IDTipoIVA3,
    IDTipoIVA4,
    IDTipoIVA5,
    IDTipoIVA6,
    BaseImponible1,
    BaseImponible2,
    BaseImponible3,
    BaseImponible4,
    BaseImponible5,
    BaseImponible6,
    PorcentajeIVA1,
    PorcentajeIVA2,
    PorcentajeIVA3,
    PorcentajeIVA4,
    PorcentajeIVA5,
    PorcentajeIVA6,
    CuotaIVA1,
    CuotaIVA2,
    CuotaIVA3,
    CuotaIVA4,
    CuotaIVA5,
    CuotaIVA6,
    PorcentajeRecargo1,
    PorcentajeRecargo2,
    PorcentajeRecargo3,
    PorcentajeRecargo4,
    PorcentajeRecargo5,
    PorcentajeRecargo6,
    CuotaRecargo1,
    CuotaRecargo2,
    CuotaRecargo3,
    CuotaRecargo4,
    CuotaRecargo5,
    CuotaRecargo6,
    ImporteBases,
    ImporteCuotas,
    ImporteTasas,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    FechaHoraCreacion
)
SELECT 
    ID,
    IDTipoDocumento,
    TipoMovimiento,
    Ejercicio,
    IDSerie,
    CodigoSerie,
    Numero,
    Documento,
    FechaHora,
    FechaServicio,
    ClientePotencial,
    IDClienteProveedor,
    CodigoClienteProveedor,
    IDDireccion,
    Referencia,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono,
    OtrosDatosFiscales,
    IDAlmacen,
    IDRepresentante,
    IDTransportista,
    IDOportunidad,
    IDFormaPago,
    Recibos,
    DiasPrimero,
    DiasResto,
    ImporteBruto,
    DescuentoComercial,
    ImporteDescuentoComercial,
    DescuentoProntoPago,
    ImporteDescuentoProntoPago,
    Retencion,
    ImporteRetencion,
    RegimenIVA,
    IDTipoIVA1,
    IDTipoIVA2,
    IDTipoIVA3,
    IDTipoIVA4,
    IDTipoIVA5,
    IDTipoIVA6,
    BaseImponible1,
    BaseImponible2,
    BaseImponible3,
    BaseImponible4,
    BaseImponible5,
    BaseImponible6,
    PorcentajeIVA1,
    PorcentajeIVA2,
    PorcentajeIVA3,
    PorcentajeIVA4,
    PorcentajeIVA5,
    PorcentajeIVA6,
    CuotaIVA1,
    CuotaIVA2,
    CuotaIVA3,
    CuotaIVA4,
    CuotaIVA5,
    CuotaIVA6,
    PorcentajeRecargo1,
    PorcentajeRecargo2,
    PorcentajeRecargo3,
    PorcentajeRecargo4,
    PorcentajeRecargo5,
    PorcentajeRecargo6,
    CuotaRecargo1,
    CuotaRecargo2,
    CuotaRecargo3,
    CuotaRecargo4,
    CuotaRecargo5,
    CuotaRecargo6,
    ImporteBases,
    ImporteCuotas,
    ImporteTasas,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    FechaHoraCreacion
FROM _Cabeceras;

DROP TABLE IF EXISTS _Cabeceras;

CREATE INDEX NDX_Cabeceras_IDTipoDocumento ON Cabeceras (IDTipoDocumento);
CREATE INDEX NDX_Cabeceras_TipoMovimiento ON Cabeceras (TipoMovimiento);
CREATE INDEX NDX_Cabeceras_Ejercicio ON Cabeceras (Ejercicio);
CREATE INDEX NDX_Cabeceras_IDSerie ON Cabeceras (IDSerie);
CREATE INDEX NDX_Cabeceras_CodigoSerie ON Cabeceras (CodigoSerie);
CREATE INDEX NDX_Cabeceras_Numero ON Cabeceras (Numero);
CREATE INDEX NDX_Cabeceras_Documento ON Cabeceras (Documento);
CREATE INDEX NDX_Cabeceras_FechaHora ON Cabeceras (FechaHora);
CREATE INDEX NDX_Cabeceras_ClientePotencial ON Cabeceras (ClientePotencial);
CREATE INDEX NDX_Cabeceras_IDClienteProveedor ON Cabeceras (IDClienteProveedor);
CREATE INDEX NDX_Cabeceras_CodigoClienteProveedor ON Cabeceras (CodigoClienteProveedor);
CREATE INDEX NDX_Cabeceras_IDDireccion ON Cabeceras (IDDireccion);
CREATE INDEX NDX_Cabeceras_Referencia ON Cabeceras (Referencia);
CREATE INDEX NDX_Cabeceras_NIF ON Cabeceras (NIF);
CREATE INDEX NDX_Cabeceras_NombreComercial ON Cabeceras (NombreComercial);
CREATE INDEX NDX_Cabeceras_NombreFiscal ON Cabeceras (NombreFiscal);
CREATE INDEX NDX_Cabeceras_IDAlmacen ON Cabeceras (IDAlmacen);
CREATE INDEX NDX_Cabeceras_IDAlmacenDestino ON Cabeceras (IDAlmacenDestino);
CREATE INDEX NDX_Cabeceras_IDRepresentante ON Cabeceras (IDRepresentante);
CREATE INDEX NDX_Cabeceras_IDTransportista ON Cabeceras (IDTransportista);
CREATE INDEX NDX_Cabeceras_IDOportunidad ON Cabeceras (IDOportunidad);
CREATE INDEX NDX_Cabeceras_IDFormaPago ON Cabeceras (IDFormaPago);
CREATE INDEX NDX_Cabeceras_EstadoEnvio ON Cabeceras (EstadoEnvio);
CREATE INDEX NDX_Cabeceras_EstadoCarga ON Cabeceras (EstadoCarga);
CREATE INDEX NDX_Cabeceras_Emitido ON Cabeceras (Emitido);
CREATE INDEX NDX_Cabeceras_Servido ON Cabeceras (Servido);
CREATE INDEX NDX_Cabeceras_Traspasado ON Cabeceras (Traspasado);
CREATE INDEX NDX_Cabeceras_Abonado ON Cabeceras (Abonado);
CREATE INDEX NDX_Cabeceras_Contabilizado ON Cabeceras (Contabilizado);
CREATE INDEX NDX_Cabeceras_FechaHoraCreacion ON Cabeceras (FechaHoraCreacion);    
CREATE INDEX NDX_Cabeceras_Com_Cliente ON Cabeceras (ClientePotencial, IDClienteProveedor);    
CREATE INDEX NDX_Cabeceras_Com_ClienteDireccion ON Cabeceras (ClientePotencial, IDClienteProveedor, IDDireccion);  


-- --------------------------------------------------------------------------------------------------------------
--  CabecerasTmp
-- --------------------------------------------------------------------------------------------------------------
-- + IDAlmacenDestino
-- + Contabilizado

DROP TABLE IF EXISTS _CabecerasTmp;
CREATE TEMPORARY TABLE _CabecerasTmp AS SELECT * FROM CabecerasTmp;

DROP TABLE CabecerasTmp;

CREATE TABLE CabecerasTmp (
    ID                         VARCHAR (128) PRIMARY KEY UNIQUE,
    IDTipoDocumento            VARCHAR (128),
    TipoMovimiento             INTEGER,
    Ejercicio                  INTEGER,
    IDSerie                    VARCHAR (128),
    CodigoSerie                VARCHAR (10),
    Numero                     INTEGER,
    Documento                  VARCHAR (15),
    FechaHora                  DATETIME,
    FechaServicio              DATE,
    ClientePotencial           INTEGER,           
    IDClienteProveedor         VARCHAR (128),
    CodigoClienteProveedor     VARCHAR (15),
    IDDireccion                VARCHAR (128),
    Referencia                 VARCHAR (50),
    NIF                        VARCHAR (15),
    NombreComercial            VARCHAR (60),
    NombreFiscal               VARCHAR (60),
    Domicilio                  VARCHAR (60),
    CodigoPostal               VARCHAR (10),
    Poblacion                  VARCHAR (30),
    Provincia                  VARCHAR (30),
    Pais                       VARCHAR (2),
    Telefono                   VARCHAR (12),
    OtrosDatosFiscales         TEXT,
    IDAlmacen                  VARCHAR (128),
    IDAlmacenDestino           VARCHAR (128),        /* NUEVO CAMPO */
    IDRepresentante            VARCHAR (128),
    IDTransportista            VARCHAR (128),
    IDOportunidad              VARCHAR (128),       
    IDFormaPago                VARCHAR (128),
    Recibos                    INTEGER,
    DiasPrimero                INTEGER,
    DiasResto                  INTEGER,
    ImporteBruto               REAL,
    DescuentoComercial         REAL,
    ImporteDescuentoComercial  REAL,
    DescuentoProntoPago        REAL,
    ImporteDescuentoProntoPago REAL,
    Retencion                  REAL,
    ImporteRetencion           REAL,
    RegimenIVA                 INTEGER,
    IDTipoIVA1                 VARCHAR (128),
    IDTipoIVA2                 VARCHAR (128),
    IDTipoIVA3                 VARCHAR (128),
    IDTipoIVA4                 VARCHAR (128),
    IDTipoIVA5                 VARCHAR (128),
    IDTipoIVA6                 VARCHAR (128),
    BaseImponible1             REAL,
    BaseImponible2             REAL,
    BaseImponible3             REAL,
    BaseImponible4             REAL,
    BaseImponible5             REAL,
    BaseImponible6             REAL,
    PorcentajeIVA1             REAL,
    PorcentajeIVA2             REAL,
    PorcentajeIVA3             REAL,
    PorcentajeIVA4             REAL,
    PorcentajeIVA5             REAL,
    PorcentajeIVA6             REAL,
    CuotaIVA1                  REAL,
    CuotaIVA2                  REAL,
    CuotaIVA3                  REAL,
    CuotaIVA4                  REAL,
    CuotaIVA5                  REAL,
    CuotaIVA6                  REAL,
    PorcentajeRecargo1         REAL,
    PorcentajeRecargo2         REAL,
    PorcentajeRecargo3         REAL,
    PorcentajeRecargo4         REAL,
    PorcentajeRecargo5         REAL,
    PorcentajeRecargo6         REAL,
    CuotaRecargo1              REAL,
    CuotaRecargo2              REAL,
    CuotaRecargo3              REAL,
    CuotaRecargo4              REAL,
    CuotaRecargo5              REAL,
    CuotaRecargo6              REAL,
    ImporteBases               REAL,
    ImporteCuotas              REAL,
    ImporteTasas               REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    Contabilizado              INTEGER,      /* NUEVO CAMPO */
    FechaHoraCreacion          DATETIME
);

INSERT INTO CabecerasTmp (
    ID,
    IDTipoDocumento,
    TipoMovimiento,
    Ejercicio,
    IDSerie,
    CodigoSerie,
    Numero,
    Documento,
    FechaHora,
    FechaServicio,
    ClientePotencial, 
    IDClienteProveedor,
    CodigoClienteProveedor,
    IDDireccion,
    Referencia,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono,
    OtrosDatosFiscales,
    IDAlmacen,
    IDRepresentante,
    IDTransportista,
    IDOportunidad,
    IDFormaPago,
    Recibos,
    DiasPrimero,
    DiasResto,
    ImporteBruto,
    DescuentoComercial,
    ImporteDescuentoComercial,
    DescuentoProntoPago,
    ImporteDescuentoProntoPago,
    Retencion,
    ImporteRetencion,
    RegimenIVA,
    IDTipoIVA1,
    IDTipoIVA2,
    IDTipoIVA3,
    IDTipoIVA4,
    IDTipoIVA5,
    IDTipoIVA6,
    BaseImponible1,
    BaseImponible2,
    BaseImponible3,
    BaseImponible4,
    BaseImponible5,
    BaseImponible6,
    PorcentajeIVA1,
    PorcentajeIVA2,
    PorcentajeIVA3,
    PorcentajeIVA4,
    PorcentajeIVA5,
    PorcentajeIVA6,
    CuotaIVA1,
    CuotaIVA2,
    CuotaIVA3,
    CuotaIVA4,
    CuotaIVA5,
    CuotaIVA6,
    PorcentajeRecargo1,
    PorcentajeRecargo2,
    PorcentajeRecargo3,
    PorcentajeRecargo4,
    PorcentajeRecargo5,
    PorcentajeRecargo6,
    CuotaRecargo1,
    CuotaRecargo2,
    CuotaRecargo3,
    CuotaRecargo4,
    CuotaRecargo5,
    CuotaRecargo6,
    ImporteBases,
    ImporteCuotas,
    ImporteTasas,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    FechaHoraCreacion
)
SELECT 
    ID,
    IDTipoDocumento,
    TipoMovimiento,
    Ejercicio,
    IDSerie,
    CodigoSerie,
    Numero,
    Documento,
    FechaHora,
    FechaServicio,
    ClientePotencial,
    IDClienteProveedor,
    CodigoClienteProveedor,
    IDDireccion,
    Referencia,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono,
    OtrosDatosFiscales,
    IDAlmacen,
    IDRepresentante,
    IDTransportista,
    IDOportunidad,
    IDFormaPago,
    Recibos,
    DiasPrimero,
    DiasResto,
    ImporteBruto,
    DescuentoComercial,
    ImporteDescuentoComercial,
    DescuentoProntoPago,
    ImporteDescuentoProntoPago,
    Retencion,
    ImporteRetencion,
    RegimenIVA,
    IDTipoIVA1,
    IDTipoIVA2,
    IDTipoIVA3,
    IDTipoIVA4,
    IDTipoIVA5,
    IDTipoIVA6,
    BaseImponible1,
    BaseImponible2,
    BaseImponible3,
    BaseImponible4,
    BaseImponible5,
    BaseImponible6,
    PorcentajeIVA1,
    PorcentajeIVA2,
    PorcentajeIVA3,
    PorcentajeIVA4,
    PorcentajeIVA5,
    PorcentajeIVA6,
    CuotaIVA1,
    CuotaIVA2,
    CuotaIVA3,
    CuotaIVA4,
    CuotaIVA5,
    CuotaIVA6,
    PorcentajeRecargo1,
    PorcentajeRecargo2,
    PorcentajeRecargo3,
    PorcentajeRecargo4,
    PorcentajeRecargo5,
    PorcentajeRecargo6,
    CuotaRecargo1,
    CuotaRecargo2,
    CuotaRecargo3,
    CuotaRecargo4,
    CuotaRecargo5,
    CuotaRecargo6,
    ImporteBases,
    ImporteCuotas,
    ImporteTasas,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    FechaHoraCreacion
FROM _CabecerasTmp;

DROP TABLE IF EXISTS _CabecerasTmp;

CREATE INDEX NDX_CabecerasTmp_IDTipoDocumento ON CabecerasTmp (IDTipoDocumento);
CREATE INDEX NDX_CabecerasTmp_TipoMovimiento ON CabecerasTmp (TipoMovimiento);
CREATE INDEX NDX_CabecerasTmp_Ejercicio ON CabecerasTmp (Ejercicio);
CREATE INDEX NDX_CabecerasTmp_IDSerie ON CabecerasTmp (IDSerie);
CREATE INDEX NDX_CabecerasTmp_CodigoSerie ON CabecerasTmp (CodigoSerie);
CREATE INDEX NDX_CabecerasTmp_Numero ON CabecerasTmp (Numero);
CREATE INDEX NDX_CabecerasTmp_Documento ON CabecerasTmp (Documento);
CREATE INDEX NDX_CabecerasTmp_FechaHora ON CabecerasTmp (FechaHora);
CREATE INDEX NDX_CabecerasTmp_ClientePotencial ON CabecerasTmp (ClientePotencial);
CREATE INDEX NDX_CabecerasTmp_IDClienteProveedor ON CabecerasTmp (IDClienteProveedor);
CREATE INDEX NDX_CabecerasTmp_CodigoClienteProveedor ON CabecerasTmp (CodigoClienteProveedor);
CREATE INDEX NDX_CabecerasTmp_IDDireccion ON CabecerasTmp (IDDireccion);
CREATE INDEX NDX_CabecerasTmp_Referencia ON CabecerasTmp (Referencia);
CREATE INDEX NDX_CabecerasTmp_NIF ON CabecerasTmp (NIF);
CREATE INDEX NDX_CabecerasTmp_NombreComercial ON CabecerasTmp (NombreComercial);
CREATE INDEX NDX_CabecerasTmp_NombreFiscal ON CabecerasTmp (NombreFiscal);
CREATE INDEX NDX_CabecerasTmp_IDAlmacen ON CabecerasTmp (IDAlmacen);
CREATE INDEX NDX_CabecerasTmp_IDAlmacenDestino ON CabecerasTmp (IDAlmacenDestino);
CREATE INDEX NDX_CabecerasTmp_IDRepresentante ON CabecerasTmp (IDRepresentante);
CREATE INDEX NDX_CabecerasTmp_IDTransportista ON CabecerasTmp (IDTransportista);
CREATE INDEX NDX_CabecerasTmp_IDOportunidad ON CabecerasTmp (IDOportunidad);
CREATE INDEX NDX_CabecerasTmp_IDFormaPago ON CabecerasTmp (IDFormaPago);
CREATE INDEX NDX_CabecerasTmp_EstadoEnvio ON CabecerasTmp (EstadoEnvio);
CREATE INDEX NDX_CabecerasTmp_EstadoCarga ON CabecerasTmp (EstadoCarga);
CREATE INDEX NDX_CabecerasTmp_Emitido ON CabecerasTmp (Emitido);
CREATE INDEX NDX_CabecerasTmp_Servido ON CabecerasTmp (Servido);
CREATE INDEX NDX_CabecerasTmp_Traspasado ON CabecerasTmp (Traspasado);
CREATE INDEX NDX_CabecerasTmp_Abonado ON CabecerasTmp (Abonado);
CREATE INDEX NDX_CabecerasTmp_Contabilizado ON CabecerasTmp (Contabilizado);
CREATE INDEX NDX_CabecerasTmp_FechaHoraCreacion ON CabecerasTmp (FechaHoraCreacion);    
CREATE INDEX NDX_CabecerasTmp_Com_Cliente ON CabecerasTmp (ClientePotencial, IDClienteProveedor);    
CREATE INDEX NDX_CabecerasTmp_Com_ClienteDireccion ON CabecerasTmp (ClientePotencial, IDClienteProveedor, IDDireccion);  


-- --------------------------------------------------------------------------------------------------------------
--  HCabeceras
-- --------------------------------------------------------------------------------------------------------------
-- + IDAlmacenDestino
-- + Contabilizado

DROP TABLE IF EXISTS _HCabeceras;
CREATE TEMPORARY TABLE _HCabeceras AS SELECT * FROM HCabeceras;

DROP TABLE HCabeceras;

CREATE TABLE HCabeceras (
    ID                         VARCHAR (128) PRIMARY KEY UNIQUE,
    IDTipoDocumento            VARCHAR (128),
    TipoMovimiento             INTEGER,
    Ejercicio                  INTEGER,
    IDSerie                    VARCHAR (128),
    CodigoSerie                VARCHAR (10),
    Numero                     INTEGER,
    Documento                  VARCHAR (15),
    FechaHora                  DATETIME,
    FechaServicio              DATE,
    ClientePotencial           INTEGER,           
    IDClienteProveedor         VARCHAR (128),
    CodigoClienteProveedor     VARCHAR (15),
    IDDireccion                VARCHAR (128),
    Referencia                 VARCHAR (50),
    NIF                        VARCHAR (15),
    NombreComercial            VARCHAR (60),
    NombreFiscal               VARCHAR (60),
    Domicilio                  VARCHAR (60),
    CodigoPostal               VARCHAR (10),
    Poblacion                  VARCHAR (30),
    Provincia                  VARCHAR (30),
    Pais                       VARCHAR (2),
    Telefono                   VARCHAR (12),
    OtrosDatosFiscales         TEXT,
    IDAlmacen                  VARCHAR (128),
    IDAlmacenDestino           VARCHAR (128),        /* NUEVO CAMPO */
    IDRepresentante            VARCHAR (128),
    IDTransportista            VARCHAR (128),
    IDOportunidad              VARCHAR (128),       
    IDFormaPago                VARCHAR (128),
    Recibos                    INTEGER,
    DiasPrimero                INTEGER,
    DiasResto                  INTEGER,
    ImporteBruto               REAL,
    DescuentoComercial         REAL,
    ImporteDescuentoComercial  REAL,
    DescuentoProntoPago        REAL,
    ImporteDescuentoProntoPago REAL,
    Retencion                  REAL,
    ImporteRetencion           REAL,
    RegimenIVA                 INTEGER,
    IDTipoIVA1                 VARCHAR (128),
    IDTipoIVA2                 VARCHAR (128),
    IDTipoIVA3                 VARCHAR (128),
    IDTipoIVA4                 VARCHAR (128),
    IDTipoIVA5                 VARCHAR (128),
    IDTipoIVA6                 VARCHAR (128),
    BaseImponible1             REAL,
    BaseImponible2             REAL,
    BaseImponible3             REAL,
    BaseImponible4             REAL,
    BaseImponible5             REAL,
    BaseImponible6             REAL,
    PorcentajeIVA1             REAL,
    PorcentajeIVA2             REAL,
    PorcentajeIVA3             REAL,
    PorcentajeIVA4             REAL,
    PorcentajeIVA5             REAL,
    PorcentajeIVA6             REAL,
    CuotaIVA1                  REAL,
    CuotaIVA2                  REAL,
    CuotaIVA3                  REAL,
    CuotaIVA4                  REAL,
    CuotaIVA5                  REAL,
    CuotaIVA6                  REAL,
    PorcentajeRecargo1         REAL,
    PorcentajeRecargo2         REAL,
    PorcentajeRecargo3         REAL,
    PorcentajeRecargo4         REAL,
    PorcentajeRecargo5         REAL,
    PorcentajeRecargo6         REAL,
    CuotaRecargo1              REAL,
    CuotaRecargo2              REAL,
    CuotaRecargo3              REAL,
    CuotaRecargo4              REAL,
    CuotaRecargo5              REAL,
    CuotaRecargo6              REAL,
    ImporteBases               REAL,
    ImporteCuotas              REAL,
    ImporteTasas               REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    Contabilizado              INTEGER,      /* NUEVO CAMPO */
    FechaHoraCreacion          DATETIME
);

INSERT INTO HCabeceras (
    ID,
    IDTipoDocumento,
    TipoMovimiento,
    Ejercicio,
    IDSerie,
    CodigoSerie,
    Numero,
    Documento,
    FechaHora,
    FechaServicio,
    ClientePotencial, 
    IDClienteProveedor,
    CodigoClienteProveedor,
    IDDireccion,
    Referencia,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono,
    OtrosDatosFiscales,
    IDAlmacen,
    IDRepresentante,
    IDTransportista,
    IDOportunidad,
    IDFormaPago,
    Recibos,
    DiasPrimero,
    DiasResto,
    ImporteBruto,
    DescuentoComercial,
    ImporteDescuentoComercial,
    DescuentoProntoPago,
    ImporteDescuentoProntoPago,
    Retencion,
    ImporteRetencion,
    RegimenIVA,
    IDTipoIVA1,
    IDTipoIVA2,
    IDTipoIVA3,
    IDTipoIVA4,
    IDTipoIVA5,
    IDTipoIVA6,
    BaseImponible1,
    BaseImponible2,
    BaseImponible3,
    BaseImponible4,
    BaseImponible5,
    BaseImponible6,
    PorcentajeIVA1,
    PorcentajeIVA2,
    PorcentajeIVA3,
    PorcentajeIVA4,
    PorcentajeIVA5,
    PorcentajeIVA6,
    CuotaIVA1,
    CuotaIVA2,
    CuotaIVA3,
    CuotaIVA4,
    CuotaIVA5,
    CuotaIVA6,
    PorcentajeRecargo1,
    PorcentajeRecargo2,
    PorcentajeRecargo3,
    PorcentajeRecargo4,
    PorcentajeRecargo5,
    PorcentajeRecargo6,
    CuotaRecargo1,
    CuotaRecargo2,
    CuotaRecargo3,
    CuotaRecargo4,
    CuotaRecargo5,
    CuotaRecargo6,
    ImporteBases,
    ImporteCuotas,
    ImporteTasas,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    FechaHoraCreacion
)
SELECT 
    ID,
    IDTipoDocumento,
    TipoMovimiento,
    Ejercicio,
    IDSerie,
    CodigoSerie,
    Numero,
    Documento,
    FechaHora,
    FechaServicio,
    ClientePotencial,
    IDClienteProveedor,
    CodigoClienteProveedor,
    IDDireccion,
    Referencia,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono,
    OtrosDatosFiscales,
    IDAlmacen,
    IDRepresentante,
    IDTransportista,
    IDOportunidad,
    IDFormaPago,
    Recibos,
    DiasPrimero,
    DiasResto,
    ImporteBruto,
    DescuentoComercial,
    ImporteDescuentoComercial,
    DescuentoProntoPago,
    ImporteDescuentoProntoPago,
    Retencion,
    ImporteRetencion,
    RegimenIVA,
    IDTipoIVA1,
    IDTipoIVA2,
    IDTipoIVA3,
    IDTipoIVA4,
    IDTipoIVA5,
    IDTipoIVA6,
    BaseImponible1,
    BaseImponible2,
    BaseImponible3,
    BaseImponible4,
    BaseImponible5,
    BaseImponible6,
    PorcentajeIVA1,
    PorcentajeIVA2,
    PorcentajeIVA3,
    PorcentajeIVA4,
    PorcentajeIVA5,
    PorcentajeIVA6,
    CuotaIVA1,
    CuotaIVA2,
    CuotaIVA3,
    CuotaIVA4,
    CuotaIVA5,
    CuotaIVA6,
    PorcentajeRecargo1,
    PorcentajeRecargo2,
    PorcentajeRecargo3,
    PorcentajeRecargo4,
    PorcentajeRecargo5,
    PorcentajeRecargo6,
    CuotaRecargo1,
    CuotaRecargo2,
    CuotaRecargo3,
    CuotaRecargo4,
    CuotaRecargo5,
    CuotaRecargo6,
    ImporteBases,
    ImporteCuotas,
    ImporteTasas,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    FechaHoraCreacion
FROM _HCabeceras;

DROP TABLE IF EXISTS _HCabeceras;

CREATE INDEX NDX_HCabeceras_IDTipoDocumento ON HCabeceras (IDTipoDocumento);
CREATE INDEX NDX_HCabeceras_TipoMovimiento ON HCabeceras (TipoMovimiento);
CREATE INDEX NDX_HCabeceras_Ejercicio ON HCabeceras (Ejercicio);
CREATE INDEX NDX_HCabeceras_IDSerie ON HCabeceras (IDSerie);
CREATE INDEX NDX_HCabeceras_CodigoSerie ON HCabeceras (CodigoSerie);
CREATE INDEX NDX_HCabeceras_Numero ON HCabeceras (Numero);
CREATE INDEX NDX_HCabeceras_Documento ON HCabeceras (Documento);
CREATE INDEX NDX_HCabeceras_FechaHora ON HCabeceras (FechaHora);
CREATE INDEX NDX_HCabeceras_ClientePotencial ON HCabeceras (ClientePotencial);
CREATE INDEX NDX_HCabeceras_IDClienteProveedor ON HCabeceras (IDClienteProveedor);
CREATE INDEX NDX_HCabeceras_CodigoClienteProveedor ON HCabeceras (CodigoClienteProveedor);
CREATE INDEX NDX_HCabeceras_IDDireccion ON HCabeceras (IDDireccion);
CREATE INDEX NDX_HCabeceras_Referencia ON HCabeceras (Referencia);
CREATE INDEX NDX_HCabeceras_NIF ON HCabeceras (NIF);
CREATE INDEX NDX_HCabeceras_NombreComercial ON HCabeceras (NombreComercial);
CREATE INDEX NDX_HCabeceras_NombreFiscal ON HCabeceras (NombreFiscal);
CREATE INDEX NDX_HCabeceras_IDAlmacen ON HCabeceras (IDAlmacen);
CREATE INDEX NDX_HCabeceras_IDAlmacenDestino ON HCabeceras (IDAlmacenDestino);
CREATE INDEX NDX_HCabeceras_IDRepresentante ON HCabeceras (IDRepresentante);
CREATE INDEX NDX_HCabeceras_IDTransportista ON HCabeceras (IDTransportista);
CREATE INDEX NDX_HCabeceras_IDOportunidad ON HCabeceras (IDOportunidad);
CREATE INDEX NDX_HCabeceras_IDFormaPago ON HCabeceras (IDFormaPago);
CREATE INDEX NDX_HCabeceras_EstadoEnvio ON HCabeceras (EstadoEnvio);
CREATE INDEX NDX_HCabeceras_EstadoCarga ON HCabeceras (EstadoCarga);
CREATE INDEX NDX_HCabeceras_Emitido ON HCabeceras (Emitido);
CREATE INDEX NDX_HCabeceras_Servido ON HCabeceras (Servido);
CREATE INDEX NDX_HCabeceras_Traspasado ON HCabeceras (Traspasado);
CREATE INDEX NDX_HCabeceras_Abonado ON HCabeceras (Abonado);
CREATE INDEX NDX_HCabeceras_Contabilizado ON HCabeceras (Contabilizado);
CREATE INDEX NDX_HCabeceras_FechaHoraCreacion ON HCabeceras (FechaHoraCreacion);    
CREATE INDEX NDX_HCabeceras_Com_Cliente ON HCabeceras (ClientePotencial, IDClienteProveedor);    
CREATE INDEX NDX_HCabeceras_Com_ClienteDireccion ON HCabeceras (ClientePotencial, IDClienteProveedor, IDDireccion);  


-- --------------------------------------------------------------------------------------------------------------
-- Lineas
-- --------------------------------------------------------------------------------------------------------------
-- + IDAlmacenDestino
-- + ImporteFinal
-- + Medida1
-- + Medida2
-- + Medida3
-- Crear index NDX_Lineas_Com_ConsultaHistorico

DROP TABLE IF EXISTS _Lineas;
CREATE TEMPORARY TABLE _Lineas AS SELECT * FROM Lineas;

DROP TABLE Lineas;

CREATE TABLE Lineas (
    ID                            VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCabecera                    VARCHAR (128),
    IDTipoDocumento               VARCHAR (128),
    Ejercicio                     INTEGER,
    IDSerie                       VARCHAR (128),
    Numero                        INTEGER,
    Linea                         REAL,
    IDAlmacen                     VARCHAR (128),
    IDAlmacenDestino              VARCHAR (128),        /* NUEVO CAMPO */
    IDProducto                    VARCHAR (128),
    CodigoProducto                VARCHAR (20),
    IDAgrupacion                  VARCHAR (128),
    FactorConversion              REAL,
    IDValorPropiedad1             VARCHAR (128),
    IDValorPropiedad2             VARCHAR (128),
    IDValorPropiedad3             VARCHAR (128),
    Titulo                        VARCHAR (55),
    NumeroEnvases                 REAL,
    NumeroEnvasesServidos         REAL,
    NumeroEnvasesAbonados         REAL,
    UnidadesEnvase                REAL,
    Unidades                      REAL,
    UnidadesSinCargo              REAL,
    UnidadesServidas              REAL,
    UnidadesAbonadas              REAL,
    UnidadesBase                  REAL,
    CalcularImporteXPeso          INTEGER,
    PesoUnitario                  REAL,
    Peso                          REAL,
    PesoServido                   REAL,
    PesoAbonado                   REAL,
    Precio                        REAL,
    Descuento1                    REAL,
    AplicarDescuento1EnEuros      INTEGER,
    ImporteDescuento1             REAL,
    Descuento2                    REAL,
    AplicarDescuento2EnEuros      INTEGER,
    ImporteDescuento2             REAL,
    Descuento3                    REAL,
    AplicarDescuento3EnEuros      INTEGER,
    ImporteDescuento3             REAL,
    OrigenPrecio                  INTEGER,
    IDTasa                        VARCHAR (128),
    Tasa                          REAL,
    AplicarTasaEnPorcentaje       INTEGER,
    ImporteTasa                   REAL,
    ImporteBruto                  REAL,
    ImporteNeto                   REAL,
    ImporteFinal                  REAL,                 /* NUEVO CAMPO */             
    Comision                      REAL,
    AplicarComisionEnEuros        INTEGER,
    ImporteComision               REAL,
    PrecioCoste                   REAL,
    IDTipoIVA                     VARCHAR (128),
    PorcentajeIVA                 REAL,
    PorcentajeRecargo             REAL,
    ClientePotencial              INTEGER,
    IDClienteProveedor            VARCHAR (128),
    IDDireccion                   VARCHAR (128),
    FechaHora                     DATETIME,
    Descripcion                   TEXT,
    TipoLinea                     VARCHAR (1),
    IDTipoAbono                   VARCHAR (128),
    ActualizarStock               INTEGER,
    HoraInicio                    TIME,
    HoraFinal                     TIME,
    Medida1                       REAL,                 /* NUEVO CAMPO */   
    Medida2                       REAL,                 /* NUEVO CAMPO */   
    Medida3                       REAL,                 /* NUEVO CAMPO */   
    TipoCalculoUnidades           INTEGER,
    IDTarifa                      VARCHAR (128),
    ReferenciaPrecioEspecial      VARCHAR (20),
    IDLineaPrecioEspecial         VARCHAR (128),
    IDOrigenPrecioEspecial        VARCHAR (128),
    TieneEscandallo               INTEGER,
    IDOrigenEscandallo            VARCHAR (128),
    IDCabeceraOrigen              VARCHAR (128),
    IDLineaOrigen                 VARCHAR (128),
    Bonificacion                  REAL,
    BonificacionSobreBruto        INTEGER,
    ImporteBonificacion           REAL,
    IDOrigenBonificacion          VARCHAR (128),
    ImporteBaseDescuentoAdicional REAL,
    DescuentoAdicional1           REAL,
    ImporteDescuentoAdicional1    REAL,
    DescuentoAdicional2           REAL,
    ImporteDescuentoAdicional2    REAL,
    DescuentoAdicional3           REAL,
    ImporteDescuentoAdicional3    REAL,
    IDOrigenDescuentoAdicional    VARCHAR (128) 
);

INSERT INTO Lineas (
    ID,
    IDCabecera,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Linea,
    IDAlmacen,
    IDProducto,
    CodigoProducto,
    IDAgrupacion,
    FactorConversion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Titulo,
    NumeroEnvases,
    NumeroEnvasesServidos,
    NumeroEnvasesAbonados,
    UnidadesEnvase,
    Unidades,
    UnidadesSinCargo,
    UnidadesServidas,
    UnidadesAbonadas,
    UnidadesBase,
    CalcularImporteXPeso,
    PesoUnitario,
    Peso,
    PesoServido,
    PesoAbonado,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    ImporteDescuento1,
    Descuento2,
    AplicarDescuento2EnEuros,
    ImporteDescuento2,
    Descuento3,
    AplicarDescuento3EnEuros,
    ImporteDescuento3,
    OrigenPrecio,
    IDTasa,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    TipoCalculoUnidades,
    IDTarifa,
    ReferenciaPrecioEspecial,
    IDLineaPrecioEspecial,
    IDOrigenPrecioEspecial,
    TieneEscandallo,
    IDOrigenEscandallo,
    IDCabeceraOrigen,
    IDLineaOrigen,
    Bonificacion,
    BonificacionSobreBruto,
    ImporteBonificacion,
    IDOrigenBonificacion,
    ImporteBaseDescuentoAdicional,
    DescuentoAdicional1,
    ImporteDescuentoAdicional1,
    DescuentoAdicional2,
    ImporteDescuentoAdicional2,
    DescuentoAdicional3,
    ImporteDescuentoAdicional3,
    IDOrigenDescuentoAdicional
) SELECT 
    ID,
    IDCabecera,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Linea,
    IDAlmacen,
    IDProducto,
    CodigoProducto,
    IDAgrupacion,
    FactorConversion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Titulo,
    NumeroEnvases,
    NumeroEnvasesServidos,
    NumeroEnvasesAbonados,
    UnidadesEnvase,
    Unidades,
    UnidadesSinCargo,
    UnidadesServidas,
    UnidadesAbonadas,
    UnidadesBase,
    CalcularImporteXPeso,
    PesoUnitario,
    Peso,
    PesoServido,
    PesoAbonado,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    ImporteDescuento1,
    Descuento2,
    AplicarDescuento2EnEuros,
    ImporteDescuento2,
    Descuento3,
    AplicarDescuento3EnEuros,
    ImporteDescuento3,
    OrigenPrecio,
    IDTasa,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    TipoCalculoUnidades,
    IDTarifa,
    ReferenciaPrecioEspecial,
    IDLineaPrecioEspecial,
    IDOrigenPrecioEspecial,
    TieneEscandallo,
    IDOrigenEscandallo,
    IDCabeceraOrigen,
    IDLineaOrigen,
    Bonificacion,
    BonificacionSobreBruto,
    ImporteBonificacion,
    IDOrigenBonificacion,
    ImporteBaseDescuentoAdicional,
    DescuentoAdicional1,
    ImporteDescuentoAdicional1,
    DescuentoAdicional2,
    ImporteDescuentoAdicional2,
    DescuentoAdicional3,
    ImporteDescuentoAdicional3,
    IDOrigenDescuentoAdicional
FROM _Lineas;

DROP TABLE IF EXISTS _Lineas;

CREATE INDEX NDX_Lineas_IDCabecera ON Lineas (IDCabecera);
CREATE INDEX NDX_Lineas_IDTipoDocumento ON Lineas (IDTipoDocumento);
CREATE INDEX NDX_Lineas_Ejercicio ON Lineas (Ejercicio);
CREATE INDEX NDX_Lineas_IDSerie ON Lineas (IDSerie);
CREATE INDEX NDX_Lineas_Numero ON Lineas (Numero);
CREATE INDEX NDX_Lineas_Linea ON Lineas (Linea);
CREATE INDEX NDX_Lineas_IDAlmacen ON Lineas (IDAlmacen);
CREATE INDEX NDX_Lineas_IDAlmacenDestino ON Lineas (IDAlmacenDestino);
CREATE INDEX NDX_Lineas_IDProducto ON Lineas (IDProducto);
CREATE INDEX NDX_Lineas_CodigoProducto ON Lineas (CodigoProducto);
CREATE INDEX NDX_Lineas_IDAgrupacion ON Lineas (IDAgrupacion);
CREATE INDEX NDX_Lineas_IDValorPropiedad1 ON Lineas (IDValorPropiedad1);
CREATE INDEX NDX_Lineas_IDValorPropiedad2 ON Lineas (IDValorPropiedad2);
CREATE INDEX NDX_Lineas_IDValorPropiedad3 ON Lineas (IDValorPropiedad3);
CREATE INDEX NDX_Lineas_Titulo ON Lineas (Titulo);
CREATE INDEX NDX_Lineas_PorcentajeIVA ON Lineas (PorcentajeIVA);
CREATE INDEX NDX_Lineas_ClientePotencial ON Lineas (ClientePotencial);
CREATE INDEX NDX_Lineas_IDClienteProveedor ON Lineas (IDClienteProveedor);
CREATE INDEX NDX_Lineas_IDDireccion ON Lineas (IDDireccion);
CREATE INDEX NDX_Lineas_FechaHora ON Lineas (FechaHora);
CREATE INDEX NDX_Lineas_ActualizarStock ON Lineas (ActualizarStock);
CREATE INDEX NDX_Lineas_IDOrigenPrecioEspecial ON Lineas (IDOrigenPrecioEspecial);
CREATE INDEX NDX_Lineas_IDOrigenEscandallo ON Lineas (IDOrigenEscandallo);
CREATE INDEX NDX_Lineas_IDCabeceraOrigen ON Lineas (IDCabeceraOrigen);
CREATE INDEX NDX_Lineas_IDLineaOrigen ON Lineas (IDLineaOrigen);
CREATE INDEX NDX_Lineas_IDOrigenBonificacion ON Lineas (IDOrigenBonificacion);
CREATE INDEX NDX_Lineas_IDOrigenDescuentoAdicional ON Lineas (IDOrigenDescuentoAdicional);
CREATE INDEX NDX_Lineas_Com_Cliente ON Lineas (ClientePotencial, IDClienteProveedor);
CREATE INDEX NDX_Lineas_Com_CabeceraLinea ON Lineas (ID, IDCabecera);
CREATE INDEX NDX_Lineas_Com_CabeceraLineaOrigen ON Lineas (IDCabeceraOrigen, IDLineaOrigen);
CREATE INDEX NDX_Lineas_Com_ConsultaHistorico ON Lineas (IDClienteProveedor, IDProducto, IDAgrupacion, IDValorPropiedad1, IDValorPropiedad2, IDValorPropiedad3);


-- --------------------------------------------------------------------------------------------------------------
-- HLineas
-- --------------------------------------------------------------------------------------------------------------
-- + IDAlmacenDestino
-- + ImporteFinal
-- + Medida1
-- + Medida2
-- + Medida3
-- Crear index NDX_Lineas_Com_ConsultaHistorico

DROP TABLE IF EXISTS _HLineas;
CREATE TEMPORARY TABLE _HLineas AS SELECT * FROM HLineas;

DROP TABLE HLineas;

CREATE TABLE HLineas (
    ID                            VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCabecera                    VARCHAR (128),
    IDTipoDocumento               VARCHAR (128),
    Ejercicio                     INTEGER,
    IDSerie                       VARCHAR (128),
    Numero                        INTEGER,
    Linea                         REAL,
    IDAlmacen                     VARCHAR (128),
    IDAlmacenDestino              VARCHAR (128),        /* NUEVO CAMPO */
    IDProducto                    VARCHAR (128),
    CodigoProducto                VARCHAR (20),
    IDAgrupacion                  VARCHAR (128),
    FactorConversion              REAL,
    IDValorPropiedad1             VARCHAR (128),
    IDValorPropiedad2             VARCHAR (128),
    IDValorPropiedad3             VARCHAR (128),
    Titulo                        VARCHAR (55),
    NumeroEnvases                 REAL,
    NumeroEnvasesServidos         REAL,
    NumeroEnvasesAbonados         REAL,
    UnidadesEnvase                REAL,
    Unidades                      REAL,
    UnidadesSinCargo              REAL,
    UnidadesServidas              REAL,
    UnidadesAbonadas              REAL,
    UnidadesBase                  REAL,
    CalcularImporteXPeso          INTEGER,
    PesoUnitario                  REAL,
    Peso                          REAL,
    PesoServido                   REAL,
    PesoAbonado                   REAL,
    Precio                        REAL,
    Descuento1                    REAL,
    AplicarDescuento1EnEuros      INTEGER,
    ImporteDescuento1             REAL,
    Descuento2                    REAL,
    AplicarDescuento2EnEuros      INTEGER,
    ImporteDescuento2             REAL,
    Descuento3                    REAL,
    AplicarDescuento3EnEuros      INTEGER,
    ImporteDescuento3             REAL,
    OrigenPrecio                  INTEGER,
    IDTasa                        VARCHAR (128),
    Tasa                          REAL,
    AplicarTasaEnPorcentaje       INTEGER,
    ImporteTasa                   REAL,
    ImporteBruto                  REAL,
    ImporteNeto                   REAL,
    ImporteFinal                  REAL,                 /* NUEVO CAMPO */             
    Comision                      REAL,
    AplicarComisionEnEuros        INTEGER,
    ImporteComision               REAL,
    PrecioCoste                   REAL,
    IDTipoIVA                     VARCHAR (128),
    PorcentajeIVA                 REAL,
    PorcentajeRecargo             REAL,
    ClientePotencial              INTEGER,
    IDClienteProveedor            VARCHAR (128),
    IDDireccion                   VARCHAR (128),
    FechaHora                     DATETIME,
    Descripcion                   TEXT,
    TipoLinea                     VARCHAR (1),
    IDTipoAbono                   VARCHAR (128),
    ActualizarStock               INTEGER,
    HoraInicio                    TIME,
    HoraFinal                     TIME,
    Medida1                       REAL,                 /* NUEVO CAMPO */   
    Medida2                       REAL,                 /* NUEVO CAMPO */   
    Medida3                       REAL,                 /* NUEVO CAMPO */   
    TipoCalculoUnidades           INTEGER,
    IDTarifa                      VARCHAR (128),
    ReferenciaPrecioEspecial      VARCHAR (20),
    IDLineaPrecioEspecial         VARCHAR (128),
    IDOrigenPrecioEspecial        VARCHAR (128),
    TieneEscandallo               INTEGER,
    IDOrigenEscandallo            VARCHAR (128),
    IDCabeceraOrigen              VARCHAR (128),
    IDLineaOrigen                 VARCHAR (128),
    Bonificacion                  REAL,
    BonificacionSobreBruto        INTEGER,
    ImporteBonificacion           REAL,
    IDOrigenBonificacion          VARCHAR (128),
    ImporteBaseDescuentoAdicional REAL,
    DescuentoAdicional1           REAL,
    ImporteDescuentoAdicional1    REAL,
    DescuentoAdicional2           REAL,
    ImporteDescuentoAdicional2    REAL,
    DescuentoAdicional3           REAL,
    ImporteDescuentoAdicional3    REAL,
    IDOrigenDescuentoAdicional    VARCHAR (128) 
);

INSERT INTO HLineas (
    ID,
    IDCabecera,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Linea,
    IDAlmacen,
    IDProducto,
    CodigoProducto,
    IDAgrupacion,
    FactorConversion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Titulo,
    NumeroEnvases,
    NumeroEnvasesServidos,
    NumeroEnvasesAbonados,
    UnidadesEnvase,
    Unidades,
    UnidadesSinCargo,
    UnidadesServidas,
    UnidadesAbonadas,
    UnidadesBase,
    CalcularImporteXPeso,
    PesoUnitario,
    Peso,
    PesoServido,
    PesoAbonado,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    ImporteDescuento1,
    Descuento2,
    AplicarDescuento2EnEuros,
    ImporteDescuento2,
    Descuento3,
    AplicarDescuento3EnEuros,
    ImporteDescuento3,
    OrigenPrecio,
    IDTasa,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    TipoCalculoUnidades,
    IDTarifa,
    ReferenciaPrecioEspecial,
    IDLineaPrecioEspecial,
    IDOrigenPrecioEspecial,
    TieneEscandallo,
    IDOrigenEscandallo,
    IDCabeceraOrigen,
    IDLineaOrigen,
    Bonificacion,
    BonificacionSobreBruto,
    ImporteBonificacion,
    IDOrigenBonificacion,
    ImporteBaseDescuentoAdicional,
    DescuentoAdicional1,
    ImporteDescuentoAdicional1,
    DescuentoAdicional2,
    ImporteDescuentoAdicional2,
    DescuentoAdicional3,
    ImporteDescuentoAdicional3,
    IDOrigenDescuentoAdicional
) SELECT 
    ID,
    IDCabecera,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Linea,
    IDAlmacen,
    IDProducto,
    CodigoProducto,
    IDAgrupacion,
    FactorConversion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Titulo,
    NumeroEnvases,
    NumeroEnvasesServidos,
    NumeroEnvasesAbonados,
    UnidadesEnvase,
    Unidades,
    UnidadesSinCargo,
    UnidadesServidas,
    UnidadesAbonadas,
    UnidadesBase,
    CalcularImporteXPeso,
    PesoUnitario,
    Peso,
    PesoServido,
    PesoAbonado,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    ImporteDescuento1,
    Descuento2,
    AplicarDescuento2EnEuros,
    ImporteDescuento2,
    Descuento3,
    AplicarDescuento3EnEuros,
    ImporteDescuento3,
    OrigenPrecio,
    IDTasa,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    TipoCalculoUnidades,
    IDTarifa,
    ReferenciaPrecioEspecial,
    IDLineaPrecioEspecial,
    IDOrigenPrecioEspecial,
    TieneEscandallo,
    IDOrigenEscandallo,
    IDCabeceraOrigen,
    IDLineaOrigen,
    Bonificacion,
    BonificacionSobreBruto,
    ImporteBonificacion,
    IDOrigenBonificacion,
    ImporteBaseDescuentoAdicional,
    DescuentoAdicional1,
    ImporteDescuentoAdicional1,
    DescuentoAdicional2,
    ImporteDescuentoAdicional2,
    DescuentoAdicional3,
    ImporteDescuentoAdicional3,
    IDOrigenDescuentoAdicional
FROM _HLineas;

DROP TABLE IF EXISTS _HLineas;

CREATE INDEX NDX_HLineas_IDCabecera ON HLineas (IDCabecera);
CREATE INDEX NDX_HLineas_IDTipoDocumento ON HLineas (IDTipoDocumento);
CREATE INDEX NDX_HLineas_Ejercicio ON HLineas (Ejercicio);
CREATE INDEX NDX_HLineas_IDSerie ON HLineas (IDSerie);
CREATE INDEX NDX_HLineas_Numero ON HLineas (Numero);
CREATE INDEX NDX_HLineas_Linea ON HLineas (Linea);
CREATE INDEX NDX_HLineas_IDAlmacen ON HLineas (IDAlmacen);
CREATE INDEX NDX_HLineas_IDAlmacenDestino ON HLineas (IDAlmacenDestino);
CREATE INDEX NDX_HLineas_IDProducto ON HLineas (IDProducto);
CREATE INDEX NDX_HLineas_CodigoProducto ON HLineas (CodigoProducto);
CREATE INDEX NDX_HLineas_IDAgrupacion ON HLineas (IDAgrupacion);
CREATE INDEX NDX_HLineas_IDValorPropiedad1 ON HLineas (IDValorPropiedad1);
CREATE INDEX NDX_HLineas_IDValorPropiedad2 ON HLineas (IDValorPropiedad2);
CREATE INDEX NDX_HLineas_IDValorPropiedad3 ON HLineas (IDValorPropiedad3);
CREATE INDEX NDX_HLineas_Titulo ON HLineas (Titulo);
CREATE INDEX NDX_HLineas_PorcentajeIVA ON HLineas (PorcentajeIVA);
CREATE INDEX NDX_HLineas_ClientePotencial ON HLineas (ClientePotencial);
CREATE INDEX NDX_HLineas_IDClienteProveedor ON HLineas (IDClienteProveedor);
CREATE INDEX NDX_HLineas_IDDireccion ON HLineas (IDDireccion);
CREATE INDEX NDX_HLineas_FechaHora ON HLineas (FechaHora);
CREATE INDEX NDX_HLineas_ActualizarStock ON HLineas (ActualizarStock);
CREATE INDEX NDX_HLineas_IDOrigenPrecioEspecial ON HLineas (IDOrigenPrecioEspecial);
CREATE INDEX NDX_HLineas_IDOrigenEscandallo ON HLineas (IDOrigenEscandallo);
CREATE INDEX NDX_HLineas_IDCabeceraOrigen ON HLineas (IDCabeceraOrigen);
CREATE INDEX NDX_HLineas_IDLineaOrigen ON HLineas (IDLineaOrigen);
CREATE INDEX NDX_HLineas_IDOrigenBonificacion ON HLineas (IDOrigenBonificacion);
CREATE INDEX NDX_HLineas_IDOrigenDescuentoAdicional ON HLineas (IDOrigenDescuentoAdicional);
CREATE INDEX NDX_HLineas_Com_Cliente ON HLineas (ClientePotencial, IDClienteProveedor);
CREATE INDEX NDX_HLineas_Com_CabeceraLinea ON HLineas (ID, IDCabecera);
CREATE INDEX NDX_HLineas_Com_CabeceraLineaOrigen ON HLineas (IDCabeceraOrigen, IDLineaOrigen);
CREATE INDEX NDX_HLineas_Com_ConsultaHistorico ON HLineas (IDClienteProveedor, IDProducto, IDAgrupacion, IDValorPropiedad1, IDValorPropiedad2, IDValorPropiedad3);


-- --------------------------------------------------------------------------------------------------------------
-- LineasTmp
-- --------------------------------------------------------------------------------------------------------------
-- + IDAlmacenDestino
-- + ImporteFinal
-- + Medida1
-- + Medida2
-- + Medida3
-- Crear index NDX_Lineas_Com_ConsultaHistorico

DROP TABLE IF EXISTS _LineasTmp;
CREATE TEMPORARY TABLE _LineasTmp AS SELECT * FROM LineasTmp;

DROP TABLE LineasTmp;

CREATE TABLE LineasTmp (
    ID                            VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCabecera                    VARCHAR (128),
    IDTipoDocumento               VARCHAR (128),
    Ejercicio                     INTEGER,
    IDSerie                       VARCHAR (128),
    Numero                        INTEGER,
    Linea                         REAL,
    IDAlmacen                     VARCHAR (128),
    IDAlmacenDestino              VARCHAR (128),        /* NUEVO CAMPO */
    IDProducto                    VARCHAR (128),
    CodigoProducto                VARCHAR (20),
    IDAgrupacion                  VARCHAR (128),
    FactorConversion              REAL,
    IDValorPropiedad1             VARCHAR (128),
    IDValorPropiedad2             VARCHAR (128),
    IDValorPropiedad3             VARCHAR (128),
    Titulo                        VARCHAR (55),
    NumeroEnvases                 REAL,
    NumeroEnvasesServidos         REAL,
    NumeroEnvasesAbonados         REAL,
    UnidadesEnvase                REAL,
    Unidades                      REAL,
    UnidadesSinCargo              REAL,
    UnidadesServidas              REAL,
    UnidadesAbonadas              REAL,
    UnidadesBase                  REAL,
    CalcularImporteXPeso          INTEGER,
    PesoUnitario                  REAL,
    Peso                          REAL,
    PesoServido                   REAL,
    PesoAbonado                   REAL,
    Precio                        REAL,
    Descuento1                    REAL,
    AplicarDescuento1EnEuros      INTEGER,
    ImporteDescuento1             REAL,
    Descuento2                    REAL,
    AplicarDescuento2EnEuros      INTEGER,
    ImporteDescuento2             REAL,
    Descuento3                    REAL,
    AplicarDescuento3EnEuros      INTEGER,
    ImporteDescuento3             REAL,
    OrigenPrecio                  INTEGER,
    IDTasa                        VARCHAR (128),
    Tasa                          REAL,
    AplicarTasaEnPorcentaje       INTEGER,
    ImporteTasa                   REAL,
    ImporteBruto                  REAL,
    ImporteNeto                   REAL,
    ImporteFinal                  REAL,                 /* NUEVO CAMPO */             
    Comision                      REAL,
    AplicarComisionEnEuros        INTEGER,
    ImporteComision               REAL,
    PrecioCoste                   REAL,
    IDTipoIVA                     VARCHAR (128),
    PorcentajeIVA                 REAL,
    PorcentajeRecargo             REAL,
    ClientePotencial              INTEGER,
    IDClienteProveedor            VARCHAR (128),
    IDDireccion                   VARCHAR (128),
    FechaHora                     DATETIME,
    Descripcion                   TEXT,
    TipoLinea                     VARCHAR (1),
    IDTipoAbono                   VARCHAR (128),
    ActualizarStock               INTEGER,
    HoraInicio                    TIME,
    HoraFinal                     TIME,
    Medida1                       REAL,                 /* NUEVO CAMPO */   
    Medida2                       REAL,                 /* NUEVO CAMPO */   
    Medida3                       REAL,                 /* NUEVO CAMPO */   
    TipoCalculoUnidades           INTEGER,
    IDTarifa                      VARCHAR (128),
    ReferenciaPrecioEspecial      VARCHAR (20),
    IDLineaPrecioEspecial         VARCHAR (128),
    IDOrigenPrecioEspecial        VARCHAR (128),
    TieneEscandallo               INTEGER,
    IDOrigenEscandallo            VARCHAR (128),
    IDCabeceraOrigen              VARCHAR (128),
    IDLineaOrigen                 VARCHAR (128),
    Bonificacion                  REAL,
    BonificacionSobreBruto        INTEGER,
    ImporteBonificacion           REAL,
    IDOrigenBonificacion          VARCHAR (128),
    ImporteBaseDescuentoAdicional REAL,
    DescuentoAdicional1           REAL,
    ImporteDescuentoAdicional1    REAL,
    DescuentoAdicional2           REAL,
    ImporteDescuentoAdicional2    REAL,
    DescuentoAdicional3           REAL,
    ImporteDescuentoAdicional3    REAL,
    IDOrigenDescuentoAdicional    VARCHAR (128) 
);

INSERT INTO LineasTmp (
    ID,
    IDCabecera,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Linea,
    IDAlmacen,
    IDProducto,
    CodigoProducto,
    IDAgrupacion,
    FactorConversion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Titulo,
    NumeroEnvases,
    NumeroEnvasesServidos,
    NumeroEnvasesAbonados,
    UnidadesEnvase,
    Unidades,
    UnidadesSinCargo,
    UnidadesServidas,
    UnidadesAbonadas,
    UnidadesBase,
    CalcularImporteXPeso,
    PesoUnitario,
    Peso,
    PesoServido,
    PesoAbonado,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    ImporteDescuento1,
    Descuento2,
    AplicarDescuento2EnEuros,
    ImporteDescuento2,
    Descuento3,
    AplicarDescuento3EnEuros,
    ImporteDescuento3,
    OrigenPrecio,
    IDTasa,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    TipoCalculoUnidades,
    IDTarifa,
    ReferenciaPrecioEspecial,
    IDLineaPrecioEspecial,
    IDOrigenPrecioEspecial,
    TieneEscandallo,
    IDOrigenEscandallo,
    IDCabeceraOrigen,
    IDLineaOrigen,
    Bonificacion,
    BonificacionSobreBruto,
    ImporteBonificacion,
    IDOrigenBonificacion,
    ImporteBaseDescuentoAdicional,
    DescuentoAdicional1,
    ImporteDescuentoAdicional1,
    DescuentoAdicional2,
    ImporteDescuentoAdicional2,
    DescuentoAdicional3,
    ImporteDescuentoAdicional3,
    IDOrigenDescuentoAdicional
) SELECT 
    ID,
    IDCabecera,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Linea,
    IDAlmacen,
    IDProducto,
    CodigoProducto,
    IDAgrupacion,
    FactorConversion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Titulo,
    NumeroEnvases,
    NumeroEnvasesServidos,
    NumeroEnvasesAbonados,
    UnidadesEnvase,
    Unidades,
    UnidadesSinCargo,
    UnidadesServidas,
    UnidadesAbonadas,
    UnidadesBase,
    CalcularImporteXPeso,
    PesoUnitario,
    Peso,
    PesoServido,
    PesoAbonado,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    ImporteDescuento1,
    Descuento2,
    AplicarDescuento2EnEuros,
    ImporteDescuento2,
    Descuento3,
    AplicarDescuento3EnEuros,
    ImporteDescuento3,
    OrigenPrecio,
    IDTasa,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    TipoCalculoUnidades,
    IDTarifa,
    ReferenciaPrecioEspecial,
    IDLineaPrecioEspecial,
    IDOrigenPrecioEspecial,
    TieneEscandallo,
    IDOrigenEscandallo,
    IDCabeceraOrigen,
    IDLineaOrigen,
    Bonificacion,
    BonificacionSobreBruto,
    ImporteBonificacion,
    IDOrigenBonificacion,
    ImporteBaseDescuentoAdicional,
    DescuentoAdicional1,
    ImporteDescuentoAdicional1,
    DescuentoAdicional2,
    ImporteDescuentoAdicional2,
    DescuentoAdicional3,
    ImporteDescuentoAdicional3,
    IDOrigenDescuentoAdicional
FROM _LineasTmp;

DROP TABLE IF EXISTS _LineasTmp;

CREATE INDEX NDX_LineasTmp_IDCabecera ON LineasTmp (IDCabecera);
CREATE INDEX NDX_LineasTmp_IDTipoDocumento ON LineasTmp (IDTipoDocumento);
CREATE INDEX NDX_LineasTmp_Ejercicio ON LineasTmp (Ejercicio);
CREATE INDEX NDX_LineasTmp_IDSerie ON LineasTmp (IDSerie);
CREATE INDEX NDX_LineasTmp_Numero ON LineasTmp (Numero);
CREATE INDEX NDX_LineasTmp_Linea ON LineasTmp (Linea);
CREATE INDEX NDX_LineasTmp_IDAlmacen ON LineasTmp (IDAlmacen);
CREATE INDEX NDX_LineasTmp_IDAlmacenDestino ON LineasTmp (IDAlmacenDestino);
CREATE INDEX NDX_LineasTmp_IDProducto ON LineasTmp (IDProducto);
CREATE INDEX NDX_LineasTmp_CodigoProducto ON LineasTmp (CodigoProducto);
CREATE INDEX NDX_LineasTmp_IDAgrupacion ON LineasTmp (IDAgrupacion);
CREATE INDEX NDX_LineasTmp_IDValorPropiedad1 ON LineasTmp (IDValorPropiedad1);
CREATE INDEX NDX_LineasTmp_IDValorPropiedad2 ON LineasTmp (IDValorPropiedad2);
CREATE INDEX NDX_LineasTmp_IDValorPropiedad3 ON LineasTmp (IDValorPropiedad3);
CREATE INDEX NDX_LineasTmp_Titulo ON LineasTmp (Titulo);
CREATE INDEX NDX_LineasTmp_PorcentajeIVA ON LineasTmp (PorcentajeIVA);
CREATE INDEX NDX_LineasTmp_ClientePotencial ON LineasTmp (ClientePotencial);
CREATE INDEX NDX_LineasTmp_IDClienteProveedor ON LineasTmp (IDClienteProveedor);
CREATE INDEX NDX_LineasTmp_IDDireccion ON LineasTmp (IDDireccion);
CREATE INDEX NDX_LineasTmp_FechaHora ON LineasTmp (FechaHora);
CREATE INDEX NDX_LineasTmp_ActualizarStock ON LineasTmp (ActualizarStock);
CREATE INDEX NDX_LineasTmp_IDOrigenPrecioEspecial ON LineasTmp (IDOrigenPrecioEspecial);
CREATE INDEX NDX_LineasTmp_IDOrigenEscandallo ON LineasTmp (IDOrigenEscandallo);
CREATE INDEX NDX_LineasTmp_IDCabeceraOrigen ON LineasTmp (IDCabeceraOrigen);
CREATE INDEX NDX_LineasTmp_IDLineaOrigen ON LineasTmp (IDLineaOrigen);
CREATE INDEX NDX_LineasTmp_IDOrigenBonificacion ON LineasTmp (IDOrigenBonificacion);
CREATE INDEX NDX_LineasTmp_IDOrigenDescuentoAdicional ON LineasTmp (IDOrigenDescuentoAdicional);
CREATE INDEX NDX_LineasTmp_Com_Cliente ON LineasTmp (ClientePotencial, IDClienteProveedor);
CREATE INDEX NDX_LineasTmp_Com_CabeceraLinea ON LineasTmp (ID, IDCabecera);
CREATE INDEX NDX_LineasTmp_Com_CabeceraLineaOrigen ON LineasTmp (IDCabeceraOrigen, IDLineaOrigen);
CREATE INDEX NDX_LineasTmp_Com_ConsultaHistorico ON LineasTmp (IDClienteProveedor, IDProducto, IDAgrupacion, IDValorPropiedad1, IDValorPropiedad2, IDValorPropiedad3);


-- --------------------------------------------------------------------------------------------------------------
-- Productos
-- --------------------------------------------------------------------------------------------------------------
-- - Referencia
-- - PedirHoraInicioFinal
-- + PedirPeso -> ActivarEdicionPeso
-- + Medida1
-- + ActivarEdicionMedida1
-- + Medida2
-- + ActivarEdicionMedida2
-- + Medida3
-- + ActivarEdicionMedida3

DROP TABLE IF EXISTS _Productos;
CREATE TEMPORARY TABLE _Productos AS SELECT * FROM Productos;

DROP TABLE Productos;

CREATE TABLE Productos (
    ID                          VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoProducto              VARCHAR (20)  UNIQUE,
    Titulo                      VARCHAR (55),
    UnidadMedida                VARCHAR (10),
    PedirEnvases                INTEGER,
    UnidadMedidaEnvase          VARCHAR (10),
    UnidadesEnvase              REAL,
    DesvincularCalculoEnvases   INTEGER,
    NoFraccionarEnvases         INTEGER,
    PesoUnitario                REAL,
    CalcularImporteXPeso        INTEGER,
    ActivarEdicionPeso          INTEGER,                /* NUEVO CAMPO */ 
    UnidadMedidaPeso            VARCHAR (10),
    Medida1                     REAL,                   /* NUEVO CAMPO */  
    ActivarEdicionMedida1       INTEGER,                /* NUEVO CAMPO */  
    Medida2                     REAL,                   /* NUEVO CAMPO */  
    ActivarEdicionMedida2       INTEGER,                /* NUEVO CAMPO */  
    Medida3                     REAL,                   /* NUEVO CAMPO */  
    ActivarEdicionMedida3       INTEGER,                /* NUEVO CAMPO */  
    TipoCalculoUnidades         INTEGER,
    IDFamilia                   VARCHAR (128),
    IDSubfamilia                VARCHAR (128),
    IDMarca                     VARCHAR (128),
    IDGrupoProducto             VARCHAR (128),
    IDTipoIVA                   VARCHAR (128),
    TextoAgrupacionVentas       VARCHAR (20),
    IDProveedorHabitual         VARCHAR (128),
    Descripcion                 TEXT,
    DescripcionWeb              TEXT,
    OtrosDatos                  TEXT,
    AvisoCompras                TEXT,
    AvisoVentas                 TEXT,
    EsEnvase                    INTEGER,
    ControlStock                INTEGER,
    UnidadesVentaMinimo         REAL,
    IDAgrupacionBase            VARCHAR (128),
    IDAgrupacionVentas          VARCHAR (128),
    IDAgrupacionCompras         VARCHAR (128),
    IDPropiedad1                VARCHAR (128),
    IDPropiedad2                VARCHAR (128),
    IDPropiedad3                VARCHAR (128),
    CodigoEquivalencia          VARCHAR (20),
    MostrarEnVistaPrincipal     INTEGER,
    GestionarTasas              INTEGER,
    IDTasa                      VARCHAR (128),
    Tasa                        REAL,
    GestionarTrazabilidad       INTEGER,
    TieneEscandallo             INTEGER,
    DesglosarEscandalloEnVentas INTEGER,
    PreciosEscandalloEnVentas   INTEGER,
    NoVender                    INTEGER,
    NoComprar                   INTEGER,  
    OrdenCatalogo               VARCHAR (20),
    ProductoDestacado           INTEGER
);

INSERT INTO Productos (
    ID,
    CodigoProducto,
    Titulo,
    UnidadMedida,
    PedirEnvases,
    UnidadMedidaEnvase,
    UnidadesEnvase,
    DesvincularCalculoEnvases,
    NoFraccionarEnvases,
    PesoUnitario,
    CalcularImporteXPeso,
    ActivarEdicionPeso,
    UnidadMedidaPeso,
    TipoCalculoUnidades,
    IDFamilia,
    IDSubfamilia,
    IDMarca,
    IDGrupoProducto,
    IDTipoIVA,
    TextoAgrupacionVentas,
    IDProveedorHabitual,
    Descripcion,
    DescripcionWeb,
    OtrosDatos,
    AvisoCompras,
    AvisoVentas,
    EsEnvase,
    ControlStock,
    UnidadesVentaMinimo,
    IDAgrupacionBase,
    IDAgrupacionVentas,
    IDAgrupacionCompras,
    IDPropiedad1,
    IDPropiedad2,
    IDPropiedad3,
    CodigoEquivalencia,
    MostrarEnVistaPrincipal,
    GestionarTasas,
    IDTasa,
    Tasa,
    GestionarTrazabilidad,
    TieneEscandallo,
    DesglosarEscandalloEnVentas,
    PreciosEscandalloEnVentas,
    NoVender,
    NoComprar,
    OrdenCatalogo,
    ProductoDestacado
)
SELECT 
    ID,
    CodigoProducto,
    Titulo,
    UnidadMedida,
    PedirEnvases,
    UnidadMedidaEnvase,
    UnidadesEnvase,
    DesvincularCalculoEnvases,
    NoFraccionarEnvases,
    PesoUnitario,
    CalcularImporteXPeso,
    PedirPeso,
    UnidadMedidaPeso,
    TipoCalculoUnidades,
    IDFamilia,
    IDSubfamilia,
    IDMarca,
    IDGrupoProducto,
    IDTipoIVA,
    TextoAgrupacionVentas,
    IDProveedorHabitual,
    Descripcion,
    DescripcionWeb,
    OtrosDatos,
    AvisoCompras,
    AvisoVentas,
    EsEnvase,
    ControlStock,
    UnidadesVentaMinimo,
    IDAgrupacionBase,
    IDAgrupacionVentas,
    IDAgrupacionCompras,
    IDPropiedad1,
    IDPropiedad2,
    IDPropiedad3,
    CodigoEquivalencia,
    MostrarEnVistaPrincipal,
    GestionarTasas,
    IDTasa,
    Tasa,
    GestionarTrazabilidad,
    TieneEscandallo,
    DesglosarEscandalloEnVentas,
    PreciosEscandalloEnVentas,
    NoVender,
    NoComprar,
    OrdenCatalogo,
    ProductoDestacado
FROM _Productos;

DROP TABLE IF EXISTS _Productos;

CREATE INDEX NDX_Productos_Titulo ON Productos (Titulo);
CREATE INDEX NDX_Productos_IDFamilia ON Productos (IDFamilia);
CREATE INDEX NDX_Productos_IDSubfamilia ON Productos (IDSubfamilia);
CREATE INDEX NDX_Productos_IDMarca ON Productos (IDMarca);
CREATE INDEX NDX_Productos_IDGrupoProducto ON Productos (IDGrupoProducto);
CREATE INDEX NDX_Productos_IDTipoIVA ON Productos (IDTipoIVA);
CREATE INDEX NDX_Productos_IDProveedorHabitual ON Productos (IDProveedorHabitual);
CREATE INDEX NDX_Productos_ControlStock ON Productos (ControlStock);
CREATE INDEX NDX_Productos_IDAgrupacionBase ON Productos (IDAgrupacionBase);
CREATE INDEX NDX_Productos_IDAgrupacionCompras ON Productos (IDAgrupacionCompras);
CREATE INDEX NDX_Productos_IDAgrupacionVentas ON Productos (IDAgrupacionVentas);
CREATE INDEX NDX_Productos_IDPropiedad1 ON Productos (IDPropiedad1);
CREATE INDEX NDX_Productos_IDPropiedad2 ON Productos (IDPropiedad2);
CREATE INDEX NDX_Productos_IDPropiedad3 ON Productos (IDPropiedad3);
CREATE INDEX NDX_Productos_CodigoEquivalencia ON Productos (CodigoEquivalencia);
CREATE INDEX NDX_Productos_MostrarEnVistaPrincipal ON Productos (MostrarEnVistaPrincipal);
CREATE INDEX NDX_Productos_IDTasa ON Productos (IDTasa);
CREATE INDEX NDX_Productos_NoVender ON Productos (NoVender);
CREATE INDEX NDX_Productos_NoComprar ON Productos (NoComprar);
CREATE INDEX NDX_Productos_OrdenCatalogo ON Productos (OrdenCatalogo);
CREATE INDEX NDX_Productos_ProductoDestacado ON Productos (ProductoDestacado);


-- --------------------------------------------------------------------------------------------------------------
-- TiposDocumento
-- --------------------------------------------------------------------------------------------------------------
-- - Trazabilidad
-- + Contabilizar
-- + Servir
-- + ActualizarTarifasCompra

DROP TABLE IF EXISTS _TiposDocumento;
CREATE TEMPORARY TABLE _TiposDocumento AS SELECT * FROM TiposDocumento;

DROP TABLE TiposDocumento;

CREATE TABLE TiposDocumento (
    ID                                               VARCHAR (128) PRIMARY KEY UNIQUE,
    Icono                                            VARCHAR (50),
    TipoMovimiento                                   INTEGER,
    DescripcionSingular                              VARCHAR (40),
    DescripcionPlural                                VARCHAR (40),
    GenerarCobros                                    INTEGER,
    ActualizarStock                                  INTEGER,
    ActivarTasas                                     INTEGER,
    ActivarControlRiesgoCliente                      INTEGER,
    ActivarParaConsultasHistoricos                   INTEGER,
    IDAlmacen                                        VARCHAR (128),
    IDSerie                                          VARCHAR (128),
    IDFormaPago                                      VARCHAR (128),
    IDTipoAbono                                      VARCHAR (128),
    BloquearAnyadirDocumento                         INTEGER,
    BloquearDuplicarDocumento                        INTEGER,
    BloquearModificacionDocumentoGuardado            INTEGER,
    BloquearModificacionDocumentoEmitido             INTEGER,
    BloquearEliminarDocumento                        INTEGER,
    PermitirClientesPotenciales                      INTEGER,
    Contabilizar                                     INTEGER,
    Servir                                           INTEGER,
    ActualizarTarifasCompra                          INTEGER,
    NoCalcularImportes                               INTEGER,
    FirmaObligatoria                                 INTEGER,
    TraspasarA                                       VARCHAR (128),
    EmailAsunto                                      VARCHAR (100),
    EmailCuerpo                                      TEXT,
    Emp_DiasAntiguedadBorrarDocumentosAlRecibirDatos INTEGER,
    Orden                                            INTEGER
);

INSERT INTO TiposDocumento (
    ID,
    Icono,
    TipoMovimiento,
    DescripcionSingular,
    DescripcionPlural,
    GenerarCobros,
    ActualizarStock,
    ActivarTasas,
    ActivarControlRiesgoCliente,
    ActivarParaConsultasHistoricos,
    IDAlmacen,
    IDSerie,
    IDFormaPago,
    IDTipoAbono,
    BloquearAnyadirDocumento,
    BloquearDuplicarDocumento,
    BloquearModificacionDocumentoGuardado,
    BloquearModificacionDocumentoEmitido,
    BloquearEliminarDocumento,
    PermitirClientesPotenciales,
    NoCalcularImportes,
    FirmaObligatoria,
    TraspasarA,
    EmailAsunto,
    EmailCuerpo,
    Emp_DiasAntiguedadBorrarDocumentosAlRecibirDatos,
    Orden
)
SELECT 
    ID,
    Icono,
    TipoMovimiento,
    DescripcionSingular,
    DescripcionPlural,
    GenerarCobros,
    ActualizarStock,
    ActivarTasas,
    ActivarControlRiesgoCliente,
    ActivarParaConsultasHistoricos,
    IDAlmacen,
    IDSerie,
    IDFormaPago,
    IDTipoAbono,
    BloquearAnyadirDocumento,
    BloquearDuplicarDocumento,
    BloquearModificacionDocumentoGuardado,
    BloquearModificacionDocumentoEmitido,
    BloquearEliminarDocumento,
    PermitirClientesPotenciales,
    NoCalcularImportes,
    FirmaObligatoria,
    TraspasarA,
    EmailAsunto,
    EmailCuerpo,
    Emp_DiasAntiguedadBorrarDocumentosAlRecibirDatos,
    Orden
FROM _TiposDocumento;

DROP TABLE IF EXISTS _TiposDocumento;

CREATE INDEX NDX_TiposDocumento_TipoMovimiento ON TiposDocumento (TipoMovimiento);
CREATE INDEX NDX_TiposDocumento_DescripcionSingular ON TiposDocumento (DescripcionSingular);
CREATE INDEX NDX_TiposDocumento_DescripcionPlural ON TiposDocumento (DescripcionPlural);
CREATE INDEX NDX_TiposDocumento_Orden ON TiposDocumento (Orden);


-- --------------------------------------------------------------------------------------------------------------
-- Familias
-- --------------------------------------------------------------------------------------------------------------
-- + CuentaVentas
-- + CuentaVentasAbonos
-- + CuentaCompras
-- + CuentaComprasAbonos

ALTER TABLE Familias ADD COLUMN CuentaVentas VARCHAR(10);
ALTER TABLE Familias ADD COLUMN CuentaVentasAbonos VARCHAR(10);
ALTER TABLE Familias ADD COLUMN CuentaCompras VARCHAR(10);
ALTER TABLE Familias ADD COLUMN CuentaComprasAbonos VARCHAR(10);


-- --------------------------------------------------------------------------------------------------------------
-- ProductosPreciosCompra
-- --------------------------------------------------------------------------------------------------------------
-- - MargenVenta
-- + Referencia
-- + AplicarDescuento1EnEuros
-- + AplicarDescuento2EnEuros
-- + Descuento3
-- + AplicarDescuento3EnEuros

DROP TABLE IF EXISTS _ProductosPreciosCompra;
CREATE TEMPORARY TABLE _ProductosPreciosCompra AS SELECT * FROM ProductosPreciosCompra;

DROP TABLE ProductosPreciosCompra;

CREATE TABLE ProductosPreciosCompra (
    ID                          VARCHAR (128) PRIMARY KEY UNIQUE,
    IDProducto                  VARCHAR (128),
    IDProveedor                 VARCHAR (128),
    Referencia                  VARCHAR (20),
    IDAgrupacion                VARCHAR (128),
    IDValorPropiedad1           VARCHAR (128),
    IDValorPropiedad2           VARCHAR (128),
    IDValorPropiedad3           VARCHAR (128),
    PrecioCompra                REAL,
    Descuento1Compra            REAL,
    AplicarDescuento1EnEuros    INTEGER,
    Descuento2Compra            REAL,
    AplicarDescuento2EnEuros    INTEGER,
    Descuento3Compra            REAL,
    AplicarDescuento3EnEuros    INTEGER,
    GastosCompra                REAL,
    CosteManual                 REAL
);

INSERT INTO ProductosPreciosCompra (
    ID,
    IDProducto,
    IDProveedor,
    IDAgrupacion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    PrecioCompra,
    Descuento1Compra,
    Descuento2Compra,
    GastosCompra,
    CosteManual
)
SELECT 
    ID,
    IDProducto,
    IDProveedor,
    IDAgrupacion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    PrecioCompra,
    Descuento1Compra,
    Descuento2Compra,
    GastosCompra,
    CosteManual
FROM _ProductosPreciosCompra;

DROP TABLE IF EXISTS _ProductosPreciosCompra;

CREATE INDEX NDX_ProductosPreciosCompra_IDProducto ON ProductosPreciosCompra (IDProducto);
CREATE INDEX NDX_ProductosPreciosCompra_IDProveedor ON ProductosPreciosCompra (IDProveedor);
CREATE UNIQUE INDEX NDX_ProductosPreciosCompra_UNIQUE ON ProductosPreciosCompra (IDProducto, IDProveedor, IDAgrupacion, IDValorPropiedad1, IDValorPropiedad2, IDValorPropiedad3);


-- --------------------------------------------------------------------------------------------------------------
-- Tarifas
-- --------------------------------------------------------------------------------------------------------------
-- - RecalculoAutomatico
-- - PrecioBase
-- - Margen
-- + TipoCalculo
-- + ModoCalculo
-- + TipoMargen
-- + Margen
-- + Decimales

DROP TABLE IF EXISTS _Tarifas;
CREATE TEMPORARY TABLE _Tarifas AS SELECT * FROM Tarifas;

DROP TABLE Tarifas;

CREATE TABLE Tarifas (
    ID           VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoTarifa VARCHAR (10) UNIQUE,
    Descripcion  VARCHAR (30),
    TipoCalculo  INTEGER,
    ModoCalculo  INTEGER,
    TipoMargen   INTEGER,
    Margen       REAL,
    Decimales    INTEGER
);

INSERT INTO Tarifas (
    ID,
    CodigoTarifa,
    Descripcion
)
SELECT 
    ID,
    CodigoTarifa,
    Descripcion
FROM _Tarifas;

DROP TABLE IF EXISTS _Tarifas;

CREATE INDEX NDX_Tarifas_CodigoTarifa ON Tarifas (CodigoTarifa);
CREATE INDEX NDX_Tarifas_Descripcion ON Tarifas (Descripcion);


-- --------------------------------------------------------------------------------------------------------------
-- Oportunidades
-- --------------------------------------------------------------------------------------------------------------
-- Cambiar IDContacto -> Contacto (Como en visitas) 

DROP TABLE IF EXISTS _Oportunidades;
CREATE TEMPORARY TABLE _Oportunidades AS SELECT * FROM Oportunidades;

DROP TABLE Oportunidades;

CREATE TABLE Oportunidades (
    ID                        VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoOportunidad         VARCHAR (10)  UNIQUE,
    Nombre                    VARCHAR (40),
    ClientePotencial          INTEGER,
    IDCliente                 VARCHAR (128),
    IDFaseOportunidad         VARCHAR (128),
    FechaHoraInicio           DATETIME,
    FechaFinalizacionPrevista DATE,
    FechaFinalizacion         DATE,
    Contacto                  VARCHAR (50),
    TipoOportunidad           INTEGER,
    EstadoOportunidad         INTEGER,
    Observaciones             TEXT,
    EstadoEnvio               INTEGER
);

INSERT INTO Oportunidades (
    ID,
    CodigoOportunidad,
    Nombre,
    ClientePotencial,
    IDCliente,
    IDFaseOportunidad,
    FechaHoraInicio,
    FechaFinalizacionPrevista,
    FechaFinalizacion,
    Contacto,
    TipoOportunidad,
    EstadoOportunidad,
    Observaciones,
    EstadoEnvio
)
SELECT 
    ID,
    CodigoOportunidad,
    Nombre,
    ClientePotencial,
    IDCliente,
    IDFaseOportunidad,
    FechaHoraInicio,
    FechaFinalizacionPrevista,
    FechaFinalizacion,
    IDContacto,
    TipoOportunidad,
    EstadoOportunidad,
    Observaciones,
    EstadoEnvio
FROM _Oportunidades;

DROP TABLE IF EXISTS _Oportunidades;

CREATE INDEX NDX_Oportunidades_Nombre ON Oportunidades (Nombre);
CREATE INDEX NDX_Oportunidades_ClientePotencial ON Oportunidades (ClientePotencial);
CREATE INDEX NDX_Oportunidades_IDCliente ON Oportunidades (IDCliente);
CREATE INDEX NDX_Oportunidades_IDFaseOportunidad ON Oportunidades (IDFaseOportunidad);
CREATE INDEX NDX_Oportunidades_FechaHoraInicio ON Oportunidades (FechaHoraInicio);
CREATE INDEX NDX_Oportunidades_TipoOportunidad ON Oportunidades (TipoOportunidad);
CREATE INDEX NDX_Oportunidades_EstadoOportunidad ON Oportunidades (EstadoOportunidad);
CREATE INDEX NDX_Oportunidades_EstadoEnvio ON Oportunidades (EstadoEnvio);
CREATE INDEX NDX_Oportunidades_Com_Cliente ON Oportunidades (ClientePotencial, IDCliente);


-- --------------------------------------------------------------------------------------------------------------
-- Logs
-- --------------------------------------------------------------------------------------------------------------

CREATE TABLE Logs (
    ID              VARCHAR (128) PRIMARY KEY UNIQUE,
    FechaHora       VARCHAR (128),
    IDProceso       VARCHAR (128),
    Tipo            VARCHAR (1),
    TipoRegistro    VARCHAR (30),
    IDRegistroPadre VARCHAR (128),
    IDRegistro      VARCHAR (128),
    IDUsuario       VARCHAR (128) 
);

CREATE INDEX NDX_Logs_FechaHora ON Logs (FechaHora);
CREATE INDEX NDX_Logs_IDProceso ON Logs (IDProceso);
CREATE INDEX NDX_Logs_Tipo ON Logs (Tipo);
CREATE INDEX NDX_Logs_TipoRegistro ON Logs (TipoRegistro);
CREATE INDEX NDX_Logs_IDRegistroPadre ON Logs (IDRegistroPadre);
CREATE INDEX NDX_Logs_IDRegistro ON Logs (IDRegistro);
CREATE INDEX NDX_Logs_IDUsuario ON Logs (IDUsuario);
CREATE INDEX NDX_Logs_Com_Registro ON Logs (TipoRegistro, IDRegistro);


-- --------------------------------------------------------------------------------------------------------------
-- LogsLineas
-- --------------------------------------------------------------------------------------------------------------

CREATE TABLE LogsLineas (
    ID            VARCHAR (128) PRIMARY KEY UNIQUE,
    IDLog         VARCHAR (128),
    Campo         VARCHAR (50),
    ValorAnterior TEXT,
    Valor         TEXT
);

CREATE INDEX NDX_LogsLineas_IDLog ON LogsLineas (IDLog);
CREATE INDEX NDX_LogsLineas_Campo ON LogsLineas (Campo);


-- --------------------------------------------------------------------------------------------------------------
-- TraspasosAlmacenes
-- --------------------------------------------------------------------------------------------------------------
-- Eliminar tabla, ahora se utiliza la tabla de Cabeceras

DROP TABLE IF EXISTS TraspasosAlmacenes;


-- --------------------------------------------------------------------------------------------------------------
-- TraspasosAlmacenesLineas
-- --------------------------------------------------------------------------------------------------------------
-- Eliminar tabla, ahora se utiliza la tabla de Lineas

DROP TABLE IF EXISTS TraspasosAlmacenesLineas;


-- --------------------------------------------------------------------------------------------------------------
-- vStocks
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS vStocks;
CREATE VIEW vStocks AS
SELECT 
    StocksMovimientos.ID,
    StocksMovimientos.IDAlmacen,
    StocksMovimientos.IDProducto,
    StocksMovimientos.IDValorPropiedad1,
    StocksMovimientos.IDValorPropiedad2,
    StocksMovimientos.IDValorPropiedad3,
    StocksMovimientos.Lote,
    StocksMovimientos.FechaCaducidad,
    SUM(StocksMovimientos.Unidades) AS Stock,
    SUM(StocksMovimientos.Peso) AS Peso
FROM 
    StocksMovimientos
LEFT JOIN 
	Lineas ON StocksMovimientos.Tipo = 'DOC' 
	AND Lineas.IDCabecera = StocksMovimientos.IDRegistroPadre 
	AND Lineas.ID = StocksMovimientos.IDRegistro
LEFT JOIN 
    (SELECT IDAlmacen, FechaHora FROM vCargasInicialesCerradas GROUP BY IDAlmacen) AS Cargas 
    ON StocksMovimientos.IDAlmacen = Cargas.IDAlmacen
LEFT JOIN 
    (SELECT IDAlmacen, IDProducto, MAX(FechaHora) AS MaxFechaHora FROM ConsolidacionesInventario GROUP BY IDAlmacen, IDProducto) AS Consolidaciones 
    ON StocksMovimientos.IDAlmacen = Consolidaciones.IDAlmacen 
    AND StocksMovimientos.IDProducto = Consolidaciones.IDProducto
WHERE 
	/* Control carga inicial cerrada */
    (StocksMovimientos.FechaHora >= Cargas.FechaHora OR Cargas.FechaHora IS NULL)
	/* Consolidación producto */
	AND (StocksMovimientos.FechaHora >= Consolidaciones.MaxFechaHora OR Consolidaciones.MaxFechaHora IS NULL)
	/* Taspaso de documentos, filtrar líneas que tiene que actualizar el stock */
    AND 
    (
		StocksMovimientos.Tipo <> 'DOC' 
		OR (Lineas.IDCabeceraOrigen = '' OR Lineas.IDCabeceraOrigen IS NULL) 
		OR (Lineas.IDCabeceraOrigen IS NOT NULL AND Lineas.IDCabeceraOrigen <> '' AND IFNULL((SELECT ActualizarStock FROM Lineas AS L WHERE L.IDCabecera = Lineas.IDCabeceraOrigen AND L.ID = Lineas.IDLineaOrigen), 0) = 0)
    )
GROUP BY
    StocksMovimientos.IDAlmacen,
    StocksMovimientos.IDProducto,
    StocksMovimientos.IDValorPropiedad1,
    StocksMovimientos.IDValorPropiedad2,
    StocksMovimientos.IDValorPropiedad3,
    StocksMovimientos.Lote;
	

-- --------------------------------------------------------------------------------------------------------------
-- vMovimientosStock
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS vMovimientosStock;
CREATE VIEW `vMovimientosStock` AS
SELECT 
    StocksMovimientos.ID,
    StocksMovimientos.FechaHora,
    StocksMovimientos.Tipo,
    CASE StocksMovimientos.Tipo 
		WHEN 'DOC' THEN 
			CASE Cabeceras.TipoMovimiento 
				WHEN 0 THEN (SELECT DescripcionSingular FROM TiposDocumento WHERE ID = Cabeceras.IDTipoDocumento) || ' (@Ventas)'
				WHEN 1 THEN (SELECT DescripcionSingular FROM TiposDocumento WHERE ID = Cabeceras.IDTipoDocumento) || ' (@Compras)'
                ELSE (SELECT DescripcionSingular FROM TiposDocumento WHERE ID = Cabeceras.IDTipoDocumento)
			END
		WHEN 'CON' THEN '@Consolidacion'
		ELSE NULL
	END AS DescripcionTipo,
    CASE StocksMovimientos.Tipo 
		WHEN 'DOC' THEN Cabeceras.Documento
		ELSE NULL
	END AS Documento,
    StocksMovimientos.IDAlmacen,
    Almacenes.CodigoAlmacen,
	Almacenes.Nombre AS NombreAlmacen,
    StocksMovimientos.IDProducto,
    Productos.CodigoProducto,
    Productos.Titulo,
    StocksMovimientos.IDValorPropiedad1,
    CASE WHEN StocksMovimientos.IDValorPropiedad1 <> '' THEN
		(SELECT Descripcion FROM PropiedadesValores WHERE ID = StocksMovimientos.IDValorPropiedad1)
		ELSE ''
	END AS DescripcionValorPropiedad1,
    StocksMovimientos.IDValorPropiedad2,
    CASE WHEN StocksMovimientos.IDValorPropiedad2 <> '' THEN
		(SELECT Descripcion FROM PropiedadesValores WHERE ID = StocksMovimientos.IDValorPropiedad2)
		ELSE ''
	END AS DescripcionValorPropiedad2,
    StocksMovimientos.IDValorPropiedad3,
    CASE WHEN StocksMovimientos.IDValorPropiedad3 <> '' THEN
		(SELECT Descripcion FROM PropiedadesValores WHERE ID = StocksMovimientos.IDValorPropiedad3)
		ELSE ''
	END AS DescripcionValorPropiedad3,
    StocksMovimientos.Lote,
    StocksMovimientos.FechaCaducidad,
    StocksMovimientos.Unidades,
    StocksMovimientos.Peso    
FROM 
    StocksMovimientos
INNER JOIN Almacenes ON
	Almacenes.ID = StocksMovimientos.IDAlmacen
INNER JOIN Productos ON
	Productos.ID = StocksMovimientos.IDProducto
LEFT JOIN 
	Cabeceras ON StocksMovimientos.Tipo = 'DOC' 
	AND Cabeceras.ID = StocksMovimientos.IDRegistroPadre 
LEFT JOIN 
	Lineas ON StocksMovimientos.Tipo = 'DOC' 
	AND Lineas.IDCabecera = StocksMovimientos.IDRegistroPadre 
	AND Lineas.ID = StocksMovimientos.IDRegistro
LEFT JOIN 
    (SELECT IDAlmacen, IDProducto, MAX(FechaHora) AS MaxFechaHora FROM ConsolidacionesInventario GROUP BY IDAlmacen, IDProducto) AS Consolidaciones 
    ON StocksMovimientos.IDAlmacen = Consolidaciones.IDAlmacen 
    AND StocksMovimientos.IDProducto = Consolidaciones.IDProducto
WHERE 
	/* Consolidación producto */
	(StocksMovimientos.FechaHora >= Consolidaciones.MaxFechaHora OR Consolidaciones.MaxFechaHora IS NULL)
	/* Taspaso de documentos, filtrar líneas que tiene que actualizar el stock */
    AND 
    (
		StocksMovimientos.Tipo <> 'DOC' 
		OR (Lineas.IDCabeceraOrigen = '' OR Lineas.IDCabeceraOrigen IS NULL) 
		OR (Lineas.IDCabeceraOrigen IS NOT NULL AND Lineas.IDCabeceraOrigen <> '' AND IFNULL((SELECT ActualizarStock FROM Lineas AS L WHERE L.IDCabecera = Lineas.IDCabeceraOrigen AND L.ID = Lineas.IDLineaOrigen), 0) = 0)
    );


-- --------------------------------------------------------------------------------------------------------------
-- vActividadClientes
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS vActividadClientes;
CREATE VIEW `vActividadClientes` AS
SELECT 
    '@Visita' AS Tipo,
    'Visitas$' || Visitas.ID AS ID,
    Visitas.ClientePotencial,
    Visitas.IDCliente AS IDCliente,
    Clientes.CodigoCliente AS CodigoCliente,
    Clientes.NombreComercial AS NombreComercial,
    Visitas.FechaHoraInicio AS FechaHora,
    Visitas.Observaciones AS Descripcion,
    0 as Importe
FROM Visitas 
INNER JOIN Clientes ON Visitas.IDCliente = Clientes.ID
WHERE Visitas.ClientePotencial IS NULL OR Visitas.ClientePotencial = 0
UNION
SELECT 
    '@Visita' AS Tipo,
    'Visitas$' || Visitas.ID AS ID,
    Visitas.ClientePotencial,
    Visitas.IDCliente AS IDCliente,
    ClientesPotenciales.CodigoClientePotencial AS CodigoCliente,
    ClientesPotenciales.NombreComercial AS NombreComercial,
    Visitas.FechaHoraInicio AS FechaHora,
    Visitas.Observaciones AS Descripcion,
    0 as Importe
FROM Visitas 
INNER JOIN ClientesPotenciales ON Visitas.IDCliente = ClientesPotenciales.ID
WHERE Visitas.ClientePotencial = 1
UNION
SELECT 
    '@Cobro' AS Tipo,
    'CobrosLineas$' || CobrosLineas.ID AS ID,
    0 AS ClientePotencial,
    Cobros.IDCliente AS IDCliente,
    Clientes.CodigoCliente AS CodigoCliente,
    Clientes.NombreComercial AS NombreComercial,
    CobrosLineas.FechaHora AS FechaHora,
    CobrosLineas.Concepto AS Descripcion,
    CobrosLineas.ImporteCobrado AS Importe
FROM CobrosLineas 
INNER JOIN Cobros ON CobrosLineas.IDCobro = Cobros.ID
INNER JOIN Clientes ON Cobros.IDCliente = Clientes.ID 
UNION
SELECT 
    TiposDocumento.DescripcionSingular AS Tipo,
    'CabecerasVentas$' || Cabeceras.ID AS ID,
    Cabeceras.ClientePotencial,
    Cabeceras.IDClienteProveedor AS IDCliente,
    Cabeceras.CodigoClienteProveedor AS CodigoCliente,
    Cabeceras.NombreComercial AS NombreComercial,
    Cabeceras.FechaHora AS FechaHora,
    Cabeceras.Documento AS Descripcion,
    Cabeceras.ImporteTotal AS Importe
FROM Cabeceras 
INNER JOIN TiposDocumento ON Cabeceras.IDTipoDocumento = TiposDocumento.ID
WHERE 
    TiposDocumento.TipoMovimiento = 0 /* 0 -> Ventas */
UNION
SELECT 
    TiposDocumento.DescripcionSingular AS Tipo,
    'CabecerasDepositos$' || Cabeceras.ID AS ID,
    Cabeceras.ClientePotencial,
    Cabeceras.IDClienteProveedor AS IDCliente,
    Cabeceras.CodigoClienteProveedor AS CodigoCliente,
    Cabeceras.NombreComercial AS NombreComercial,
    Cabeceras.FechaHora AS FechaHora,
    Cabeceras.Documento AS Descripcion,
    Cabeceras.ImporteTotal AS Importe
FROM Cabeceras 
INNER JOIN TiposDocumento ON Cabeceras.IDTipoDocumento = TiposDocumento.ID
WHERE 
    TiposDocumento.TipoMovimiento = 5 /* 5 -> Depositos */
UNION
SELECT 
    TiposDocumento.DescripcionSingular AS Tipo,
    'CabecerasAbonos$' || Cabeceras.ID AS ID,
    Cabeceras.ClientePotencial,
    Cabeceras.IDClienteProveedor AS IDCliente,
    Cabeceras.CodigoClienteProveedor AS CodigoCliente,
    Cabeceras.NombreComercial AS NombreComercial,
    Cabeceras.FechaHora AS FechaHora,
    Cabeceras.Documento AS Descripcion,
    Cabeceras.ImporteTotal AS Importe
FROM Cabeceras 
INNER JOIN TiposDocumento ON Cabeceras.IDTipoDocumento = TiposDocumento.ID
WHERE 
    TiposDocumento.TipoMovimiento = 6; /* 6 -> Abonos */



-- --------------------------------------------------------------------------------------------------------------
-- vActividadProveedores
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS vActividadProveedores;
CREATE VIEW `vActividadProveedores` AS
SELECT 
    '@Pago' AS Tipo,
    'PagosLineas$' || PagosLineas.ID AS ID,
    Pagos.IDProveedor AS IDProveedor,
    Proveedores.CodigoProveedor,
    Proveedores.NombreComercial,
    PagosLineas.FechaHora AS FechaHora,
    PagosLineas.Concepto AS Descripcion,
    PagosLineas.ImportePagado AS Importe
FROM PagosLineas 
INNER JOIN Pagos ON PagosLineas.IDPago = Pagos.ID
INNER JOIN Proveedores ON Pagos.IDProveedor = Proveedores.ID
UNION
SELECT 
    TiposDocumento.DescripcionSingular AS Tipo,
    'CabecerasCompras$' || Cabeceras.ID AS ID,
    Cabeceras.IDClienteProveedor AS IDProveedor,
    Cabeceras.CodigoClienteProveedor AS CodigoProveedor,
    Cabeceras.NombreComercial AS NombreComercial,
    Cabeceras.FechaHora AS FechaHora,
    Cabeceras.Documento AS Descripcion,
    Cabeceras.ImporteTotal AS Importe
FROM Cabeceras 
INNER JOIN TiposDocumento ON Cabeceras.IDTipoDocumento = TiposDocumento.ID 
WHERE TiposDocumento.TipoMovimiento = 1 /* 1 -> Compras */
UNION
SELECT 
    TiposDocumento.DescripcionSingular AS Tipo,
    'CabecerasAbonosCompras$' || Cabeceras.ID AS ID,
    Cabeceras.IDClienteProveedor AS IDProveedor,
    Cabeceras.CodigoClienteProveedor AS CodigoProveedor,
    Cabeceras.NombreComercial AS NombreComercial,
    Cabeceras.FechaHora AS FechaHora,
    Cabeceras.Documento AS Descripcion,
    Cabeceras.ImporteTotal AS Importe
FROM Cabeceras 
INNER JOIN TiposDocumento ON Cabeceras.IDTipoDocumento = TiposDocumento.ID
WHERE 
    TiposDocumento.TipoMovimiento = 7; /* 7 -> Abonos Compras */



-- --------------------------------------------------------------------------------------------------------------
-- vOportunidades
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS vOportunidades;
CREATE VIEW `vOportunidades` AS
	SELECT 
		Oportunidades.*,
		Clientes.CodigoCliente,
		Clientes.NombreComercial,
		Clientes.NombreFiscal
	FROM Oportunidades 
	INNER JOIN Clientes ON Oportunidades.IDCliente = Clientes.ID 
	WHERE Oportunidades.ClientePotencial IS NULL OR Oportunidades.ClientePotencial = 0
	UNION 
	SELECT 
		Oportunidades.*,
		ClientesPotenciales.CodigoClientePotencial AS CodigoCliente,
		ClientesPotenciales.NombreComercial,
		ClientesPotenciales.NombreFiscal
	FROM Oportunidades 
	INNER JOIN ClientesPotenciales ON Oportunidades.IDCliente = ClientesPotenciales.ID 
	WHERE Oportunidades.ClientePotencial = 1;