
-- --------------------------------------------------------------------------------------------------------------
-- Clientes
-- --------------------------------------------------------------------------------------------------------------
-- Skype -> MicrosoftTeams
-- FechaAlta -> FechaHoraAlta

DROP TABLE IF EXISTS _Clientes;
CREATE TEMPORARY TABLE _Clientes AS SELECT * FROM Clientes;

DROP TABLE Clientes;

CREATE TABLE Clientes (
    ID                                                       VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoCliente                                            VARCHAR (15)  UNIQUE,
    NIF                                                      VARCHAR (15),
    NombreComercial                                          VARCHAR (60),
    NombreFiscal                                             VARCHAR (60),
    Domicilio                                                VARCHAR (60),
    CodigoPostal                                             VARCHAR (10),
    Poblacion                                                VARCHAR (30),
    Provincia                                                VARCHAR (30),
    Pais                                                     VARCHAR (2),
    Telefono1                                                VARCHAR (16),
    Telefono2                                                VARCHAR (16),
    Movil                                                    VARCHAR (16),
    WhatsApp                                                 VARCHAR (16),
    Email                                                    VARCHAR (100),
    MicrosoftTeams                                           VARCHAR (100),
    WEB                                                      VARCHAR (40),
    IDRepresentante                                          VARCHAR (128),
    IDTransportista                                          VARCHAR (128),
    IDGrupoCliente                                           VARCHAR (128),
    IDActividad                                              VARCHAR (128),
    DescuentoComercial                                       REAL,
    DescuentoProntoPago                                      REAL,
    IDFormaPago                                              VARCHAR (128),
    DiaPago1                                                 INTEGER,
    DiaPago2                                                 INTEGER,
    VacacionesDesde                                          VARCHAR (5),
    VacacionesHasta                                          VARCHAR (5),
    DiasProrroga                                             INTEGER,
    Morosidad                                                VARCHAR (1),
    Retencion                                                REAL,
    RegimenIVA                                               INTEGER,
    AlbaranSinValorar                                        INTEGER,
    Observaciones                                            TEXT,
    MotivoBaja                                               VARCHAR (30),
    OtrosDatos                                               TEXT,
    OtrosDatosFiscales                                       TEXT,
    AvisoVentas                                              TEXT,
    RiesgoConcedido                                          REAL,
    RiesgoAlcanzado                                          REAL,
    RiesgoNumeroRecibos                                      INTEGER,
    RiesgoDiasAntiguedadDeuda                                INTEGER,
    IDTarifa                                                 VARCHAR (128),
    Latitud                                                  REAL,
    Longitud                                                 REAL,
    DescuentoPorLinea1                                       REAL,
    DescuentoPorLinea2                                       REAL,
    DescuentoPorLinea3                                       REAL,
    IDSerie                                                  VARCHAR (128),
    IDTipoDocumento                                          VARCHAR (128),
    DesactivarAplicacionAutomaticaPreciosEspecialesGenericos INTEGER,
    IDAuxiliarPrecioEspecialCliente                          VARCHAR (10),
    OmitirPrecioEspecialTipo                                 VARCHAR (10),
    CuentaContable                                           VARCHAR (12),
    EstadoAutorizacion                                       INTEGER,
    FechaAutorizacion                                        DATE,
    EstadoEnvio                                              INTEGER,
    FechaHoraAlta                                            DATETIME
);

INSERT INTO Clientes (
    ID,
    CodigoCliente,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    MicrosoftTeams,
    WEB,
    IDRepresentante,
    IDTransportista,
    IDGrupoCliente,
    IDActividad,
    DescuentoComercial,
    DescuentoProntoPago,
    IDFormaPago,
    DiaPago1,
    DiaPago2,
    VacacionesDesde,
    VacacionesHasta,
    DiasProrroga,
    Morosidad,
    Retencion,
    RegimenIVA,
    AlbaranSinValorar,
    Observaciones,
    MotivoBaja,
    OtrosDatos,
    OtrosDatosFiscales,
    AvisoVentas,
    RiesgoConcedido,
    RiesgoAlcanzado,
    RiesgoNumeroRecibos,
    RiesgoDiasAntiguedadDeuda,
    IDTarifa,
    Latitud,
    Longitud,
    DescuentoPorLinea1,
    DescuentoPorLinea2,
    DescuentoPorLinea3,
    IDSerie,
    IDTipoDocumento,
    DesactivarAplicacionAutomaticaPreciosEspecialesGenericos,
    IDAuxiliarPrecioEspecialCliente,
    OmitirPrecioEspecialTipo,
    CuentaContable,
    EstadoAutorizacion,
    FechaAutorizacion,
    EstadoEnvio,
    FechaHoraAlta
)
SELECT 
    ID,
    CodigoCliente,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    Skype,
    WEB,
    IDRepresentante,
    IDTransportista,
    IDGrupoCliente,
    IDActividad,
    DescuentoComercial,
    DescuentoProntoPago,
    IDFormaPago,
    DiaPago1,
    DiaPago2,
    VacacionesDesde,
    VacacionesHasta,
    DiasProrroga,
    Morosidad,
    Retencion,
    RegimenIVA,
    AlbaranSinValorar,
    Observaciones,
    MotivoBaja,
    OtrosDatos,
    OtrosDatosFiscales,
    AvisoVentas,
    RiesgoConcedido,
    RiesgoAlcanzado,
    RiesgoNumeroRecibos,
    RiesgoDiasAntiguedadDeuda,
    IDTarifa,
    Latitud,
    Longitud,
    DescuentoPorLinea1,
    DescuentoPorLinea2,
    DescuentoPorLinea3,
    IDSerie,
    IDTipoDocumento,
    DesactivarAplicacionAutomaticaPreciosEspecialesGenericos,
    IDAuxiliarPrecioEspecialCliente,
    OmitirPrecioEspecialTipo,
    CuentaContable,
    EstadoAutorizacion,
    FechaAutorizacion,
    EstadoEnvio,
    FechaAlta
FROM _Clientes;

DROP TABLE _Clientes;

CREATE INDEX NDX_Clientes_NIF ON Clientes (NIF);
CREATE INDEX NDX_Clientes_NombreComercial ON Clientes (NombreComercial);
CREATE INDEX NDX_Clientes_NombreFiscal ON Clientes (NombreFiscal);
CREATE INDEX NDX_Clientes_CodigoPostal ON Clientes (CodigoPostal);
CREATE INDEX NDX_Clientes_Domicilio ON Clientes (Domicilio);
CREATE INDEX NDX_Clientes_Telefono1 ON Clientes (Telefono1);
CREATE INDEX NDX_Clientes_Telefono2 ON Clientes (Telefono2);
CREATE INDEX NDX_Clientes_Movil ON Clientes (Movil);
CREATE INDEX NDX_Clientes_IDRepresentante ON Clientes (IDRepresentante);
CREATE INDEX NDX_Clientes_IDTransportista ON Clientes (IDTransportista);
CREATE INDEX NDX_Clientes_IDGrupoCliente ON Clientes (IDGrupoCliente);
CREATE INDEX NDX_Clientes_IDActividad ON Clientes (IDActividad);
CREATE INDEX NDX_Clientes_IDFormaPago ON Clientes (IDFormaPago);
CREATE INDEX NDX_Clientes_Morosidad ON Clientes (Morosidad);
CREATE INDEX NDX_Clientes_IDTarifa ON Clientes (IDTarifa);
CREATE INDEX NDX_Clientes_IDSerie ON Clientes (IDSerie);
CREATE INDEX NDX_Clientes_IDTipoDocumento ON Clientes (IDTipoDocumento);
CREATE INDEX NDX_Clientes_IDAuxiliarPrecioEspecialCliente ON Clientes (IDAuxiliarPrecioEspecialCliente);
CREATE INDEX NDX_Clientes_EstadoAutorizacion ON Clientes (EstadoAutorizacion);
CREATE INDEX NDX_Clientes_FechaAutorizacion ON Clientes (FechaAutorizacion);
CREATE INDEX NDX_Clientes_EstadoEnvio ON Clientes (EstadoEnvio);
CREATE INDEX NDX_Clientes_FechaHoraAlta ON Clientes (FechaHoraAlta);



