
-- --------------------------------------------------------------------------------------------------------------
--  Clientes
-- --------------------------------------------------------------------------------------------------------------

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),
    Skype                                                    VARCHAR (100),
    WEB                                                      VARCHAR (40),
    IDRepresentante                                          VARCHAR (128),
    IDTransportista                                          VARCHAR (128),
    IDGrupoCliente                                           VARCHAR (128),
    IDActividad                                              VARCHAR (128),   /* NUEVO CAMPO */
    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),
                                                                            /* QUITAR CAMPO ClienteProspeccion */
    CuentaContable                                           VARCHAR (12),
    EstadoAutorizacion                                       INTEGER,       /* NUEVO CAMPO */
    FechaAutorizacion                                        DATE,          /* NUEVO CAMPO */
    EstadoEnvio                                              INTEGER,       /* CAMBIO DE POSICIÓN */
    FechaAlta                                                DATE           /* NUEVO CAMPO */
);

INSERT INTO Clientes (
    ID,
    CodigoCliente,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    Skype,
    WEB,
    IDRepresentante,
    IDTransportista,
    IDGrupoCliente,
    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,
    EstadoEnvio
)
SELECT 
    ID,
    CodigoCliente,
    NIF,
    NombreComercial,
    NombreFiscal,
    Domicilio,
    CodigoPostal,
    Poblacion,
    Provincia,
    Pais,
    Telefono1,
    Telefono2,
    Movil,
    WhatsApp,
    Email,
    Skype,
    WEB,
    IDRepresentante,
    IDTransportista,
    IDGrupoCliente,
    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,
    EstadoEnvio
FROM _Clientes;

DROP TABLE IF EXISTS _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_FechaAlta ON Clientes (FechaAlta);



-- --------------------------------------------------------------------------------------------------------------
--  DireccionesClientes
-- --------------------------------------------------------------------------------------------------------------

ALTER TABLE DireccionesClientes ADD COLUMN Observaciones TEXT;



-- --------------------------------------------------------------------------------------------------------------
--  ClientePotenciales
-- --------------------------------------------------------------------------------------------------------------
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),
    Skype                                                    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,     
    FechaAlta                                                DATE           
);

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_FechaAlta ON ClientesPotenciales (FechaAlta);




-- --------------------------------------------------------------------------------------------------------------
--  DireccionesClientesPotenciales
-- --------------------------------------------------------------------------------------------------------------
CREATE TABLE DireccionesClientesPotenciales (
    ID                          VARCHAR (128) PRIMARY KEY UNIQUE,
    IDClientePotencial          VARCHAR (128),
    Linea                       INTEGER,
    Nombre                      VARCHAR (40),
    Domicilio                   VARCHAR (40),
    CodigoPostal                VARCHAR (10),
    Poblacion                   VARCHAR (30),
    Provincia                   VARCHAR (30),
    Pais                        VARCHAR (2),
    Telefono                    VARCHAR (16),
    Email                       VARCHAR (100),
    Latitud                     REAL,
    Longitud                    REAL,
    Observaciones               TEXT
);

CREATE UNIQUE INDEX NDX_DireccionesClientesPotenciales_UNIQUE ON DireccionesClientesPotenciales (IDClientePotencial, Linea);
CREATE INDEX NDX_DireccionesClientesPotenciales_IDClientePotencial ON DireccionesClientesPotenciales (IDClientePotencial);
CREATE INDEX NDX_DireccionesClientesPotenciales_Linea ON DireccionesClientesPotenciales (Linea);
CREATE INDEX NDX_DireccionesClientesPotenciales_Nombre ON DireccionesClientesPotenciales (Nombre);
CREATE INDEX NDX_DireccionesClientesPotenciales_Telefono ON DireccionesClientesPotenciales (Telefono);




-- --------------------------------------------------------------------------------------------------------------
--  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),
    Skype                       VARCHAR (100),
    Observaciones               TEXT 
);

CREATE UNIQUE INDEX NDX_ContactosClientesPotenciales_UNIQUE ON ContactosClientesPotenciales (IDClientePotencial, Linea);
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);




-- --------------------------------------------------------------------------------------------------------------
--  RutasClientes
-- --------------------------------------------------------------------------------------------------------------
DROP TABLE IF EXISTS _RutasClientes;
CREATE TEMPORARY TABLE _RutasClientes AS SELECT * FROM RutasClientes;

DROP TABLE RutasClientes;

CREATE TABLE RutasClientes (
    ID                    VARCHAR (128) PRIMARY KEY UNIQUE,
    IDRuta                VARCHAR (128),
    Orden                 INTEGER,
    ClientePotencial      INTEGER,   /* NUEVO CAMPO */
    IDCliente             VARCHAR (128),
    IDDireccion           VARCHAR (128) 
);

INSERT INTO RutasClientes (
    ID,
    IDRuta,
    Orden,
    ClientePotencial,
    IDCliente,
    IDDireccion
)
SELECT 
    ID,
    IDRuta,
    Orden,
    0,              /* ClientePotencial */
    IDCliente,
    IDDireccion
FROM _RutasClientes;

DROP TABLE IF EXISTS _RutasClientes;

CREATE UNIQUE INDEX NDX_RutasClientes_UNIQUE ON RutasClientes (IDRuta, ClientePotencial, IDCliente, IDDireccion); 
CREATE INDEX NDX_RutasClientes_IDRuta ON RutasClientes (IDRuta); 
CREATE INDEX NDX_RutasClientes_ClientePotencial ON RutasClientes (ClientePotencial); 
CREATE INDEX NDX_RutasClientes_IDCliente ON RutasClientes (IDCliente); 
CREATE INDEX NDX_RutasClientes_IDDireccion ON RutasClientes (IDDireccion); 
CREATE INDEX NDX_RutasClientes_Orden ON RutasClientes (Orden); 
CREATE INDEX NDX_RutasClientes_Com_Cliente ON RutasClientes (ClientePotencial, IDCliente);



-- --------------------------------------------------------------------------------------------------------------
--  RutasSeguimientosLineas
-- --------------------------------------------------------------------------------------------------------------

DROP TABLE IF EXISTS _RutasSeguimientosLineas;
CREATE TEMPORARY TABLE _RutasSeguimientosLineas AS SELECT * FROM RutasSeguimientosLineas;

DROP TABLE RutasSeguimientosLineas;

CREATE TABLE RutasSeguimientosLineas (
    ID                    VARCHAR (128) PRIMARY KEY UNIQUE,
    IDRutaSeguimiento     VARCHAR (128),
    ClientePotencial      INTEGER,          /* NUEVO CAMPO */
    IDCliente             VARCHAR (128),
    IDDireccion           VARCHAR (128),
    TipoRegistro          VARCHAR (40),
    IDRegistro            VARCHAR (128),
    FechaHora             DATETIME
);

INSERT INTO RutasSeguimientosLineas (
    ID,
    IDRutaSeguimiento,
    ClientePotencial,
    IDCliente,
    IDDireccion,
    TipoRegistro,
    IDRegistro,
    FechaHora
)
SELECT 
    ID,
    IDRutaSeguimiento,
    0,                  /* ClientePotencial */
    IDCliente,
    IDDireccion,
    TipoRegistro,
    IDRegistro,
    FechaHora
FROM _RutasSeguimientosLineas;

DROP TABLE IF EXISTS _RutasSeguimientosLineas;

