untitled

Pasted Nov 10, 2026, 10:13 PM1 file273 lines

Scan to open on your phone

Point a camera at the QR code - it opens this exact paste, no app needed.

https://codepastes.com/zzgs81ght084dvtx
untitled
package com.negocio.desinfectantes.data

import androidx.room.Database
import androidx.room.RoomDatabase

@Database(
    entities = [
        ProductoEntity::class,
        AromaEntity::class,
        PresentacionEntity::class,
        InventarioEntity::class,
        ProduccionEntity::class,
        DistribucionProduccionEntity::class,
        MovimientoInventarioEntity::class,
        ClienteEntity::class,
        VentaEntity::class,
        DetalleVentaEntity::class,
        PagoVentaEntity::class,

        // Nuevas entidades de lotes
        LoteProduccionEntity::class,
        LoteDetalleEntity::class,
        LoteGastoEntity::class,
        LoteInventarioEntity::class,
        LoteVentaEntity::class,
        ControlNumeracionLotesEntity::class
    ],
    version = 7,
    exportSchema = false
)
abstract class PrestigeDatabase : RoomDatabase() {
    abstract fun productoDao(): ProductoDao
}


package com.negocio.desinfectantes.data

import android.content.Context
import androidx.room.Room
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase

object DatabaseProvider {

    private val MIGRATION_2_3 = object : Migration(2, 3) {
        override fun migrate(database: SupportSQLiteDatabase) {

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS producciones (
                    id TEXT NOT NULL,
                    presentacionId TEXT NOT NULL,
                    cantidadProducida INTEGER NOT NULL,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS distribuciones_produccion (
                    id TEXT NOT NULL,
                    produccionId TEXT NOT NULL,
                    sede TEXT NOT NULL,
                    cantidad INTEGER NOT NULL,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS movimientos_inventario (
                    id TEXT NOT NULL,
                    presentacionId TEXT NOT NULL,
                    sede TEXT NOT NULL,
                    tipoMovimiento TEXT NOT NULL,
                    cantidad INTEGER NOT NULL,
                    referenciaId TEXT,
                    observacion TEXT,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)
        }
    }

    private val MIGRATION_3_4 = object : Migration(3, 4) {
        override fun migrate(database: SupportSQLiteDatabase) {

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS clientes (
                    id TEXT NOT NULL,
                    nombre TEXT NOT NULL,
                    telefono TEXT,
                    direccion TEXT,
                    observaciones TEXT,
                    activo INTEGER NOT NULL,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)
        }
    }

    private val MIGRATION_4_5 = object : Migration(4, 5) {
        override fun migrate(database: SupportSQLiteDatabase) {

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS ventas (
                    id TEXT NOT NULL,
                    clienteId TEXT NOT NULL,
                    sede TEXT NOT NULL,
                    tipoVenta TEXT NOT NULL,
                    estadoEntrega TEXT NOT NULL,
                    total REAL NOT NULL,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS detalles_venta (
                    id TEXT NOT NULL,
                    ventaId TEXT NOT NULL,
                    presentacionId TEXT NOT NULL,
                    cantidad INTEGER NOT NULL,
                    precioUnitario REAL NOT NULL,
                    subtotal REAL NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS pagos_venta (
                    id TEXT NOT NULL,
                    ventaId TEXT NOT NULL,
                    monto REAL NOT NULL,
                    metodoPago TEXT NOT NULL,
                    observacion TEXT,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)
        }
    }

    // Nueva migración: versión 5 a 6
    private val MIGRATION_5_6 = object : Migration(5, 6) {
        override fun migrate(database: SupportSQLiteDatabase) {

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS lotes_produccion (
                    id TEXT NOT NULL,
                    productoId TEXT NOT NULL,
                    aromaId TEXT NOT NULL,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS lotes_detalle (
                    id TEXT NOT NULL,
                    loteId TEXT NOT NULL,
                    presentacionId TEXT NOT NULL,
                    cantidadFabricada INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS lotes_gastos (
                    id TEXT NOT NULL,
                    loteId TEXT NOT NULL,
                    concepto TEXT NOT NULL,
                    monto REAL NOT NULL,
                    observacion TEXT,
                    fechaCreacion INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS lotes_inventario (
                    id TEXT NOT NULL,
                    loteId TEXT NOT NULL,
                    presentacionId TEXT NOT NULL,
                    sede TEXT NOT NULL,
                    cantidadDisponible INTEGER NOT NULL,
                    cantidadReservada INTEGER NOT NULL,
                    PRIMARY KEY(id)
                )
            """)

            database.execSQL("""
                CREATE TABLE IF NOT EXISTS lotes_ventas (
                    id TEXT NOT NULL,
                    ventaId TEXT NOT NULL,
                    detalleVentaId TEXT NOT NULL,
                    loteInventarioId TEXT NOT NULL,
                    cantidad INTEGER NOT NULL,
                    estado TEXT NOT NULL,
                    PRIMARY KEY(id)
                )
            """)
        }
    }


    val MIGRATION_6_7 = object : Migration(6, 7) {
        override fun migrate(db: SupportSQLiteDatabase) {

            db.execSQL("""
            ALTER TABLE lotes_produccion
            ADD COLUMN numeroLote TEXT NOT NULL DEFAULT ''
        """)

            db.execSQL("""
            UPDATE lotes_produccion
            SET numeroLote = 'LOTE-' || printf('%04d',
                (
                    SELECT COUNT(*)
                    FROM lotes_produccion AS anterior
                    WHERE anterior.fechaCreacion < lotes_produccion.fechaCreacion
                    OR (
                        anterior.fechaCreacion = lotes_produccion.fechaCreacion
                        AND anterior.id <= lotes_produccion.id
                    )
                )
            )
        """)
            db.execSQL("""
    CREATE TABLE IF NOT EXISTS control_numeracion_lotes (
        id INTEGER NOT NULL PRIMARY KEY,
        ultimoNumero INTEGER NOT NULL
    )
""")

            db.execSQL("""
    INSERT INTO control_numeracion_lotes (id, ultimoNumero)
    SELECT 1, COUNT(*) FROM lotes_produccion
""")
        }
    }


    @Volatile
    private var INSTANCE: PrestigeDatabase? = null

    fun obtenerBaseDatos(context: Context): PrestigeDatabase {

        return INSTANCE ?: synchronized(this) {

            val instancia = Room.databaseBuilder(
                context.applicationContext,
                PrestigeDatabase::class.java,
                "prestige_clean_database"
            )
                .addMigrations(
                    MIGRATION_2_3,
                    MIGRATION_3_4,
                    MIGRATION_4_5,
                    MIGRATION_5_6,
                    MIGRATION_6_7
                )
                .build()

            INSTANCE = instancia

            instancia
        }
    }
}

8,607 chars · codepastes.com