-- --------------------------------------------------------------------------------------------------------------
-- ClientesPotenciales
-- --------------------------------------------------------------------------------------------------------------
-- Skype -> MicrosoftTeams
-- FechaAlta -> FechaHoraAlta

DROP TABLE IF EXISTS _ClientesPotenciales;
CREATE TEMPORARY TABLE _ClientesPotenciales AS SELECT * FROM ClientesPotenciales;

DROP TABLE ClientesPotenciales;

CREATE TABLE ClientesPotenciales (
    ID                     VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoClientePotencial VARCHAR (15)  UNIQUE,
    NIF                    VARCHAR (15),
    NombreComercial        VARCHAR (60),
    NombreFiscal           VARCHAR (60),
    Domicilio              VARCHAR (60),
    CodigoPostal           VARCHAR (10),
    Poblacion              VARCHAR (30),
    Provincia              VARCHAR (30),
    Pais                   VARCHAR (2),
    Telefono1              VARCHAR (16),
    Telefono2              VARCHAR (16),
    Movil                  VARCHAR (16),
    WhatsApp               VARCHAR (16),
    Email                  VARCHAR (100),
    MicrosoftTeams         VARCHAR (100),
    WEB                    VARCHAR (40),
    IDRepresentante        VARCHAR (128),
    IDGrupoCliente         VARCHAR (128),
    IDActividad            VARCHAR (128),
    Observaciones          TEXT,
    IDTarifa               VARCHAR (128),
    Latitud                REAL,
    Longitud               REAL,
    EstadoEnvio            INTEGER,
    FechaHoraAlta          DATETIME
);

INSERT INTO ClientesPotenciales (
    ID,
    CodigoClientePotencial,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    MicrosoftTeams,
    WEB,
    IDRepresentante,
    IDGrupoCliente,
    IDActividad,
    Observaciones,
    IDTarifa,
    Latitud,
    Longitud,
    EstadoEnvio,
    FechaHoraAlta
)
SELECT 
    ID,
    CodigoClientePotencial,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    Skype,
    WEB,
    IDRepresentante,
    IDGrupoCliente,
    IDActividad,
    Observaciones,
    IDTarifa,
    Latitud,
    Longitud,
    EstadoEnvio,
    FechaAlta
FROM _ClientesPotenciales;

DROP TABLE _ClientesPotenciales;

CREATE INDEX NDX_ClientesPotenciales_NIF ON ClientesPotenciales (NIF);
CREATE INDEX NDX_ClientesPotenciales_NombreComercial ON ClientesPotenciales (NombreComercial);
CREATE INDEX NDX_ClientesPotenciales_NombreFiscal ON ClientesPotenciales (NombreFiscal);
CREATE INDEX NDX_ClientesPotenciales_CodigoPostal ON ClientesPotenciales (CodigoPostal);
CREATE INDEX NDX_ClientesPotenciales_Domicilio ON ClientesPotenciales (Domicilio);
CREATE INDEX NDX_ClientesPotenciales_Telefono1 ON ClientesPotenciales (Telefono1);
CREATE INDEX NDX_ClientesPotenciales_Telefono2 ON ClientesPotenciales (Telefono2);
CREATE INDEX NDX_ClientesPotenciales_Movil ON ClientesPotenciales (Movil);
CREATE INDEX NDX_ClientesPotenciales_IDRepresentante ON ClientesPotenciales (IDRepresentante);
CREATE INDEX NDX_ClientesPotenciales_IDGrupoCliente ON ClientesPotenciales (IDGrupoCliente);
CREATE INDEX NDX_ClientesPotenciales_IDActividad ON ClientesPotenciales (IDActividad);
CREATE INDEX NDX_ClientesPotenciales_EstadoEnvio ON ClientesPotenciales (EstadoEnvio);
CREATE INDEX NDX_ClientesPotenciales_FechaHoraAlta ON ClientesPotenciales (FechaHoraAlta);



-- --------------------------------------------------------------------------------------------------------------
-- Proveedores
-- --------------------------------------------------------------------------------------------------------------
-- Skype -> MicrosoftTeams
-- FechaAlta -> FechaHoraAlta

DROP TABLE IF EXISTS _Proveedores;
CREATE TEMPORARY TABLE _Proveedores AS SELECT * FROM Proveedores;

DROP TABLE Proveedores;

CREATE TABLE Proveedores (
    ID                  VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoProveedor     VARCHAR (15)  UNIQUE,
    NIF                 VARCHAR (15),
    NombreComercial     VARCHAR (60),
    NombreFiscal        VARCHAR (60),
    Domicilio           VARCHAR (60),
    CodigoPostal        VARCHAR (10),
    Poblacion           VARCHAR (30),
    Provincia           VARCHAR (30),
    Pais                VARCHAR (2),
    Telefono1           VARCHAR (16),
    Telefono2           VARCHAR (16),
    Movil               VARCHAR (16),
    WhatsApp            VARCHAR (16),
    Email               VARCHAR (100),
    MicrosoftTeams      VARCHAR (100),
    WEB                 VARCHAR (40),
    DescuentoComercial  REAL,
    DescuentoProntoPago REAL,
    IDGrupoProveedor    VARCHAR (128),
    IDActividad         VARCHAR (128),
    IDFormaPago         VARCHAR (128),
    Retencion           REAL,
    RegimenIVA          INTEGER,
    Observaciones       TEXT,
    MotivoBaja          VARCHAR (30),
    OtrosDatos          TEXT,
    OtrosDatosFiscales  TEXT,
    AvisoCompras        TEXT,
    Latitud             REAL,
    Longitud            REAL,
    IDSerie             VARCHAR (128),
    IDTipoDocumento     VARCHAR (128),
    CuentaContable      VARCHAR (12),
    EstadoEnvio         INTEGER,
    FechaHoraAlta       DATETIME
);

INSERT INTO Proveedores (
    ID,
    CodigoProveedor,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    MicrosoftTeams,
    WEB,
    DescuentoComercial,
    DescuentoProntoPago,
    IDGrupoProveedor,
    IDActividad,
    IDFormaPago,
    Retencion,
    RegimenIVA,
    Observaciones,
    MotivoBaja,
    OtrosDatos,
    OtrosDatosFiscales,
    AvisoCompras,
    Latitud,
    Longitud,
    IDSerie,
    IDTipoDocumento,
    CuentaContable,
    EstadoEnvio,
    FechaHoraAlta
)
SELECT 
    ID,
    CodigoProveedor,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    Skype,
    WEB,
    DescuentoComercial,
    DescuentoProntoPago,
    IDGrupoProveedor,
    IDActividad,
    IDFormaPago,
    Retencion,
    RegimenIVA,
    Observaciones,
    MotivoBaja,
    OtrosDatos,
    OtrosDatosFiscales,
    AvisoCompras,
    Latitud,
    Longitud,
    IDSerie,
    IDTipoDocumento,
    CuentaContable,
    EstadoEnvio,
    FechaAlta