CREATE INDEX NDX_RutasSeguimientosLineas_IDRutaSeguimiento ON RutasSeguimientosLineas (IDRutaSeguimiento); 
CREATE INDEX NDX_RutasSeguimientosLineas_ClientePotencial ON RutasSeguimientosLineas (ClientePotencial); 
CREATE INDEX NDX_RutasSeguimientosLineas_IDCliente ON RutasSeguimientosLineas (IDCliente); 
CREATE INDEX NDX_RutasSeguimientosLineas_IDDireccion ON RutasSeguimientosLineas (IDDireccion); 
CREATE INDEX NDX_RutasSeguimientosLineas_TipoRegistro ON RutasSeguimientosLineas (TipoRegistro); 
CREATE INDEX NDX_RutasSeguimientosLineas_IDRegistro ON RutasSeguimientosLineas (IDRegistro); 
CREATE INDEX NDX_RutasSeguimientosLineas_Com_Cliente ON RutasSeguimientosLineas (ClientePotencial, IDCliente); 
CREATE INDEX NDX_RutasSeguimientosLineas_Com_ClienteDireccion ON RutasSeguimientosLineas (ClientePotencial, IDCliente, IDDireccion); 
CREATE INDEX NDX_RutasSeguimientosLineas_Com_ContadorRegistros ON RutasSeguimientosLineas (IDRutaSeguimiento, TipoRegistro); 



-- --------------------------------------------------------------------------------------------------------------
--  Proveedores
-- --------------------------------------------------------------------------------------------------------------

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),
    Skype                     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,
    FechaAlta                 DATE
);

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

DROP TABLE IF EXISTS _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_FechaAlta ON Proveedores (FechaAlta);



-- --------------------------------------------------------------------------------------------------------------
--  DireccionesProveedores
-- --------------------------------------------------------------------------------------------------------------
ALTER TABLE DireccionesProveedores ADD COLUMN Observaciones TEXT;



-- --------------------------------------------------------------------------------------------------------------
--  GruposProveedores
-- --------------------------------------------------------------------------------------------------------------
CREATE TABLE GruposProveedores (
    ID                      VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoGrupoProveedor    VARCHAR (10) UNIQUE,
    Descripcion             VARCHAR (40)
);

CREATE INDEX NDX_GruposProveedores_Descripcion ON GruposProveedores (Descripcion);



-- --------------------------------------------------------------------------------------------------------------
--  TiposIVA
-- --------------------------------------------------------------------------------------------------------------
ALTER TABLE TiposIVA ADD COLUMN CuentaRepercutido VARCHAR(10);
ALTER TABLE TiposIVA ADD COLUMN CuentaSoportado VARCHAR(10);



-- --------------------------------------------------------------------------------------------------------------
--  Representantes
-- --------------------------------------------------------------------------------------------------------------
ALTER TABLE Representantes ADD COLUMN Observaciones TEXT;



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

DROP TABLE Productos;

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

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

DROP TABLE IF EXISTS _Productos;

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

-- --------------------------------------------------------------------------------------------------------------
--  ProductosPreciosCompra
-- --------------------------------------------------------------------------------------------------------------

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

DROP TABLE ProductosPreciosCompra;

CREATE TABLE ProductosPreciosCompra (
    ID                VARCHAR (128) PRIMARY KEY UNIQUE,
    IDProducto        VARCHAR (128),
    IDProveedor       VARCHAR (128),  /* NUEVO CAMPO */
    IDAgrupacion      VARCHAR (128),
    IDValorPropiedad1 VARCHAR (128),
    IDValorPropiedad2 VARCHAR (128),
    IDValorPropiedad3 VARCHAR (128),
    PrecioCompra      REAL,         
    Descuento1Compra  REAL,           /* DescuentoCompra -> Descuento1Compra */
    Descuento2Compra  REAL,           /* NUEVO CAMPO */
    GastosCompra      REAL,
    MargenVenta       REAL,
    CosteManual       REAL
);

INSERT INTO ProductosPreciosCompra (
    ID,
    IDProducto,
    IDProveedor, 
    IDAgrupacion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    PrecioCompra,
    Descuento1Compra, 
    Descuento2Compra, 
    GastosCompra,
    MargenVenta,
    CosteManual
)
SELECT 
    ID,
    IDProducto,
    null,               /* IDProveedor */            
    IDAgrupacion,
    IDValorPropiedad1,
    IDValorPropiedad2,
    IDValorPropiedad3,
    PrecioCompra,
    DescuentoCompra,    /* Descuento1Compra */     
    0,                  /* Descuento2Compra */    
    GastosCompra,
    MargenVenta,
    CosteManual
FROM _ProductosPreciosCompra;

DROP TABLE IF EXISTS _ProductosPreciosCompra;

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



-- --------------------------------------------------------------------------------------------------------------
--  PreciosEspecialesLineas
-- --------------------------------------------------------------------------------------------------------------

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,
    AplicarIDTarifa          VARCHAR (128),
    UnidadesDesde            REAL,
    UnidadesHasta            REAL,
    ImporteBonificacion      REAL,
    UnidadesBaseRegalo       REAL,
    UnidadesRegaladas        REAL,
    IDProductoRegalado       VARCHAR (128),
    UnidadesBaseSinCargo     REAL,                /* NUEVO CAMPO */     
    UnidadesSinCargo         REAL,                /* NUEVO CAMPO */     
    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,
    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,
    Referencia
FROM _PreciosEspecialesLineas;

DROP TABLE IF EXISTS _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_OrderBySelectPrecio ON PreciosEspecialesLineas (ValorCriterio1, ValorCriterio2, ValorCriterio3, ValorCriterio4, ValorCriterio5, UnidadesDesde, UnidadesHasta);

-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  TiposDocumento
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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

DROP TABLE TiposDocumento;

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

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

DROP TABLE IF EXISTS _TiposDocumento;

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

-- Permitir clientes potenciales a los presupuestos de venta
UPDATE TiposDocumento SET PermitirClientesPotenciales=1 WHERE ID = 'PRV';

-- No calcular importes en Cargas iniciales, recargas y descargas
UPDATE TiposDocumento SET NoCalcularImportes=1 WHERE TipoMovimiento IN (2,3,4);


-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  Visitas
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

DROP TABLE IF EXISTS _Visitas;
CREATE TEMPORARY TABLE _Visitas AS SELECT * FROM Visitas;

DROP TABLE Visitas;

CREATE TABLE Visitas (
    ID                   VARCHAR (128) PRIMARY KEY UNIQUE,
    FechaHoraInicio      DATETIME,
    FechaHoraFin         DATETIME,
    ClientePotencial     INTEGER,
    IDCliente            VARCHAR (128),
    IDDireccion          VARCHAR (128),
    Contacto             VARCHAR (30),
    IDMedioVisita        VARCHAR (128),
    IDMotivoVisita       VARCHAR (128),
    IDResultadoVisita    VARCHAR (128),
    IDRepresentante      VARCHAR (128),
    IDOportunidad        VARCHAR (128),
    Observaciones        TEXT,
    InformacionAdicional TEXT,
    EstadoEnvio          INTEGER
);

INSERT INTO Visitas (
    ID,
    FechaHoraInicio,
    FechaHoraFin,
    ClientePotencial, 
    IDCliente, 
    IDDireccion,
    Contacto,
    IDMedioVisita,
    IDMotivoVisita,
    IDResultadoVisita,
    IDRepresentante,
    Observaciones,
    InformacionAdicional,
    EstadoEnvio
)
SELECT 
    ID,
    FechaHoraInicio,
    FechaHoraFin,
    0,                    /* ClientePotencial */
    IDCliente,
    IDDireccion,
    Contacto,
    IDMedioVisita,
    IDMotivoVisita,
    IDResultadoVisita,
    IDRepresentante,
    Observaciones,
    InformacionAdicional,
    EstadoEnvio
FROM _Visitas;

DROP TABLE IF EXISTS _Visitas;

