{
  "_readme": "Lista blanca de diferencias APROBADAS entre el esquema real de mbinvautocentrorodriguez (la demo) y el que producen las migraciones contra una base genuinamente nueva. Existe porque las migraciones NUNCA habian producido un tenant funcional de punta a punta antes de esta ronda — el esquema de la demo salio de otro lado (synchronize:true o DDL a mano) y no de las migraciones. La herramienta de comparacion (schema-divergence.spec.ts) FALLA si aparece una tabla que difiere y no esta aca, o si una tabla listada aca deja de coincidir con el string exacto guardado — igual que el trinquete de ofensas: agregar una entrada nueva, o cambiar el string guardado de una existente, requiere aprobacion explicita del usuario en el diff. Los strings son SHOW CREATE TABLE normalizado (sin AUTO_INCREMENT=N, sin CHARACTER SET/COLLATE — el collation es un problema de COMO SE CREA LA BASE, no de las migraciones, ver .env.example) contra test_default_sentinel, verificado tras correr la reconciliacion completa.",
  "droppedInFresh": {},
  "_droppedInFresh_historico": {
    "_nota": "taller_sync_events YA NO es una divergencia — DropUnusedSyncEvents1770700000000 se corrio contra la demo real (autorizado explicitamente) y la tabla desaparecio de los dos lados (verificado: 0 filas antes de borrar, 0 tablas taller_sync_events despues, en la demo Y en las tres bases de aislamiento). Esta entrada queda solo como registro de que existio, no como aprobacion activa — si 'taller_sync_events' volviera a aparecer como divergencia, es una regresion, no algo ya aprobado."
  },
  "newInFresh": {},
  "_newInFresh_historico": {
    "_nota": "taller_ot_facturacion YA NO es una divergencia — CreateTallerOtFacturacion1780100000000 se corrio contra la demo real (incidente de produccion del 2026-09-09, ver AddTiendaFacturacionPosConfig) y la tabla ahora existe con el mismo esquema en ambos lados. Esta entrada queda solo como registro, no como aprobacion activa."
  },
  "columnDivergences": {
    "_motivo_general_categoria_A": "GANA MIGRACION/ENTIDAD, la demo quedo atras con un nullable-con-default viejo (de antes de que existieran migraciones). Sin riesgo real: todas tienen default y ningun codigo inserta NULL a proposito. No se toca la demo (decision explicita del usuario).",
    "taller_cosas_trae": "CREATE TABLE `taller_cosas_trae` ( `id` int NOT NULL AUTO_INCREMENT, `nombre` varchar(150) NOT NULL, `descripcion` text, `activo` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `IDX_cosa_trae_activo` (`activo`)) ENGINE=InnoDB",
    "taller_cotizaciones": "CREATE TABLE `taller_cotizaciones` ( `id` int NOT NULL AUTO_INCREMENT, `ot_id` int NOT NULL, `numero_cotizacion` varchar(20) DEFAULT NULL, `subtotal` decimal(12,2) NOT NULL DEFAULT '0.00', `iva` decimal(12,2) NOT NULL DEFAULT '0.00', `total` decimal(12,2) NOT NULL DEFAULT '0.00', `estado` enum('borrador','enviada','aprobada','rechazada') NOT NULL DEFAULT 'borrador', `fecha_aprobacion` datetime DEFAULT NULL, `aprobado_por` varchar(255) DEFAULT NULL, `public_token` varchar(64) DEFAULT NULL, `public_expires_at` datetime DEFAULT NULL, `decision_cliente_at` datetime DEFAULT NULL, `decision_cliente_nombre` varchar(255) DEFAULT NULL, `decision_cliente_firma` mediumtext, `decision_cliente_motivo` text, `notas` text, `local_id` varchar(36) DEFAULT NULL, `version` int NOT NULL DEFAULT '1', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `asesor_id` int DEFAULT NULL, `asesor_nombre` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `IDX_cot_public_token` (`public_token`), KEY `IDX_cotizacion_ot` (`ot_id`), KEY `IDX_cotizacion_estado` (`estado`), KEY `IDX_cotizaciones_asesor_id` (`asesor_id`), CONSTRAINT `FK_43b5827f4666a17de0217cf199a` FOREIGN KEY (`ot_id`) REFERENCES `taller_ordenes_trabajo` (`id`) ON DELETE CASCADE) ENGINE=InnoDB",
    "taller_ordenes_trabajo": "CREATE TABLE `taller_ordenes_trabajo` ( `id` int NOT NULL AUTO_INCREMENT, `numero_ot` varchar(20) NOT NULL, `cliente_tarjeta` varchar(24) NOT NULL, `vehiculo_id` int NOT NULL, `fecha_entrada` datetime NOT NULL, `fecha_salida` datetime DEFAULT NULL, `km` int NOT NULL, `nivel_gasolina` int NOT NULL DEFAULT '0', `requerimiento_cliente` text, `observaciones` text, `estado` enum('borrador','en_proceso','cotizada','aprobada','terminada','facturada','entregada') NOT NULL DEFAULT 'borrador', `pdf_escaner` varchar(500) DEFAULT NULL, `local_id` varchar(36) DEFAULT NULL, `version` int NOT NULL DEFAULT '1', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `created_by` int DEFAULT NULL, `updated_by` int DEFAULT NULL, `tienda_id` int DEFAULT NULL, `mecanico_id` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `UQ_8940053bb2a92c5a9d150753f8a` (`numero_ot`), KEY `IDX_ot_numero` (`numero_ot`), KEY `IDX_ot_cliente` (`cliente_tarjeta`), KEY `IDX_ot_estado` (`estado`), KEY `IDX_ot_fecha_entrada` (`fecha_entrada`), KEY `IDX_ot_fecha_salida` (`fecha_salida`), KEY `IDX_ot_local_id` (`local_id`), KEY `FK_9f45d5a9b85f340e14aa9e24ab9` (`vehiculo_id`), KEY `IDX_ots_tienda_id` (`tienda_id`), KEY `IDX_ots_mecanico_id` (`mecanico_id`), CONSTRAINT `FK_9f45d5a9b85f340e14aa9e24ab9` FOREIGN KEY (`vehiculo_id`) REFERENCES `taller_vehiculos` (`id`) ON DELETE RESTRICT, CONSTRAINT `FK_ots_mecanico` FOREIGN KEY (`mecanico_id`) REFERENCES `taller_mecanicos` (`id`) ON DELETE SET NULL) ENGINE=InnoDB",
    "taller_productos": "CREATE TABLE `taller_productos` ( `plu` varchar(24) NOT NULL, `desclarga` varchar(255) NOT NULL, `desccorta` varchar(100) DEFAULT NULL, `alterno` varchar(50) DEFAULT NULL, `precio` decimal(12,2) NOT NULL DEFAULT '0.00', `pagaiva` tinyint(1) NOT NULL DEFAULT '0', `iva` decimal(5,2) NOT NULL DEFAULT '0.00', `es_servicio` tinyint(1) NOT NULL DEFAULT '0', `usainventario` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `estaller` tinyint(1) NOT NULL DEFAULT '1', `costo` decimal(12,2) NOT NULL DEFAULT '0.00', PRIMARY KEY (`plu`), KEY `IDX_taller_productos_plu` (`plu`), KEY `IDX_taller_productos_desclarga` (`desclarga`), KEY `IDX_taller_productos_alterno` (`alterno`)) ENGINE=InnoDB",
    "_nota_taller_productos": "plu=24 aqui es CORRECTO (no confundir con la demo, que tiene 25): solo guarda TLLP-XXXXXXXX (13 caracteres), 24 alcanza. Distinto de taller_cotizacion_lineas.plu (25, corregido — guarda PLUs de AMBOS origenes, entidad y migracion ya en 25).",
    "taller_tipos_dano": "CREATE TABLE `taller_tipos_dano` ( `id` int NOT NULL AUTO_INCREMENT, `nombre` varchar(100) NOT NULL, `descripcion` text, `icono` varchar(50) DEFAULT NULL, `color` varchar(20) DEFAULT '#ef4444', `activo` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `IDX_tipo_dano_activo` (`activo`)) ENGINE=InnoDB",
    "_nota_taller_tipos_dano": "Ademas de la tightening nullable->NOT NULL: `descripcion` y `updated_at` son columnas EXTRA que ni la demo ni la entidad (TipoDano) tienen. Inofensivas (nullable/con default, nada las lee) — aprobado dejarlas, ver punto 3(d) de la reconciliacion.",
    "taller_tipos_vehiculo": "CREATE TABLE `taller_tipos_vehiculo` ( `id` int NOT NULL AUTO_INCREMENT, `nombre` varchar(100) NOT NULL, `descripcion` text, `plantilla_danos` varchar(50) NOT NULL DEFAULT 'carro', `activo` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `created_by` int DEFAULT NULL, `updated_by` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `IDX_tipo_vehiculo_activo` (`activo`)) ENGINE=InnoDB",
    "taller_vehiculos": "CREATE TABLE `taller_vehiculos` ( `id` int NOT NULL AUTO_INCREMENT, `placa` varchar(20) NOT NULL, `marca` varchar(100) DEFAULT NULL, `modelo` varchar(100) DEFAULT NULL, `anio` int DEFAULT NULL, `motor` varchar(100) DEFAULT NULL, `cilindraje` varchar(50) DEFAULT NULL, `color` varchar(50) DEFAULT NULL, `tipo_vehiculo_id` int DEFAULT NULL, `cliente_id` varchar(24) DEFAULT NULL, `notas` text, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `created_by` int DEFAULT NULL, `updated_by` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `UQ_4d1aa539dd8e983b18f5bcbadd4` (`placa`), KEY `IDX_vehiculo_placa` (`placa`), KEY `IDX_vehiculo_cliente` (`cliente_id`), KEY `FK_236187cb95f415ed8440899f51a` (`tipo_vehiculo_id`), CONSTRAINT `FK_236187cb95f415ed8440899f51a` FOREIGN KEY (`tipo_vehiculo_id`) REFERENCES `taller_tipos_vehiculo` (`id`)) ENGINE=InnoDB",
    "_nota_taller_vehiculos": "El FK a tipo_vehiculo_id ya NO tiene ON DELETE SET NULL (se corrigio, ver ReconcileVehiculosTipoVehiculoFk1770500000000) — coincide con la demo (RESTRICT implicito) en COMPORTAMIENTO; solo queda como divergencia el nombre del FK/indice (auto-generado por TypeORM) y created_at/updated_at NOT NULL, categoria A.",

    "_motivo_general_categoria_B": "GANA ENTIDAD/DEMO, la migracion original tenia el bug — reconciliado en esta ronda. Solo quedan restos cosmeticos (nombres de indice/FK autogenerados por TypeORM, columnas extra inofensivas) despues de que ReconcileOtCosasTrae/ReconcileOtFotos/ReconcileOtFirmasNombreLength/ReconcileOtDanosZona corrigieran lo que importaba (columnas faltantes, largo, nullability).",
    "taller_ot_cosas_trae": "CREATE TABLE `taller_ot_cosas_trae` ( `id` int NOT NULL AUTO_INCREMENT, `ot_id` int NOT NULL, `cosa_trae_id` int NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `cantidad` int NOT NULL DEFAULT '1', `observacion` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_ot_cosa` (`ot_id`,`cosa_trae_id`), KEY `FK_daf078855f73f796c9dca2a12ba` (`cosa_trae_id`), CONSTRAINT `FK_62a728becca16d02f5ce713349d` FOREIGN KEY (`ot_id`) REFERENCES `taller_ordenes_trabajo` (`id`) ON DELETE CASCADE, CONSTRAINT `FK_daf078855f73f796c9dca2a12ba` FOREIGN KEY (`cosa_trae_id`) REFERENCES `taller_cosas_trae` (`id`) ON DELETE CASCADE) ENGINE=InnoDB",
    "_nota_taller_ot_cosas_trae": "El UNIQUE (ot_id, cosa_trae_id) YA ESTA — lo urgente esta resuelto. `created_at` es una columna extra que ni demo ni entidad (OtCosaTrae) tienen; inofensiva. El FK de cosa_trae_id quedo en ON DELETE CASCADE (la demo no tiene clausula = RESTRICT) — no se toco porque no estaba en el alcance aprobado para esta tabla.",
    "taller_ot_danos": "CREATE TABLE `taller_ot_danos` ( `id` int NOT NULL AUTO_INCREMENT, `ot_id` int NOT NULL, `tipo_dano_id` int NOT NULL, `zona` varchar(50) NOT NULL, `descripcion` text, `posicion_x` decimal(5,2) DEFAULT NULL, `posicion_y` decimal(5,2) DEFAULT NULL, `foto_url` varchar(500) DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `FK_f5b93e54e1f51a55d60a469d2a1` (`ot_id`), KEY `FK_6528f7adbfde0bf500731a42206` (`tipo_dano_id`), CONSTRAINT `FK_6528f7adbfde0bf500731a42206` FOREIGN KEY (`tipo_dano_id`) REFERENCES `taller_tipos_dano` (`id`) ON DELETE RESTRICT, CONSTRAINT `FK_f5b93e54e1f51a55d60a469d2a1` FOREIGN KEY (`ot_id`) REFERENCES `taller_ordenes_trabajo` (`id`) ON DELETE CASCADE) ENGINE=InnoDB",
    "taller_ot_firmas": "CREATE TABLE `taller_ot_firmas` ( `id` int NOT NULL AUTO_INCREMENT, `ot_id` int NOT NULL, `firma_cliente` varchar(500) DEFAULT NULL, `fecha_firma_cliente` datetime DEFAULT NULL, `nombre_firma_cliente` varchar(255) DEFAULT NULL, `firma_recepcion` varchar(500) DEFAULT NULL, `fecha_firma_recepcion` datetime DEFAULT NULL, `nombre_firma_recepcion` varchar(255) DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `UQ_8b520f101dc37c781b67e28e1c3` (`ot_id`), CONSTRAINT `FK_8b520f101dc37c781b67e28e1c3` FOREIGN KEY (`ot_id`) REFERENCES `taller_ordenes_trabajo` (`id`) ON DELETE CASCADE) ENGINE=InnoDB",
    "_nota_taller_ot_firmas": "created_at/updated_at son columnas extra que ni demo ni entidad (OtFirma) tienen; inofensivas.",
    "taller_ot_fotos": "CREATE TABLE `taller_ot_fotos` ( `id` int NOT NULL AUTO_INCREMENT, `ot_id` int NOT NULL, `tipo` enum('general','dano','documento') NOT NULL DEFAULT 'general', `url` varchar(500) NOT NULL, `descripcion` varchar(255) DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `orden` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `FK_7a4dc1d061974aefbf976f8ee3a` (`ot_id`), CONSTRAINT `FK_7a4dc1d061974aefbf976f8ee3a` FOREIGN KEY (`ot_id`) REFERENCES `taller_ordenes_trabajo` (`id`) ON DELETE CASCADE) ENGINE=InnoDB",

    "_motivo_general_categoria_C": "GANA ENTIDAD/DEMO (fuente real medida, no supuesta) — solo el largo de plu, ya corregido. La entidad tambien se corrigio (cotizacion-linea.entity.ts, length 24->25).",
    "taller_cotizacion_lineas": "CREATE TABLE `taller_cotizacion_lineas` ( `id` int NOT NULL AUTO_INCREMENT, `cotizacion_id` int NOT NULL, `plu` varchar(25) NOT NULL, `descripcion` varchar(255) NOT NULL, `precio_unitario` decimal(12,2) NOT NULL, `cantidad` decimal(10,3) NOT NULL DEFAULT '1.000', `subtotal` decimal(12,2) NOT NULL, `iva` decimal(12,2) NOT NULL DEFAULT '0.00', `total` decimal(12,2) NOT NULL, `es_servicio` tinyint(1) NOT NULL DEFAULT '0', `orden` int NOT NULL DEFAULT '0', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `IDX_linea_cotizacion` (`cotizacion_id`), CONSTRAINT `FK_b2e3e755bee53bfa75da032f7f8` FOREIGN KEY (`cotizacion_id`) REFERENCES `taller_cotizaciones` (`id`) ON DELETE CASCADE) ENGINE=InnoDB",
    "_nota_taller_cotizacion_lineas": "plu ya en 25 (correcto, medido contra maeplu real). El nullable de plu (demo=NULL, aca=NOT NULL) es categoria A, no se toca la demo."
  }
}