FROM _Proveedores;

DROP TABLE _Proveedores;

CREATE INDEX NDX_Proveedores_NIF ON Proveedores (NIF);
CREATE INDEX NDX_Proveedores_NombreComercial ON Proveedores (NombreComercial);
CREATE INDEX NDX_Proveedores_NombreFiscal ON Proveedores (NombreFiscal);
CREATE INDEX NDX_Proveedores_CodigoPostal ON Proveedores (CodigoPostal);
CREATE INDEX NDX_Proveedores_Domicilio ON Proveedores (Domicilio);
CREATE INDEX NDX_Proveedores_Telefono1 ON Proveedores (Telefono1);
CREATE INDEX NDX_Proveedores_Telefono2 ON Proveedores (Telefono2);
CREATE INDEX NDX_Proveedores_Movil ON Proveedores (Movil);
CREATE INDEX NDX_Proveedores_IDGrupoProveedor ON Proveedores (IDGrupoProveedor);
CREATE INDEX NDX_Proveedores_IDActividad ON Proveedores (IDActividad);
CREATE INDEX NDX_Proveedores_IDFormaPago ON Proveedores (IDFormaPago);
CREATE INDEX NDX_Proveedores_EstadoEnvio ON Proveedores (EstadoEnvio);
CREATE INDEX NDX_Proveedores_FechaHoraAlta ON Proveedores (FechaHoraAlta);



-- --------------------------------------------------------------------------------------------------------------
-- ContactosClientes
-- --------------------------------------------------------------------------------------------------------------
-- Skype -> MicrosoftTeams

DROP TABLE IF EXISTS _ContactosClientes;
CREATE TEMPORARY TABLE _ContactosClientes AS SELECT * FROM ContactosClientes;

DROP TABLE ContactosClientes;

CREATE TABLE ContactosClientes (
    ID             VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCliente      VARCHAR (128),
    Linea          INTEGER,
    Nombre         VARCHAR (50),
    Cargo          VARCHAR (50),
    Telefono       VARCHAR (16),
    Movil          VARCHAR (16),
    WhatsApp       VARCHAR (16),
    Email          VARCHAR (100),
    MicrosoftTeams VARCHAR (100),
    Observaciones  TEXT
);

INSERT INTO ContactosClientes (
    ID,
    IDCliente,
    Linea,
    Nombre,
    Cargo,
    Telefono,
    Movil,
    WhatsApp,
    Email,
    MicrosoftTeams,
    Observaciones
)
SELECT 
    ID,
    IDCliente,
    Linea,
    Nombre,
    Cargo,
    Telefono,
    Movil,
    WhatsApp,
    Email,
    Skype,
    Observaciones
FROM _ContactosClientes;

DROP TABLE _ContactosClientes;

CREATE INDEX NDX_ContactosClientes_IDCliente ON ContactosClientes (IDCliente);
CREATE INDEX NDX_ContactosClientes_Linea ON ContactosClientes (Linea);
CREATE INDEX NDX_ContactosClientes_Nombre ON ContactosClientes (Nombre);
CREATE INDEX NDX_ContactosClientes_Telefono ON ContactosClientes (Telefono);
CREATE INDEX NDX_ContactosClientes_Movil ON ContactosClientes (Movil);
CREATE UNIQUE INDEX NDX_ContactosClientes_UNIQUE ON ContactosClientes (IDCliente, Linea);


-- --------------------------------------------------------------------------------------------------------------
-- ContactosClientesPotenciales
-- --------------------------------------------------------------------------------------------------------------
-- Skype -> MicrosoftTeams

DROP TABLE IF EXISTS _ContactosClientesPotenciales;
CREATE TEMPORARY TABLE _ContactosClientesPotenciales AS SELECT * FROM ContactosClientesPotenciales;

DROP TABLE ContactosClientesPotenciales;

CREATE TABLE ContactosClientesPotenciales (
    ID                  VARCHAR (128) PRIMARY KEY UNIQUE,
    IDClientePotencial  VARCHAR (128),
    Linea               INTEGER,
    Nombre              VARCHAR (50),
    Cargo               VARCHAR (50),
    Telefono            VARCHAR (16),
    Movil               VARCHAR (16),
    WhatsApp            VARCHAR (16),
    Email               VARCHAR (100),
    MicrosoftTeams      VARCHAR (100),
    Observaciones       TEXT
);

INSERT INTO ContactosClientesPotenciales (
    ID,
    IDClientePotencial,
    Linea,
    Nombre,
    Cargo,
    Telefono,
    Movil,
    WhatsApp,
    Email,
    MicrosoftTeams,
    Observaciones
)
SELECT 
    ID,
    IDClientePotencial,
    Linea,
    Nombre,
    Cargo,
    Telefono,
    Movil,
    WhatsApp,
    Email,
    Skype,
    Observaciones
FROM _ContactosClientesPotenciales;

DROP TABLE _ContactosClientesPotenciales;

CREATE INDEX NDX_ContactosClientesPotenciales_IDClientePotencial ON ContactosClientesPotenciales (IDClientePotencial);
CREATE INDEX NDX_ContactosClientesPotenciales_Linea ON ContactosClientesPotenciales (Linea);
CREATE INDEX NDX_ContactosClientesPotenciales_Nombre ON ContactosClientesPotenciales (Nombre);
CREATE INDEX NDX_ContactosClientesPotenciales_Telefono ON ContactosClientesPotenciales (Telefono);
CREATE INDEX NDX_ContactosClientesPotenciales_Movil ON ContactosClientesPotenciales (Movil);
CREATE UNIQUE INDEX NDX_ContactosClientesPotenciales_UNIQUE ON ContactosClientesPotenciales (IDClientePotencial, Linea);


-- --------------------------------------------------------------------------------------------------------------
-- ContactosProveedores
-- --------------------------------------------------------------------------------------------------------------
-- Skype -> MicrosoftTeams

DROP TABLE IF EXISTS _ContactosProveedores;
CREATE TEMPORARY TABLE _ContactosProveedores AS SELECT * FROM ContactosProveedores;

DROP TABLE ContactosProveedores;

CREATE TABLE ContactosProveedores (
    ID                  VARCHAR (128) PRIMARY KEY UNIQUE,
    IDProveedor         VARCHAR (128),
    Linea               INTEGER,
    Nombre              VARCHAR (50),
    Cargo               VARCHAR (50),
    Telefono            VARCHAR (16),
    Movil               VARCHAR (16),
    WhatsApp            VARCHAR (16),
    Email               VARCHAR (100),
    MicrosoftTeams      VARCHAR (100),
    Observaciones       TEXT
);

INSERT INTO ContactosProveedores (
    ID,
    IDProveedor,
    Linea,
    Nombre,
    Cargo,
    Telefono,
    Movil,
    WhatsApp,
    Email,
    MicrosoftTeams,
    Observaciones
)
SELECT 
    ID,
    IDProveedor,
    Linea,
    Nombre,
    Cargo,
    Telefono,
    Movil,
    WhatsApp,
    Email,
    Skype,
    Observaciones
FROM _ContactosProveedores;

DROP TABLE _ContactosProveedores;