CREATE INDEX NDX_Visitas_FechaHoraInicio ON Visitas (FechaHoraInicio);
CREATE INDEX NDX_Visitas_FechaHoraFin ON Visitas (FechaHoraFin);
CREATE INDEX NDX_Visitas_ClientePotencial ON Visitas (ClientePotencial);
CREATE INDEX NDX_Visitas_IDCliente ON Visitas (IDCliente);
CREATE INDEX NDX_Visitas_IDDireccion ON Visitas (IDDireccion);
CREATE INDEX NDX_Visitas_IDMedioVisita ON Visitas (IDMedioVisita);
CREATE INDEX NDX_Visitas_IDMotivoVisita ON Visitas (IDMotivoVisita);
CREATE INDEX NDX_Visitas_IDResultadoVisita ON Visitas (IDResultadoVisita);
CREATE INDEX NDX_Visitas_IDRepresentante ON Visitas (IDRepresentante);
CREATE INDEX NDX_Visitas_IDOportunidad ON Visitas (IDOportunidad);
CREATE INDEX NDX_Visitas_EstadoEnvio ON Visitas (EstadoEnvio);
CREATE INDEX NDX_Visitas_Com_Cliente ON Visitas (ClientePotencial, IDCliente);
CREATE INDEX NDX_Visitas_Com_ClienteDireccion ON Visitas (ClientePotencial, IDCliente, IDDireccion);

-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  Cabeceras
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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,           /* NUEVO CAMPO */
    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),
    IDRepresentante            VARCHAR (128),
    IDTransportista            VARCHAR (128),
    IDOportunidad              VARCHAR (128),       /* NUEVO CAMPO */
    IDFormaPago                VARCHAR (128),
    Recibos                    INTEGER,
    DiasPrimero                INTEGER,
    DiasResto                  INTEGER,
    ImporteBruto               REAL,
    DescuentoComercial         REAL,
    ImporteDescuentoComercial  REAL,
    DescuentoProntoPago        REAL,
    ImporteDescuentoProntoPago REAL,
    Retencion                  REAL,
    ImporteRetencion           REAL,
    RegimenIVA                 INTEGER,
    IDTipoIVA1                 VARCHAR (128),
    IDTipoIVA2                 VARCHAR (128),
    IDTipoIVA3                 VARCHAR (128),
    IDTipoIVA4                 VARCHAR (128),
    IDTipoIVA5                 VARCHAR (128),
    IDTipoIVA6                 VARCHAR (128),
    BaseImponible1             REAL,
    BaseImponible2             REAL,
    BaseImponible3             REAL,
    BaseImponible4             REAL,
    BaseImponible5             REAL,
    BaseImponible6             REAL,
    PorcentajeIVA1             REAL,
    PorcentajeIVA2             REAL,
    PorcentajeIVA3             REAL,
    PorcentajeIVA4             REAL,
    PorcentajeIVA5             REAL,
    PorcentajeIVA6             REAL,
    CuotaIVA1                  REAL,
    CuotaIVA2                  REAL,
    CuotaIVA3                  REAL,
    CuotaIVA4                  REAL,
    CuotaIVA5                  REAL,
    CuotaIVA6                  REAL,
    PorcentajeRecargo1         REAL,
    PorcentajeRecargo2         REAL,
    PorcentajeRecargo3         REAL,
    PorcentajeRecargo4         REAL,
    PorcentajeRecargo5         REAL,
    PorcentajeRecargo6         REAL,
    CuotaRecargo1              REAL,
    CuotaRecargo2              REAL,
    CuotaRecargo3              REAL,
    CuotaRecargo4              REAL,
    CuotaRecargo5              REAL,
    CuotaRecargo6              REAL,
    ImporteBases               REAL,
    ImporteCuotas              REAL,
    ImporteTasas               REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    FechaHoraCreacion          DATETIME
);

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

DROP TABLE IF EXISTS _Cabeceras;

CREATE INDEX NDX_Cabeceras_IDTipoDocumento ON Cabeceras (IDTipoDocumento);
CREATE INDEX NDX_Cabeceras_TipoMovimiento ON Cabeceras (TipoMovimiento);
CREATE INDEX NDX_Cabeceras_Ejercicio ON Cabeceras (Ejercicio);
CREATE INDEX NDX_Cabeceras_IDSerie ON Cabeceras (IDSerie);
CREATE INDEX NDX_Cabeceras_CodigoSerie ON Cabeceras (CodigoSerie);
CREATE INDEX NDX_Cabeceras_Numero ON Cabeceras (Numero);
CREATE INDEX NDX_Cabeceras_Documento ON Cabeceras (Documento);
CREATE INDEX NDX_Cabeceras_FechaHora ON Cabeceras (FechaHora);
CREATE INDEX NDX_Cabeceras_ClientePotencial ON Cabeceras (ClientePotencial);
CREATE INDEX NDX_Cabeceras_IDClienteProveedor ON Cabeceras (IDClienteProveedor);
CREATE INDEX NDX_Cabeceras_CodigoClienteProveedor ON Cabeceras (CodigoClienteProveedor);
CREATE INDEX NDX_Cabeceras_IDDireccion ON Cabeceras (IDDireccion);
CREATE INDEX NDX_Cabeceras_Referencia ON Cabeceras (Referencia);
CREATE INDEX NDX_Cabeceras_NIF ON Cabeceras (NIF);
CREATE INDEX NDX_Cabeceras_NombreComercial ON Cabeceras (NombreComercial);
CREATE INDEX NDX_Cabeceras_NombreFiscal ON Cabeceras (NombreFiscal);
CREATE INDEX NDX_Cabeceras_IDAlmacen ON Cabeceras (IDAlmacen);
CREATE INDEX NDX_Cabeceras_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_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
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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,           /* NUEVO CAMPO */
    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),
    IDRepresentante            VARCHAR (128),
    IDTransportista            VARCHAR (128),
    IDOportunidad              VARCHAR (128),       /* NUEVO CAMPO */
    IDFormaPago                VARCHAR (128),
    Recibos                    INTEGER,
    DiasPrimero                INTEGER,
    DiasResto                  INTEGER,
    ImporteBruto               REAL,
    DescuentoComercial         REAL,
    ImporteDescuentoComercial  REAL,
    DescuentoProntoPago        REAL,
    ImporteDescuentoProntoPago REAL,
    Retencion                  REAL,
    ImporteRetencion           REAL,
    RegimenIVA                 INTEGER,
    IDTipoIVA1                 VARCHAR (128),
    IDTipoIVA2                 VARCHAR (128),
    IDTipoIVA3                 VARCHAR (128),
    IDTipoIVA4                 VARCHAR (128),
    IDTipoIVA5                 VARCHAR (128),
    IDTipoIVA6                 VARCHAR (128),
    BaseImponible1             REAL,
    BaseImponible2             REAL,
    BaseImponible3             REAL,
    BaseImponible4             REAL,
    BaseImponible5             REAL,
    BaseImponible6             REAL,
    PorcentajeIVA1             REAL,
    PorcentajeIVA2             REAL,
    PorcentajeIVA3             REAL,
    PorcentajeIVA4             REAL,
    PorcentajeIVA5             REAL,
    PorcentajeIVA6             REAL,
    CuotaIVA1                  REAL,
    CuotaIVA2                  REAL,
    CuotaIVA3                  REAL,
    CuotaIVA4                  REAL,
    CuotaIVA5                  REAL,
    CuotaIVA6                  REAL,
    PorcentajeRecargo1         REAL,
    PorcentajeRecargo2         REAL,
    PorcentajeRecargo3         REAL,
    PorcentajeRecargo4         REAL,
    PorcentajeRecargo5         REAL,
    PorcentajeRecargo6         REAL,
    CuotaRecargo1              REAL,
    CuotaRecargo2              REAL,
    CuotaRecargo3              REAL,
    CuotaRecargo4              REAL,
    CuotaRecargo5              REAL,
    CuotaRecargo6              REAL,
    ImporteBases               REAL,
    ImporteCuotas              REAL,
    ImporteTasas               REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    FechaHoraCreacion          DATETIME
);

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

DROP TABLE IF EXISTS _CabecerasTmp;