CREATE INDEX NDX_ContactosProveedores_IDProveedor ON ContactosProveedores (IDProveedor);
CREATE INDEX NDX_ContactosProveedores_Linea ON ContactosProveedores (Linea);
CREATE INDEX NDX_ContactosProveedores_Nombre ON ContactosProveedores (Nombre);
CREATE INDEX NDX_ContactosProveedores_Telefono ON ContactosProveedores (Telefono);
CREATE INDEX NDX_ContactosProveedores_Movil ON ContactosProveedores (Movil);
CREATE UNIQUE INDEX NDX_ContactosProveedores_UNIQUE ON ContactosProveedores (IDProveedor, Linea);



-- --------------------------------------------------------------------------------------------------------------
-- CamposAdicionalesValores
-- --------------------------------------------------------------------------------------------------------------
-- + IDPadre

DROP TABLE IF EXISTS _CamposAdicionalesValores;
CREATE TEMPORARY TABLE _CamposAdicionalesValores AS SELECT * FROM CamposAdicionalesValores;

DROP TABLE CamposAdicionalesValores;

CREATE TABLE CamposAdicionalesValores (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCampoAdicional VARCHAR (128),
    IDPadre          VARCHAR (128),
    IDRegistro       VARCHAR (128),
    Valor            TEXT
);

INSERT INTO CamposAdicionalesValores (
    ID,
    IDCampoAdicional,
    IDRegistro,
    Valor
)
SELECT 
    ID,
    IDCampoAdicional,
    IDRegistro,
    Valor
FROM _CamposAdicionalesValores;

DROP TABLE _CamposAdicionalesValores;

CREATE UNIQUE INDEX NDX_CamposAdicionalesValores_UNIQUE ON CamposAdicionalesValores (IDCampoAdicional, IDRegistro);
CREATE INDEX NDX_CamposAdicionalesValores_IDCampoAdicional ON CamposAdicionalesValores (IDCampoAdicional);
CREATE INDEX NDX_CamposAdicionalesValores_IDPadre ON CamposAdicionalesValores (IDPadre);
CREATE INDEX NDX_CamposAdicionalesValores_IDRegistro ON CamposAdicionalesValores (IDRegistro);



-- --------------------------------------------------------------------------------------------------------------
-- CamposAdicionalesValoresTmp
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE CamposAdicionalesValoresTmp (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCampoAdicional VARCHAR (128),
    IDPadre          VARCHAR (128),
    IDRegistro       VARCHAR (128),
    Valor            TEXT
);

CREATE UNIQUE INDEX NDX_CamposAdicionalesValoresTmp_UNIQUE ON CamposAdicionalesValoresTmp (IDCampoAdicional, IDRegistro);
CREATE INDEX NDX_CamposAdicionalesValoresTmp_IDCampoAdicional ON CamposAdicionalesValoresTmp (IDCampoAdicional);
CREATE INDEX NDX_CamposAdicionalesValoresTmp_IDPadre ON CamposAdicionalesValoresTmp (IDPadre);
CREATE INDEX NDX_CamposAdicionalesValoresTmp_IDRegistro ON CamposAdicionalesValoresTmp (IDRegistro);

-- --------------------------------------------------------------------------------------------------------------
-- Productos
-- --------------------------------------------------------------------------------------------------------------
-- + Referencia
-- + PrecioCoste
-- - GestionarTasas -> GestionarTasa1
-- - IDTasa
-- + Tasa -> Tasa1
-- + GestionarTasa2
-- + Tasa2

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,
    Referencia                  VARCHAR (20),           /* NUEVO CAMPO */ 
    Titulo                      VARCHAR (55),
    UnidadMedida                VARCHAR (10),
    PedirEnvases                INTEGER,
    UnidadMedidaEnvase          VARCHAR (10),
    UnidadesEnvase              REAL,
    DesvincularCalculoEnvases   INTEGER,
    NoFraccionarEnvases         INTEGER,
    PesoUnitario                REAL,
    CalcularImporteXPeso        INTEGER,
    ActivarEdicionPeso          INTEGER,
    UnidadMedidaPeso            VARCHAR (10),
    Medida1                     REAL,
    ActivarEdicionMedida1       INTEGER,
    Medida2                     REAL,
    ActivarEdicionMedida2       INTEGER,
    Medida3                     REAL,
    ActivarEdicionMedida3       INTEGER,
    TipoCalculoUnidades         INTEGER,
    IDFamilia                   VARCHAR (128),
    IDSubfamilia                VARCHAR (128),
    IDMarca                     VARCHAR (128),
    IDGrupoProducto             VARCHAR (128),
    IDTipoIVA                   VARCHAR (128),
    PrecioCoste                 REAL,                   /* NUEVO CAMPO */ 
    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,
    GestionarTasa1              INTEGER,
    Tasa1                       REAL,
    GestionarTasa2              INTEGER,
    Tasa2                       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,
    Medida1,
    ActivarEdicionMedida1,
    Medida2,
    ActivarEdicionMedida2,
    Medida3,
    ActivarEdicionMedida3,
    TipoCalculoUnidades,
    IDFamilia,
    IDSubfamilia,
    IDMarca,
    IDGrupoProducto,
    IDTipoIVA,
    TextoAgrupacionVentas,
    IDProveedorHabitual,
    Descripcion,
    DescripcionWeb,
    OtrosDatos,
    AvisoCompras,
    AvisoVentas,
    EsEnvase,
    ControlStock,
    UnidadesVentaMinimo,
    IDAgrupacionBase,
    IDAgrupacionVentas,
    IDAgrupacionCompras,
    IDPropiedad1,
    IDPropiedad2,
    IDPropiedad3,
    CodigoEquivalencia,
    MostrarEnVistaPrincipal,
    GestionarTasa1,
    Tasa1,
    GestionarTrazabilidad,
    TieneEscandallo,
    DesglosarEscandalloEnVentas,
    PreciosEscandalloEnVentas,
    NoVender,
    NoComprar,
    OrdenCatalogo,
    ProductoDestacado
)
SELECT 
    ID,
    CodigoProducto,
    Titulo,
    UnidadMedida,
    PedirEnvases,
    UnidadMedidaEnvase,
    UnidadesEnvase,
    DesvincularCalculoEnvases,
    NoFraccionarEnvases,
    PesoUnitario,
    CalcularImporteXPeso,
    ActivarEdicionPeso,
    UnidadMedidaPeso,
    Medida1,
    ActivarEdicionMedida1,
    Medida2,
    ActivarEdicionMedida2,
    Medida3,
    ActivarEdicionMedida3,
    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,
    Tasa,
    GestionarTrazabilidad,
    TieneEscandallo,
    DesglosarEscandalloEnVentas,
    PreciosEscandalloEnVentas,
    NoVender,
    NoComprar,
    OrdenCatalogo,
    ProductoDestacado
FROM _Productos;

DROP TABLE IF EXISTS _Productos;

CREATE INDEX NDX_Productos_Referencia ON Productos (Referencia);
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_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);



-- --------------------------------------------------------------------------------------------------------------
-- Cabeceras
-- --------------------------------------------------------------------------------------------------------------
-- + ImportePortes
-- + IDTipoIVAPortes
-- + ImporteTasas -> ImporteTasas1
-- + ImporteTasas2

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),        
    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,
    ImportePortes              REAL,
    IDTipoIVAPortes            VARCHAR (128),
    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,
    ImporteTasas1              REAL,
    ImporteTasas2              REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    Contabilizado              INTEGER,      
    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,
    IDAlmacenDestino,
    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,
    ImporteTasas1,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    Contabilizado,
    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,
    IDAlmacenDestino,
    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,
    Contabilizado,
    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
-- --------------------------------------------------------------------------------------------------------------
-- + ImportePortes
-- + IDTipoIVAPortes
-- + ImporteTasas -> ImporteTasas1
-- + ImporteTasas2

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),        
    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,
    ImportePortes              REAL,
    IDTipoIVAPortes            VARCHAR (128),
    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,
    ImporteTasas1              REAL,
    ImporteTasas2              REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    Contabilizado              INTEGER,      
    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,
    IDAlmacenDestino,
    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,
    ImporteTasas1,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    Contabilizado,
    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,
    IDAlmacenDestino,
    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,
    Contabilizado,
    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
-- --------------------------------------------------------------------------------------------------------------
-- + ImportePortes
-- + IDTipoIVAPortes
-- + ImporteTasas -> ImporteTasas1
-- + ImporteTasas2

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),        
    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,
    ImportePortes              REAL,
    IDTipoIVAPortes            VARCHAR (128),
    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,
    ImporteTasas1              REAL,
    ImporteTasas2              REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    Contabilizado              INTEGER,      
    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,
    IDAlmacenDestino,
    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,
    ImporteTasas1,
    ImporteTotal,
    ImporteComision,
    Observaciones,
    EstadoEnvio,
    EstadoCarga,
    Emitido,
    Servido,
    Traspasado,
    Abonado,
    Contabilizado,
    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,
    IDAlmacenDestino,
    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,
    Contabilizado,
    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
-- --------------------------------------------------------------------------------------------------------------
-- - IDTasa
-- + Tasa -> Tasa1
-- + AplicarTasaEnPorcentaje -> AplicarTasa1EnPorcentaje
-- + ImporteTasa -> ImporteTasa1
-- + Tasa2
-- + AplicarTasa2EnPorcentaje
-- + ImporteTasa2

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),
    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,
    Tasa1                         REAL,
    AplicarTasa1EnPorcentaje      INTEGER,
    ImporteTasa1                  REAL,
    Tasa2                         REAL,
    AplicarTasa2EnPorcentaje      INTEGER,
    ImporteTasa2                  REAL,
    ImporteBruto                  REAL,
    ImporteNeto                   REAL,
    ImporteFinal                  REAL,
    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,
    Medida2                       REAL,
    Medida3                       REAL,
    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,
    IDAlmacenDestino,
    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,
    Tasa1,
    AplicarTasa1EnPorcentaje,
    ImporteTasa1,
    ImporteBruto,
    ImporteNeto,
    ImporteFinal,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    Medida1,
    Medida2,
    Medida3,
    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,
    IDAlmacenDestino,
    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,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    ImporteFinal,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    Medida1,
    Medida2,
    Medida3,
    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 _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_Titulo ON Lineas (Titulo);
CREATE INDEX NDX_Lineas_Unidades ON Lineas (Unidades);
CREATE INDEX NDX_Lineas_Precio ON Lineas (Precio);
CREATE INDEX NDX_Lineas_Descuento1 ON Lineas (Descuento1);
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_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);



-- --------------------------------------------------------------------------------------------------------------
-- LineasTmp
-- --------------------------------------------------------------------------------------------------------------
-- - IDTasa
-- + Tasa -> Tasa1
-- + AplicarTasaEnPorcentaje -> AplicarTasa1EnPorcentaje
-- + ImporteTasa -> ImporteTasa1
-- + Tasa2
-- + AplicarTasa2EnPorcentaje
-- + ImporteTasa2

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),
    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,
    Tasa1                         REAL,
    AplicarTasa1EnPorcentaje      INTEGER,
    ImporteTasa1                  REAL,
    Tasa2                         REAL,
    AplicarTasa2EnPorcentaje      INTEGER,
    ImporteTasa2                  REAL,
    ImporteBruto                  REAL,
    ImporteNeto                   REAL,
    ImporteFinal                  REAL,
    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,
    Medida2                       REAL,
    Medida3                       REAL,
    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,
    IDAlmacenDestino,
    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,
    Tasa1,
    AplicarTasa1EnPorcentaje,
    ImporteTasa1,
    ImporteBruto,
    ImporteNeto,
    ImporteFinal,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    Medida1,
    Medida2,
    Medida3,
    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,
    IDAlmacenDestino,
    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,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    ImporteFinal,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    Medida1,
    Medida2,
    Medida3,
    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 _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_Titulo ON LineasTmp (Titulo);
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_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);



-- --------------------------------------------------------------------------------------------------------------
-- HLineas
-- --------------------------------------------------------------------------------------------------------------
-- - IDTasa
-- + Tasa -> Tasa1
-- + AplicarTasaEnPorcentaje -> AplicarTasa1EnPorcentaje
-- + ImporteTasa -> ImporteTasa1
-- + Tasa2
-- + AplicarTasa2EnPorcentaje
-- + ImporteTasa2

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),
    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,
    Tasa1                         REAL,
    AplicarTasa1EnPorcentaje      INTEGER,
    ImporteTasa1                  REAL,
    Tasa2                         REAL,
    AplicarTasa2EnPorcentaje      INTEGER,
    ImporteTasa2                  REAL,
    ImporteBruto                  REAL,
    ImporteNeto                   REAL,
    ImporteFinal                  REAL,
    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,
    Medida2                       REAL,
    Medida3                       REAL,
    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,
    IDAlmacenDestino,
    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,
    Tasa1,
    AplicarTasa1EnPorcentaje,
    ImporteTasa1,
    ImporteBruto,
    ImporteNeto,
    ImporteFinal,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    Medida1,
    Medida2,
    Medida3,
    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,
    IDAlmacenDestino,
    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,
    Tasa,
    AplicarTasaEnPorcentaje,
    ImporteTasa,
    ImporteBruto,
    ImporteNeto,
    ImporteFinal,
    Comision,
    AplicarComisionEnEuros,
    ImporteComision,
    PrecioCoste,
    IDTipoIVA,
    PorcentajeIVA,
    PorcentajeRecargo,
    ClientePotencial,
    IDClienteProveedor,
    IDDireccion,
    FechaHora,
    Descripcion,
    TipoLinea,
    IDTipoAbono,
    ActualizarStock,
    HoraInicio,
    HoraFinal,
    Medida1,
    Medida2,
    Medida3,
    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 _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_Titulo ON HLineas (Titulo);
CREATE INDEX NDX_HLineas_Unidades ON HLineas (Unidades);
CREATE INDEX NDX_HLineas_Precio ON HLineas (Precio);
CREATE INDEX NDX_HLineas_Descuento1 ON HLineas (Descuento1);
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_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);



-- --------------------------------------------------------------------------------------------------------------
-- Tasas: Eliminar tabla
-- --------------------------------------------------------------------------------------------------------------

DROP TABLE Tasas;



-- --------------------------------------------------------------------------------------------------------------
-- TarifasPrecios
-- --------------------------------------------------------------------------------------------------------------
-- + UnidadesDesde
-- + UnidadesHasta

DROP TABLE IF EXISTS _TarifasPrecios;
CREATE TEMPORARY TABLE _TarifasPrecios AS SELECT * FROM TarifasPrecios;

DROP TABLE TarifasPrecios;