CREATE INDEX NDX_CabecerasTmp_IDTipoDocumento ON CabecerasTmp (IDTipoDocumento);
CREATE INDEX NDX_CabecerasTmp_TipoMovimiento ON CabecerasTmp (TipoMovimiento);
CREATE INDEX NDX_CabecerasTmp_Ejercicio ON CabecerasTmp (Ejercicio);
CREATE INDEX NDX_CabecerasTmp_IDSerie ON CabecerasTmp (IDSerie);
CREATE INDEX NDX_CabecerasTmp_CodigoSerie ON CabecerasTmp (CodigoSerie);
CREATE INDEX NDX_CabecerasTmp_Numero ON CabecerasTmp (Numero);
CREATE INDEX NDX_CabecerasTmp_Documento ON CabecerasTmp (Documento);
CREATE INDEX NDX_CabecerasTmp_FechaHora ON CabecerasTmp (FechaHora);
CREATE INDEX NDX_CabecerasTmp_ClientePotencial ON CabecerasTmp (ClientePotencial);
CREATE INDEX NDX_CabecerasTmp_IDClienteProveedor ON CabecerasTmp (IDClienteProveedor);
CREATE INDEX NDX_CabecerasTmp_CodigoClienteProveedor ON CabecerasTmp (CodigoClienteProveedor);
CREATE INDEX NDX_CabecerasTmp_IDDireccion ON CabecerasTmp (IDDireccion);
CREATE INDEX NDX_CabecerasTmp_Referencia ON CabecerasTmp (Referencia);
CREATE INDEX NDX_CabecerasTmp_NIF ON CabecerasTmp (NIF);
CREATE INDEX NDX_CabecerasTmp_NombreComercial ON CabecerasTmp (NombreComercial);
CREATE INDEX NDX_CabecerasTmp_NombreFiscal ON CabecerasTmp (NombreFiscal);
CREATE INDEX NDX_CabecerasTmp_IDAlmacen ON CabecerasTmp (IDAlmacen);
CREATE INDEX NDX_CabecerasTmp_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_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
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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,           /* NUEVO CAMPO */
    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),
    IDRepresentante            VARCHAR (128),
    IDTransportista            VARCHAR (128),
    IDOportunidad              VARCHAR (128),       /* NUEVO CAMPO */
    IDFormaPago                VARCHAR (128),
    Recibos                    INTEGER,
    DiasPrimero                INTEGER,
    DiasResto                  INTEGER,
    ImporteBruto               REAL,
    DescuentoComercial         REAL,
    ImporteDescuentoComercial  REAL,
    DescuentoProntoPago        REAL,
    ImporteDescuentoProntoPago REAL,
    Retencion                  REAL,
    ImporteRetencion           REAL,
    RegimenIVA                 INTEGER,
    IDTipoIVA1                 VARCHAR (128),
    IDTipoIVA2                 VARCHAR (128),
    IDTipoIVA3                 VARCHAR (128),
    IDTipoIVA4                 VARCHAR (128),
    IDTipoIVA5                 VARCHAR (128),
    IDTipoIVA6                 VARCHAR (128),
    BaseImponible1             REAL,
    BaseImponible2             REAL,
    BaseImponible3             REAL,
    BaseImponible4             REAL,
    BaseImponible5             REAL,
    BaseImponible6             REAL,
    PorcentajeIVA1             REAL,
    PorcentajeIVA2             REAL,
    PorcentajeIVA3             REAL,
    PorcentajeIVA4             REAL,
    PorcentajeIVA5             REAL,
    PorcentajeIVA6             REAL,
    CuotaIVA1                  REAL,
    CuotaIVA2                  REAL,
    CuotaIVA3                  REAL,
    CuotaIVA4                  REAL,
    CuotaIVA5                  REAL,
    CuotaIVA6                  REAL,
    PorcentajeRecargo1         REAL,
    PorcentajeRecargo2         REAL,
    PorcentajeRecargo3         REAL,
    PorcentajeRecargo4         REAL,
    PorcentajeRecargo5         REAL,
    PorcentajeRecargo6         REAL,
    CuotaRecargo1              REAL,
    CuotaRecargo2              REAL,
    CuotaRecargo3              REAL,
    CuotaRecargo4              REAL,
    CuotaRecargo5              REAL,
    CuotaRecargo6              REAL,
    ImporteBases               REAL,
    ImporteCuotas              REAL,
    ImporteTasas               REAL,
    ImporteTotal               REAL,
    ImporteComision            REAL,
    Observaciones              TEXT,
    EstadoEnvio                INTEGER,
    EstadoCarga                INTEGER,
    Emitido                    INTEGER,
    Servido                    INTEGER,
    Traspasado                 INTEGER,
    Abonado                    INTEGER,
    FechaHoraCreacion          DATETIME
);

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

DROP TABLE IF EXISTS _HCabeceras;

CREATE INDEX NDX_HCabeceras_IDTipoDocumento ON HCabeceras (IDTipoDocumento);
CREATE INDEX NDX_HCabeceras_TipoMovimiento ON HCabeceras (TipoMovimiento);
CREATE INDEX NDX_HCabeceras_Ejercicio ON HCabeceras (Ejercicio);
CREATE INDEX NDX_HCabeceras_IDSerie ON HCabeceras (IDSerie);
CREATE INDEX NDX_HCabeceras_CodigoSerie ON HCabeceras (CodigoSerie);
CREATE INDEX NDX_HCabeceras_Numero ON HCabeceras (Numero);
CREATE INDEX NDX_HCabeceras_Documento ON HCabeceras (Documento);
CREATE INDEX NDX_HCabeceras_FechaHora ON HCabeceras (FechaHora);
CREATE INDEX NDX_HCabeceras_ClientePotencial ON HCabeceras (ClientePotencial);
CREATE INDEX NDX_HCabeceras_IDClienteProveedor ON HCabeceras (IDClienteProveedor);
CREATE INDEX NDX_HCabeceras_CodigoClienteProveedor ON HCabeceras (CodigoClienteProveedor);
CREATE INDEX NDX_HCabeceras_IDDireccion ON HCabeceras (IDDireccion);
CREATE INDEX NDX_HCabeceras_Referencia ON HCabeceras (Referencia);
CREATE INDEX NDX_HCabeceras_NIF ON HCabeceras (NIF);
CREATE INDEX NDX_HCabeceras_NombreComercial ON HCabeceras (NombreComercial);
CREATE INDEX NDX_HCabeceras_NombreFiscal ON HCabeceras (NombreFiscal);
CREATE INDEX NDX_HCabeceras_IDAlmacen ON HCabeceras (IDAlmacen);
CREATE INDEX NDX_HCabeceras_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_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
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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),
	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,             /* NUEVO CAMPO */
	UnidadesServidas              REAL,
	UnidadesAbonadas              REAL,
	UnidadesBase                  REAL,
	CalcularImporteXPeso          INTEGER,
	PesoUnitario                  REAL,
	Peso                          REAL,
	PesoServido                   REAL,
	PesoAbonado                   REAL,
	Precio                        REAL,
	Descuento1                    REAL,
	AplicarDescuento1EnEuros      INTEGER,
	ImporteDescuento1             REAL,
	Descuento2                    REAL,
	AplicarDescuento2EnEuros      INTEGER,
	ImporteDescuento2             REAL,
	Descuento3                    REAL,
	AplicarDescuento3EnEuros      INTEGER,
	ImporteDescuento3             REAL,
	OrigenPrecio                  INTEGER,
	IDTasa                        VARCHAR (128),
	Tasa                          REAL,
	AplicarTasaEnPorcentaje       INTEGER,
	ImporteTasa                   REAL,
	ImporteBruto                  REAL,
	ImporteNeto                   REAL,
	Comision                      REAL,
	AplicarComisionEnEuros        INTEGER,
	ImporteComision               REAL,
	PrecioCoste                   REAL,
	IDTipoIVA                     VARCHAR (128),
	PorcentajeIVA                 REAL,
	PorcentajeRecargo             REAL,
	ClientePotencial              INTEGER,				/* NUEVO CAMPO */
	IDClienteProveedor            VARCHAR (128),
	IDDireccion                   VARCHAR (128),
	FechaHora                     DATETIME,
	Descripcion                   TEXT,
	TipoLinea                     VARCHAR (1),
	IDTipoAbono                   VARCHAR (128),
	ActualizarStock               INTEGER,
	HoraInicio                    TIME,
	HoraFinal                     TIME,
	TipoCalculoUnidades           INTEGER,
	IDTarifa                      VARCHAR (128),
	ReferenciaPrecioEspecial      VARCHAR (20),
	IDLineaPrecioEspecial         VARCHAR (128),
	IDOrigenPrecioEspecial        VARCHAR (128),
	TieneEscandallo               INTEGER,
	IDOrigenEscandallo            VARCHAR (128),
	IDCabeceraOrigen              VARCHAR (128),
	IDLineaOrigen                 VARCHAR (128),
	Bonificacion                  REAL,
	BonificacionSobreBruto        INTEGER,
	ImporteBonificacion           REAL,
	IDOrigenBonificacion          VARCHAR (128),
	ImporteBaseDescuentoAdicional REAL,
	DescuentoAdicional1           REAL,
	ImporteDescuentoAdicional1    REAL,
	DescuentoAdicional2           REAL,
	ImporteDescuentoAdicional2    REAL,
	DescuentoAdicional3           REAL,
	ImporteDescuentoAdicional3    REAL,
	IDOrigenDescuentoAdicional    VARCHAR (128)
);

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