CREATE TABLE TarifasPrecios (
    ID                VARCHAR (128) PRIMARY KEY UNIQUE,
    IDTarifa          VARCHAR (128),
    IDProducto        VARCHAR (128),
    IDAgrupacion      VARCHAR (128),
    IDValorPropiedad1 VARCHAR (128),
    IDValorPropiedad2 VARCHAR (128),
    IDValorPropiedad3 VARCHAR (128),
    Precio            REAL,
    Descuento         REAL,
    UnidadesDesde     REAL,
    UnidadesHasta     REAL,
    Margen            REAL
);

INSERT INTO TarifasPrecios (
    ID,
    IDTarifa,
    IDProducto,
    IDAgrupacion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Precio,
    Descuento,
    Margen
)
SELECT 
    ID,
    IDTarifa,
    IDProducto,
    IDAgrupacion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    Precio,
    Descuento,
    Margen
FROM _TarifasPrecios;

DROP TABLE _TarifasPrecios;

CREATE INDEX NDX_TarifasPrecios_IDTarifa ON TarifasPrecios (IDTarifa);
CREATE INDEX NDX_TarifasPrecios_IDProducto ON TarifasPrecios (IDProducto);
CREATE INDEX NDX_TarifasPrecios_IDAgrupacion ON TarifasPrecios (IDAgrupacion);
CREATE INDEX NDX_TarifasPrecios_IDValorPropiedad1 ON TarifasPrecios (IDValorPropiedad1);
CREATE INDEX NDX_TarifasPrecios_IDValorPropiedad2 ON TarifasPrecios (IDValorPropiedad2);
CREATE INDEX NDX_TarifasPrecios_IDValorPropiedad3 ON TarifasPrecios (IDValorPropiedad3);
CREATE INDEX NDX_TarifasPrecios_UnidadesDesde ON TarifasPrecios (UnidadesDesde);
CREATE INDEX NDX_TarifasPrecios_UnidadesHasta ON TarifasPrecios (UnidadesHasta);
CREATE INDEX NDX_TarifasPrecios_OrderByPrecioTarifa ON TarifasPrecios (UnidadesDesde, UnidadesHasta);



-- --------------------------------------------------------------------------------------------------------------
-- FormasPago
-- --------------------------------------------------------------------------------------------------------------
-- + IDTipoEfecto

ALTER TABLE FormasPago ADD IDTipoEfecto VARCHAR(128);

CREATE INDEX NDX_FormasPago_IDTipoEfecto ON FormasPago (IDTipoEfecto);



-- --------------------------------------------------------------------------------------------------------------
-- PreciosEspecialesLineas
-- --------------------------------------------------------------------------------------------------------------
-- + AplicarUltimosDescuentos

DROP TABLE IF EXISTS _PreciosEspecialesLineas;
CREATE TEMPORARY TABLE _PreciosEspecialesLineas AS SELECT * FROM PreciosEspecialesLineas;

DROP TABLE PreciosEspecialesLineas;

CREATE TABLE PreciosEspecialesLineas (
    ID                       VARCHAR (128) PRIMARY KEY UNIQUE,
    IDPrecioEspecial         VARCHAR (128) COLLATE NOCASE,
    ValorCriterio1           VARCHAR (128) COLLATE NOCASE,
    ValorCriterio2           VARCHAR (128) COLLATE NOCASE,
    ValorCriterio3           VARCHAR (128) COLLATE NOCASE,
    ValorCriterio4           VARCHAR (128) COLLATE NOCASE,
    ValorCriterio5           VARCHAR (128) COLLATE NOCASE,
    FechaValidezDesde        DATE,
    FechaValidezHasta        DATE,
    Precio                   REAL,
    Descuento1               REAL,
    AplicarDescuento1EnEuros INTEGER,
    Descuento2               REAL,
    AplicarDescuento2EnEuros INTEGER,
    Descuento3               REAL,
    AplicarDescuento3EnEuros INTEGER,
    AplicarUltimoPrecioVenta INTEGER,
    AplicarUltimosDescuentos INTEGER,           /* NUEVO CAMPO */     
    AplicarIDTarifa          VARCHAR (128),
    UnidadesDesde            REAL,
    UnidadesHasta            REAL,
    ImporteBonificacion      REAL,
    UnidadesBaseRegalo       REAL,
    UnidadesRegaladas        REAL,
    IDProductoRegalado       VARCHAR (128),
    UnidadesBaseSinCargo     REAL,
    UnidadesSinCargo         REAL,
    Referencia               VARCHAR (20) 
);

INSERT INTO PreciosEspecialesLineas (
    ID,
    IDPrecioEspecial,
    ValorCriterio1,
    ValorCriterio2,
    ValorCriterio3,
    ValorCriterio4,
    ValorCriterio5,
    FechaValidezDesde,
    FechaValidezHasta,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    Descuento2,
    AplicarDescuento2EnEuros,
    Descuento3,
    AplicarDescuento3EnEuros,
    AplicarUltimoPrecioVenta,
    AplicarIDTarifa,
    UnidadesDesde,
    UnidadesHasta,
    ImporteBonificacion,
    UnidadesBaseRegalo,
    UnidadesRegaladas,
    IDProductoRegalado,
    UnidadesBaseSinCargo,
    UnidadesSinCargo,
    Referencia
)
SELECT 
    ID,
    IDPrecioEspecial,
    ValorCriterio1,
    ValorCriterio2,
    ValorCriterio3,
    ValorCriterio4,
    ValorCriterio5,
    FechaValidezDesde,
    FechaValidezHasta,
    Precio,
    Descuento1,
    AplicarDescuento1EnEuros,
    Descuento2,
    AplicarDescuento2EnEuros,
    Descuento3,
    AplicarDescuento3EnEuros,
    AplicarUltimoPrecioVenta,
    AplicarIDTarifa,
    UnidadesDesde,
    UnidadesHasta,
    ImporteBonificacion,
    UnidadesBaseRegalo,
    UnidadesRegaladas,
    IDProductoRegalado,
    UnidadesBaseSinCargo,
    UnidadesSinCargo,
    Referencia
FROM _PreciosEspecialesLineas;

DROP TABLE _PreciosEspecialesLineas;

CREATE INDEX NDX_PreciosEspecialesLineas_IDPrecioEspecial ON PreciosEspecialesLineas (IDPrecioEspecial);
CREATE INDEX NDX_PreciosEspecialesLineas_ValorCriterio1 ON PreciosEspecialesLineas (ValorCriterio1);
CREATE INDEX NDX_PreciosEspecialesLineas_ValorCriterio2 ON PreciosEspecialesLineas (ValorCriterio2);
CREATE INDEX NDX_PreciosEspecialesLineas_ValorCriterio3 ON PreciosEspecialesLineas (ValorCriterio3);
CREATE INDEX NDX_PreciosEspecialesLineas_ValorCriterio4 ON PreciosEspecialesLineas (ValorCriterio4);
CREATE INDEX NDX_PreciosEspecialesLineas_ValorCriterio5 ON PreciosEspecialesLineas (ValorCriterio5);
CREATE INDEX NDX_PreciosEspecialesLineas_UnidadesDesde ON PreciosEspecialesLineas (UnidadesDesde);
CREATE INDEX NDX_PreciosEspecialesLineas_UnidadesHasta ON PreciosEspecialesLineas (UnidadesHasta);
CREATE INDEX NDX_PreciosEspecialesLineas_FechaValidezDesde ON PreciosEspecialesLineas (FechaValidezDesde);
CREATE INDEX NDX_PreciosEspecialesLineas_FechaValidezHasta ON PreciosEspecialesLineas (FechaValidezHasta);
CREATE INDEX NDX_PreciosEspecialesLineas_AplicarUltimoPrecioVenta ON PreciosEspecialesLineas (AplicarUltimoPrecioVenta);
CREATE INDEX NDX_PreciosEspecialesLineas_AplicarUltimosDescuentos ON PreciosEspecialesLineas (AplicarUltimosDescuentos);
CREATE INDEX NDX_PreciosEspecialesLineas_OrderBySelectPrecio ON PreciosEspecialesLineas (ValorCriterio1, ValorCriterio2, ValorCriterio3, ValorCriterio4, ValorCriterio5, UnidadesDesde, UnidadesHasta);



-- --------------------------------------------------------------------------------------------------------------
-- Cobros
-- --------------------------------------------------------------------------------------------------------------
-- + IDTipoEfecto
-- + IDRemesa

DROP TABLE IF EXISTS _Cobros;
CREATE TEMPORARY TABLE _Cobros AS SELECT * FROM Cobros;

DROP TABLE Cobros;

CREATE TABLE Cobros (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCabecera       VARCHAR (128),
    IDCliente        VARCHAR (128),
    IDDireccion      VARCHAR (128),
    IDTipoDocumento  VARCHAR (128),
    Ejercicio        INTEGER,
    IDSerie          VARCHAR (128),
    Numero           INTEGER,
    Documento        VARCHAR (15),
    Orden            INTEGER,
    FechaHoraEmision DATETIME,
    FechaVencimiento DATE,
    Importe          REAL,
    ImporteCobrado   REAL,
    Observaciones    TEXT,
    IDTipoEfecto     VARCHAR (128),
    Cobrado          INTEGER,
    IDRemesa         VARCHAR (128),
    EstadoEnvio      INTEGER,
    CobrosHeredados  BOOLEAN
);

INSERT INTO Cobros (
    ID,
    IDCabecera,
    IDCliente,
    IDDireccion,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Documento,
    Orden,
    FechaHoraEmision,
    FechaVencimiento,
    Importe,
    ImporteCobrado,
    Observaciones,
    Cobrado,
    EstadoEnvio,
    CobrosHeredados
)
SELECT ID,
    IDCabecera,
    IDCliente,
    IDDireccion,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Documento,
    Orden,
    FechaHoraEmision,
    FechaVencimiento,
    Importe,
    ImporteCobrado,
    Observaciones,
    Cobrado,
    EstadoEnvio,
    CobrosHeredados
FROM _Cobros;

DROP TABLE _Cobros;

CREATE INDEX NDX_Cobros_IDCabecera ON Cobros (IDCabecera);
CREATE INDEX NDX_Cobros_IDCliente ON Cobros (IDCliente);
CREATE INDEX NDX_Cobros_IDDireccion ON Cobros (IDDireccion);
CREATE INDEX NDX_Cobros_IDTipoDocumento ON Cobros (IDTipoDocumento);
CREATE INDEX NDX_Cobros_Ejercicio ON Cobros (Ejercicio);
CREATE INDEX NDX_Cobros_IDSerie ON Cobros (IDSerie);
CREATE INDEX NDX_Cobros_Numero ON Cobros (Numero);
CREATE INDEX NDX_Cobros_Documento ON Cobros (Documento);
CREATE INDEX NDX_Cobros_Orden ON Cobros (Orden);
CREATE INDEX NDX_Cobros_FechaHoraEmision ON Cobros (FechaHoraEmision);
CREATE INDEX NDX_Cobros_FechaVencimiento ON Cobros (FechaVencimiento);
CREATE INDEX NDX_Cobros_IDTipoEfecto ON Cobros (IDTipoEfecto);
CREATE INDEX NDX_Cobros_Cobrado ON Cobros (Cobrado);
CREATE INDEX NDX_Cobros_IDRemesa ON Cobros (IDRemesa);
CREATE INDEX NDX_Cobros_EstadoEnvio ON Cobros (EstadoEnvio);



-- --------------------------------------------------------------------------------------------------------------
-- CobrosLineas
-- --------------------------------------------------------------------------------------------------------------
-- + IDRemesa

ALTER TABLE CobrosLineas ADD IDRemesa VARCHAR(128);

CREATE INDEX NDX_CobrosLineas_IDRemesa ON CobrosLineas (IDRemesa);



-- --------------------------------------------------------------------------------------------------------------
-- Pagos
-- --------------------------------------------------------------------------------------------------------------
-- + IDTipoEfecto
-- + IDRemesa

DROP TABLE IF EXISTS _Pagos;
CREATE TEMPORARY TABLE _Pagos AS SELECT * FROM Pagos;

DROP TABLE Pagos;

CREATE TABLE Pagos (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    IDCabecera       VARCHAR (128),
    IDProveedor      VARCHAR (128),
    IDDireccion      VARCHAR (128),
    IDTipoDocumento  VARCHAR (128),
    Ejercicio        INTEGER,
    IDSerie          VARCHAR (128),
    Numero           INTEGER,
    Documento        VARCHAR (15),
    Orden            INTEGER,
    FechaHoraEmision DATETIME,
    FechaVencimiento VARCHAR (10),
    Importe          REAL,
    ImportePagado    REAL,
    Observaciones    TEXT,
    IDTipoEfecto     VARCHAR (128),
    Pagado           INTEGER,
    IDRemesa         VARCHAR (128),
    EstadoEnvio      INTEGER
);

INSERT INTO Pagos (
    ID,
    IDCabecera,
    IDProveedor,
    IDDireccion,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Documento,
    Orden,
    FechaHoraEmision,
    FechaVencimiento,
    Importe,
    ImportePagado,
    Observaciones,
    Pagado,
    EstadoEnvio
)
SELECT 
    ID,
    IDCabecera,
    IDProveedor,
    IDDireccion,
    IDTipoDocumento,
    Ejercicio,
    IDSerie,
    Numero,
    Documento,
    Orden,
    FechaHoraEmision,
    FechaVencimiento,
    Importe,
    ImportePagado,
    Observaciones,
    Pagado,
    EstadoEnvio
FROM _Pagos;

DROP TABLE _Pagos;

CREATE INDEX NDX_Pagos_IDCabecera ON Pagos (IDCabecera);
CREATE INDEX NDX_Pagos_IDProveedor ON Pagos (IDProveedor);
CREATE INDEX NDX_Pagos_IDDireccion ON Pagos (IDDireccion);
CREATE INDEX NDX_Pagos_IDTipoDocumento ON Pagos (IDTipoDocumento);
CREATE INDEX NDX_Pagos_Ejercicio ON Pagos (Ejercicio);
CREATE INDEX NDX_Pagos_IDSerie ON Pagos (IDSerie);
CREATE INDEX NDX_Pagos_Numero ON Pagos (Numero);
CREATE INDEX NDX_Pagos_Documento ON Pagos (Documento);
CREATE INDEX NDX_Pagos_Orden ON Pagos (Orden);
CREATE INDEX NDX_Pagos_FechaHoraEmision ON Pagos (FechaHoraEmision);
CREATE INDEX NDX_Pagos_FechaVencimiento ON Pagos (FechaVencimiento);
CREATE INDEX NDX_Pagos_IDTipoEfecto ON Pagos (IDTipoEfecto);
CREATE INDEX NDX_Pagos_Pagado ON Pagos (Pagado);
CREATE INDEX NDX_Pagos_IDRemesa ON Pagos (IDRemesa);
CREATE INDEX NDX_Pagos_EstadoEnvio ON Pagos (EstadoEnvio);