DROP TABLE IF EXISTS _Lineas;


CREATE INDEX NDX_Lineas_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_IDProducto ON Lineas (IDProducto);
CREATE INDEX NDX_Lineas_CodigoProducto ON Lineas (CodigoProducto);
CREATE INDEX NDX_Lineas_IDAgrupacion ON Lineas (IDAgrupacion);
CREATE INDEX NDX_Lineas_IDValorPropiedad1 ON Lineas (IDValorPropiedad1);
CREATE INDEX NDX_Lineas_IDValorPropiedad2 ON Lineas (IDValorPropiedad2);
CREATE INDEX NDX_Lineas_IDValorPropiedad3 ON Lineas (IDValorPropiedad3);
CREATE INDEX NDX_Lineas_Titulo ON Lineas (Titulo);
CREATE INDEX NDX_Lineas_PorcentajeIVA ON Lineas (PorcentajeIVA);
CREATE INDEX NDX_Lineas_ClientePotencial ON Lineas (ClientePotencial);
CREATE INDEX NDX_Lineas_IDClienteProveedor ON Lineas (IDClienteProveedor);
CREATE INDEX NDX_Lineas_IDDireccion ON Lineas (IDDireccion);
CREATE INDEX NDX_Lineas_FechaHora ON Lineas (FechaHora);
CREATE INDEX NDX_Lineas_ActualizarStock ON Lineas (ActualizarStock);
CREATE INDEX NDX_Lineas_IDOrigenPrecioEspecial ON Lineas (IDOrigenPrecioEspecial);
CREATE INDEX NDX_Lineas_IDOrigenEscandallo ON Lineas (IDOrigenEscandallo);
CREATE INDEX NDX_Lineas_IDCabeceraOrigen ON Lineas (IDCabeceraOrigen);
CREATE INDEX NDX_Lineas_IDLineaOrigen ON Lineas (IDLineaOrigen);
CREATE INDEX NDX_Lineas_IDOrigenBonificacion ON Lineas (IDOrigenBonificacion);
CREATE INDEX NDX_Lineas_IDOrigenDescuentoAdicional ON Lineas (IDOrigenDescuentoAdicional); 
CREATE INDEX NDX_Lineas_Com_Cliente ON Lineas (ClientePotencial, IDClienteProveedor);    
CREATE INDEX NDX_Lineas_Com_ClienteDireccion ON Lineas (ClientePotencial, IDClienteProveedor, IDDireccion);    
CREATE INDEX NDX_Lineas_Com_CabeceraLinea ON Lineas (IDCabecera, ID);    
CREATE INDEX NDX_Lineas_Com_CabeceraLineaOrigen ON Lineas (IDCabeceraOrigen, IDLineaOrigen);   



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  LineasTmp
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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),
	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,             /* NUEVO CAMPO */
	UnidadesServidas              REAL,
	UnidadesAbonadas              REAL,
	UnidadesBase                  REAL,
	CalcularImporteXPeso          INTEGER,
	PesoUnitario                  REAL,
	Peso                          REAL,
	PesoServido                   REAL,
	PesoAbonado                   REAL,
	Precio                        REAL,
	Descuento1                    REAL,
	AplicarDescuento1EnEuros      INTEGER,
	ImporteDescuento1             REAL,
	Descuento2                    REAL,
	AplicarDescuento2EnEuros      INTEGER,
	ImporteDescuento2             REAL,
	Descuento3                    REAL,
	AplicarDescuento3EnEuros      INTEGER,
	ImporteDescuento3             REAL,
	OrigenPrecio                  INTEGER,
	IDTasa                        VARCHAR (128),
	Tasa                          REAL,
	AplicarTasaEnPorcentaje       INTEGER,
	ImporteTasa                   REAL,
	ImporteBruto                  REAL,
	ImporteNeto                   REAL,
	Comision                      REAL,
	AplicarComisionEnEuros        INTEGER,
	ImporteComision               REAL,
	PrecioCoste                   REAL,
	IDTipoIVA                     VARCHAR (128),
	PorcentajeIVA                 REAL,
	PorcentajeRecargo             REAL,
	ClientePotencial              INTEGER,				/* NUEVO CAMPO */
	IDClienteProveedor            VARCHAR (128),
	IDDireccion                   VARCHAR (128),
	FechaHora                     DATETIME,
	Descripcion                   TEXT,
	TipoLinea                     VARCHAR (1),
	IDTipoAbono                   VARCHAR (128),
	ActualizarStock               INTEGER,
	HoraInicio                    TIME,
	HoraFinal                     TIME,
	TipoCalculoUnidades           INTEGER,
	IDTarifa                      VARCHAR (128),
	ReferenciaPrecioEspecial      VARCHAR (20),
	IDLineaPrecioEspecial         VARCHAR (128),
	IDOrigenPrecioEspecial        VARCHAR (128),
	TieneEscandallo               INTEGER,
	IDOrigenEscandallo            VARCHAR (128),
	IDCabeceraOrigen              VARCHAR (128),
	IDLineaOrigen                 VARCHAR (128),
	Bonificacion                  REAL,
	BonificacionSobreBruto        INTEGER,
	ImporteBonificacion           REAL,
	IDOrigenBonificacion          VARCHAR (128),
	ImporteBaseDescuentoAdicional REAL,
	DescuentoAdicional1           REAL,
	ImporteDescuentoAdicional1    REAL,
	DescuentoAdicional2           REAL,
	ImporteDescuentoAdicional2    REAL,
	DescuentoAdicional3           REAL,
	ImporteDescuentoAdicional3    REAL,
	IDOrigenDescuentoAdicional    VARCHAR (128)
);

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

DROP TABLE IF EXISTS _LineasTmp;


CREATE INDEX NDX_LineasTmp_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_IDProducto ON LineasTmp (IDProducto);
CREATE INDEX NDX_LineasTmp_CodigoProducto ON LineasTmp (CodigoProducto);
CREATE INDEX NDX_LineasTmp_IDAgrupacion ON LineasTmp (IDAgrupacion);
CREATE INDEX NDX_LineasTmp_IDValorPropiedad1 ON LineasTmp (IDValorPropiedad1);
CREATE INDEX NDX_LineasTmp_IDValorPropiedad2 ON LineasTmp (IDValorPropiedad2);
CREATE INDEX NDX_LineasTmp_IDValorPropiedad3 ON LineasTmp (IDValorPropiedad3);
CREATE INDEX NDX_LineasTmp_Titulo ON LineasTmp (Titulo);
CREATE INDEX NDX_LineasTmp_PorcentajeIVA ON LineasTmp (PorcentajeIVA);
CREATE INDEX NDX_LineasTmp_ClientePotencial ON LineasTmp (ClientePotencial);
CREATE INDEX NDX_LineasTmp_IDClienteProveedor ON LineasTmp (IDClienteProveedor);
CREATE INDEX NDX_LineasTmp_IDDireccion ON LineasTmp (IDDireccion);
CREATE INDEX NDX_LineasTmp_FechaHora ON LineasTmp (FechaHora);
CREATE INDEX NDX_LineasTmp_ActualizarStock ON LineasTmp (ActualizarStock);
CREATE INDEX NDX_LineasTmp_IDOrigenPrecioEspecial ON LineasTmp (IDOrigenPrecioEspecial);
CREATE INDEX NDX_LineasTmp_IDOrigenEscandallo ON LineasTmp (IDOrigenEscandallo);
CREATE INDEX NDX_LineasTmp_IDCabeceraOrigen ON LineasTmp (IDCabeceraOrigen);
CREATE INDEX NDX_LineasTmp_IDLineaOrigen ON LineasTmp (IDLineaOrigen);
CREATE INDEX NDX_LineasTmp_IDOrigenBonificacion ON LineasTmp (IDOrigenBonificacion);
CREATE INDEX NDX_LineasTmp_IDOrigenDescuentoAdicional ON LineasTmp (IDOrigenDescuentoAdicional); 
CREATE INDEX NDX_LineasTmp_Com_Cliente ON LineasTmp (ClientePotencial, IDClienteProveedor);    
CREATE INDEX NDX_LineasTmp_Com_ClienteDireccion ON LineasTmp (ClientePotencial, IDClienteProveedor, IDDireccion);    
CREATE INDEX NDX_LineasTmp_Com_CabeceraLinea ON LineasTmp (IDCabecera, ID);    
CREATE INDEX NDX_LineasTmp_Com_CabeceraLineaOrigen ON LineasTmp (IDCabeceraOrigen, IDLineaOrigen);   



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  HLineas
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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),
	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,             /* NUEVO CAMPO */
	UnidadesServidas              REAL,
	UnidadesAbonadas              REAL,
	UnidadesBase                  REAL,
	CalcularImporteXPeso          INTEGER,
	PesoUnitario                  REAL,
	Peso                          REAL,
	PesoServido                   REAL,
	PesoAbonado                   REAL,
	Precio                        REAL,
	Descuento1                    REAL,
	AplicarDescuento1EnEuros      INTEGER,
	ImporteDescuento1             REAL,
	Descuento2                    REAL,
	AplicarDescuento2EnEuros      INTEGER,
	ImporteDescuento2             REAL,
	Descuento3                    REAL,
	AplicarDescuento3EnEuros      INTEGER,
	ImporteDescuento3             REAL,
	OrigenPrecio                  INTEGER,
	IDTasa                        VARCHAR (128),
	Tasa                          REAL,
	AplicarTasaEnPorcentaje       INTEGER,
	ImporteTasa                   REAL,
	ImporteBruto                  REAL,
	ImporteNeto                   REAL,
	Comision                      REAL,
	AplicarComisionEnEuros        INTEGER,
	ImporteComision               REAL,
	PrecioCoste                   REAL,
	IDTipoIVA                     VARCHAR (128),
	PorcentajeIVA                 REAL,
	PorcentajeRecargo             REAL,
	ClientePotencial              INTEGER,				/* NUEVO CAMPO */
	IDClienteProveedor            VARCHAR (128),
	IDDireccion                   VARCHAR (128),
	FechaHora                     DATETIME,
	Descripcion                   TEXT,
	TipoLinea                     VARCHAR (1),
	IDTipoAbono                   VARCHAR (128),
	ActualizarStock               INTEGER,
	HoraInicio                    TIME,
	HoraFinal                     TIME,
	TipoCalculoUnidades           INTEGER,
	IDTarifa                      VARCHAR (128),
	ReferenciaPrecioEspecial      VARCHAR (20),
	IDLineaPrecioEspecial         VARCHAR (128),
	IDOrigenPrecioEspecial        VARCHAR (128),
	TieneEscandallo               INTEGER,
	IDOrigenEscandallo            VARCHAR (128),
	IDCabeceraOrigen              VARCHAR (128),
	IDLineaOrigen                 VARCHAR (128),
	Bonificacion                  REAL,
	BonificacionSobreBruto        INTEGER,
	ImporteBonificacion           REAL,
	IDOrigenBonificacion          VARCHAR (128),
	ImporteBaseDescuentoAdicional REAL,
	DescuentoAdicional1           REAL,
	ImporteDescuentoAdicional1    REAL,
	DescuentoAdicional2           REAL,
	ImporteDescuentoAdicional2    REAL,
	DescuentoAdicional3           REAL,
	ImporteDescuentoAdicional3    REAL,
	IDOrigenDescuentoAdicional    VARCHAR (128)
);

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

DROP TABLE IF EXISTS _HLineas;


CREATE INDEX NDX_HLineas_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_IDProducto ON HLineas (IDProducto);
CREATE INDEX NDX_HLineas_CodigoProducto ON HLineas (CodigoProducto);
CREATE INDEX NDX_HLineas_IDAgrupacion ON HLineas (IDAgrupacion);
CREATE INDEX NDX_HLineas_IDValorPropiedad1 ON HLineas (IDValorPropiedad1);
CREATE INDEX NDX_HLineas_IDValorPropiedad2 ON HLineas (IDValorPropiedad2);
CREATE INDEX NDX_HLineas_IDValorPropiedad3 ON HLineas (IDValorPropiedad3);
CREATE INDEX NDX_HLineas_Titulo ON HLineas (Titulo);
CREATE INDEX NDX_HLineas_PorcentajeIVA ON HLineas (PorcentajeIVA);
CREATE INDEX NDX_HLineas_ClientePotencial ON HLineas (ClientePotencial);
CREATE INDEX NDX_HLineas_IDClienteProveedor ON HLineas (IDClienteProveedor);
CREATE INDEX NDX_HLineas_IDDireccion ON HLineas (IDDireccion);
CREATE INDEX NDX_HLineas_FechaHora ON HLineas (FechaHora);
CREATE INDEX NDX_HLineas_ActualizarStock ON HLineas (ActualizarStock);
CREATE INDEX NDX_HLineas_IDOrigenPrecioEspecial ON HLineas (IDOrigenPrecioEspecial);
CREATE INDEX NDX_HLineas_IDOrigenEscandallo ON HLineas (IDOrigenEscandallo);
CREATE INDEX NDX_HLineas_IDCabeceraOrigen ON HLineas (IDCabeceraOrigen);
CREATE INDEX NDX_HLineas_IDLineaOrigen ON HLineas (IDLineaOrigen);
CREATE INDEX NDX_HLineas_IDOrigenBonificacion ON HLineas (IDOrigenBonificacion);
CREATE INDEX NDX_HLineas_IDOrigenDescuentoAdicional ON HLineas (IDOrigenDescuentoAdicional); 
CREATE INDEX NDX_HLineas_Com_Cliente ON HLineas (ClientePotencial, IDClienteProveedor);    
CREATE INDEX NDX_HLineas_Com_ClienteDireccion ON HLineas (ClientePotencial, IDClienteProveedor, IDDireccion);    
CREATE INDEX NDX_HLineas_Com_CabeceraLinea ON HLineas (IDCabecera, ID);    
CREATE INDEX NDX_HLineas_Com_CabeceraLineaOrigen ON HLineas (IDCabeceraOrigen, IDLineaOrigen);   



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  Oportunidades
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

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

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



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  OportunidadesFases
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

CREATE TABLE OportunidadesFases (
    ID                          VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoOportunidadFase       VARCHAR (10) UNIQUE,
    Descripcion                 VARCHAR (40),
    PorcentajeAvance            REAL,
    EstadoOportunidad           INTEGER
);