-- --------------------------------------------------------------------------------------------------------------
-- PagosLineas
-- --------------------------------------------------------------------------------------------------------------
-- + IDRemesa

ALTER TABLE PagosLineas ADD IDRemesa VARCHAR(128);

CREATE INDEX NDX_PagosLineas_IDRemesa ON PagosLineas (IDRemesa);



-- --------------------------------------------------------------------------------------------------------------
-- Bancos
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE Bancos (
    ID                                VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoBanco                       VARCHAR (10),
    Nombre                            VARCHAR (40),
    Telefono                          VARCHAR (16),
    Email                             VARCHAR (100),
    PersonaContacto                   VARCHAR (40),
    IBAN                              VARCHAR (34),
    BIC                               VARCHAR (11),
    IDContrapartida                   VARCHAR (128),
    IDContrapartidaEfectosDescontados VARCHAR (128),
    NIFPresentador                    VARCHAR (15),
    NombrePresentador                 VARCHAR (40),
    SufijoPresentador                 VARCHAR (3),
    NIFOrdenante                      VARCHAR (15),
    NombreOrdenante                   VARCHAR (40),
    SufijoOrdenante                   VARCHAR (3) 
);

CREATE UNIQUE INDEX NDX_Bancos_CodigoBanco ON Bancos (CodigoBanco);
CREATE INDEX NDX_Bancos_Nombre ON Bancos (Nombre);



-- --------------------------------------------------------------------------------------------------------------
-- TiposEfectos
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE TiposEfectos (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoTipoEfecto VARCHAR (10),
    Descripcion      VARCHAR (40) 
);

CREATE UNIQUE INDEX NDX_TiposEfectos_CodigoTipoEfecto ON TiposEfectos (CodigoTipoEfecto);
CREATE INDEX NDX_TiposEfectos_Descripcion ON TiposEfectos (Descripcion);



-- --------------------------------------------------------------------------------------------------------------
-- TiposRemesas
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE TiposRemesas (
    ID                                   VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoTipoRemesa                     VARCHAR (10),
    Descripcion                          VARCHAR (40),
    Tipo                                 INTEGER,
    Norma                                INTEGER,
    IDTipoEfecto                         VARCHAR (128),
    GuardarPrevisionesEfectosDescontados INTEGER,
    IDFormaCobro                         VARCHAR (128) 
);

CREATE UNIQUE INDEX NDX_TiposRemesas_CodigoTipoRemesa ON TiposRemesas (CodigoTipoRemesa);
CREATE INDEX NDX_TiposRemesas_Tipo ON TiposRemesas (Tipo);
CREATE INDEX NDX_TiposRemesas_Descripcion ON TiposRemesas (Descripcion);



-- --------------------------------------------------------------------------------------------------------------
-- Remesas
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE Remesas (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    Tipo             INTEGER,
    Numero           INTEGER,
    IDTipoRemesa     VARCHAR (128),
    FechaEmision     DATE,
    FechaVencimiento DATE,
    IDBanco          VARCHAR (128),
    Generada         INTEGER,
    Contabilizada    INTEGER,
    Estado           INTEGER
);

CREATE UNIQUE INDEX NDX_Remesas_UNIQUE ON Remesas (Tipo, Numero);
CREATE INDEX NDX_Remesas_Tipo ON Remesas (Tipo);
CREATE INDEX NDX_Remesas_Numero ON Remesas (Numero);
CREATE INDEX NDX_Remesas_IDTipoRemesa ON Remesas (IDTipoRemesa);
CREATE INDEX NDX_Remesas_FechaEmision ON Remesas (FechaEmision);
CREATE INDEX NDX_Remesas_FechaVencimiento ON Remesas (FechaVencimiento);
CREATE INDEX NDX_Remesas_Generada ON Remesas (Generada);
CREATE INDEX NDX_Remesas_Contabilizada ON Remesas (Contabilizada);
CREATE INDEX NDX_Remesas_Estado ON Remesas (Estado);



-- --------------------------------------------------------------------------------------------------------------
-- RemesasTmp
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE RemesasTmp (
    ID               VARCHAR (128) PRIMARY KEY UNIQUE,
    Tipo             INTEGER,
    Numero           INTEGER,
    IDTipoRemesa     VARCHAR (128),
    FechaEmision     DATE,
    FechaVencimiento DATE,
    IDBanco          VARCHAR (128),
    Generada         INTEGER,
    Contabilizada    INTEGER,
    Estado           INTEGER
);

CREATE INDEX NDX_RemesasTmp_Tipo ON RemesasTmp (Tipo);
CREATE INDEX NDX_RemesasTmp_Numero ON RemesasTmp (Numero);
CREATE INDEX NDX_RemesasTmp_IDTipoRemesa ON RemesasTmp (IDTipoRemesa);
CREATE INDEX NDX_RemesasTmp_FechaEmision ON RemesasTmp (FechaEmision);
CREATE INDEX NDX_RemesasTmp_FechaVencimiento ON RemesasTmp (FechaVencimiento);
CREATE INDEX NDX_RemesasTmp_Generada ON RemesasTmp (Generada);
CREATE INDEX NDX_RemesasTmp_Contabilizada ON RemesasTmp (Contabilizada);
CREATE INDEX NDX_RemesasTmp_Estado ON RemesasTmp (Estado);



-- --------------------------------------------------------------------------------------------------------------
-- RemesasLineas
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE IF NOT EXISTS RemesasLineas (
    ID VARCHAR (128) PRIMARY KEY UNIQUE, 
    IDRemesa VARCHAR (128), 
    IDCobroPago VARCHAR (128), 
    Concepto VARCHAR (50), 
    IDClienteProveedor VARCHAR (128), 
    FechaVencimiento DATE, 
    Importe REAL
);

CREATE INDEX NDX_RemesasLineas_IDRemesa ON RemesasLineas (IDRemesa);
CREATE INDEX NDX_RemesasLineas_IDCobroPago ON RemesasLineas (IDCobroPago);
CREATE INDEX NDX_RemesasLineas_Concepto ON RemesasLineas (Concepto);
CREATE INDEX NDX_RemesasLineas_IDClienteProveedor ON RemesasLineas (IDClienteProveedor);
CREATE INDEX NDX_RemesasLineas_FechaVencimiento ON RemesasLineas (FechaVencimiento);



-- --------------------------------------------------------------------------------------------------------------
-- RemesasLineasTmp
-- --------------------------------------------------------------------------------------------------------------
-- Nueva tabla

CREATE TABLE IF NOT EXISTS RemesasLineasTmp (
    ID VARCHAR (128) PRIMARY KEY UNIQUE, 
    IDRemesa VARCHAR (128), 
    IDCobroPago VARCHAR (128), 
    Concepto VARCHAR (50), 
    IDClienteProveedor VARCHAR (128), 
    FechaVencimiento DATE, 
    Importe REAL
);

CREATE INDEX NDX_RemesasLineasTmp_IDRemesa ON RemesasLineasTmp (IDRemesa);
CREATE INDEX NDX_RemesasLineasTmp_IDCobroPago ON RemesasLineasTmp (IDCobroPago);
CREATE INDEX NDX_RemesasLineasTmp_Concepto ON RemesasLineasTmp (Concepto);
CREATE INDEX NDX_RemesasLineasTmp_IDClienteProveedor ON RemesasLineasTmp (IDClienteProveedor);
CREATE INDEX NDX_RemesasLineasTmp_FechaVencimiento ON RemesasLineasTmp (FechaVencimiento);