CREATE INDEX NDX_OportunidadesFases_Descripcion ON OportunidadesFases (Descripcion);
CREATE INDEX NDX_OportunidadesFases_PorcentajeAvance ON OportunidadesFases (PorcentajeAvance);



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  Actividades
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

CREATE TABLE Actividades (
    ID                          VARCHAR (128) PRIMARY KEY UNIQUE,
    CodigoActividad             VARCHAR (10) UNIQUE,
    Descripcion                 VARCHAR (40)
);

CREATE INDEX NDX_Actividades_CodigoActividad ON Actividades (CodigoActividad);
CREATE INDEX NDX_Actividades_Descripcion ON Actividades (Descripcion);



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  Tareas
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
CREATE TABLE Tareas (
    ID                          VARCHAR (128) PRIMARY KEY UNIQUE,
    ClientePotencial            INTEGER,
    IDCliente                   VARCHAR (128),
    IDOportunidad               VARCHAR (128),
    FechaHora                   DATETIME,
    IDMedioVisita               VARCHAR (128),
    IDMotivoVisita              VARCHAR (128),
    Descripcion                 TEXT,
    Estado                      INTEGER,
    EstadoEnvio                 INTEGER
);

CREATE INDEX NDX_Tareas_ClientePotencial ON Tareas (ClientePotencial);
CREATE INDEX NDX_Tareas_IDCliente ON Tareas (IDCliente);
CREATE INDEX NDX_Tareas_IDOportunidad ON Tareas (IDOportunidad);
CREATE INDEX NDX_Tareas_FechaHora ON Tareas (FechaHora);
CREATE INDEX NDX_Tareas_IDMedioVisita ON Tareas (IDMedioVisita);
CREATE INDEX NDX_Tareas_IDMotivoVisita ON Tareas (IDMotivoVisita);
CREATE INDEX NDX_Tareas_Estado ON Tareas (Estado);
CREATE INDEX NDX_Tareas_EstadoEnvio ON Tareas (EstadoEnvio);
CREATE INDEX NDX_Tareas_Com_Cliente ON Tareas (ClientePotencial, IDCliente);



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  StocksMovimientos
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

CREATE TABLE StocksMovimientos (
    ID                VARCHAR (128) PRIMARY KEY UNIQUE NOT NULL,
    FechaHora         DATETIME      NOT NULL,
    Tipo              VARCHAR (3)   NOT NULL,
    IDRegistroPadre   VARCHAR (128),
    IDRegistro        VARCHAR (128),
    IDAlmacen         VARCHAR (128) NOT NULL,
    IDProducto        VARCHAR (128) NOT NULL,
    IDValorPropiedad1 VARCHAR (128) NOT NULL,
    IDValorPropiedad2 VARCHAR (128) NOT NULL,
    IDValorPropiedad3 VARCHAR (128) NOT NULL,
    Lote              VARCHAR (20)  NOT NULL,
    FechaCaducidad    DATE,
    Unidades          REAL          NOT NULL,
    Peso              REAL          NOT NULL
);

CREATE INDEX NDX_StocksMovimientos_FechaHora ON StocksMovimientos (FechaHora);
CREATE INDEX NDX_StocksMovimientos_Tipo ON StocksMovimientos (Tipo);
CREATE INDEX NDX_StocksMovimientos_IDRegistroPadre ON StocksMovimientos (IDRegistroPadre);
CREATE INDEX NDX_StocksMovimientos_IDRegistro ON StocksMovimientos (IDRegistro);
CREATE INDEX NDX_StocksMovimientos_IDAlmacen ON StocksMovimientos (IDAlmacen);
CREATE INDEX NDX_StocksMovimientos_IDProducto ON StocksMovimientos (IDProducto);
CREATE INDEX NDX_StocksMovimientos_IDValorPropiedad1 ON StocksMovimientos (IDValorPropiedad1);
CREATE INDEX NDX_StocksMovimientos_IDValorPropiedad2 ON StocksMovimientos (IDValorPropiedad2);
CREATE INDEX NDX_StocksMovimientos_IDValorPropiedad3 ON StocksMovimientos (IDValorPropiedad3);
CREATE INDEX NDX_StocksMovimientos_Lote ON StocksMovimientos (Lote);
CREATE INDEX NDX_StocksMovimientos_Com_vStocks ON StocksMovimientos (IDAlmacen, IDProducto, IDValorPropiedad1, IDValorPropiedad2, IDValorPropiedad3, Lote);
    


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

DROP VIEW IF EXISTS `vActividadClientes`;

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



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

DROP VIEW IF EXISTS `vActividadProveedores`;

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



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  vRutasClientes
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS `vRutasClientes`;

CREATE VIEW `vRutasClientes` AS
/* Clientes */
SELECT 
    RutasClientes.*,
    Clientes.CodigoCliente,
    Clientes.NombreComercial,
    Clientes.NombreFiscal,
    Clientes.Domicilio,
    Clientes.CodigoPostal,
    Clientes.Poblacion,
    DireccionesClientes.Nombre AS DireccionNombre,
    DireccionesClientes.Domicilio AS DireccionDomicilio,
    DireccionesClientes.CodigoPostal AS DireccionCodigoPostal,
    DireccionesClientes.Poblacion AS DireccionPoblacion
FROM RutasClientes 
INNER JOIN Clientes ON RutasClientes.IDCliente = Clientes.ID 
LEFT JOIN DireccionesClientes ON RutasClientes.IDDireccion = DireccionesClientes.ID
WHERE RutasClientes.ClientePotencial IS NULL OR RutasClientes.ClientePotencial = 0
UNION 
/* Clientes Potenciales */
SELECT 
    RutasClientes.*,
    ClientesPotenciales.CodigoClientePotencial AS CodigoCliente,
    ClientesPotenciales.NombreComercial,
    ClientesPotenciales.NombreFiscal,
    ClientesPotenciales.Domicilio,
    ClientesPotenciales.CodigoPostal,
    ClientesPotenciales.Poblacion,
    DireccionesClientesPotenciales.Nombre AS DireccionNombre,
    DireccionesClientesPotenciales.Domicilio AS DireccionDomicilio,
    DireccionesClientesPotenciales.CodigoPostal AS DireccionCodigoPostal,
    DireccionesClientesPotenciales.Poblacion AS DireccionPoblacion
FROM RutasClientes 
INNER JOIN ClientesPotenciales ON RutasClientes.IDCliente = ClientesPotenciales.ID 
LEFT JOIN DireccionesClientesPotenciales ON RutasClientes.IDDireccion = DireccionesClientesPotenciales.ID
WHERE RutasClientes.ClientePotencial = 1;



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  vRutasSeguimientosLineas
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS `vRutasSeguimientosLineas`;

CREATE VIEW `vRutasSeguimientosLineas` AS
/* Clientes */
SELECT 
    RutasSeguimientosLineas.ID, 
    RutasSeguimientosLineas.IDRutaSeguimiento, 
    0 AS ClientePotencial, 
    RutasSeguimientosLineas.IDCliente, 
    RutasSeguimientosLineas.IDDireccion, 
    RutasSeguimientosLineas.FechaHora,
    CASE TipoRegistro
        WHEN 'SinActividad' THEN RutasSeguimientosLineas.ID
        ELSE RutasSeguimientosLineas.TipoRegistro || '\$' || RutasSeguimientosLineas.IDRegistro
    END AS IDRegistro,
    Clientes.CodigoCliente,
    Clientes.NombreComercial,
    (SELECT Nombre FROM DireccionesClientes WHERE ID=RutasSeguimientosLineas.IDDireccion) AS NombreDireccion,
    CASE TipoRegistro 
        WHEN 'Cabeceras' THEN (SELECT DescripcionSingular FROM TiposDocumento WHERE ID = (SELECT IDTipoDocumento FROM Cabeceras WHERE ID=RutasSeguimientosLineas.IDRegistro))
        WHEN 'Visitas' THEN '@Visita'
        WHEN 'CobrosLineas' THEN '@Cobro'
        WHEN 'SinActividad' THEN '@SinActividad'
        ELSE '' 
    END AS Tipo,
    CASE TipoRegistro 
        WHEN 'Cabeceras' THEN (SELECT Documento FROM Cabeceras WHERE ID=RutasSeguimientosLineas.IDRegistro) 
        WHEN 'Visitas' THEN (SELECT Observaciones FROM Visitas WHERE ID=RutasSeguimientosLineas.IDRegistro) 
        WHEN 'CobrosLineas' THEN (SELECT Concepto FROM CobrosLineas WHERE ID=RutasSeguimientosLineas.IDRegistro)
        ELSE '' 
    END AS Descripcion,
    CASE TipoRegistro 
        WHEN 'Cabeceras' THEN (SELECT ImporteTotal FROM Cabeceras WHERE ID=RutasSeguimientosLineas.IDRegistro) 
        WHEN 'CobrosLineas' THEN (SELECT ImporteCobrado FROM CobrosLineas WHERE ID=RutasSeguimientosLineas.IDRegistro)
        ELSE '' 
    END AS Importe
FROM RutasSeguimientosLineas LEFT JOIN Clientes ON RutasSeguimientosLineas.IDCliente = Clientes.ID 
WHERE RutasSeguimientosLineas.ClientePotencial = 0 OR RutasSeguimientosLineas.ClientePotencial IS NULL
UNION
/* Clientes potenciales */
SELECT 
    RutasSeguimientosLineas.ID, 
    RutasSeguimientosLineas.IDRutaSeguimiento, 
    1 AS ClientePotencial, 
    RutasSeguimientosLineas.IDCliente, 
    RutasSeguimientosLineas.IDDireccion, 
    RutasSeguimientosLineas.FechaHora,
    CASE TipoRegistro
        WHEN 'SinActividad' THEN RutasSeguimientosLineas.ID
        ELSE RutasSeguimientosLineas.TipoRegistro || '\$' || RutasSeguimientosLineas.IDRegistro
    END AS IDRegistro,
    ClientesPotenciales.CodigoClientePotencial,
    ClientesPotenciales.NombreComercial,
    (SELECT Nombre FROM DireccionesClientesPotenciales WHERE ID=RutasSeguimientosLineas.IDDireccion) AS NombreDireccion,
    CASE TipoRegistro 
        WHEN 'Cabeceras' THEN (SELECT DescripcionSingular FROM TiposDocumento WHERE ID = (SELECT IDTipoDocumento FROM Cabeceras WHERE ID=RutasSeguimientosLineas.IDRegistro))
        WHEN 'Visitas' THEN '@Visita'
        WHEN 'CobrosLineas' THEN '@Cobro'
        WHEN 'SinActividad' THEN '@SinActividad'
        ELSE '' 
    END AS Tipo,
    CASE TipoRegistro 
        WHEN 'Cabeceras' THEN (SELECT Documento FROM Cabeceras WHERE ID=RutasSeguimientosLineas.IDRegistro) 
        WHEN 'Visitas' THEN (SELECT Observaciones FROM Visitas WHERE ID=RutasSeguimientosLineas.IDRegistro) 
        WHEN 'CobrosLineas' THEN (SELECT Concepto FROM CobrosLineas WHERE ID=RutasSeguimientosLineas.IDRegistro)
        ELSE '' 
    END AS Descripcion,
    CASE TipoRegistro 
        WHEN 'Cabeceras' THEN (SELECT ImporteTotal FROM Cabeceras WHERE ID=RutasSeguimientosLineas.IDRegistro) 
        WHEN 'CobrosLineas' THEN (SELECT ImporteCobrado FROM CobrosLineas WHERE ID=RutasSeguimientosLineas.IDRegistro)
        ELSE '' 
    END AS Importe
FROM RutasSeguimientosLineas LEFT JOIN ClientesPotenciales ON RutasSeguimientosLineas.IDCliente = ClientesPotenciales.ID 
WHERE RutasSeguimientosLineas.ClientePotencial = 1;



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

DROP VIEW IF EXISTS `vStocks`;

CREATE VIEW `vStocks` AS
SELECT 
    StocksMovimientos.ID,
    StocksMovimientos.IDAlmacen,
    StocksMovimientos.IDProducto,
    StocksMovimientos.IDValorPropiedad1,
    StocksMovimientos.IDValorPropiedad2,
    StocksMovimientos.IDValorPropiedad3,
    StocksMovimientos.Lote,
    StocksMovimientos.FechaCaducidad,
    SUM(StocksMovimientos.Unidades) AS Stock,
    SUM(StocksMovimientos.Peso) AS Peso
FROM StocksMovimientos LEFT JOIN Lineas ON StocksMovimientos.Tipo = 'DOC' AND Lineas.IDCabecera = StocksMovimientos.IDRegistroPadre AND Lineas.ID = StocksMovimientos.IDRegistro
WHERE 
    /* Control carga inicial cerrada */
    StocksMovimientos.FechaHora >= COALESCE((SELECT FechaHora FROM vCargasInicialesCerradas WHERE IDAlmacen = StocksMovimientos.IDAlmacen), '2000-01-01 00:00:00') 
    /* Consolidación producto */
    AND StocksMovimientos.FechaHora >= COALESCE((SELECT MAX(FechaHora) FROM ConsolidacionesInventario WHERE IDAlmacen = StocksMovimientos.IDAlmacen AND IDProducto = StocksMovimientos.IDProducto), '2000-01-01 00:00:00') 
    /* Taspaso de documentos, filtrar líneas que tiene que actualizar el stock */
    AND 
    (
        /* Tipo movimiento stock no es un documento */
        StocksMovimientos.Tipo <> 'DOC' OR
        /* Documento no traspasado */
        (Lineas.IDCabeceraOrigen = '' OR Lineas.IDCabeceraOrigen IS NULL) OR  
        /* Documento traspasado pero que el origen no actualiza el stock */
        (Lineas.IDCabeceraOrigen <> '' AND Lineas.IDCabeceraOrigen IS NOT NULL AND IFNULL((SELECT ActualizarStock FROM Lineas AS L WHERE L.IDCabecera = Lineas.IDCabeceraOrigen AND L.ID = Lineas.IDLineaOrigen),0) = 0)
    )				
GROUP BY
    StocksMovimientos.IDAlmacen,
    StocksMovimientos.IDProducto,
    StocksMovimientos.IDValorPropiedad1,
    StocksMovimientos.IDValorPropiedad2,
    StocksMovimientos.IDValorPropiedad3,
    StocksMovimientos.Lote;



-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------
--  vVisitas
-- --------------------------------------------------------------------------------------------------------------
-- --------------------------------------------------------------------------------------------------------------

DROP VIEW IF EXISTS `vVisitas`;

CREATE VIEW `vVisitas` AS
/* Clientes */
SELECT 
    Visitas.*,
    Clientes.CodigoCliente,
    Clientes.NombreComercial,
    Clientes.NombreFiscal,
    DireccionesClientes.Nombre AS NombreDireccion
FROM Visitas 
INNER JOIN Clientes ON Visitas.IDCliente = Clientes.ID 
LEFT JOIN DireccionesClientes ON Visitas.IDDireccion = DireccionesClientes.ID
WHERE Visitas.ClientePotencial IS NULL OR Visitas.ClientePotencial = 0
UNION 
/* Clientes Potenciales */
SELECT 
    Visitas.*,
    ClientesPotenciales.CodigoClientePotencial AS CodigoCliente,
    ClientesPotenciales.NombreComercial,
    ClientesPotenciales.NombreFiscal,
    DireccionesClientesPotenciales.Nombre AS NombreDireccion
FROM Visitas 
INNER JOIN ClientesPotenciales ON Visitas.IDCliente = ClientesPotenciales.ID 
LEFT JOIN DireccionesClientesPotenciales ON Visitas.IDDireccion = DireccionesClientesPotenciales.ID
WHERE Visitas.ClientePotencial = 1;